{"version":3,"mappings":"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","names":["l","c","i","r","s","f","d","v","h","g","n","t","m","p","b","E","L","C","w","B","I","y","k","K","R","S","T","P","X","o","a","Y","U","u","V","W","$","G","J","Q","Z","#setup","#cleanup","#focused","#provider","noop","matchQuery","#online","#gcTimeout","#abortSignalConsumed","#defaultOptions","#client","#cache","#initialState","#queryType","#retryer","#dispatch","#isInitialPausedFetch","#revertState","#selectError","#currentThenable","#currentQuery","#executeFetch","#updateTimers","#clearStaleTimeout","#clearRefetchInterval","#updateQuery","#updateStaleTimeout","#computeRefetchInterval","#currentRefetchInterval","#updateRefetchInterval","#currentResult","#currentResultOptions","#currentResultState","#trackedProps","#staleTimeoutId","#refetchIntervalId","#currentQueryInitialState","#lastQueryWithDefinedData","#selectFn","#selectResult","#notify","#options","#queries","#observers","#result","#onUpdate","#findMatchingObservers","#observerMatches","#combineResult","#trackResult","#lastQueryHashes","#combinedResult","#lastResult","#lastCombine","#shouldSkipCombine","e","memo","exports","EventEmitter","getNativeCallCapabilities","We","de","Be","Re","te","At","Ge","pe","Qe","en","tn","ae","nn","tr","je","nr","_t","kt","rr","ir","or","sr","cr","Ve","Lt","ur","fr","dr","pr","Ce","rn","ne","ie","It","Le","ee","Je","le","it","bt","yt","ue","we","Ze","on","Oe","dt","sn","wt","ge","an","he","et","Rt","Mt","ot","Dt","ln","fn","Ne","$t","pt","oe","dn","xe","ve","Se","be","A","xt","st","He","Ie","pn","hn","Nt","vn","ze","St","Ae","Me","Ct","tt","Ft","z","Ut","mn","Wt","Bt","Et","Tt","bn","wn","Sn","Cn","En","ce","ye","ht","_","_e","jt","Ht","Yt","H","kn","q","ke","os","$n","Ke","F","qt","qe","ct","Gt","me","Ee","Ot","Te","rt","Jn","Qt","Pe","Vn","ta","Yn","Kn","qn","M","Fe","x","De","nt","at","j","D","ut","$e","Ue","mt","Xe","N","COMMA","Text","warn","isTag","isTagRaw","Comment","Element","ProcessingInstruction","Node","defaultOptions","require_utilities","HTMLReactParser","_arrayLikeToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_slicedToArray","_unsupportedIterableToArray","apply","min","max","limit","type","PI","last","_input","clip_rgb","unpack","round","input","LAB_CONSTANTS","pow","interpolator","mix","cos","sin","sqrt","atan2","interpolate_hsx","floor","rgb2hsl","rgb2hsv","scale","log","abs","createContext","useContext","useMemo","useRef","useCallback","useState","useSyncExternalStore","Fragment","joinable","NodeType","DOMParser","doc","bind","mac","windows","event","O","$eXv8n$shadowDOM","$lIB5W$useRef","$lIB5W$useCallback","$awe0O$useRef","$awe0O$useCallback","$awe0O$useEffect","$5319z$useRef","$5319z$useCallback","$hZqKM$useState","$hZqKM$useRef","$hZqKM$useEffect","$hZqKM$useMemo","arrayLikeToArray","arrayWithHoles","iterableToArrayLimit","unsupportedIterableToArray","nonIterableRest","ownKeys","_objectSpread","bindAll","arrayWithoutHoles","iterableToArray","nonIterableSpread","_navigator","_createForOfIteratorHelper"],"ignoreList":[0,1,2,3,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,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,262,263,264,265,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,311,312,327,347,348,349,350,351,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,418,447,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,570,571,572,573,574,575,576,577,583,584,592,593,594,595,603,629,630,631,664,665,666,667,668,669,670,671,672,673,682,692,693,694,695,750,751,752,753,754,755,756,757,885,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1115,1116,1123],"sources":["../../node_modules/.pnpm/react-colorful@5.8.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-colorful/dist/index.mjs","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/subscribable.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/focusManager.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/timeoutManager.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/utils.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/environmentManager.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/thenable.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/notifyManager.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/onlineManager.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/retryer.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/removable.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/infiniteQueryBehavior.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/query.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/queryObserver.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.js","../../node_modules/.pnpm/@tanstack+query-core@5.101.4/node_modules/@tanstack/query-core/build/modern/queriesObserver.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/errorBoundaryUtils.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/suspense.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/useQueries.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/useQuery.js","../../node_modules/.pnpm/@tanstack+react-query@5.101.4_react@19.2.8/node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowBendUpLeft.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowBendUpRight.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowDown.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowLeft.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowRight.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowSquareOut.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowUp.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowsClockwise.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ArrowsDownUp.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/At.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Basketball.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Bell.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/BellRinging.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/BellSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Bookmark.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/CaretLeft.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/CaretRight.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/CaretUp.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ChatCircle.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ChatCircleDots.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ChatTeardropDots.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ChatText.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Chats.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Check.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Checkerboard.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Checks.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Clock.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ClockCounterClockwise.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/CodeBlock.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Code.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Coffee.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Copy.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Cross.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Desktop.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Devices.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/DotsSixVertical.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/DotsThree.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/DotsThreeOutlineVertical.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Download.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/DownloadSimple.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/EnvelopeSimple.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/File.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Flag.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Flask.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Funnel.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/GearSix.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Gif.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Globe.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/GridFour.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Hash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/HashStraight.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Headphones.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Heart.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/House.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Image.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Images.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Keyboard.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Leaf.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Lightbulb.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Link.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ListBullets.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ListMagnifyingGlass.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ListNumbers.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Lock.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/MagnifyingGlass.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/MapPinPlus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Microphone.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/MicrophoneSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Minus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/MonitorArrowUp.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/PaintBrush.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Palette.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/PaperPlaneTilt.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Pause.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Peace.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/PencilSimple.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/PersonSimpleCircle.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Phone.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/PhoneDisconnect.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Play.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Plus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/PlusCircle.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/PushPin.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/PushPinSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Quotes.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ShareNetwork.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Shield.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/ShieldWarning.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/SignIn.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/SignOut.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Smiley.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/SmileySad.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/SortAscending.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/SpeakerHigh.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/SpeakerSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/SquaresFour.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Star.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Sticker.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Stop.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Sun.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Terminal.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/TextAa.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/TextB.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/TextHOne.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/TextHThree.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/TextHTwo.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/TextItalic.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/TextStrikethrough.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/TextUnderline.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Trash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Tray.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/UserCircle.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/UserMinus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/UserPlus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/UsersThree.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/VideoCamera.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/VideoCameraSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowBendUpLeft.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowBendUpRight.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowDown.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowLeft.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowRight.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowSquareOut.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowUp.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowsClockwise.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ArrowsDownUp.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/At.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Basketball.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Bell.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/BellRinging.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/BellSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Bookmark.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/CaretLeft.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/CaretRight.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/CaretUp.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ChatCircle.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ChatCircleDots.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ChatTeardropDots.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ChatText.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Chats.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Check.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Checkerboard.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Checks.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Clock.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ClockCounterClockwise.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/CodeBlock.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Code.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Coffee.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Copy.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Cross.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Desktop.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Devices.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/DotsSixVertical.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/DotsThree.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/DotsThreeOutlineVertical.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Download.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/DownloadSimple.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/EnvelopeSimple.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/File.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Flag.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Flask.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Funnel.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/GearSix.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Gif.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Globe.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/GridFour.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Hash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/HashStraight.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Headphones.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Heart.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/House.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Image.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Images.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Keyboard.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Leaf.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Lightbulb.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Link.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ListBullets.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ListMagnifyingGlass.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ListNumbers.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Lock.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/MagnifyingGlass.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/MapPinPlus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Microphone.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/MicrophoneSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Minus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/MonitorArrowUp.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/PaintBrush.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Palette.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/PaperPlaneTilt.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Pause.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Peace.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/PencilSimple.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/PersonSimpleCircle.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Phone.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/PhoneDisconnect.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Play.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Plus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/PlusCircle.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/PushPin.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/PushPinSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Quotes.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ShareNetwork.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Shield.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/ShieldWarning.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/SignIn.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/SignOut.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Smiley.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/SmileySad.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/SortAscending.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/SpeakerHigh.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/SpeakerSlash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/SquaresFour.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Star.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Sticker.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Stop.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Sun.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Terminal.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/TextAa.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/TextB.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/TextHOne.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/TextHThree.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/TextHTwo.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/TextItalic.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/TextStrikethrough.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/TextUnderline.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Trash.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Tray.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/UserCircle.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/UserMinus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/UserPlus.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/UsersThree.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/VideoCamera.es.js","../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/VideoCameraSlash.es.js","../../src/app/plugins/matrix-to.ts","../../src/app/state/lastCompositionEnd.ts","../../src/app/hooks/useComposingCheck.ts","../../node_modules/.pnpm/@tanstack+virtual-core@3.17.7/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js","../../node_modules/.pnpm/@tanstack+virtual-core@3.17.7/node_modules/@tanstack/virtual-core/dist/esm/utils.js","../../node_modules/.pnpm/@tanstack+virtual-core@3.17.7/node_modules/@tanstack/virtual-core/dist/esm/index.js","../../node_modules/.pnpm/@tanstack+react-virtual@3.14.9_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@tanstack/react-virtual/dist/esm/index.js","../../src/app/hooks/useSpace.ts","../../src/unstable/prefixes/msc/profile.ts","../../src/unstable/prefixes/sable/profile.ts","../../src/unstable/prefixes/sable/event_misc.ts","../../src/app/state/room/lastRoom.ts","../../src/app/hooks/usePrefersReducedMotion.ts","../../src/app/plugins/custom-emoji/imagePackCache.ts","../../src/app/pages/roomRouteMatch.ts","../../src/app/hooks/useStateEventCallback.ts","../../src/app/hooks/useForceUpdate.ts","../../src/app/hooks/useStateEvent.ts","../../src/app/hooks/useMatrixClient.ts","../../src/app/hooks/usePowerLevels.ts","../../src/app/hooks/useRoom.ts","../../src/app/hooks/useKeyDown.ts","../../src/app/utils/notifications.ts","../../src/client/roomMemberHydration.ts","../../src/app/hooks/useRoomMembers.ts","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/WidgetApiDirection.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/ApiVersion.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/transport/PostmessageTransport.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/WidgetApiAction.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/GetOpenIDAction.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/WidgetType.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/ModalWidgetActions.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/models/WidgetEventCapability.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/Symbols.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/UpdateDelayedEventAction.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/WidgetApi.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/Capabilities.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/util/SimpleObservable.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/ClientWidgetApi.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/IWidgetApiErrorResponse.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/WidgetKind.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/interfaces/ModalButtonKind.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/models/validation/url.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/models/validation/utils.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/models/Widget.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/models/WidgetParser.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/templating/url-template.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/driver/WidgetDriver.js","../../node_modules/.pnpm/matrix-widget-api@1.17.0/node_modules/matrix-widget-api/lib/index.js","../../src/app/plugins/call/utils.ts","../../src/app/plugins/call/CallWidgetDriver.ts","../../src/app/plugins/call/types.ts","../../node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.mjs","../../node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.js","../../src/app/plugins/call/CallControlState.ts","../../src/app/plugins/call/elementCallDomAdapter.ts","../../src/app/plugins/call/CallControl.ts","../../src/app/plugins/call/CallEmbed.ts","../../src/app/plugins/call/hooks.ts","../../src/app/hooks/useTheme.ts","../../src/app/state/callOwner.ts","../../src/app/state/callEmbed.ts","../../src/app/hooks/useMatrixRTCSession.tsx","../../src/app/hooks/useCall.ts","../../src/app/features/call/canvasCamera.ts","../../src/app/state/livekitJsCall.ts","../../src/app/state/nativeCall.ts","../../src/app/features/call/livekitJsCallManager.tsx","../../node_modules/.pnpm/@sableclient+tauri-plugin-livekit-mobile@0.2.0/node_modules/@sableclient/tauri-plugin-livekit-mobile/dist-js/index.js","../../src/app/features/call/nativeCallProbe.ts","../../src/app/features/call/nativeTransport.ts","../../src/app/features/call/nativeCallController.ts","../../src/app/features/call/nativeCallManager.ts","../../src/app/hooks/useCallEmbed.ts","../../src/app/hooks/useLivekitSupport.ts","../../src/app/utils/rtc.ts","../../src/app/features/call/useCallStartCapabilities.ts","../../src/app/hooks/useMediaAuthentication.ts","../../src/app/state/userRoomProfile.ts","../../src/app/state/hooks/userRoomProfile.ts","../../src/app/components/sequence-card/SequenceCard.tsx","../../src/app/utils/room/directMember.ts","../../src/app/utils/room/display.ts","../../src/app/utils/colorMXID.ts","../../src/app/components/user-avatar/UserAvatar.tsx","../../src/app/features/call/CallMemberCard.tsx","../../src/app/features/call/Controls.tsx","../../src/app/state/hooks/callPreferences.ts","../../node_modules/.pnpm/@livekit+components-react@2.9.23_livekit-client@2.21.0_@types+dom-mediacapture-record@1_c8bc678bcba86fddc38b37c8e9733a2f/node_modules/@livekit/components-react/dist/contexts-BtSGUJjc.mjs","../../node_modules/.pnpm/@livekit+components-react@2.9.23_livekit-client@2.21.0_@types+dom-mediacapture-record@1_c8bc678bcba86fddc38b37c8e9733a2f/node_modules/@livekit/components-react/dist/room-BC_ml4G1.mjs","../../node_modules/.pnpm/@livekit+components-react@2.9.23_livekit-client@2.21.0_@types+dom-mediacapture-record@1_c8bc678bcba86fddc38b37c8e9733a2f/node_modules/@livekit/components-react/dist/hooks-C7fu1g_i.mjs","../../node_modules/.pnpm/@livekit+components-react@2.9.23_livekit-client@2.21.0_@types+dom-mediacapture-record@1_c8bc678bcba86fddc38b37c8e9733a2f/node_modules/@livekit/components-react/dist/components-zhA5OhZT.mjs","../../node_modules/.pnpm/@livekit+components-react@2.9.23_livekit-client@2.21.0_@types+dom-mediacapture-record@1_c8bc678bcba86fddc38b37c8e9733a2f/node_modules/@livekit/components-react/dist/prefabs.mjs","../../src/app/features/call/CallDevicePreview.tsx","../../src/app/features/call/PrescreenControls.tsx","../../src/app/features/call/LivekitCallParticipant.tsx","../../src/app/features/call/callChrome.tsx","../../src/app/features/call/LivekitJsCallSurface.tsx","../../src/app/components/ResponsiveMenu.tsx","../../src/app/hooks/useMobileLongPress.ts","../../src/app/hooks/useMenuAnchor.ts","../../src/app/features/call/nativeVideoOverlay.ts","../../src/app/hooks/router/useSelectedRoom.ts","../../src/app/features/call/callClient.ts","../../src/app/features/call/NativeCallSurface.tsx","../../src/app/features/call/CallView.tsx","../../src/app/hooks/useRoomWidgets.ts","../../src/app/hooks/useRoomCreators.ts","../../src/app/hooks/useRoomPermissions.ts","../../src/app/features/widgets/GenericWidgetDriver.ts","../../src/app/features/widgets/WidgetIframe.tsx","../../src/app/hooks/useIntegrationManager.ts","../../src/app/features/widgets/IntegrationManager.tsx","../../src/app/pages/client/sidebar/SidebarResizer.tsx","../../src/app/features/widgets/WidgetsDrawer.tsx","../../src/app/state/room/roomToOpenThread.ts","../../src/app/state/room/roomToThreadBrowser.ts","../../src/app/utils/abbreviations.ts","../../src/app/hooks/useSyncState.ts","../../src/app/state/room/roomToParents.ts","../../src/app/hooks/useRoomAbbreviations.ts","../../src/app/components/icons/roomIcons.tsx","../../src/app/utils/bgColorImg.js","../../src/app/components/room-avatar/AvatarImage.tsx","../../src/app/components/room-avatar/RoomAvatar.tsx","../../node_modules/.pnpm/linkifyjs@4.3.3/node_modules/linkifyjs/dist/linkify.mjs","../../node_modules/.pnpm/linkify-react@4.3.3_linkifyjs@4.3.3_react@19.2.8/node_modules/linkify-react/dist/linkify-react.mjs","../../node_modules/.pnpm/html-dom-parser@8.0.0/node_modules/html-dom-parser/lib/client/constants.js","../../node_modules/.pnpm/domelementtype@3.0.0/node_modules/domelementtype/dist/index.js","../../node_modules/.pnpm/domhandler@6.0.1/node_modules/domhandler/dist/node.js","../../node_modules/.pnpm/domhandler@6.0.1/node_modules/domhandler/dist/index.js","../../node_modules/.pnpm/html-dom-parser@8.0.0/node_modules/html-dom-parser/lib/client/utilities.js","../../node_modules/.pnpm/html-dom-parser@8.0.0/node_modules/html-dom-parser/lib/client/domparser.js","../../node_modules/.pnpm/html-dom-parser@8.0.0/node_modules/html-dom-parser/lib/client/html-to-dom.js","../../node_modules/.pnpm/react-property@2.0.2/node_modules/react-property/lib/possibleStandardNamesOptimized.js","../../node_modules/.pnpm/react-property@2.0.2/node_modules/react-property/lib/index.js","../../node_modules/.pnpm/inline-style-parser@0.2.9/node_modules/inline-style-parser/cjs/index.js","../../node_modules/.pnpm/style-to-object@2.0.2/node_modules/style-to-object/cjs/index.js","../../node_modules/.pnpm/style-to-js@2.0.2/node_modules/style-to-js/dist/index.js","../../node_modules/.pnpm/html-react-parser@6.1.5_@types+react@19.2.17_react@19.2.8/node_modules/html-react-parser/lib/utilities.js","../../node_modules/.pnpm/html-react-parser@6.1.5_@types+react@19.2.17_react@19.2.8/node_modules/html-react-parser/lib/attributes-to-props.js","../../node_modules/.pnpm/html-react-parser@6.1.5_@types+react@19.2.17_react@19.2.8/node_modules/html-react-parser/lib/dom-to-react.js","../../node_modules/.pnpm/html-react-parser@6.1.5_@types+react@19.2.17_react@19.2.8/node_modules/html-react-parser/lib/index.js","../../node_modules/.pnpm/html-react-parser@6.1.5_@types+react@19.2.17_react@19.2.8/node_modules/html-react-parser/esm/index.mjs","../../src/app/utils/emojiDetection.ts","../../src/app/utils/findAndReplace.ts","../../src/app/utils/matrixHtml.ts","../../src/app/hooks/useTimeoutToggle.ts","../../src/app/features/settings/routes.ts","../../src/app/features/settings/settingsLink.ts","../../src/app/components/ClientSideHoverFreeze.tsx","../../src/app/plugins/arborium/runtime.ts","../../src/app/plugins/arborium/themes.ts","../../src/app/plugins/arborium/ArboriumThemeBridge.tsx","../../src/app/components/code-highlight/CodeHighlightRenderer.tsx","../../src/app/components/media/Image.tsx","../../src/app/components/media/Video.tsx","../../src/app/components/media/MediaControls.tsx","../../src/app/plugins/matrix-uri.ts","../../node_modules/.pnpm/emojibase@17.0.0/node_modules/emojibase/esm/index.js","../../src/app/plugins/emoji.ts","../../src/app/plugins/react-custom-html-parser.tsx","../../src/app/components/room-topic-viewer/RoomTopicViewer.tsx","../../src/app/utils/room/unread.ts","../../src/app/state/mDirectList.ts","../../src/app/state/nicknames.ts","../../src/app/hooks/useAccountDataCallback.ts","../../src/app/hooks/useNickname.ts","../../src/app/hooks/useRoomMeta.ts","../../src/app/state/room-list/utils.ts","../../src/app/state/room-list/roomList.ts","../../src/app/components/BackRouteHandler.tsx","../../src/app/hooks/useRoomPinnedEvents.ts","../../src/app/state/roomSettings.ts","../../src/app/state/hooks/roomSettings.ts","../../src/app/hooks/useRoomEvent.ts","../../src/app/components/message/layout/Modern.tsx","../../src/app/components/message/layout/Compact.tsx","../../src/app/components/message/layout/Bubble.tsx","../../src/app/components/message/layout/Base.tsx","../../src/app/components/message/placeholder/LinePlaceholder.tsx","../../src/app/components/message/placeholder/CompactPlaceholder.tsx","../../src/app/components/message/placeholder/DefaultPlaceholder.tsx","../../src/app/components/message/Reaction.tsx","../../src/app/components/message/ReactionKeyInline.tsx","../../src/app/utils/textDiff.ts","../../src/app/components/message/InlineTextDiff.tsx","../../src/app/components/message/attachment/Attachment.tsx","../../node_modules/.pnpm/dompurify@3.4.13/node_modules/dompurify/dist/purify.es.mjs","../../src/app/utils/sanitize.ts","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/limit.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/clip_rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/type.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/unpack.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/last.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/input.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/Color.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/version.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/chroma.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/colors/w3cx11.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hex/hex2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hex/rgb2hex.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/named/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/alpha.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/clipped.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lab/lab-constants.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lab/lab2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lab/rgb2lab.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lab/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/darken.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/get.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/luminance.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/mix.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/mix.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/premultiply.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/lch2lab.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/lch2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/hcl2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/lab2lch.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/rgb2lch.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/lch/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/saturate.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/set.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/ops/shade.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/lrgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/lab.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/_hsx.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/lch.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/num/num2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/num/rgb2num.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/num/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/num.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hcg/hcg2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hcg/rgb2hcg.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hcg/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/hcg.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsi/hsi2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsi/rgb2hsi.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsi/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/hsi.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsl/hsl2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsl/rgb2hsl.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsl/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/hsl.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsv/hsv2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsv/rgb2hsv.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hsv/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/hsv.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/multiply-matrices.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklab/oklab2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklab/rgb2oklab.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklab/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/oklab.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/interpolator/oklch.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/average.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/scale.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/bezier.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/rgb/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/blend.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/cubehelix.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/generator/random.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/analyze.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/contrast.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/contrastAPCA.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/delta-e.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/distance.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/valid.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/utils/scales.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/colors/colorbrewer.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/cmyk/cmyk2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/cmyk/rgb2cmyk.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/cmyk/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/hsl2css.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/lab2css.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/lch2css.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/oklab2css.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklch/rgb2oklch.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/oklch2css.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/rgb2css.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklch/oklch2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/css2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/css/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/gl/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/hex/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/temp/temperature2rgb.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/temp/rgb2temperature.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/temp/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/src/io/oklch/index.js","../../node_modules/.pnpm/chroma-js@3.2.0/node_modules/chroma-js/index.js","../../src/app/plugins/color.ts","../../src/app/hooks/useAccessibleNameColor.ts","../../src/app/hooks/usePowerLevelTags.ts","../../src/app/hooks/useRoomCreatorsTag.ts","../../src/app/hooks/useMemberPowerTag.ts","../../src/app/utils/shadeColor.ts","../../src/app/hooks/useTimelineScrollActivity.ts","../../src/app/hooks/useUserProfile.ts","../../src/app/hooks/useSableCosmetics.ts","../../src/app/hooks/useAccountData.ts","../../src/app/hooks/useIgnoredUsers.ts","../../src/app/hooks/useRoomMemberHydration.ts","../../src/app/hooks/useMemberEventParser.tsx","../../src/app/pages/client/shallowRoute.ts","../../src/app/pages/client/useShallowRoute.ts","../../src/app/features/settings/useOpenSettings.ts","../../src/app/hooks/router/useSelectedSpace.ts","../../src/app/hooks/useRoomNavigate.ts","../../src/app/hooks/useMentionClickHandler.ts","../../node_modules/.pnpm/react-i18next@17.0.11_i18next@26.3.6_typescript@7.0.2__react-dom@19.2.8_react@19.2.8__react@19.2.8_typescript@7.0.2/node_modules/react-i18next/dist/es/utils.js","../../node_modules/.pnpm/react-i18next@17.0.11_i18next@26.3.6_typescript@7.0.2__react-dom@19.2.8_react@19.2.8__react@19.2.8_typescript@7.0.2/node_modules/react-i18next/dist/es/unescape.js","../../node_modules/.pnpm/react-i18next@17.0.11_i18next@26.3.6_typescript@7.0.2__react-dom@19.2.8_react@19.2.8__react@19.2.8_typescript@7.0.2/node_modules/react-i18next/dist/es/defaults.js","../../node_modules/.pnpm/react-i18next@17.0.11_i18next@26.3.6_typescript@7.0.2__react-dom@19.2.8_react@19.2.8__react@19.2.8_typescript@7.0.2/node_modules/react-i18next/dist/es/i18nInstance.js","../../node_modules/.pnpm/react-i18next@17.0.11_i18next@26.3.6_typescript@7.0.2__react-dom@19.2.8_react@19.2.8__react@19.2.8_typescript@7.0.2/node_modules/react-i18next/dist/es/context.js","../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@19.2.8/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@19.2.8/node_modules/use-sync-external-store/shim/index.js","../../node_modules/.pnpm/react-i18next@17.0.11_i18next@26.3.6_typescript@7.0.2__react-dom@19.2.8_react@19.2.8__react@19.2.8_typescript@7.0.2/node_modules/react-i18next/dist/es/useTranslation.js","../../src/app/features/settings/useSettingsLinkBaseUrl.ts","../../src/app/utils/tauriMediaEncryption.ts","../../src/app/hooks/useObjectURL.ts","../../src/app/utils/mimeTypes.ts","../../src/app/components/message/content/ThumbnailContent.tsx","../../node_modules/.pnpm/blurhash@2.0.5/node_modules/blurhash/dist/esm/index.js","../../node_modules/.pnpm/react-blurhash@0.3.0_blurhash@2.0.5_react@19.2.8/node_modules/react-blurhash/dist/esm/index.js","../../src/app/utils/blurHash.ts","../../src/app/utils/externalGif.ts","../../src/app/utils/klipy.ts","../../src/app/hooks/useFavoriteGifs.ts","../../src/app/hooks/useMobileTapActivation.ts","../../src/app/components/message/content/ImageContent.tsx","../../src/app/components/message/content/VideoContent.tsx","../../node_modules/.pnpm/react-range@1.10.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-range/lib/types.js","../../node_modules/.pnpm/react-range@1.10.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-range/lib/utils.js","../../node_modules/.pnpm/react-range@1.10.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-range/lib/Range.js","../../node_modules/.pnpm/react-range@1.10.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-range/lib/index.js","../../src/app/hooks/media/useMediaPlay.ts","../../src/app/hooks/media/useMediaPlayTimeCallback.ts","../../src/app/hooks/media/useMediaSeek.ts","../../src/app/hooks/media/useMediaVolume.ts","../../src/app/hooks/media/useMediaLoading.ts","../../src/app/hooks/useThrottle.ts","../../src/app/components/message/content/AudioContent.tsx","../../node_modules/.pnpm/file-saver@2.0.5/node_modules/file-saver/dist/FileSaver.min.js","../../src/app/state/toast.ts","../../src/app/utils/download.ts","../../src/app/components/message/content/FileContent.tsx","../../src/app/utils/cspNonce.ts","../../src/app/theme/previewCss.ts","../../src/app/components/text-viewer/TextViewer.tsx","../../src/app/components/theme/CssViewerButton.tsx","../../src/app/components/theme/ThemePreviewCard.tsx","../../src/app/features/settings/cosmetics/themeSettingsPatch.ts","../../src/app/theme/cache.ts","../../src/app/theme/metadata.ts","../../src/app/theme/processThemeImport.ts","../../src/app/theme/themeApproval.ts","../../src/app/theme/themeLibrary.ts","../../src/app/components/message/content/UploadedSableCssContent.tsx","../../src/app/components/message/content/FallbackContent.tsx","../../src/app/components/message/content/EventContent.tsx","../../src/app/utils/pronouns.ts","../../src/app/persona/projection.ts","../../src/app/persona/proxy.ts","../../src/app/persona/selection.ts","../../src/app/utils/keyedQueue.ts","../../src/app/persona/catalog.ts","../../src/app/hooks/usePerMessageProfile.ts","../../src/app/components/message/Reply.tsx","../../node_modules/.pnpm/dayjs@1.11.21/node_modules/dayjs/dayjs.min.js","../../node_modules/.pnpm/dayjs@1.11.21/node_modules/dayjs/plugin/isToday.js","../../node_modules/.pnpm/dayjs@1.11.21/node_modules/dayjs/plugin/isYesterday.js","../../src/app/utils/time.ts","../../src/app/components/message/Time.tsx","../../src/app/components/message/FileHeader.tsx","../../src/app/state/modal.ts","../../src/app/hooks/useGetRoom.ts","../../src/app/hooks/useMessageTargetRooms.ts","../../src/app/state/hooks/roomList.ts","../../src/app/utils/AsyncSearch.ts","../../src/app/hooks/useAsyncSearch.ts","../../src/app/hooks/useListFocusIndex.ts","../../src/app/utils/room/unreadResolver.ts","../../src/app/hooks/useNotificationMode.ts","../../src/app/hooks/useRoomsNotificationPreferences.ts","../../src/app/hooks/useMatrixEvent.ts","../../src/app/state/room/roomToUnread.ts","../../src/app/components/unread-badge/UnreadBadge.tsx","../../src/app/features/navigate/RoomSearch.tsx","../../src/app/components/message/modals/MessageForward.tsx","../../src/app/components/editor/autocomplete/BaseAutocompleteMenu.tsx","../../src/app/components/editor/autocomplete/AutocompleteMenu.tsx","../../src/app/components/editor/autocomplete/autocompleteQuery.ts","../../src/app/components/editor/autocomplete/useAutocompleteQuery.ts","../../src/app/components/editor/types.ts","../../src/app/components/editor/utils.ts","../../src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx","../../src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx","../../src/app/plugins/recent-emoji.ts","../../src/app/hooks/useRecentEmoji.ts","../../src/app/hooks/useImagePacks.ts","../../src/app/plugins/utils.ts","../../src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx","../../src/app/components/editor/ProseMirrorEditable.tsx","../../node_modules/.pnpm/orderedmap@2.1.1/node_modules/orderedmap/dist/index.js","../../node_modules/.pnpm/prosemirror-model@1.25.11/node_modules/prosemirror-model/dist/index.js","../../node_modules/.pnpm/prosemirror-transform@1.12.0/node_modules/prosemirror-transform/dist/index.js","../../node_modules/.pnpm/prosemirror-state@1.4.4/node_modules/prosemirror-state/dist/index.js","../../node_modules/.pnpm/prosemirror-commands@1.7.2/node_modules/prosemirror-commands/dist/index.js","../../node_modules/.pnpm/rope-sequence@1.3.4/node_modules/rope-sequence/dist/index.js","../../node_modules/.pnpm/prosemirror-history@1.5.0/node_modules/prosemirror-history/dist/index.js","../../node_modules/.pnpm/w3c-keyname@2.2.8/node_modules/w3c-keyname/index.js","../../node_modules/.pnpm/prosemirror-keymap@1.2.3/node_modules/prosemirror-keymap/dist/index.js","../../node_modules/.pnpm/prosemirror-view@1.42.2/node_modules/prosemirror-view/dist/index.js","../../src/app/components/editor/model.ts","../../src/app/components/editor/prosemirrorNodeViews.ts","../../src/app/components/editor/prosemirrorSchema.ts","../../src/app/components/editor/prosemirrorController.ts","../../src/app/components/editor/keyboard.ts","../../src/app/components/editor/useEditorRenderContext.ts","../../src/app/components/editor/Editor.tsx","../../src/app/plugins/markdown/utils.ts","../../node_modules/.pnpm/marked@18.0.10/node_modules/marked/lib/marked.esm.js","../../src/app/plugins/markdown/extensions/matrix-spoiler.ts","../../src/app/plugins/markdown/extensions/matrix-math.ts","../../src/app/plugins/markdown/extensions/matrix-subscript.ts","../../src/app/plugins/markdown/extensions/matrix-emoticon.ts","../../src/app/plugins/markdown/extensions/matrix-underline.ts","../../src/app/plugins/markdown/extensions/matrix-mfm-color.ts","../../src/app/plugins/markdown/expandBlockNewlines.ts","../../src/app/plugins/markdown/allowedHtmlTags.ts","../../src/app/plugins/markdown/markdownToHtml.ts","../../node_modules/.pnpm/html-dom-parser@8.0.2/node_modules/html-dom-parser/esm/client/constants.mjs","../../node_modules/.pnpm/html-dom-parser@8.0.2/node_modules/html-dom-parser/esm/client/utilities.mjs","../../node_modules/.pnpm/html-dom-parser@8.0.2/node_modules/html-dom-parser/esm/client/domparser.mjs","../../node_modules/.pnpm/html-dom-parser@8.0.2/node_modules/html-dom-parser/esm/client/html-to-dom.mjs","../../src/app/plugins/markdown/htmlToMarkdown.ts","../../src/app/plugins/markdown/injectDataMd.ts","../../src/app/components/editor/output.ts","../../src/app/components/editor/matrixMentionMarkdown.ts","../../src/app/components/editor/input.ts","../../src/app/components/editor/MarkdownToolbar.tsx","../../src/app/components/editor/ProseMirrorEditorSurface.tsx","../../src/app/components/message/MsgTypeRenderers.tsx","../../src/app/components/message/RenderBody.tsx","../../src/app/components/message/MGallery.tsx","../../src/app/components/virtualizer/VirtualTile.tsx","../../src/app/hooks/useImageGestures.ts","../../src/app/components/image-viewer/ImageViewer.tsx","../../src/app/components/url-preview/UrlPreview.tsx","../../src/app/components/url-preview/UrlPreviewCard.tsx","../../src/app/components/url-preview/ClientPreview.tsx","../../src/app/theme/previewUrls.ts","../../src/app/components/url-preview/ThemeThirdPartyBanner.tsx","../../src/app/components/url-preview/SableChatPreviewPlaceholder.tsx","../../src/app/components/url-preview/ThemePreviewUrlCard.tsx","../../src/app/components/url-preview/TweakPreviewUrlCard.tsx","../../src/app/plugins/pdfjs-dist.ts","../../src/app/components/Pdf-viewer/PdfViewer.tsx","../../src/app/components/message/MCuteEvent.tsx","../../src/app/features/settings/SettingsLinkContext.tsx","../../src/app/components/setting-tile/SettingTile.tsx","../../src/app/components/setting-tile/SettingToggle.tsx","../../src/app/features/room/poll-modals/PollDialog.tsx","../../src/app/features/room/poll-modals/PollResponses.tsx","../../src/app/components/message/PollEvent.tsx","../../src/types/matrix/common.ts","../../src/app/components/RenderMessageContent.tsx","../../src/app/components/power/PowerColorBadge.tsx","../../src/app/components/power/PowerIcon.tsx","../../src/app/components/setting-menu-selector/SettingMenuSelector.tsx","../../src/app/components/power/PowerSelector.tsx","../../src/app/components/emoji-board/useEmojiGroupIcons.ts","../../src/app/components/emoji-board/useEmojiGroupLabels.ts","../../src/app/utils/gifProviders.ts","../../src/app/components/emoji-board/types.ts","../../src/app/components/emoji-board/components/SearchInput.tsx","../../src/app/components/emoji-board/components/Tabs.tsx","../../src/app/components/emoji-board/components/Sidebar.tsx","../../src/app/components/emoji-board/components/NoStickerPacks.tsx","../../src/app/components/emoji-board/components/NoGifResults.tsx","../../src/app/components/emoji-board/components/Preview.tsx","../../src/app/components/emoji-board/components/Item.tsx","../../src/app/components/emoji-board/components/Group.tsx","../../src/app/components/emoji-board/components/Layout.tsx","../../src/app/components/emoji-board/useGifSearch.ts","../../src/app/components/emoji-board/EmojiBoard.tsx","../../src/app/hooks/useRelations.ts","../../src/app/features/room/reaction-viewer/ReactionViewer.tsx","../../src/app/features/room/message/Reactions.tsx","../../node_modules/.pnpm/react-aria@3.50.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-aria/dist/private/utils/domHelpers.mjs","../../node_modules/.pnpm/react-stately@3.48.0_react@19.2.8/node_modules/react-stately/dist/private/flags/flags.mjs","../../node_modules/.pnpm/react-aria@3.50.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-aria/dist/private/utils/shadowdom/DOMFunctions.mjs","../../node_modules/.pnpm/react-aria@3.50.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-aria/dist/private/utils/useLayoutEffect.mjs","../../node_modules/.pnpm/react-aria@3.50.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-aria/dist/private/interactions/utils.mjs","../../node_modules/.pnpm/react-aria@3.50.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-aria/dist/private/utils/useGlobalListeners.mjs","../../node_modules/.pnpm/react-aria@3.50.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-aria/dist/private/interactions/useFocusWithin.mjs","../../node_modules/.pnpm/react-aria@3.50.0_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/react-aria/dist/private/interactions/useHover.mjs","../../src/app/utils/haptics.ts","../../src/app/components/page/MobileNavDrawerContext.ts","../../src/app/components/page/mobileSwipeCoordinator.ts","../../src/app/utils/nativeAnimation.ts","../../src/app/components/SwipeableMessageWrapper.tsx","../../src/app/features/room/buildReplacementContent.ts","../../src/app/hooks/useSpoilerClickHandler.ts","../../src/app/features/room/message/hiddenLinkPreviews.ts","../../src/app/features/room/message/MessageEditor.tsx","../../src/app/components/message/modals/MessageReport.tsx","../../src/app/components/message/modals/MessageReactions.tsx","../../src/app/hooks/useRoomEventReaders.ts","../../src/app/components/event-readers/EventReaders.tsx","../../src/app/components/message/modals/MessageReadRecipts.tsx","../../src/app/utils/addStickerToDefaultStickerPack.ts","../../src/app/state/upload.ts","../../src/app/state/room/roomInputDrafts.ts","../../src/app/state/list.ts","../../src/app/components/event-history/EventHistory.tsx","../../src/app/components/message/modals/MessageEditHistory.tsx","../../src/app/components/message/modals/MessageSource.tsx","../../src/app/components/message/modals/MessageDelete.tsx","../../src/app/features/bookmarks/bookmarkDomain.ts","../../src/app/features/bookmarks/bookmarkRepository.ts","../../src/app/state/bookmarks.ts","../../src/app/hooks/useBookmarks.ts","../../src/app/utils/favoriteGif.ts","../../src/app/features/room/persona-picker/PersonaPicker.tsx","../../src/app/components/message/modals/Options.tsx","../../src/app/features/room/message/messageTouch.ts","../../src/app/features/room/message/Message.tsx","../../src/app/utils/decryptScheduler.ts","../../src/app/features/room/message/EncryptedContent.tsx","../../src/app/hooks/useMatrixEventRenderer.ts","../../src/app/components/message-preview/MessagePreview.tsx","../../src/app/features/room/room-pin-menu/RoomPinMenu.tsx","../../src/app/features/room/RoomCallButton.tsx","../../src/app/hooks/useDirectUsers.ts","../../src/app/components/AsyncError.tsx","../../src/app/components/invite-user-prompt/InviteUserPrompt.tsx","../../src/app/components/modal-overlay/PromptDialog.tsx","../../src/app/components/direct-invite-prompt/DirectInvitePrompt.tsx","../../src/app/components/setting-menu-selector/options.ts","../../src/app/components/RoomNotificationSwitcher.tsx","../../src/app/components/cutout-card/CutoutCard.tsx","../../src/app/components/time-date/PickerColumn.tsx","../../src/app/components/time-date/TimePicker.tsx","../../src/app/components/time-date/DatePicker.tsx","../../src/app/features/room/jump-to-time/JumpToTime.tsx","../../src/app/state/hooks/unread.ts","../../src/app/components/confirm/confirm.tsx","../../src/app/hooks/useRoomMenuActions.ts","../../src/app/features/room/RoomMenu.tsx","../../src/app/features/room/RoomViewHeader.tsx","../../src/app/hooks/useUserPresence.ts","../../src/app/components/presence/Presence.tsx","../../src/app/components/typing-indicator/TypingIndicator.tsx","../../src/app/hooks/useIntersectionObserver.ts","../../src/app/components/scroll-top-container/ScrollTopContainer.tsx","../../src/app/state/typingMembers.ts","../../src/app/hooks/useRoomTypingMembers.ts","../../src/app/hooks/useMemberFilter.ts","../../src/app/hooks/useMemberSort.ts","../../src/app/components/MemberSortMenu.tsx","../../src/app/utils/formatCompactNumber.ts","../../src/app/features/room/MembersDrawer.tsx","../../src/app/components/SwipeableChatWrapper.tsx","../../src/app/components/message/modals/MessageReactionPicker.tsx","../../src/app/components/message/modals/MessageReproxyPicker.tsx","../../src/app/components/message/modals/GlobalModalManager.tsx","../../src/app/state/scheduledMessages.ts","../../src/app/utils/delayedEvents.ts","../../src/app/hooks/useDelayedEventsSupport.ts","../../src/app/hooks/useMessageEdit.ts","../../src/app/hooks/useRoomLatestRenderedEvent.ts","../../src/app/features/room/RoomViewFollowing.tsx","../../src/app/hooks/useTypingStatusUpdater.ts","../../src/app/hooks/useFilePicker.ts","../../src/app/hooks/useFilePasteHandler.ts","../../src/app/hooks/useFileDrop.ts","../../src/app/components/upload-card/UploadCard.tsx","../../src/app/hooks/useMediaConfig.ts","../../src/app/components/upload-card/UploadDescriptionEditor.tsx","../../src/app/components/upload-card/UploadCardRenderer.tsx","../../src/app/components/upload-card/CompactUploadCardRenderer.tsx","../../src/app/components/upload-board/UploadBoard.tsx","../../src/app/utils/sendFeedbackToUser.ts","../../src/app/utils/shortIdGen.ts","../../src/app/plugins/pluralkit-handler/PKitCommandMessageHandler.ts","../../src/app/hooks/commands/types.ts","../../src/app/hooks/commands/fun.ts","../../src/app/components/create-room/types.ts","../../src/app/components/create-room/CreateRoomAccessSelector.tsx","../../src/app/components/create-room/CreateRoomAliasInput.tsx","../../src/app/components/create-room/RoomVersionSelector.tsx","../../src/app/components/create-room/utils.ts","../../src/app/components/create-room/AdditionalCreatorInput.tsx","../../src/app/hooks/commands/membership.ts","../../src/app/hooks/commands/parsing.ts","../../src/app/hooks/commands/moderation.ts","../../src/app/utils/roomMemberProfile.ts","../../src/app/hooks/commands/profile.ts","../../src/app/hooks/commands/pmp.ts","../../src/app/hooks/commands/rainbow.ts","../../src/app/hooks/commands/raw.ts","../../src/app/hooks/commands/misc.ts","../../src/app/hooks/useCommands.ts","../../src/app/hooks/useImagePackRooms.ts","../../src/app/state/room/roomScheduleCoordinator.ts","../../src/app/components/editor/autocomplete/AutocompleteNotice.tsx","../../src/app/plugins/voice-recorder-kit/supportedCodec.ts","../../src/app/components/attachment-sheet/AttachmentContent.tsx","../../src/app/features/room/schedule-send/SchedulePickerDialog.tsx","../../src/app/features/room/schedule-send/ScheduledMessagesList.tsx","../../src/app/features/room/msgContent.ts","../../src/app/features/room/CommandAutocomplete.tsx","../../src/app/plugins/voice-recorder-kit/useVoiceRecorder.ts","../../src/app/features/room/AudioMessageRecorder.tsx","../../src/app/features/room/composerController.ts","../../src/app/features/room/settingsLinkMessage.ts","../../src/app/features/room/outgoingMessageTransforms.ts","../../src/app/features/room/composerMessage.ts","../../src/app/features/room/nativeFilePicker.ts","../../src/app/features/room/RoomInput.tsx","../../src/app/features/room/RoomInputPlaceholder.tsx","../../src/app/features/room/RoomTombstone.tsx","../../src/app/features/room/RoomViewTyping.tsx","../../node_modules/.pnpm/virtua@0.50.2_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/virtua/lib/index.js","../../src/app/components/room-intro/RoomIntro.tsx","../../src/app/hooks/useDocumentFocusChange.ts","../../src/app/hooks/router/useResolvedRoomId.ts","../../src/app/hooks/useSlidingSyncActiveRoom.ts","../../src/app/utils/timeline.ts","../../src/app/hooks/timeline/useTimelineSync.ts","../../src/app/hooks/timeline/useTimelineActions.ts","../../src/app/hooks/timeline/useProcessedTimeline.ts","../../src/app/hooks/timeline/useTimelineEventRenderer.tsx","../../src/app/components/image-viewer/RoomMediaViewer.tsx","../../src/app/hooks/timeline/useTimelineRendererContext.ts","../../src/app/hooks/timeline/useUrlPreviewPrefetch.ts","../../src/app/features/room/RoomTimeline.tsx","../../src/app/features/room/RoomView.tsx","../../src/app/features/room/CallChatView.tsx","../../src/app/features/room/ThreadDrawer.tsx","../../src/app/features/room/ThreadBrowser.tsx","../../src/app/features/room/Room.tsx","../../src/app/components/nav/NavCategory.tsx","../../src/app/components/nav/NavCategoryHeader.tsx","../../src/app/components/nav/NavEmptyLayout.tsx","../../src/app/components/nav/NavItem.tsx","../../src/app/components/nav/NavItemContent.tsx","../../src/app/components/nav/NavItemOptions.tsx","../../src/app/hooks/router/useRouteSelected.ts","../../src/app/components/MobileMenuItem.tsx","../../src/app/features/room-nav/RoomNavUser.tsx","../../src/app/components/sidebar/Sidebar.tsx","../../src/app/components/sidebar/SidebarItem.tsx","../../src/app/components/sidebar/SidebarUnreadBadge.tsx","../../src/app/components/sidebar/SidebarContent.tsx","../../src/app/components/sidebar/SidebarStack.tsx","../../src/app/components/sidebar/SidebarStackSeparator.tsx","../../src/app/components/sidebar/SidebarTab.tsx","../../src/app/features/room-nav/RoomNavItem.tsx","../../src/app/features/room-nav/RoomNavCategoryButton.tsx","../../src/app/state/utils/stringSetAtom.ts","../../src/app/state/closedNavCategories.ts","../../src/app/hooks/useCategoryHandler.ts","../../src/app/state/hooks/navToActivePath.ts","../../src/app/hooks/useNavToActivePathMapper.ts","../../src/app/state/room-list/inviteList.ts","../../src/app/state/updateInvites.ts","../../src/app/hooks/useDismissedInvites.ts","../../src/app/hooks/useInviteCount.ts","../../src/app/hooks/useInboxNotificationCount.ts","../../src/app/pages/client/sidebar/InboxTab.tsx","../../src/app/pages/client/sidebar/NavigateTab.tsx","../../src/app/hooks/useCrossSigning.ts","../../src/app/utils/matrix-crypto.ts","../../src/app/hooks/useDeviceVerificationStatus.ts","../../src/app/components/LogoutDialog.tsx","../../src/app/components/LogoutDialogOverlay.tsx","../../src/app/components/SettingsShell.tsx","../../src/app/state/desktopUpdate.ts","../../src/app/features/settings/about/About.tsx","../../src/app/features/settings/account/MatrixId.tsx","../../src/app/hooks/useCapabilities.ts","../../src/app/utils/msc4466.ts","../../src/app/features/settings/account/TimezoneEditor.tsx","../../src/app/features/settings/account/PronounEditor.tsx","../../src/app/features/settings/account/BioEditor.tsx","../../src/app/components/HexColorPickerPopOut.tsx","../../src/app/features/settings/account/NameColorEditor.tsx","../../src/app/features/settings/account/StatusEditor.tsx","../../src/app/features/settings/account/AnimalCosmetics.tsx","../../src/app/components/image-editor/ImageEditor.tsx","../../src/app/components/avatar-upload-tile/AvatarUploadTile.tsx","../../src/app/features/settings/account/Profile.tsx","../../src/app/features/settings/account/ContactInfo.tsx","../../src/app/features/settings/account/IgnoredUserList.tsx","../../src/app/features/settings/account/Account.tsx","../../src/app/features/settings/cosmetics/ThemeCatalogOnboarding.tsx","../../src/app/utils/share.ts","../../src/app/utils/file.ts","../../src/app/features/settings/cosmetics/ThemeImportModal.tsx","../../src/app/theme/githubRaw.ts","../../src/app/theme/catalog.ts","../../src/app/theme/syncedTweakCss.ts","../../src/app/theme/catalogDefaults.ts","../../src/app/theme/catalogUpdater.ts","../../src/app/features/settings/cosmetics/ThemeCatalogSettings.tsx","../../src/app/features/settings/cosmetics/ThemeAppearanceSection.tsx","../../src/app/features/common-settings/appearance/Appearance.tsx","../../src/app/features/settings/cosmetics/Themes.tsx","../../src/app/features/settings/cosmetics/LanguageSpecificPronouns.tsx","../../src/app/features/settings/cosmetics/app-icons/default.png","../../src-tauri/icons/app-icons/agender.svg","../../src-tauri/icons/app-icons/bisexual.svg","../../src-tauri/icons/app-icons/trans-gradient.svg","../../src-tauri/icons/app-icons/intersex.svg","../../src-tauri/icons/app-icons/lesbian.svg","../../src-tauri/icons/app-icons/mlm.svg","../../src/app/features/settings/cosmetics/app-icons/propeller.png","../../src-tauri/icons/app-icons/pride.svg","../../src/app/features/settings/cosmetics/app-icons/trans.png","../../src/app/features/settings/cosmetics/AppIconSettings.tsx","../../src/app/features/settings/cosmetics/Cosmetics.tsx","../../src/app/plugins/text-area/Cursor.ts","../../src/app/plugins/text-area/mods/Intent.ts","../../src/app/plugins/text-area/TextArea.ts","../../src/app/plugins/text-area/TextAreaOperations.ts","../../src/app/hooks/useTextAreaIntent.ts","../../src/app/hooks/useTextAreaCodeEditor.ts","../../src/app/components/AccountDataEditor.tsx","../../src/app/features/settings/developer-tools/AccountData.tsx","../../src/app/utils/mediaLoadDiagnostics.ts","../../src/app/features/settings/developer-tools/SyncDiagnostics.tsx","../../src/app/state/debugLogger.ts","../../src/app/features/settings/developer-tools/DebugLogViewer.tsx","../../src/app/features/settings/developer-tools/SentrySettings.tsx","../../src/app/features/settings/developer-tools/DevelopTools.tsx","../../src/app/hooks/useDeviceList.ts","../../src/app/hooks/useSecretStorage.ts","../../src/app/state/backupRestore.ts","../../src/app/hooks/useKeyBackup.ts","../../src/app/components/SecretStorage.tsx","../../src/app/hooks/useRestoreBackupOnVerification.ts","../../src/app/components/BackupRestore.tsx","../../src/app/utils/MegolmExportEncryption.ts","../../src/app/features/settings/devices/LocalBackup.tsx","../../src/app/features/settings/devices/DeviceTile.tsx","../../src/app/components/ActionUIA.tsx","../../src/app/components/DeviceVerificationStatus.ts","../../src/app/hooks/useAuthMetadata.ts","../../src/app/hooks/useAccountManagement.ts","../../src/app/components/ManualVerification.tsx","../../src/app/hooks/useVerificationRequest.ts","../../src/app/components/DeviceVerification.tsx","../../src/app/components/DeviceVerificationSetup.tsx","../../src/app/features/settings/devices/Verification.tsx","../../src/app/features/settings/devices/OtherDevices.tsx","../../src/app/features/settings/devices/Devices.tsx","../../src/app/components/image-pack-view/UsageSwitcher.tsx","../../src/app/components/image-pack-view/ImageTile.tsx","../../src/app/components/image-pack-view/PackMeta.tsx","../../src/app/components/image-pack-view/ImagePackContent.tsx","../../src/app/components/image-pack-view/RoomImagePack.tsx","../../src/app/components/image-pack-view/UserImagePack.tsx","../../src/app/components/image-pack-view/ImagePackView.tsx","../../src/app/features/settings/emojis-stickers/GlobalPacks.tsx","../../src/app/features/settings/emojis-stickers/UserPack.tsx","../../src/app/features/settings/emojis-stickers/EmojisStickers.tsx","../../src/app/features/settings/experimental/BandwithSavingEmojis.tsx","../../src/app/features/settings/experimental/MSC4268HistoryShare.tsx","../../src/app/features/settings/experimental/MSC4274MediaGalleries.tsx","../../src/app/features/settings/experimental/Experimental.tsx","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/bind.js","../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/bind-all.js","../../node_modules/.pnpm/bind-event-listener@3.0.0/node_modules/bind-event-listener/dist/index.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/honey-pot-data-attribute.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/is-honey-pot-element.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/get-element-from-point-without-honey-pot.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/typeof.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/max-z-index.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/popover-reset-styles.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/once.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/supports-popover.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/honey-pot-fix/make-honey-pot-fix.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../../node_modules/.pnpm/@babel+runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/is-firefox.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/is-safari.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/count-events-for-safari.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/is-from-another-window.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/changing-window/is-leaving-window.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/detect-broken-drag.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/get-input.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/dispatch-consumer-event.js","../../node_modules/.pnpm/raf-schd@4.0.3/node_modules/raf-schd/dist/raf-schd.esm.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/lifecycle-manager.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/ledger/usage-ledger.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/public-utils/combine.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/add-attribute.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-drop-target.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-monitor.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/make-adapter/make-adapter.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/android.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/util/media-types/text-media-type.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/adapter/element-adapter-native-data-key.js","../../node_modules/.pnpm/@atlaskit+pragmatic-drag-and-drop@2.0.2/node_modules/@atlaskit/pragmatic-drag-and-drop/dist/esm/adapter/element-adapter.js","../../src/app/utils/key-symbol.ts","../../src/app/utils/settingsSync.ts","../../src/app/hooks/useSettingsSync.ts","../../public/sound/invite.ogg","../../public/sound/notification.ogg","../../public/sound/ringtone.webm","../../src/app/features/call/callRingtone.ts","../../src/app/features/call/callRingtoneStorage.ts","../../src/app/features/call/callToneSources.ts","../../src/app/features/call/CallRingtoneManager.ts","../../src/app/features/settings/general/CallSoundSettingsCards.tsx","../../src/app/features/settings/general/CallSoundSettings.tsx","../../src/app/features/settings/general/General.tsx","../../src/app/features/settings/keyboard-shortcuts/KeyboardShortcuts.tsx","../../src/app/hooks/usePermission.ts","../../src/app/hooks/useEmailNotifications.ts","../../src/app/state/pushSubscription.ts","../../src/app/state/unifiedPushEndpoint.ts","../../src/app/features/settings/notifications/PushNotifications.tsx","../../src/app/features/settings/notifications/NativePushNotificationsApiClient.ts","../../src/app/features/settings/notifications/NativePushNotifications.ts","../../src/app/features/settings/notifications/NotificationTransport.ts","../../src/app/features/settings/notifications/DeregisterPushNotifications.tsx","../../src/app/features/settings/notifications/SystemNotification.tsx","../../src/app/features/settings/notifications/NotificationLevelsHint.tsx","../../src/app/hooks/usePushRule.ts","../../src/app/features/settings/notifications/notificationModeOptions.ts","../../src/app/features/settings/notifications/NotificationModeSwitcher.tsx","../../src/app/features/settings/notifications/AllMessages.tsx","../../src/app/features/settings/notifications/SpecialMessages.tsx","../../src/app/features/settings/notifications/KeywordMessages.tsx","../../src/app/features/settings/notifications/Notifications.tsx","../../src/app/features/settings/Persona/PerMessageProfileListItem.tsx","../../src/app/persona/pluralkit.ts","../../src/app/features/settings/Persona/PerMessageProfileOverview.tsx","../../src/app/features/settings/Persona/PKCompat.tsx","../../src/app/features/settings/Persona/PickerPage.tsx","../../node_modules/.pnpm/nanoid@6.0.1/node_modules/nanoid/url-alphabet/index.js","../../node_modules/.pnpm/nanoid@6.0.1/node_modules/nanoid/index.browser.js","../../src/app/features/settings/Persona/PerMessageProfileEditor.tsx","../../src/app/features/settings/Persona/PerMessageProfileEditorView.tsx","../../src/app/features/settings/Persona/ProfilesPage.tsx","../../src/app/features/settings/settingsSearch.ts","../../src/app/features/settings/useSettingsFocus.ts","../../src/app/state/autoUpdateCheck.ts","../../node_modules/.pnpm/@tauri-apps+plugin-store@2.4.4/node_modules/@tauri-apps/plugin-store/dist-js/index.js","../../src/app/state/desktopSettings.ts","../../src/app/state/hooks/desktopSettings.ts","../../src/app/features/settings/desktop/Desktop.tsx","../../src/app/features/settings/accessibility/Accessibility.tsx","../../src/app/features/settings/Settings.tsx","../../src/app/features/settings/SettingsRoute.tsx","../../src/app/pages/client/sidebar/SettingsTab.tsx","../../src/app/components/user-profile/UserHero.tsx","../../src/app/hooks/useSessionProfiles.ts","../../src/app/utils/presence.ts","../../src/app/pages/client/sidebar/UserMenuTab.tsx","../../src/app/state/room/lastSpace.ts","../../src/app/pages/client/sidebar/MessageTab.tsx","../../src/app/pages/client/sidebar/UserQuickTools.tsx","../../src/app/components/page/PageNavShell.tsx","../../src/app/state/hooks/closedNavCategories.ts","../../src/app/components/join-address-prompt/JoinAddressPrompt.tsx","../../src/app/pages/client/home/useHomeRooms.ts","../../src/app/state/isResizingSidebar.ts","../../src/app/hooks/useSidebarWidth.ts","../../src/app/components/nav/NavMenu.tsx","../../src/app/pages/client/home/Home.tsx","../../src/app/features/message-search/useMessageSearch.ts","../../src/app/features/message-search/SearchResultGroup.tsx","../../src/app/features/message-search/SearchInput.tsx","../../src/app/features/message-search/SearchFilters.tsx","../../src/app/features/message-search/MessageSearch.tsx","../../src/app/pages/client/home/Search.tsx","../../src/app/hooks/useJoinedRoomId.ts","../../src/app/components/knock-room-prompt/KnockRoomPrompt.tsx","../../src/app/components/room-card/RoomCard.tsx","../../src/app/hooks/useLocalRoomSummary.ts","../../src/app/components/RoomSummaryLoader.tsx","../../src/app/features/join-before-navigate/JoinBeforeNavigate.tsx","../../src/app/pages/pathSearchParam.ts","../../src/app/hooks/router/useSearchParamsViaServers.ts","../../src/app/pages/client/home/RoomProvider.tsx","../../src/app/pages/client/direct/useDirectRooms.ts","../../src/app/pages/client/direct/Direct.tsx","../../src/app/pages/client/direct/RoomProvider.tsx","../../src/app/features/create-chat/CreateChat.tsx","../../src/app/pages/client/direct/DirectCreate.tsx","../../src/app/pages/client/space/SpaceProvider.tsx","../../src/app/state/spaceRooms.ts","../../src/app/features/space-nav/SpaceNavItem.tsx","../../src/app/state/closedLobbyCategories.ts","../../src/app/hooks/useSpaceHierarchy.ts","../../src/app/state/room/roomToChildren.ts","../../src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx","../../src/app/pages/client/space/Space.tsx","../../src/app/pages/client/space/Search.tsx","../../src/app/pages/client/space/RoomProvider.tsx","../../src/app/features/forum/ForumMenu.tsx","../../src/app/features/forum/ForumHeader.tsx","../../src/app/features/forum/ForumHero.tsx","../../src/app/features/room/ThreadRootItem.tsx","../../src/app/features/forum/ForumThreadItem.tsx","../../src/app/features/forum/ForumView.tsx","../../src/app/pages/client/RoomRoute.tsx","../../src/app/components/page/PersistentRoomHost.tsx","../../src/app/components/page/MobileNavDrawer.tsx","../../src/app/components/page/Page.tsx","../../src/app/components/page/MessageSearchHeader.tsx","../../src/app/components/page/SettingsSectionPage.tsx","../../src/app/components/page/PageNavHeaderWithMenu.tsx"],"sourcesContent":["import e,{useRef as r,useMemo as n,useEffect as t,useState as o,useCallback as a,useLayoutEffect as u}from\"react\";function l(){return(l=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e}).apply(this,arguments)}function c(e,r){if(null==e)return{};var n,t,o={},a=Object.keys(e);for(t=0;t<a.length;t++)r.indexOf(n=a[t])>=0||(o[n]=e[n]);return o}function i(e){var n=r(e),t=r(function(e){n.current&&n.current(e)});return n.current=e,t.current}var s=function(e,r,n){return void 0===r&&(r=0),void 0===n&&(n=1),e>n?n:e<r?r:e},f=function(e){return\"touches\"in e},d=function(e){return e&&e.ownerDocument.defaultView||self},v=function(e,r,n){var t=e.getBoundingClientRect(),o=f(r)?function(e,r){for(var n=0;n<e.length;n++)if(e[n].identifier===r)return e[n];return e[0]}(r.touches,n):r;return{left:s((o.pageX-(t.left+d(e).pageXOffset))/t.width),top:s((o.pageY-(t.top+d(e).pageYOffset))/t.height)}},h=function(e){!f(e)&&e.preventDefault()},g=e.memo(function(o){var a=o.onMove,u=o.onKey,s=o.onEnd,g=c(o,[\"onMove\",\"onKey\",\"onEnd\"]),m=r(null),p=i(a),b=i(u),_=i(s),E=r(null),C=r(!1),x=n(function(){var e=function(e){h(e),(f(e)?e.touches.length>0:e.buttons>0)&&m.current?p(v(m.current,e,E.current)):(n(!1),_())},r=function(){n(!1),_()};function n(n){var t=C.current,o=d(m.current),a=n?o.addEventListener:o.removeEventListener;a(t?\"touchmove\":\"mousemove\",e),a(t?\"touchend\":\"mouseup\",r)}return[function(e){var r=e.nativeEvent,t=m.current;if(t&&(h(r),!function(e,r){return r&&!f(e)}(r,C.current)&&t)){if(f(r)){C.current=!0;var o=r.changedTouches||[];o.length&&(E.current=o[0].identifier)}t.focus(),p(v(t,r,E.current)),n(!0)}},function(e){var r=e.which||e.keyCode;r<37||r>40||(e.preventDefault(),b({left:39===r?.05:37===r?-.05:0,top:40===r?.05:38===r?-.05:0}))},function(e){var r=e.which||e.keyCode;r>=37&&r<=40&&_()},n]},[b,p,_]),H=x[0],M=x[1],N=x[2],w=x[3];return t(function(){return w},[w]),e.createElement(\"div\",l({},g,{onTouchStart:H,onMouseDown:H,className:\"react-colorful__interactive\",ref:m,onKeyDown:M,onKeyUp:N,tabIndex:0,role:\"slider\"}))}),m=function(e){return e.filter(Boolean).join(\" \")},p=function(r){var n=r.color,t=r.left,o=r.top,a=void 0===o?.5:o,u=m([\"react-colorful__pointer\",r.className]);return e.createElement(\"div\",{className:u,style:{top:100*a+\"%\",left:100*t+\"%\"}},e.createElement(\"div\",{className:\"react-colorful__pointer-fill\",style:{backgroundColor:n}}))},b=function(e,r,n){return void 0===r&&(r=0),void 0===n&&(n=Math.pow(10,r)),Math.round(n*e)/n},_={grad:.9,turn:360,rad:360/(2*Math.PI)},E=function(e){return L(C(e))},C=function(e){return\"#\"===e[0]&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:4===e.length?b(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:8===e.length?b(parseInt(e.substring(6,8),16)/255,2):1}},x=function(e,r){return void 0===r&&(r=\"deg\"),Number(e)*(_[r]||1)},H=function(e){var r=/hsla?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?N({h:x(r[1],r[2]),s:Number(r[3]),l:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},M=H,N=function(e){var r=e.s,n=e.l;return{h:e.h,s:(r*=(n<50?n:100-n)/100)>0?2*r/(n+r)*100:0,v:n+r,a:e.a}},w=function(e){return B(I(e))},y=function(e){var r=e.s,n=e.v,t=e.a,o=(200-r)*n/100;return{h:b(e.h),s:b(o>0&&o<200?r*n/100/(o<=100?o:200-o)*100:0),l:b(o/2),a:b(t,2)}},k=function(e){var r=y(e);return\"hsl(\"+r.h+\", \"+r.s+\"%, \"+r.l+\"%)\"},q=function(e){var r=y(e);return\"hsla(\"+r.h+\", \"+r.s+\"%, \"+r.l+\"%, \"+r.a+\")\"},I=function(e){var r=e.h,n=e.s,t=e.v,o=e.a;r=r/360*6,n/=100,t/=100;var a=Math.floor(r),u=t*(1-n),l=t*(1-(r-a)*n),c=t*(1-(1-r+a)*n),i=a%6;return{r:b(255*[t,l,u,u,c,t][i]),g:b(255*[c,t,t,l,u,u][i]),b:b(255*[u,u,c,t,t,l][i]),a:b(o,2)}},O=function(e){var r=/hsva?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?A({h:x(r[1],r[2]),s:Number(r[3]),v:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},D=O,j=function(e){var r=/rgba?\\(?\\s*(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?L({r:Number(r[1])/(r[2]?100/255:1),g:Number(r[3])/(r[4]?100/255:1),b:Number(r[5])/(r[6]?100/255:1),a:void 0===r[7]?1:Number(r[7])/(r[8]?100:1)}):{h:0,s:0,v:0,a:1}},z=j,K=function(e){var r=e.toString(16);return r.length<2?\"0\"+r:r},B=function(e){var r=e.r,n=e.g,t=e.b,o=e.a,a=o<1?K(b(255*o)):\"\";return\"#\"+K(r)+K(n)+K(t)+a},L=function(e){var r=e.r,n=e.g,t=e.b,o=e.a,a=Math.max(r,n,t),u=a-Math.min(r,n,t),l=u?a===r?(n-t)/u:a===n?2+(t-r)/u:4+(r-n)/u:0;return{h:b(60*(l<0?l+6:l)),s:b(a?u/a*100:0),v:b(a/255*100),a:o}},A=function(e){return{h:b(e.h),s:b(e.s),v:b(e.v),a:b(e.a,2)}},R=e.memo(function(r){var n=r.hue,t=r.onChange,o=r.onChangeEnd,a=m([\"react-colorful__hue\",r.className]);return e.createElement(\"div\",{className:a},e.createElement(g,{onMove:function(e){t({h:360*e.left})},onKey:function(e){t({h:s(n+360*e.left,0,360)})},onEnd:o,\"aria-label\":\"Hue\",\"aria-valuenow\":b(n),\"aria-valuemax\":\"360\",\"aria-valuemin\":\"0\"},e.createElement(p,{className:\"react-colorful__hue-pointer\",left:n/360,color:k({h:n,s:100,v:100,a:1})})))}),S=e.memo(function(r){var n=r.hsva,t=r.onChange,o=r.onChangeEnd,a={backgroundColor:k({h:n.h,s:100,v:100,a:1})};return e.createElement(\"div\",{className:\"react-colorful__saturation\",style:a},e.createElement(g,{onMove:function(e){t({s:100*e.left,v:100-100*e.top})},onKey:function(e){t({s:s(n.s+100*e.left,0,100),v:s(n.v-100*e.top,0,100)})},onEnd:o,\"aria-label\":\"Color\",\"aria-valuetext\":\"Saturation \"+b(n.s)+\"%, Brightness \"+b(n.v)+\"%\"},e.createElement(p,{className:\"react-colorful__saturation-pointer\",top:1-n.v/100,left:n.s/100,color:k(n)})))}),T=function(e,r){if(e===r)return!0;for(var n in e)if(e[n]!==r[n])return!1;return!0},F=function(e,r){return e.replace(/\\s/g,\"\")===r.replace(/\\s/g,\"\")},P=function(e,r){return e.toLowerCase()===r.toLowerCase()||T(C(e),C(r))};function X(e,n,u,l){var c=i(u),s=i(l),f=o(function(){return e.toHsva(n)}),d=f[0],v=f[1],h=r({color:n,hsva:d}),g=r(!1);t(function(){if(!e.equal(n,h.current.color)){var r=e.toHsva(n);h.current={hsva:r,color:n},v(r),g.current=!1}},[n,e]),t(function(){var r;T(d,h.current.hsva)||e.equal(r=e.fromHsva(d),h.current.color)||(h.current={hsva:d,color:r},c(r),g.current=!0)},[d,e,c]);var m=a(function(e){v(function(r){return Object.assign({},r,e)})},[]),p=a(function(){g.current&&(g.current=!1,s(h.current.color))},[s]);return[d,m,p]}var Y,U=\"undefined\"!=typeof window?u:t,V=function(){return Y||(\"undefined\"!=typeof __webpack_nonce__?__webpack_nonce__:void 0)},W=function(e){Y=e},$=new WeakMap,G=function(e){U(function(){var r=e.current;if(\"undefined\"!=typeof document&&r){var n=r.getRootNode?r.getRootNode():r.ownerDocument,t=n&&(\"head\"in n||\"host\"in n)?n:r.ownerDocument;if(!$.has(t)){var o=\"head\"in t?t.head:t,a=(o.ownerDocument||document).createElement(\"style\");a.innerHTML='.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:\"\";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url(\\'data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill-opacity=\".05\"><path d=\"M8 0h8v8H8zM0 8h8v8H0z\"/></svg>\\')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}';var u=V();u&&a.setAttribute(\"nonce\",u),$.set(t,a),o.appendChild(a)}}},[])},J=function(n){var t=n.className,o=n.colorModel,a=n.color,u=void 0===a?o.defaultColor:a,i=n.onChange,s=n.onChangeEnd,f=c(n,[\"className\",\"colorModel\",\"color\",\"onChange\",\"onChangeEnd\"]),d=r(null);G(d);var v=X(o,u,i,s),h=v[0],g=v[1],p=v[2],b=m([\"react-colorful\",t]);return e.createElement(\"div\",l({},f,{ref:d,className:b}),e.createElement(S,{hsva:h,onChange:g,onChangeEnd:p}),e.createElement(R,{hue:h.h,onChange:g,onChangeEnd:p,className:\"react-colorful__last-control\"}))},Q={defaultColor:\"000\",toHsva:E,fromHsva:function(e){return w({h:e.h,s:e.s,v:e.v,a:1})},equal:P},Z=function(r){return e.createElement(J,l({},r,{colorModel:Q}))},ee=function(r){var n=r.className,t=r.hsva,o=r.onChange,a=r.onChangeEnd,u={backgroundImage:\"linear-gradient(90deg, \"+q(Object.assign({},t,{a:0}))+\", \"+q(Object.assign({},t,{a:1}))+\")\"},l=m([\"react-colorful__alpha\",n]),c=b(100*t.a);return e.createElement(\"div\",{className:l},e.createElement(\"div\",{className:\"react-colorful__alpha-gradient\",style:u}),e.createElement(g,{onMove:function(e){o({a:e.left})},onKey:function(e){o({a:s(t.a+e.left)})},onEnd:a,\"aria-label\":\"Alpha\",\"aria-valuetext\":c+\"%\",\"aria-valuenow\":c,\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"},e.createElement(p,{className:\"react-colorful__alpha-pointer\",left:t.a,color:q(t)})))},re=function(n){var t=n.className,o=n.colorModel,a=n.color,u=void 0===a?o.defaultColor:a,i=n.onChange,s=n.onChangeEnd,f=c(n,[\"className\",\"colorModel\",\"color\",\"onChange\",\"onChangeEnd\"]),d=r(null);G(d);var v=X(o,u,i,s),h=v[0],g=v[1],p=v[2],b=m([\"react-colorful\",t]);return e.createElement(\"div\",l({},f,{ref:d,className:b}),e.createElement(S,{hsva:h,onChange:g,onChangeEnd:p}),e.createElement(R,{hue:h.h,onChange:g,onChangeEnd:p}),e.createElement(ee,{hsva:h,onChange:g,onChangeEnd:p,className:\"react-colorful__last-control\"}))},ne={defaultColor:\"0001\",toHsva:E,fromHsva:w,equal:P},te=function(r){return e.createElement(re,l({},r,{colorModel:ne}))},oe={defaultColor:{h:0,s:0,l:0,a:1},toHsva:N,fromHsva:y,equal:T},ae=function(r){return e.createElement(re,l({},r,{colorModel:oe}))},ue={defaultColor:\"hsla(0, 0%, 0%, 1)\",toHsva:H,fromHsva:q,equal:F},le=function(r){return e.createElement(re,l({},r,{colorModel:ue}))},ce={defaultColor:{h:0,s:0,l:0},toHsva:function(e){return N({h:e.h,s:e.s,l:e.l,a:1})},fromHsva:function(e){return{h:(r=y(e)).h,s:r.s,l:r.l};var r},equal:T},ie=function(r){return e.createElement(J,l({},r,{colorModel:ce}))},se={defaultColor:\"hsl(0, 0%, 0%)\",toHsva:M,fromHsva:k,equal:F},fe=function(r){return e.createElement(J,l({},r,{colorModel:se}))},de={defaultColor:{h:0,s:0,v:0,a:1},toHsva:function(e){return e},fromHsva:A,equal:T},ve=function(r){return e.createElement(re,l({},r,{colorModel:de}))},he={defaultColor:\"hsva(0, 0%, 0%, 1)\",toHsva:O,fromHsva:function(e){var r=A(e);return\"hsva(\"+r.h+\", \"+r.s+\"%, \"+r.v+\"%, \"+r.a+\")\"},equal:F},ge=function(r){return e.createElement(re,l({},r,{colorModel:he}))},me={defaultColor:{h:0,s:0,v:0},toHsva:function(e){return{h:e.h,s:e.s,v:e.v,a:1}},fromHsva:function(e){var r=A(e);return{h:r.h,s:r.s,v:r.v}},equal:T},pe=function(r){return e.createElement(J,l({},r,{colorModel:me}))},be={defaultColor:\"hsv(0, 0%, 0%)\",toHsva:D,fromHsva:function(e){var r=A(e);return\"hsv(\"+r.h+\", \"+r.s+\"%, \"+r.v+\"%)\"},equal:F},_e=function(r){return e.createElement(J,l({},r,{colorModel:be}))},Ee={defaultColor:{r:0,g:0,b:0,a:1},toHsva:L,fromHsva:I,equal:T},Ce=function(r){return e.createElement(re,l({},r,{colorModel:Ee}))},xe={defaultColor:\"rgba(0, 0, 0, 1)\",toHsva:j,fromHsva:function(e){var r=I(e);return\"rgba(\"+r.r+\", \"+r.g+\", \"+r.b+\", \"+r.a+\")\"},equal:F},He=function(r){return e.createElement(re,l({},r,{colorModel:xe}))},Me={defaultColor:{r:0,g:0,b:0},toHsva:function(e){return L({r:e.r,g:e.g,b:e.b,a:1})},fromHsva:function(e){return{r:(r=I(e)).r,g:r.g,b:r.b};var r},equal:T},Ne=function(r){return e.createElement(J,l({},r,{colorModel:Me}))},we={defaultColor:\"rgb(0, 0, 0)\",toHsva:z,fromHsva:function(e){var r=I(e);return\"rgb(\"+r.r+\", \"+r.g+\", \"+r.b+\")\"},equal:F},ye=function(r){return e.createElement(J,l({},r,{colorModel:we}))},ke=/^#?([0-9A-F]{3,8})$/i,qe=function(r){var n=r.color,u=void 0===n?\"\":n,s=r.onChange,f=r.onBlur,d=r.escape,v=r.validate,h=r.format,g=r.process,m=c(r,[\"color\",\"onChange\",\"onBlur\",\"escape\",\"validate\",\"format\",\"process\"]),p=o(function(){return d(u)}),b=p[0],_=p[1],E=i(s),C=i(f),x=a(function(e){var r=d(e.target.value);_(r),v(r)&&E(g?g(r):r)},[d,g,v,E]),H=a(function(e){v(e.target.value)||_(d(u)),C(e)},[u,d,v,C]);return t(function(){_(d(u))},[u,d]),e.createElement(\"input\",l({},m,{value:h?h(b):b,spellCheck:\"false\",onChange:x,onBlur:H}))},Ie=function(e){return\"#\"+e},Oe=function(r){var n=r.prefixed,t=r.alpha,o=c(r,[\"prefixed\",\"alpha\"]),u=a(function(e){return e.replace(/([^0-9A-F]+)/gi,\"\").substring(0,t?8:6)},[t]),i=a(function(e){return function(e,r){var n=ke.exec(e),t=n?n[1].length:0;return 3===t||6===t||!!r&&4===t||!!r&&8===t}(e,t)},[t]);return e.createElement(qe,l({},o,{escape:u,format:n?Ie:void 0,process:Ie,validate:i}))};export{te as HexAlphaColorPicker,Oe as HexColorInput,Z as HexColorPicker,ie as HslColorPicker,fe as HslStringColorPicker,ae as HslaColorPicker,le as HslaStringColorPicker,pe as HsvColorPicker,_e as HsvStringColorPicker,ve as HsvaColorPicker,ge as HsvaStringColorPicker,Ne as RgbColorPicker,ye as RgbStringColorPicker,Ce as RgbaColorPicker,He as RgbaStringColorPicker,W as setNonce};\n//# sourceMappingURL=index.module.js.map\n","// src/subscribable.ts\nvar Subscribable = class {\n  constructor() {\n    this.listeners = /* @__PURE__ */ new Set();\n    this.subscribe = this.subscribe.bind(this);\n  }\n  subscribe(listener) {\n    this.listeners.add(listener);\n    this.onSubscribe();\n    return () => {\n      this.listeners.delete(listener);\n      this.onUnsubscribe();\n    };\n  }\n  hasListeners() {\n    return this.listeners.size > 0;\n  }\n  onSubscribe() {\n  }\n  onUnsubscribe() {\n  }\n};\nexport {\n  Subscribable\n};\n//# sourceMappingURL=subscribable.js.map","// src/focusManager.ts\nimport { Subscribable } from \"./subscribable.js\";\nvar FocusManager = class extends Subscribable {\n  #focused;\n  #cleanup;\n  #setup;\n  constructor() {\n    super();\n    this.#setup = (onFocus) => {\n      if (typeof window !== \"undefined\" && window.addEventListener) {\n        const listener = () => onFocus();\n        window.addEventListener(\"visibilitychange\", listener, false);\n        return () => {\n          window.removeEventListener(\"visibilitychange\", listener);\n        };\n      }\n      return;\n    };\n  }\n  onSubscribe() {\n    if (!this.#cleanup) {\n      this.setEventListener(this.#setup);\n    }\n  }\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      this.#cleanup?.();\n      this.#cleanup = void 0;\n    }\n  }\n  setEventListener(setup) {\n    this.#setup = setup;\n    this.#cleanup?.();\n    this.#cleanup = setup((focused) => {\n      if (typeof focused === \"boolean\") {\n        this.setFocused(focused);\n      } else {\n        this.onFocus();\n      }\n    });\n  }\n  setFocused(focused) {\n    const changed = this.#focused !== focused;\n    if (changed) {\n      this.#focused = focused;\n      this.onFocus();\n    }\n  }\n  onFocus() {\n    const isFocused = this.isFocused();\n    this.listeners.forEach((listener) => {\n      listener(isFocused);\n    });\n  }\n  isFocused() {\n    if (typeof this.#focused === \"boolean\") {\n      return this.#focused;\n    }\n    return globalThis.document?.visibilityState !== \"hidden\";\n  }\n};\nvar focusManager = new FocusManager();\nexport {\n  FocusManager,\n  focusManager\n};\n//# sourceMappingURL=focusManager.js.map","// src/timeoutManager.ts\nvar defaultTimeoutProvider = {\n  // We need the wrapper function syntax below instead of direct references to\n  // global setTimeout etc.\n  //\n  // BAD: `setTimeout: setTimeout`\n  // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n  //\n  // If we use direct references here, then anything that wants to spy on or\n  // replace the global setTimeout (like tests) won't work since we'll already\n  // have a hard reference to the original implementation at the time when this\n  // file was imported.\n  setTimeout: (callback, delay) => setTimeout(callback, delay),\n  clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n  setInterval: (callback, delay) => setInterval(callback, delay),\n  clearInterval: (intervalId) => clearInterval(intervalId)\n};\nvar TimeoutManager = class {\n  // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n  // type at app boot; and if we leave that type, then any new timer provider\n  // would need to support the default provider's concrete timer ID, which is\n  // infeasible across environments.\n  //\n  // We settle for type safety for the TimeoutProvider type, and accept that\n  // this class is unsafe internally to allow for extension.\n  #provider = defaultTimeoutProvider;\n  #providerCalled = false;\n  setTimeoutProvider(provider) {\n    if (process.env.NODE_ENV !== \"production\") {\n      if (this.#providerCalled && provider !== this.#provider) {\n        console.error(\n          `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n          { previous: this.#provider, provider }\n        );\n      }\n    }\n    this.#provider = provider;\n    if (process.env.NODE_ENV !== \"production\") {\n      this.#providerCalled = false;\n    }\n  }\n  setTimeout(callback, delay) {\n    if (process.env.NODE_ENV !== \"production\") {\n      this.#providerCalled = true;\n    }\n    return this.#provider.setTimeout(callback, delay);\n  }\n  clearTimeout(timeoutId) {\n    this.#provider.clearTimeout(timeoutId);\n  }\n  setInterval(callback, delay) {\n    if (process.env.NODE_ENV !== \"production\") {\n      this.#providerCalled = true;\n    }\n    return this.#provider.setInterval(callback, delay);\n  }\n  clearInterval(intervalId) {\n    this.#provider.clearInterval(intervalId);\n  }\n};\nvar timeoutManager = new TimeoutManager();\nfunction systemSetTimeoutZero(callback) {\n  setTimeout(callback, 0);\n}\nexport {\n  TimeoutManager,\n  defaultTimeoutProvider,\n  systemSetTimeoutZero,\n  timeoutManager\n};\n//# sourceMappingURL=timeoutManager.js.map","// src/utils.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar isServer = typeof window === \"undefined\" || \"Deno\" in globalThis;\nfunction noop() {\n}\nfunction functionalUpdate(updater, input) {\n  return typeof updater === \"function\" ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n  return typeof value === \"number\" && value >= 0 && value !== Infinity;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n  return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction resolveStaleTime(staleTime, query) {\n  return typeof staleTime === \"function\" ? staleTime(query) : staleTime;\n}\nfunction resolveQueryBoolean(option, query) {\n  return typeof option === \"function\" ? option(query) : option;\n}\nfunction matchQuery(filters, query) {\n  const {\n    type = \"all\",\n    exact,\n    fetchStatus,\n    predicate,\n    queryKey,\n    stale\n  } = filters;\n  if (queryKey) {\n    if (exact) {\n      if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n        return false;\n      }\n    } else if (!partialMatchKey(query.queryKey, queryKey)) {\n      return false;\n    }\n  }\n  if (type !== \"all\") {\n    const isActive = query.isActive();\n    if (type === \"active\" && !isActive) {\n      return false;\n    }\n    if (type === \"inactive\" && isActive) {\n      return false;\n    }\n  }\n  if (typeof stale === \"boolean\" && query.isStale() !== stale) {\n    return false;\n  }\n  if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n    return false;\n  }\n  if (predicate && !predicate(query)) {\n    return false;\n  }\n  return true;\n}\nfunction matchMutation(filters, mutation) {\n  const { exact, status, predicate, mutationKey } = filters;\n  if (mutationKey) {\n    if (!mutation.options.mutationKey) {\n      return false;\n    }\n    if (exact) {\n      if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n        return false;\n      }\n    } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n      return false;\n    }\n  }\n  if (status && mutation.state.status !== status) {\n    return false;\n  }\n  if (predicate && !predicate(mutation)) {\n    return false;\n  }\n  return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n  const hashFn = options?.queryKeyHashFn || hashKey;\n  return hashFn(queryKey);\n}\nfunction hashKey(queryKey) {\n  return JSON.stringify(\n    queryKey,\n    (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n      result[key] = val[key];\n      return result;\n    }, {}) : val\n  );\n}\nfunction partialMatchKey(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (typeof a !== typeof b) {\n    return false;\n  }\n  if (a && b && typeof a === \"object\" && typeof b === \"object\") {\n    if (Array.isArray(a) && Array.isArray(b)) {\n      for (let i = 0; i < b.length; i++) {\n        if (!partialMatchKey(a[i], b[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    const bKeys = Object.keys(b);\n    for (const key of bKeys) {\n      if (!partialMatchKey(a[key], b[key])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return false;\n}\nvar hasOwn = Object.prototype.hasOwnProperty;\nfunction replaceEqualDeep(a, b, depth = 0) {\n  if (a === b) {\n    return a;\n  }\n  if (depth > 500) return b;\n  const array = isPlainArray(a) && isPlainArray(b);\n  if (!array && !(isPlainObject(a) && isPlainObject(b))) return b;\n  const aItems = array ? a : Object.keys(a);\n  const aSize = aItems.length;\n  const bItems = array ? b : Object.keys(b);\n  const bSize = bItems.length;\n  const copy = array ? new Array(bSize) : {};\n  let equalItems = 0;\n  for (let i = 0; i < bSize; i++) {\n    const key = array ? i : bItems[i];\n    const aItem = a[key];\n    const bItem = b[key];\n    if (aItem === bItem) {\n      copy[key] = aItem;\n      if (array ? i < aSize : hasOwn.call(a, key)) equalItems++;\n      continue;\n    }\n    if (aItem === null || bItem === null || typeof aItem !== \"object\" || typeof bItem !== \"object\") {\n      copy[key] = bItem;\n      continue;\n    }\n    const v = replaceEqualDeep(aItem, bItem, depth + 1);\n    copy[key] = v;\n    if (v === aItem) equalItems++;\n  }\n  return aSize === bSize && equalItems === aSize ? a : copy;\n}\nfunction shallowEqualObjects(a, b) {\n  if (!b || Object.keys(a).length !== Object.keys(b).length) {\n    return false;\n  }\n  for (const key in a) {\n    if (a[key] !== b[key]) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction isPlainArray(value) {\n  return Array.isArray(value) && value.length === Object.keys(value).length;\n}\nfunction isPlainObject(o) {\n  if (!hasObjectPrototype(o)) {\n    return false;\n  }\n  const ctor = o.constructor;\n  if (ctor === void 0) {\n    return true;\n  }\n  const prot = ctor.prototype;\n  if (!hasObjectPrototype(prot)) {\n    return false;\n  }\n  if (!prot.hasOwnProperty(\"isPrototypeOf\")) {\n    return false;\n  }\n  if (Object.getPrototypeOf(o) !== Object.prototype) {\n    return false;\n  }\n  return true;\n}\nfunction hasObjectPrototype(o) {\n  return Object.prototype.toString.call(o) === \"[object Object]\";\n}\nfunction sleep(timeout) {\n  return new Promise((resolve) => {\n    timeoutManager.setTimeout(resolve, timeout);\n  });\n}\nfunction replaceData(prevData, data, options) {\n  if (typeof options.structuralSharing === \"function\") {\n    return options.structuralSharing(prevData, data);\n  } else if (options.structuralSharing !== false) {\n    if (process.env.NODE_ENV !== \"production\") {\n      try {\n        return replaceEqualDeep(prevData, data);\n      } catch (error) {\n        console.error(\n          `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`\n        );\n        throw error;\n      }\n    }\n    return replaceEqualDeep(prevData, data);\n  }\n  return data;\n}\nfunction keepPreviousData(previousData) {\n  return previousData;\n}\nfunction addToEnd(items, item, max = 0) {\n  const newItems = [...items, item];\n  return max && newItems.length > max ? newItems.slice(1) : newItems;\n}\nfunction addToStart(items, item, max = 0) {\n  const newItems = [item, ...items];\n  return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n}\nvar skipToken = /* @__PURE__ */ Symbol();\nfunction ensureQueryFn(options, fetchOptions) {\n  if (process.env.NODE_ENV !== \"production\") {\n    if (options.queryFn === skipToken) {\n      console.error(\n        `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`\n      );\n    }\n  }\n  if (!options.queryFn && fetchOptions?.initialPromise) {\n    return () => fetchOptions.initialPromise;\n  }\n  if (!options.queryFn || options.queryFn === skipToken) {\n    return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));\n  }\n  return options.queryFn;\n}\nfunction shouldThrowError(throwOnError, params) {\n  if (typeof throwOnError === \"function\") {\n    return throwOnError(...params);\n  }\n  return !!throwOnError;\n}\nfunction addConsumeAwareSignal(object, getSignal, onCancelled) {\n  let consumed = false;\n  let signal;\n  Object.defineProperty(object, \"signal\", {\n    enumerable: true,\n    get: () => {\n      signal ??= getSignal();\n      if (consumed) {\n        return signal;\n      }\n      consumed = true;\n      if (signal.aborted) {\n        onCancelled();\n      } else {\n        signal.addEventListener(\"abort\", onCancelled, { once: true });\n      }\n      return signal;\n    }\n  });\n  return object;\n}\nexport {\n  addConsumeAwareSignal,\n  addToEnd,\n  addToStart,\n  ensureQueryFn,\n  functionalUpdate,\n  hashKey,\n  hashQueryKeyByOptions,\n  isPlainArray,\n  isPlainObject,\n  isServer,\n  isValidTimeout,\n  keepPreviousData,\n  matchMutation,\n  matchQuery,\n  noop,\n  partialMatchKey,\n  replaceData,\n  replaceEqualDeep,\n  resolveQueryBoolean,\n  resolveStaleTime,\n  shallowEqualObjects,\n  shouldThrowError,\n  skipToken,\n  sleep,\n  timeUntilStale\n};\n//# sourceMappingURL=utils.js.map","// src/environmentManager.ts\nimport { isServer } from \"./utils.js\";\nvar environmentManager = /* @__PURE__ */ (() => {\n  let isServerFn = () => isServer;\n  return {\n    /**\n     * Returns whether the current runtime should be treated as a server environment.\n     */\n    isServer() {\n      return isServerFn();\n    },\n    /**\n     * Overrides the server check globally.\n     */\n    setIsServer(isServerValue) {\n      isServerFn = isServerValue;\n    }\n  };\n})();\nexport {\n  environmentManager\n};\n//# sourceMappingURL=environmentManager.js.map","// src/thenable.ts\nimport { noop } from \"./utils.js\";\nfunction pendingThenable() {\n  let resolve;\n  let reject;\n  const thenable = new Promise((_resolve, _reject) => {\n    resolve = _resolve;\n    reject = _reject;\n  });\n  thenable.status = \"pending\";\n  thenable.catch(() => {\n  });\n  function finalize(data) {\n    Object.assign(thenable, data);\n    delete thenable.resolve;\n    delete thenable.reject;\n  }\n  thenable.resolve = (value) => {\n    finalize({\n      status: \"fulfilled\",\n      value\n    });\n    resolve(value);\n  };\n  thenable.reject = (reason) => {\n    finalize({\n      status: \"rejected\",\n      reason\n    });\n    reject(reason);\n  };\n  return thenable;\n}\nfunction tryResolveSync(promise) {\n  let data;\n  promise.then((result) => {\n    data = result;\n    return result;\n  }, noop)?.catch(noop);\n  if (data !== void 0) {\n    return { data };\n  }\n  return void 0;\n}\nexport {\n  pendingThenable,\n  tryResolveSync\n};\n//# sourceMappingURL=thenable.js.map","// src/notifyManager.ts\nimport { systemSetTimeoutZero } from \"./timeoutManager.js\";\nvar defaultScheduler = systemSetTimeoutZero;\nfunction createNotifyManager() {\n  let queue = [];\n  let transactions = 0;\n  let notifyFn = (callback) => {\n    callback();\n  };\n  let batchNotifyFn = (callback) => {\n    callback();\n  };\n  let scheduleFn = defaultScheduler;\n  const schedule = (callback) => {\n    if (transactions) {\n      queue.push(callback);\n    } else {\n      scheduleFn(() => {\n        notifyFn(callback);\n      });\n    }\n  };\n  const flush = () => {\n    const originalQueue = queue;\n    queue = [];\n    if (originalQueue.length) {\n      scheduleFn(() => {\n        batchNotifyFn(() => {\n          originalQueue.forEach((callback) => {\n            notifyFn(callback);\n          });\n        });\n      });\n    }\n  };\n  return {\n    batch: (callback) => {\n      let result;\n      transactions++;\n      try {\n        result = callback();\n      } finally {\n        transactions--;\n        if (!transactions) {\n          flush();\n        }\n      }\n      return result;\n    },\n    /**\n     * All calls to the wrapped function will be batched.\n     */\n    batchCalls: (callback) => {\n      return (...args) => {\n        schedule(() => {\n          callback(...args);\n        });\n      };\n    },\n    schedule,\n    /**\n     * Use this method to set a custom notify function.\n     * This can be used to for example wrap notifications with `React.act` while running tests.\n     */\n    setNotifyFunction: (fn) => {\n      notifyFn = fn;\n    },\n    /**\n     * Use this method to set a custom function to batch notifications together into a single tick.\n     * By default React Query will use the batch function provided by ReactDOM or React Native.\n     */\n    setBatchNotifyFunction: (fn) => {\n      batchNotifyFn = fn;\n    },\n    setScheduler: (fn) => {\n      scheduleFn = fn;\n    }\n  };\n}\nvar notifyManager = createNotifyManager();\nexport {\n  createNotifyManager,\n  defaultScheduler,\n  notifyManager\n};\n//# sourceMappingURL=notifyManager.js.map","// src/onlineManager.ts\nimport { Subscribable } from \"./subscribable.js\";\nvar OnlineManager = class extends Subscribable {\n  #online = true;\n  #cleanup;\n  #setup;\n  constructor() {\n    super();\n    this.#setup = (onOnline) => {\n      if (typeof window !== \"undefined\" && window.addEventListener) {\n        const onlineListener = () => onOnline(true);\n        const offlineListener = () => onOnline(false);\n        window.addEventListener(\"online\", onlineListener, false);\n        window.addEventListener(\"offline\", offlineListener, false);\n        return () => {\n          window.removeEventListener(\"online\", onlineListener);\n          window.removeEventListener(\"offline\", offlineListener);\n        };\n      }\n      return;\n    };\n  }\n  onSubscribe() {\n    if (!this.#cleanup) {\n      this.setEventListener(this.#setup);\n    }\n  }\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      this.#cleanup?.();\n      this.#cleanup = void 0;\n    }\n  }\n  setEventListener(setup) {\n    this.#setup = setup;\n    this.#cleanup?.();\n    this.#cleanup = setup(this.setOnline.bind(this));\n  }\n  setOnline(online) {\n    const changed = this.#online !== online;\n    if (changed) {\n      this.#online = online;\n      this.listeners.forEach((listener) => {\n        listener(online);\n      });\n    }\n  }\n  isOnline() {\n    return this.#online;\n  }\n};\nvar onlineManager = new OnlineManager();\nexport {\n  OnlineManager,\n  onlineManager\n};\n//# sourceMappingURL=onlineManager.js.map","// src/retryer.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport { environmentManager } from \"./environmentManager.js\";\nimport { sleep } from \"./utils.js\";\nfunction defaultRetryDelay(failureCount) {\n  return Math.min(1e3 * 2 ** failureCount, 3e4);\n}\nfunction canFetch(networkMode) {\n  return (networkMode ?? \"online\") === \"online\" ? onlineManager.isOnline() : true;\n}\nvar CancelledError = class extends Error {\n  constructor(options) {\n    super(\"CancelledError\");\n    this.revert = options?.revert;\n    this.silent = options?.silent;\n  }\n};\nfunction isCancelledError(value) {\n  return value instanceof CancelledError;\n}\nfunction createRetryer(config) {\n  let isRetryCancelled = false;\n  let failureCount = 0;\n  let continueFn;\n  const thenable = pendingThenable();\n  const isResolved = () => thenable.status !== \"pending\";\n  const cancel = (cancelOptions) => {\n    if (!isResolved()) {\n      const error = new CancelledError(cancelOptions);\n      reject(error);\n      config.onCancel?.(error);\n    }\n  };\n  const cancelRetry = () => {\n    isRetryCancelled = true;\n  };\n  const continueRetry = () => {\n    isRetryCancelled = false;\n  };\n  const canContinue = () => focusManager.isFocused() && (config.networkMode === \"always\" || onlineManager.isOnline()) && config.canRun();\n  const canStart = () => canFetch(config.networkMode) && config.canRun();\n  const resolve = (value) => {\n    if (!isResolved()) {\n      continueFn?.();\n      thenable.resolve(value);\n    }\n  };\n  const reject = (value) => {\n    if (!isResolved()) {\n      continueFn?.();\n      thenable.reject(value);\n    }\n  };\n  const pause = () => {\n    return new Promise((continueResolve) => {\n      continueFn = (value) => {\n        if (isResolved() || canContinue()) {\n          continueResolve(value);\n        }\n      };\n      config.onPause?.();\n    }).then(() => {\n      continueFn = void 0;\n      if (!isResolved()) {\n        config.onContinue?.();\n      }\n    });\n  };\n  const run = () => {\n    if (isResolved()) {\n      return;\n    }\n    let promiseOrValue;\n    const initialPromise = failureCount === 0 ? config.initialPromise : void 0;\n    try {\n      promiseOrValue = initialPromise ?? config.fn();\n    } catch (error) {\n      promiseOrValue = Promise.reject(error);\n    }\n    Promise.resolve(promiseOrValue).then(resolve).catch((error) => {\n      if (isResolved()) {\n        return;\n      }\n      const retry = config.retry ?? (environmentManager.isServer() ? 0 : 3);\n      const retryDelay = config.retryDelay ?? defaultRetryDelay;\n      const delay = typeof retryDelay === \"function\" ? retryDelay(failureCount, error) : retryDelay;\n      const shouldRetry = retry === true || typeof retry === \"number\" && failureCount < retry || typeof retry === \"function\" && retry(failureCount, error);\n      if (isRetryCancelled || !shouldRetry) {\n        reject(error);\n        return;\n      }\n      failureCount++;\n      config.onFail?.(failureCount, error);\n      sleep(delay).then(() => {\n        return canContinue() ? void 0 : pause();\n      }).then(() => {\n        if (isRetryCancelled) {\n          reject(error);\n        } else {\n          run();\n        }\n      });\n    });\n  };\n  return {\n    promise: thenable,\n    status: () => thenable.status,\n    cancel,\n    continue: () => {\n      continueFn?.();\n      return thenable;\n    },\n    cancelRetry,\n    continueRetry,\n    canStart,\n    start: () => {\n      if (canStart()) {\n        run();\n      } else {\n        pause().then(run);\n      }\n      return thenable;\n    }\n  };\n}\nexport {\n  CancelledError,\n  canFetch,\n  createRetryer,\n  isCancelledError\n};\n//# sourceMappingURL=retryer.js.map","// src/removable.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nimport { environmentManager } from \"./environmentManager.js\";\nimport { isValidTimeout } from \"./utils.js\";\nvar Removable = class {\n  #gcTimeout;\n  destroy() {\n    this.clearGcTimeout();\n  }\n  scheduleGc() {\n    this.clearGcTimeout();\n    if (isValidTimeout(this.gcTime)) {\n      this.#gcTimeout = timeoutManager.setTimeout(() => {\n        this.optionalRemove();\n      }, this.gcTime);\n    }\n  }\n  updateGcTime(newGcTime) {\n    this.gcTime = Math.max(\n      this.gcTime || 0,\n      newGcTime ?? (environmentManager.isServer() ? Infinity : 5 * 60 * 1e3)\n    );\n  }\n  clearGcTimeout() {\n    if (this.#gcTimeout !== void 0) {\n      timeoutManager.clearTimeout(this.#gcTimeout);\n      this.#gcTimeout = void 0;\n    }\n  }\n};\nexport {\n  Removable\n};\n//# sourceMappingURL=removable.js.map","// src/infiniteQueryBehavior.ts\nimport {\n  addConsumeAwareSignal,\n  addToEnd,\n  addToStart,\n  ensureQueryFn\n} from \"./utils.js\";\nfunction infiniteQueryBehavior(pages) {\n  return {\n    onFetch: (context, query) => {\n      const options = context.options;\n      const direction = context.fetchOptions?.meta?.fetchMore?.direction;\n      const oldPages = context.state.data?.pages || [];\n      const oldPageParams = context.state.data?.pageParams || [];\n      let result = { pages: [], pageParams: [] };\n      let currentPage = 0;\n      const fetchFn = async () => {\n        let cancelled = false;\n        const addSignalProperty = (object) => {\n          addConsumeAwareSignal(\n            object,\n            () => context.signal,\n            () => cancelled = true\n          );\n        };\n        const queryFn = ensureQueryFn(context.options, context.fetchOptions);\n        const fetchPage = async (data, param, previous) => {\n          if (cancelled) {\n            return Promise.reject(context.signal.reason);\n          }\n          if (param == null && data.pages.length) {\n            return Promise.resolve(data);\n          }\n          const createQueryFnContext = () => {\n            const queryFnContext2 = {\n              client: context.client,\n              queryKey: context.queryKey,\n              pageParam: param,\n              direction: previous ? \"backward\" : \"forward\",\n              meta: context.options.meta\n            };\n            addSignalProperty(queryFnContext2);\n            return queryFnContext2;\n          };\n          const queryFnContext = createQueryFnContext();\n          const page = await queryFn(queryFnContext);\n          const { maxPages } = context.options;\n          const addTo = previous ? addToStart : addToEnd;\n          return {\n            pages: addTo(data.pages, page, maxPages),\n            pageParams: addTo(data.pageParams, param, maxPages)\n          };\n        };\n        if (direction && oldPages.length) {\n          const previous = direction === \"backward\";\n          const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;\n          const oldData = {\n            pages: oldPages,\n            pageParams: oldPageParams\n          };\n          const param = pageParamFn(options, oldData);\n          result = await fetchPage(oldData, param, previous);\n        } else {\n          const remainingPages = pages ?? oldPages.length;\n          do {\n            const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result);\n            if (currentPage > 0 && param == null) {\n              break;\n            }\n            result = await fetchPage(result, param);\n            currentPage++;\n          } while (currentPage < remainingPages);\n        }\n        return result;\n      };\n      if (context.options.persister) {\n        context.fetchFn = () => {\n          return context.options.persister?.(\n            fetchFn,\n            {\n              client: context.client,\n              queryKey: context.queryKey,\n              meta: context.options.meta,\n              signal: context.signal\n            },\n            query\n          );\n        };\n      } else {\n        context.fetchFn = fetchFn;\n      }\n    }\n  };\n}\nfunction getNextPageParam(options, { pages, pageParams }) {\n  const lastIndex = pages.length - 1;\n  return pages.length > 0 ? options.getNextPageParam(\n    pages[lastIndex],\n    pages,\n    pageParams[lastIndex],\n    pageParams\n  ) : void 0;\n}\nfunction getPreviousPageParam(options, { pages, pageParams }) {\n  return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0;\n}\nfunction hasNextPage(options, data) {\n  if (!data) return false;\n  return getNextPageParam(options, data) != null;\n}\nfunction hasPreviousPage(options, data) {\n  if (!data || !options.getPreviousPageParam) return false;\n  return getPreviousPageParam(options, data) != null;\n}\nexport {\n  hasNextPage,\n  hasPreviousPage,\n  infiniteQueryBehavior\n};\n//# sourceMappingURL=infiniteQueryBehavior.js.map","// src/query.ts\nimport {\n  ensureQueryFn,\n  noop,\n  replaceData,\n  resolveQueryBoolean,\n  resolveStaleTime,\n  skipToken,\n  timeUntilStale\n} from \"./utils.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { CancelledError, canFetch, createRetryer } from \"./retryer.js\";\nimport { Removable } from \"./removable.js\";\nimport { infiniteQueryBehavior } from \"./infiniteQueryBehavior.js\";\nvar Query = class extends Removable {\n  #queryType;\n  #initialState;\n  #revertState;\n  #cache;\n  #client;\n  #retryer;\n  #defaultOptions;\n  #abortSignalConsumed;\n  constructor(config) {\n    super();\n    this.#abortSignalConsumed = false;\n    this.#defaultOptions = config.defaultOptions;\n    this.setOptions(config.options);\n    this.observers = [];\n    this.#client = config.client;\n    this.#cache = this.#client.getQueryCache();\n    this.queryKey = config.queryKey;\n    this.queryHash = config.queryHash;\n    this.#initialState = getDefaultState(this.options);\n    this.state = config.state ?? this.#initialState;\n    this.scheduleGc();\n  }\n  get meta() {\n    return this.options.meta;\n  }\n  get queryType() {\n    return this.#queryType;\n  }\n  get promise() {\n    return this.#retryer?.promise;\n  }\n  setOptions(options) {\n    this.options = { ...this.#defaultOptions, ...options };\n    if (options?._type) {\n      this.#queryType = options._type;\n    }\n    this.updateGcTime(this.options.gcTime);\n    if (this.state && this.state.data === void 0) {\n      const defaultState = getDefaultState(this.options);\n      if (defaultState.data !== void 0) {\n        this.setState(\n          successState(defaultState.data, defaultState.dataUpdatedAt)\n        );\n        this.#initialState = defaultState;\n      }\n    }\n  }\n  optionalRemove() {\n    if (!this.observers.length && this.state.fetchStatus === \"idle\") {\n      this.#cache.remove(this);\n    }\n  }\n  setData(newData, options) {\n    const data = replaceData(this.state.data, newData, this.options);\n    this.#dispatch({\n      data,\n      type: \"success\",\n      dataUpdatedAt: options?.updatedAt,\n      manual: options?.manual\n    });\n    return data;\n  }\n  setState(state) {\n    this.#dispatch({ type: \"setState\", state });\n  }\n  cancel(options) {\n    const promise = this.#retryer?.promise;\n    this.#retryer?.cancel(options);\n    return promise ? promise.then(noop).catch(noop) : Promise.resolve();\n  }\n  destroy() {\n    super.destroy();\n    this.cancel({ silent: true });\n  }\n  get resetState() {\n    return this.#initialState;\n  }\n  reset() {\n    this.destroy();\n    this.setState(this.resetState);\n  }\n  isActive() {\n    return this.observers.some(\n      (observer) => resolveQueryBoolean(observer.options.enabled, this) !== false\n    );\n  }\n  isDisabled() {\n    if (this.getObserversCount() > 0) {\n      return !this.isActive();\n    }\n    return this.options.queryFn === skipToken || !this.isFetched();\n  }\n  isFetched() {\n    return this.state.dataUpdateCount + this.state.errorUpdateCount > 0;\n  }\n  isStatic() {\n    if (this.getObserversCount() > 0) {\n      return this.observers.some(\n        (observer) => resolveStaleTime(observer.options.staleTime, this) === \"static\"\n      );\n    }\n    return false;\n  }\n  isStale() {\n    if (this.getObserversCount() > 0) {\n      return this.observers.some(\n        (observer) => observer.getCurrentResult().isStale\n      );\n    }\n    return this.state.data === void 0 || this.state.isInvalidated;\n  }\n  isStaleByTime(staleTime = 0) {\n    if (this.state.data === void 0) {\n      return true;\n    }\n    if (staleTime === \"static\") {\n      return false;\n    }\n    if (this.state.isInvalidated) {\n      return true;\n    }\n    return !timeUntilStale(this.state.dataUpdatedAt, staleTime);\n  }\n  onFocus() {\n    const observer = this.observers.find((x) => x.shouldFetchOnWindowFocus());\n    observer?.refetch({ cancelRefetch: false });\n    this.#retryer?.continue();\n  }\n  onOnline() {\n    const observer = this.observers.find((x) => x.shouldFetchOnReconnect());\n    observer?.refetch({ cancelRefetch: false });\n    this.#retryer?.continue();\n  }\n  addObserver(observer) {\n    if (!this.observers.includes(observer)) {\n      this.observers.push(observer);\n      this.clearGcTimeout();\n      this.#cache.notify({ type: \"observerAdded\", query: this, observer });\n    }\n  }\n  removeObserver(observer) {\n    if (this.observers.includes(observer)) {\n      this.observers = this.observers.filter((x) => x !== observer);\n      if (!this.observers.length) {\n        if (this.#retryer) {\n          if (this.#abortSignalConsumed || this.#isInitialPausedFetch()) {\n            this.#retryer.cancel({ revert: true });\n          } else {\n            this.#retryer.cancelRetry();\n          }\n        }\n        this.scheduleGc();\n      }\n      this.#cache.notify({ type: \"observerRemoved\", query: this, observer });\n    }\n  }\n  getObserversCount() {\n    return this.observers.length;\n  }\n  #isInitialPausedFetch() {\n    return this.state.fetchStatus === \"paused\" && this.state.status === \"pending\";\n  }\n  invalidate() {\n    if (!this.state.isInvalidated) {\n      this.#dispatch({ type: \"invalidate\" });\n    }\n  }\n  async fetch(options, fetchOptions) {\n    if (this.state.fetchStatus !== \"idle\" && // If the promise in the retryer is already rejected, we have to definitely\n    // re-start the fetch; there is a chance that the query is still in a\n    // pending state when that happens\n    this.#retryer?.status() !== \"rejected\") {\n      if (this.state.data !== void 0 && fetchOptions?.cancelRefetch) {\n        this.cancel({ silent: true });\n      } else if (this.#retryer) {\n        this.#retryer.continueRetry();\n        return this.#retryer.promise;\n      }\n    }\n    if (options) {\n      this.setOptions(options);\n    }\n    if (!this.options.queryFn) {\n      const observer = this.observers.find((x) => x.options.queryFn);\n      if (observer) {\n        this.setOptions(observer.options);\n      }\n    }\n    if (process.env.NODE_ENV !== \"production\") {\n      if (!Array.isArray(this.options.queryKey)) {\n        console.error(\n          `As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`\n        );\n      }\n    }\n    const abortController = new AbortController();\n    const addSignalProperty = (object) => {\n      Object.defineProperty(object, \"signal\", {\n        enumerable: true,\n        get: () => {\n          this.#abortSignalConsumed = true;\n          return abortController.signal;\n        }\n      });\n    };\n    const fetchFn = () => {\n      const queryFn = ensureQueryFn(this.options, fetchOptions);\n      const createQueryFnContext = () => {\n        const queryFnContext2 = {\n          client: this.#client,\n          queryKey: this.queryKey,\n          meta: this.meta\n        };\n        addSignalProperty(queryFnContext2);\n        return queryFnContext2;\n      };\n      const queryFnContext = createQueryFnContext();\n      this.#abortSignalConsumed = false;\n      if (this.options.persister) {\n        return this.options.persister(\n          queryFn,\n          queryFnContext,\n          this\n        );\n      }\n      return queryFn(queryFnContext);\n    };\n    const createFetchContext = () => {\n      const context2 = {\n        fetchOptions,\n        options: this.options,\n        queryKey: this.queryKey,\n        client: this.#client,\n        state: this.state,\n        fetchFn\n      };\n      addSignalProperty(context2);\n      return context2;\n    };\n    const context = createFetchContext();\n    const behavior = this.#queryType === \"infinite\" ? infiniteQueryBehavior(\n      this.options.pages\n    ) : this.options.behavior;\n    behavior?.onFetch(context, this);\n    this.#revertState = this.state;\n    if (this.state.fetchStatus === \"idle\" || this.state.fetchMeta !== context.fetchOptions?.meta) {\n      this.#dispatch({ type: \"fetch\", meta: context.fetchOptions?.meta });\n    }\n    this.#retryer = createRetryer({\n      initialPromise: fetchOptions?.initialPromise,\n      fn: context.fetchFn,\n      onCancel: (error) => {\n        if (error instanceof CancelledError && error.revert) {\n          this.setState({\n            ...this.#revertState,\n            fetchStatus: \"idle\"\n          });\n        }\n        abortController.abort();\n      },\n      onFail: (failureCount, error) => {\n        this.#dispatch({ type: \"failed\", failureCount, error });\n      },\n      onPause: () => {\n        this.#dispatch({ type: \"pause\" });\n      },\n      onContinue: () => {\n        this.#dispatch({ type: \"continue\" });\n      },\n      retry: context.options.retry,\n      retryDelay: context.options.retryDelay,\n      networkMode: context.options.networkMode,\n      canRun: () => true\n    });\n    try {\n      const data = await this.#retryer.start();\n      if (data === void 0) {\n        if (process.env.NODE_ENV !== \"production\") {\n          console.error(\n            `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`\n          );\n        }\n        throw new Error(`${this.queryHash} data is undefined`);\n      }\n      this.setData(data);\n      this.#cache.config.onSuccess?.(data, this);\n      this.#cache.config.onSettled?.(\n        data,\n        this.state.error,\n        this\n      );\n      return data;\n    } catch (error) {\n      if (error instanceof CancelledError) {\n        if (error.silent) {\n          return this.#retryer.promise;\n        } else if (error.revert) {\n          if (this.state.data === void 0) {\n            throw error;\n          }\n          return this.state.data;\n        }\n      }\n      this.#dispatch({\n        type: \"error\",\n        error\n      });\n      this.#cache.config.onError?.(\n        error,\n        this\n      );\n      this.#cache.config.onSettled?.(\n        this.state.data,\n        error,\n        this\n      );\n      throw error;\n    } finally {\n      this.scheduleGc();\n    }\n  }\n  #dispatch(action) {\n    const reducer = (state) => {\n      switch (action.type) {\n        case \"failed\":\n          return {\n            ...state,\n            fetchFailureCount: action.failureCount,\n            fetchFailureReason: action.error\n          };\n        case \"pause\":\n          return {\n            ...state,\n            fetchStatus: \"paused\"\n          };\n        case \"continue\":\n          return {\n            ...state,\n            fetchStatus: \"fetching\"\n          };\n        case \"fetch\":\n          return {\n            ...state,\n            ...fetchState(state.data, this.options),\n            fetchMeta: action.meta ?? null\n          };\n        case \"success\":\n          const newState = {\n            ...state,\n            ...successState(action.data, action.dataUpdatedAt),\n            dataUpdateCount: state.dataUpdateCount + 1,\n            ...!action.manual && {\n              fetchStatus: \"idle\",\n              fetchFailureCount: 0,\n              fetchFailureReason: null\n            }\n          };\n          this.#revertState = action.manual ? newState : void 0;\n          return newState;\n        case \"error\":\n          const error = action.error;\n          return {\n            ...state,\n            error,\n            errorUpdateCount: state.errorUpdateCount + 1,\n            errorUpdatedAt: Date.now(),\n            fetchFailureCount: state.fetchFailureCount + 1,\n            fetchFailureReason: error,\n            fetchStatus: \"idle\",\n            status: \"error\",\n            // flag existing data as invalidated if we get a background error\n            // note that \"no data\" always means stale so we can set unconditionally here\n            isInvalidated: true\n          };\n        case \"invalidate\":\n          return {\n            ...state,\n            isInvalidated: true\n          };\n        case \"setState\":\n          return {\n            ...state,\n            ...action.state\n          };\n      }\n    };\n    this.state = reducer(this.state);\n    notifyManager.batch(() => {\n      this.observers.forEach((observer) => {\n        observer.onQueryUpdate();\n      });\n      this.#cache.notify({ query: this, type: \"updated\", action });\n    });\n  }\n};\nfunction fetchState(data, options) {\n  return {\n    fetchFailureCount: 0,\n    fetchFailureReason: null,\n    fetchStatus: canFetch(options.networkMode) ? \"fetching\" : \"paused\",\n    ...data === void 0 && {\n      error: null,\n      status: \"pending\"\n    }\n  };\n}\nfunction successState(data, dataUpdatedAt) {\n  return {\n    data,\n    dataUpdatedAt: dataUpdatedAt ?? Date.now(),\n    error: null,\n    isInvalidated: false,\n    status: \"success\"\n  };\n}\nfunction getDefaultState(options) {\n  const data = typeof options.initialData === \"function\" ? options.initialData() : options.initialData;\n  const hasData = data !== void 0;\n  const initialDataUpdatedAt = hasData ? typeof options.initialDataUpdatedAt === \"function\" ? options.initialDataUpdatedAt() : options.initialDataUpdatedAt : 0;\n  return {\n    data,\n    dataUpdateCount: 0,\n    dataUpdatedAt: hasData ? initialDataUpdatedAt ?? Date.now() : 0,\n    error: null,\n    errorUpdateCount: 0,\n    errorUpdatedAt: 0,\n    fetchFailureCount: 0,\n    fetchFailureReason: null,\n    fetchMeta: null,\n    isInvalidated: false,\n    status: hasData ? \"success\" : \"pending\",\n    fetchStatus: \"idle\"\n  };\n}\nexport {\n  Query,\n  fetchState\n};\n//# sourceMappingURL=query.js.map","// src/queryObserver.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { environmentManager } from \"./environmentManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { fetchState } from \"./query.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport {\n  isValidTimeout,\n  noop,\n  replaceData,\n  resolveQueryBoolean,\n  resolveStaleTime,\n  shallowEqualObjects,\n  timeUntilStale\n} from \"./utils.js\";\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar QueryObserver = class extends Subscribable {\n  constructor(client, options) {\n    super();\n    this.options = options;\n    this.#client = client;\n    this.#selectError = null;\n    this.#currentThenable = pendingThenable();\n    this.bindMethods();\n    this.setOptions(options);\n  }\n  #client;\n  #currentQuery = void 0;\n  #currentQueryInitialState = void 0;\n  #currentResult = void 0;\n  #currentResultState;\n  #currentResultOptions;\n  #currentThenable;\n  #selectError;\n  #selectFn;\n  #selectResult;\n  // This property keeps track of the last query with defined data.\n  // It will be used to pass the previous data and query to the placeholder function between renders.\n  #lastQueryWithDefinedData;\n  #staleTimeoutId;\n  #refetchIntervalId;\n  #currentRefetchInterval;\n  #trackedProps = /* @__PURE__ */ new Set();\n  bindMethods() {\n    this.refetch = this.refetch.bind(this);\n  }\n  onSubscribe() {\n    if (this.listeners.size === 1) {\n      this.#currentQuery.addObserver(this);\n      if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n        this.#executeFetch();\n      } else {\n        this.updateResult();\n      }\n      this.#updateTimers();\n    }\n  }\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      this.destroy();\n    }\n  }\n  shouldFetchOnReconnect() {\n    return shouldFetchOn(\n      this.#currentQuery,\n      this.options,\n      this.options.refetchOnReconnect\n    );\n  }\n  shouldFetchOnWindowFocus() {\n    return shouldFetchOn(\n      this.#currentQuery,\n      this.options,\n      this.options.refetchOnWindowFocus\n    );\n  }\n  destroy() {\n    this.listeners = /* @__PURE__ */ new Set();\n    this.#clearStaleTimeout();\n    this.#clearRefetchInterval();\n    this.#currentQuery.removeObserver(this);\n  }\n  setOptions(options) {\n    const prevOptions = this.options;\n    const prevQuery = this.#currentQuery;\n    this.options = this.#client.defaultQueryOptions(options);\n    if (this.options.enabled !== void 0 && typeof this.options.enabled !== \"boolean\" && typeof this.options.enabled !== \"function\" && typeof resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== \"boolean\") {\n      throw new Error(\n        \"Expected enabled to be a boolean or a callback that returns a boolean\"\n      );\n    }\n    this.#updateQuery();\n    this.#currentQuery.setOptions(this.options);\n    if (prevOptions._defaulted && !shallowEqualObjects(this.options, prevOptions)) {\n      this.#client.getQueryCache().notify({\n        type: \"observerOptionsUpdated\",\n        query: this.#currentQuery,\n        observer: this\n      });\n    }\n    const mounted = this.hasListeners();\n    if (mounted && shouldFetchOptionally(\n      this.#currentQuery,\n      prevQuery,\n      this.options,\n      prevOptions\n    )) {\n      this.#executeFetch();\n    }\n    this.updateResult();\n    if (mounted && (this.#currentQuery !== prevQuery || resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) || resolveStaleTime(this.options.staleTime, this.#currentQuery) !== resolveStaleTime(prevOptions.staleTime, this.#currentQuery))) {\n      this.#updateStaleTimeout();\n    }\n    const nextRefetchInterval = this.#computeRefetchInterval();\n    if (mounted && (this.#currentQuery !== prevQuery || resolveQueryBoolean(this.options.enabled, this.#currentQuery) !== resolveQueryBoolean(prevOptions.enabled, this.#currentQuery) || nextRefetchInterval !== this.#currentRefetchInterval)) {\n      this.#updateRefetchInterval(nextRefetchInterval);\n    }\n  }\n  getOptimisticResult(options) {\n    const query = this.#client.getQueryCache().build(this.#client, options);\n    const result = this.createResult(query, options);\n    if (shouldAssignObserverCurrentProperties(this, result)) {\n      this.#currentResult = result;\n      this.#currentResultOptions = this.options;\n      this.#currentResultState = this.#currentQuery.state;\n    }\n    return result;\n  }\n  getCurrentResult() {\n    return this.#currentResult;\n  }\n  trackResult(result, onPropTracked) {\n    return new Proxy(result, {\n      get: (target, key) => {\n        this.trackProp(key);\n        onPropTracked?.(key);\n        if (key === \"promise\") {\n          this.trackProp(\"data\");\n          if (!this.options.experimental_prefetchInRender && this.#currentThenable.status === \"pending\") {\n            this.#currentThenable.reject(\n              new Error(\n                \"experimental_prefetchInRender feature flag is not enabled\"\n              )\n            );\n          }\n        }\n        return Reflect.get(target, key);\n      }\n    });\n  }\n  trackProp(key) {\n    this.#trackedProps.add(key);\n  }\n  getCurrentQuery() {\n    return this.#currentQuery;\n  }\n  refetch({ ...options } = {}) {\n    return this.fetch({\n      ...options\n    });\n  }\n  fetchOptimistic(options) {\n    const defaultedOptions = this.#client.defaultQueryOptions(options);\n    const query = this.#client.getQueryCache().build(this.#client, defaultedOptions);\n    return query.fetch().then(() => this.createResult(query, defaultedOptions));\n  }\n  fetch(fetchOptions) {\n    return this.#executeFetch({\n      ...fetchOptions,\n      cancelRefetch: fetchOptions.cancelRefetch ?? true\n    }).then(() => {\n      this.updateResult();\n      return this.#currentResult;\n    });\n  }\n  #executeFetch(fetchOptions) {\n    this.#updateQuery();\n    let promise = this.#currentQuery.fetch(\n      this.options,\n      fetchOptions\n    );\n    if (!fetchOptions?.throwOnError) {\n      promise = promise.catch(noop);\n    }\n    return promise;\n  }\n  #updateStaleTimeout() {\n    this.#clearStaleTimeout();\n    const staleTime = resolveStaleTime(\n      this.options.staleTime,\n      this.#currentQuery\n    );\n    if (environmentManager.isServer() || this.#currentResult.isStale || !isValidTimeout(staleTime)) {\n      return;\n    }\n    const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime);\n    const timeout = time + 1;\n    this.#staleTimeoutId = timeoutManager.setTimeout(() => {\n      if (!this.#currentResult.isStale) {\n        this.updateResult();\n      }\n    }, timeout);\n  }\n  #computeRefetchInterval() {\n    return (typeof this.options.refetchInterval === \"function\" ? this.options.refetchInterval(this.#currentQuery) : this.options.refetchInterval) ?? false;\n  }\n  #updateRefetchInterval(nextInterval) {\n    this.#clearRefetchInterval();\n    this.#currentRefetchInterval = nextInterval;\n    if (environmentManager.isServer() || resolveQueryBoolean(this.options.enabled, this.#currentQuery) === false || !isValidTimeout(this.#currentRefetchInterval) || this.#currentRefetchInterval === 0) {\n      return;\n    }\n    this.#refetchIntervalId = timeoutManager.setInterval(() => {\n      if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {\n        this.#executeFetch();\n      }\n    }, this.#currentRefetchInterval);\n  }\n  #updateTimers() {\n    this.#updateStaleTimeout();\n    this.#updateRefetchInterval(this.#computeRefetchInterval());\n  }\n  #clearStaleTimeout() {\n    if (this.#staleTimeoutId !== void 0) {\n      timeoutManager.clearTimeout(this.#staleTimeoutId);\n      this.#staleTimeoutId = void 0;\n    }\n  }\n  #clearRefetchInterval() {\n    if (this.#refetchIntervalId !== void 0) {\n      timeoutManager.clearInterval(this.#refetchIntervalId);\n      this.#refetchIntervalId = void 0;\n    }\n  }\n  createResult(query, options) {\n    const prevQuery = this.#currentQuery;\n    const prevOptions = this.options;\n    const prevResult = this.#currentResult;\n    const prevResultState = this.#currentResultState;\n    const prevResultOptions = this.#currentResultOptions;\n    const queryChange = query !== prevQuery;\n    const queryInitialState = queryChange ? query.state : this.#currentQueryInitialState;\n    const { state } = query;\n    let newState = { ...state };\n    let isPlaceholderData = false;\n    let data;\n    if (options._optimisticResults) {\n      const mounted = this.hasListeners();\n      const fetchOnMount = !mounted && shouldFetchOnMount(query, options);\n      const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);\n      if (fetchOnMount || fetchOptionally) {\n        newState = {\n          ...newState,\n          ...fetchState(state.data, query.options)\n        };\n      }\n      if (options._optimisticResults === \"isRestoring\") {\n        newState.fetchStatus = \"idle\";\n      }\n    }\n    let { error, errorUpdatedAt, status } = newState;\n    data = newState.data;\n    let skipSelect = false;\n    if (options.placeholderData !== void 0 && data === void 0 && status === \"pending\") {\n      let placeholderData;\n      if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) {\n        placeholderData = prevResult.data;\n        skipSelect = true;\n      } else {\n        placeholderData = typeof options.placeholderData === \"function\" ? options.placeholderData(\n          this.#lastQueryWithDefinedData?.state.data,\n          this.#lastQueryWithDefinedData\n        ) : options.placeholderData;\n      }\n      if (placeholderData !== void 0) {\n        status = \"success\";\n        data = replaceData(\n          prevResult?.data,\n          placeholderData,\n          options\n        );\n        isPlaceholderData = true;\n      }\n    }\n    if (options.select && data !== void 0 && !skipSelect) {\n      if (prevResult && data === prevResultState?.data && options.select === this.#selectFn) {\n        data = this.#selectResult;\n      } else {\n        try {\n          this.#selectFn = options.select;\n          data = options.select(data);\n          data = replaceData(prevResult?.data, data, options);\n          this.#selectResult = data;\n          this.#selectError = null;\n        } catch (selectError) {\n          this.#selectError = selectError;\n        }\n      }\n    }\n    if (this.#selectError) {\n      error = this.#selectError;\n      data = this.#selectResult;\n      errorUpdatedAt = Date.now();\n      status = \"error\";\n    }\n    const isFetching = newState.fetchStatus === \"fetching\";\n    const isPending = status === \"pending\";\n    const isError = status === \"error\";\n    const isLoading = isPending && isFetching;\n    const hasData = data !== void 0;\n    const result = {\n      status,\n      fetchStatus: newState.fetchStatus,\n      isPending,\n      isSuccess: status === \"success\",\n      isError,\n      isInitialLoading: isLoading,\n      isLoading,\n      data,\n      dataUpdatedAt: newState.dataUpdatedAt,\n      error,\n      errorUpdatedAt,\n      failureCount: newState.fetchFailureCount,\n      failureReason: newState.fetchFailureReason,\n      errorUpdateCount: newState.errorUpdateCount,\n      isFetched: query.isFetched(),\n      isFetchedAfterMount: newState.dataUpdateCount > queryInitialState.dataUpdateCount || newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n      isFetching,\n      isRefetching: isFetching && !isPending,\n      isLoadingError: isError && !hasData,\n      isPaused: newState.fetchStatus === \"paused\",\n      isPlaceholderData,\n      isRefetchError: isError && hasData,\n      isStale: isStale(query, options),\n      refetch: this.refetch,\n      promise: this.#currentThenable,\n      isEnabled: resolveQueryBoolean(options.enabled, query) !== false\n    };\n    const nextResult = result;\n    if (this.options.experimental_prefetchInRender) {\n      const hasResultData = nextResult.data !== void 0;\n      const isErrorWithoutData = nextResult.status === \"error\" && !hasResultData;\n      const finalizeThenableIfPossible = (thenable) => {\n        if (isErrorWithoutData) {\n          thenable.reject(nextResult.error);\n        } else if (hasResultData) {\n          thenable.resolve(nextResult.data);\n        }\n      };\n      const recreateThenable = () => {\n        const pending = this.#currentThenable = nextResult.promise = pendingThenable();\n        finalizeThenableIfPossible(pending);\n      };\n      const prevThenable = this.#currentThenable;\n      switch (prevThenable.status) {\n        case \"pending\":\n          if (query.queryHash === prevQuery.queryHash) {\n            finalizeThenableIfPossible(prevThenable);\n          }\n          break;\n        case \"fulfilled\":\n          if (isErrorWithoutData || nextResult.data !== prevThenable.value) {\n            recreateThenable();\n          }\n          break;\n        case \"rejected\":\n          if (!isErrorWithoutData || nextResult.error !== prevThenable.reason) {\n            recreateThenable();\n          }\n          break;\n      }\n    }\n    return nextResult;\n  }\n  updateResult() {\n    const prevResult = this.#currentResult;\n    const nextResult = this.createResult(this.#currentQuery, this.options);\n    this.#currentResultState = this.#currentQuery.state;\n    this.#currentResultOptions = this.options;\n    if (this.#currentResultState.data !== void 0) {\n      this.#lastQueryWithDefinedData = this.#currentQuery;\n    }\n    if (shallowEqualObjects(nextResult, prevResult)) {\n      return;\n    }\n    this.#currentResult = nextResult;\n    const shouldNotifyListeners = () => {\n      if (!prevResult) {\n        return true;\n      }\n      const { notifyOnChangeProps } = this.options;\n      const notifyOnChangePropsValue = typeof notifyOnChangeProps === \"function\" ? notifyOnChangeProps() : notifyOnChangeProps;\n      if (notifyOnChangePropsValue === \"all\" || !notifyOnChangePropsValue && !this.#trackedProps.size) {\n        return true;\n      }\n      const includedProps = new Set(\n        notifyOnChangePropsValue ?? this.#trackedProps\n      );\n      if (this.options.throwOnError) {\n        includedProps.add(\"error\");\n      }\n      return Object.keys(this.#currentResult).some((key) => {\n        const typedKey = key;\n        const changed = this.#currentResult[typedKey] !== prevResult[typedKey];\n        return changed && includedProps.has(typedKey);\n      });\n    };\n    this.#notify({ listeners: shouldNotifyListeners() });\n  }\n  #updateQuery() {\n    const query = this.#client.getQueryCache().build(this.#client, this.options);\n    if (query === this.#currentQuery) {\n      return;\n    }\n    const prevQuery = this.#currentQuery;\n    this.#currentQuery = query;\n    this.#currentQueryInitialState = query.state;\n    if (this.hasListeners()) {\n      prevQuery?.removeObserver(this);\n      query.addObserver(this);\n    }\n  }\n  onQueryUpdate() {\n    this.updateResult();\n    if (this.hasListeners()) {\n      this.#updateTimers();\n    }\n  }\n  #notify(notifyOptions) {\n    notifyManager.batch(() => {\n      if (notifyOptions.listeners) {\n        this.listeners.forEach((listener) => {\n          listener(this.#currentResult);\n        });\n      }\n      this.#client.getQueryCache().notify({\n        query: this.#currentQuery,\n        type: \"observerResultsUpdated\"\n      });\n    });\n  }\n};\nfunction shouldLoadOnMount(query, options) {\n  return resolveQueryBoolean(options.enabled, query) !== false && query.state.data === void 0 && !(query.state.status === \"error\" && resolveQueryBoolean(options.retryOnMount, query) === false);\n}\nfunction shouldFetchOnMount(query, options) {\n  return shouldLoadOnMount(query, options) || query.state.data !== void 0 && shouldFetchOn(query, options, options.refetchOnMount);\n}\nfunction shouldFetchOn(query, options, field) {\n  if (resolveQueryBoolean(options.enabled, query) !== false && resolveStaleTime(options.staleTime, query) !== \"static\") {\n    const value = typeof field === \"function\" ? field(query) : field;\n    return value === \"always\" || value !== false && isStale(query, options);\n  }\n  return false;\n}\nfunction shouldFetchOptionally(query, prevQuery, options, prevOptions) {\n  return (query !== prevQuery || resolveQueryBoolean(prevOptions.enabled, query) === false) && (!options.suspense || query.state.status !== \"error\") && isStale(query, options);\n}\nfunction isStale(query, options) {\n  return resolveQueryBoolean(options.enabled, query) !== false && query.isStaleByTime(resolveStaleTime(options.staleTime, query));\n}\nfunction shouldAssignObserverCurrentProperties(observer, optimisticResult) {\n  if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n    return true;\n  }\n  return false;\n}\nexport {\n  QueryObserver\n};\n//# sourceMappingURL=queryObserver.js.map","// src/infiniteQueryObserver.ts\nimport { QueryObserver } from \"./queryObserver.js\";\nimport { hasNextPage, hasPreviousPage } from \"./infiniteQueryBehavior.js\";\nvar InfiniteQueryObserver = class extends QueryObserver {\n  constructor(client, options) {\n    super(client, options);\n  }\n  bindMethods() {\n    super.bindMethods();\n    this.fetchNextPage = this.fetchNextPage.bind(this);\n    this.fetchPreviousPage = this.fetchPreviousPage.bind(this);\n  }\n  setOptions(options) {\n    options._type = \"infinite\";\n    super.setOptions(options);\n  }\n  getOptimisticResult(options) {\n    options._type = \"infinite\";\n    return super.getOptimisticResult(options);\n  }\n  fetchNextPage(options) {\n    return this.fetch({\n      ...options,\n      meta: {\n        fetchMore: { direction: \"forward\" }\n      }\n    });\n  }\n  fetchPreviousPage(options) {\n    return this.fetch({\n      ...options,\n      meta: {\n        fetchMore: { direction: \"backward\" }\n      }\n    });\n  }\n  createResult(query, options) {\n    const { state } = query;\n    const parentResult = super.createResult(query, options);\n    const { isFetching, isRefetching, isError, isRefetchError } = parentResult;\n    const fetchDirection = state.fetchMeta?.fetchMore?.direction;\n    const isFetchNextPageError = isError && fetchDirection === \"forward\";\n    const isFetchingNextPage = isFetching && fetchDirection === \"forward\";\n    const isFetchPreviousPageError = isError && fetchDirection === \"backward\";\n    const isFetchingPreviousPage = isFetching && fetchDirection === \"backward\";\n    const result = {\n      ...parentResult,\n      fetchNextPage: this.fetchNextPage,\n      fetchPreviousPage: this.fetchPreviousPage,\n      hasNextPage: hasNextPage(options, state.data),\n      hasPreviousPage: hasPreviousPage(options, state.data),\n      isFetchNextPageError,\n      isFetchingNextPage,\n      isFetchPreviousPageError,\n      isFetchingPreviousPage,\n      isRefetchError: isRefetchError && !isFetchNextPageError && !isFetchPreviousPageError,\n      isRefetching: isRefetching && !isFetchingNextPage && !isFetchingPreviousPage\n    };\n    return result;\n  }\n};\nexport {\n  InfiniteQueryObserver\n};\n//# sourceMappingURL=infiniteQueryObserver.js.map","// src/queriesObserver.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { QueryObserver } from \"./queryObserver.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { replaceEqualDeep, shallowEqualObjects } from \"./utils.js\";\nfunction difference(array1, array2) {\n  const excludeSet = new Set(array2);\n  return array1.filter((x) => !excludeSet.has(x));\n}\nfunction replaceAt(array, index, value) {\n  const copy = array.slice(0);\n  copy[index] = value;\n  return copy;\n}\nvar QueriesObserver = class extends Subscribable {\n  #client;\n  #result;\n  #queries;\n  #options;\n  #observers;\n  #combinedResult;\n  #lastCombine;\n  #lastResult;\n  #lastQueryHashes;\n  #observerMatches = [];\n  constructor(client, queries, options) {\n    super();\n    this.#client = client;\n    this.#options = options;\n    this.#queries = [];\n    this.#observers = [];\n    this.#result = [];\n    this.setQueries(queries);\n  }\n  onSubscribe() {\n    if (this.listeners.size === 1) {\n      this.#observers.forEach((observer) => {\n        observer.subscribe((result) => {\n          this.#onUpdate(observer, result);\n        });\n      });\n    }\n  }\n  onUnsubscribe() {\n    if (!this.listeners.size) {\n      this.destroy();\n    }\n  }\n  destroy() {\n    this.listeners = /* @__PURE__ */ new Set();\n    this.#observers.forEach((observer) => {\n      observer.destroy();\n    });\n  }\n  setQueries(queries, options) {\n    this.#queries = queries;\n    this.#options = options;\n    if (process.env.NODE_ENV !== \"production\") {\n      const queryHashes = queries.map(\n        (query) => this.#client.defaultQueryOptions(query).queryHash\n      );\n      if (new Set(queryHashes).size !== queryHashes.length) {\n        console.warn(\n          \"[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.\"\n        );\n      }\n    }\n    notifyManager.batch(() => {\n      const prevObservers = this.#observers;\n      const newObserverMatches = this.#findMatchingObservers(this.#queries);\n      newObserverMatches.forEach(\n        (match) => match.observer.setOptions(match.defaultedQueryOptions)\n      );\n      const newObservers = newObserverMatches.map((match) => match.observer);\n      const newResult = newObservers.map(\n        (observer) => observer.getCurrentResult()\n      );\n      const hasLengthChange = prevObservers.length !== newObservers.length;\n      const hasIndexChange = newObservers.some(\n        (observer, index) => observer !== prevObservers[index]\n      );\n      const hasStructuralChange = hasLengthChange || hasIndexChange;\n      const hasResultChange = hasStructuralChange ? true : newResult.some((result, index) => {\n        const prev = this.#result[index];\n        return !prev || !shallowEqualObjects(result, prev);\n      });\n      if (!hasStructuralChange && !hasResultChange) return;\n      if (hasStructuralChange) {\n        this.#observerMatches = newObserverMatches;\n        this.#observers = newObservers;\n      }\n      this.#result = newResult;\n      if (!this.hasListeners()) return;\n      if (hasStructuralChange) {\n        difference(prevObservers, newObservers).forEach((observer) => {\n          observer.destroy();\n        });\n        difference(newObservers, prevObservers).forEach((observer) => {\n          observer.subscribe((result) => {\n            this.#onUpdate(observer, result);\n          });\n        });\n      }\n      this.#notify();\n    });\n  }\n  getCurrentResult() {\n    return this.#result;\n  }\n  getQueries() {\n    return this.#observers.map((observer) => observer.getCurrentQuery());\n  }\n  getObservers() {\n    return this.#observers;\n  }\n  getOptimisticResult(queries, combine) {\n    const matches = this.#findMatchingObservers(queries);\n    const result = matches.map(\n      (match) => match.observer.getOptimisticResult(match.defaultedQueryOptions)\n    );\n    const queryHashes = matches.map(\n      (match) => match.defaultedQueryOptions.queryHash\n    );\n    return [\n      result,\n      (r) => {\n        return this.#combineResult(r ?? result, combine, queryHashes);\n      },\n      () => {\n        return this.#trackResult(result, matches);\n      }\n    ];\n  }\n  #trackResult(result, matches) {\n    return matches.map((match, index) => {\n      const observerResult = result[index];\n      return !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult, (accessedProp) => {\n        matches.forEach((m) => {\n          m.observer.trackProp(accessedProp);\n        });\n      }) : observerResult;\n    });\n  }\n  #combineResult(input, combine, queryHashes) {\n    if (combine) {\n      const lastHashes = this.#lastQueryHashes;\n      const queryHashesChanged = queryHashes !== void 0 && lastHashes !== void 0 && (lastHashes.length !== queryHashes.length || queryHashes.some((hash, i) => hash !== lastHashes[i]));\n      if (!this.#combinedResult || this.#result !== this.#lastResult || queryHashesChanged || combine !== this.#lastCombine) {\n        this.#lastCombine = combine;\n        this.#lastResult = this.#result;\n        if (queryHashes !== void 0) {\n          this.#lastQueryHashes = queryHashes;\n        }\n        this.#combinedResult = replaceEqualDeep(\n          this.#combinedResult,\n          combine(input)\n        );\n      }\n      return this.#combinedResult;\n    }\n    return input;\n  }\n  #shouldSkipCombine() {\n    return this.#options?.combine !== void 0 && this.#observers.some((observer, index) => {\n      return observer.options.suspense && this.#result[index]?.data === void 0;\n    });\n  }\n  #findMatchingObservers(queries) {\n    const prevObserversMap = /* @__PURE__ */ new Map();\n    this.#observers.forEach((observer) => {\n      const key = observer.options.queryHash;\n      if (!key) return;\n      const previousObservers = prevObserversMap.get(key);\n      if (previousObservers) {\n        previousObservers.push(observer);\n      } else {\n        prevObserversMap.set(key, [observer]);\n      }\n    });\n    const observers = [];\n    queries.forEach((options) => {\n      const defaultedOptions = this.#client.defaultQueryOptions(options);\n      const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift();\n      const observer = match ?? new QueryObserver(this.#client, defaultedOptions);\n      observers.push({\n        defaultedQueryOptions: defaultedOptions,\n        observer\n      });\n    });\n    return observers;\n  }\n  #onUpdate(observer, result) {\n    const index = this.#observers.indexOf(observer);\n    if (index !== -1) {\n      this.#result = replaceAt(this.#result, index, result);\n      this.#notify();\n    }\n  }\n  #notify() {\n    if (this.hasListeners()) {\n      const newTracked = this.#trackResult(this.#result, this.#observerMatches);\n      const shouldSkipCombine = this.#shouldSkipCombine();\n      const previousResult = this.#combinedResult;\n      const newResult = shouldSkipCombine ? previousResult : this.#combineResult(newTracked, this.#options?.combine);\n      if (shouldSkipCombine || previousResult !== newResult) {\n        notifyManager.batch(() => {\n          this.listeners.forEach((listener) => {\n            listener(this.#result);\n          });\n        });\n      }\n    }\n  }\n};\nexport {\n  QueriesObserver\n};\n//# sourceMappingURL=queriesObserver.js.map","\"use client\";\n\n// src/QueryClientProvider.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nvar QueryClientContext = React.createContext(\n  void 0\n);\nvar useQueryClient = (queryClient) => {\n  const client = React.useContext(QueryClientContext);\n  if (queryClient) {\n    return queryClient;\n  }\n  if (!client) {\n    throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");\n  }\n  return client;\n};\nvar QueryClientProvider = ({\n  client,\n  children\n}) => {\n  React.useEffect(() => {\n    client.mount();\n    return () => {\n      client.unmount();\n    };\n  }, [client]);\n  return /* @__PURE__ */ jsx(QueryClientContext.Provider, { value: client, children });\n};\nexport {\n  QueryClientContext,\n  QueryClientProvider,\n  useQueryClient\n};\n//# sourceMappingURL=QueryClientProvider.js.map","\"use client\";\n\n// src/IsRestoringProvider.ts\nimport * as React from \"react\";\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nvar IsRestoringProvider = IsRestoringContext.Provider;\nexport {\n  IsRestoringProvider,\n  useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map","\"use client\";\n\n// src/QueryErrorResetBoundary.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction createValue() {\n  let isReset = false;\n  return {\n    clearReset: () => {\n      isReset = false;\n    },\n    reset: () => {\n      isReset = true;\n    },\n    isReset: () => {\n      return isReset;\n    }\n  };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nvar QueryErrorResetBoundary = ({\n  children\n}) => {\n  const [value] = React.useState(() => createValue());\n  return /* @__PURE__ */ jsx(QueryErrorResetBoundaryContext.Provider, { value, children: typeof children === \"function\" ? children(value) : children });\n};\nexport {\n  QueryErrorResetBoundary,\n  useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map","\"use client\";\n\n// src/errorBoundaryUtils.ts\nimport * as React from \"react\";\nimport { shouldThrowError } from \"@tanstack/query-core\";\nvar ensurePreventErrorBoundaryRetry = (options, errorResetBoundary, query) => {\n  const throwOnError = query?.state.error && typeof options.throwOnError === \"function\" ? shouldThrowError(options.throwOnError, [query.state.error, query]) : options.throwOnError;\n  if (options.suspense || options.experimental_prefetchInRender || throwOnError) {\n    if (!errorResetBoundary.isReset()) {\n      options.retryOnMount = false;\n    }\n  }\n};\nvar useClearResetErrorBoundary = (errorResetBoundary) => {\n  React.useEffect(() => {\n    errorResetBoundary.clearReset();\n  }, [errorResetBoundary]);\n};\nvar getHasError = ({\n  result,\n  errorResetBoundary,\n  throwOnError,\n  query,\n  suspense\n}) => {\n  return result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && (suspense && result.data === void 0 || shouldThrowError(throwOnError, [result.error, query]));\n};\nexport {\n  ensurePreventErrorBoundaryRetry,\n  getHasError,\n  useClearResetErrorBoundary\n};\n//# sourceMappingURL=errorBoundaryUtils.js.map","// src/suspense.ts\nvar defaultThrowOnError = (_error, query) => query.state.data === void 0;\nvar ensureSuspenseTimers = (defaultedOptions) => {\n  if (defaultedOptions.suspense) {\n    const MIN_SUSPENSE_TIME_MS = 1e3;\n    const clamp = (value) => value === \"static\" ? value : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS);\n    const originalStaleTime = defaultedOptions.staleTime;\n    defaultedOptions.staleTime = typeof originalStaleTime === \"function\" ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime);\n    if (typeof defaultedOptions.gcTime === \"number\") {\n      defaultedOptions.gcTime = Math.max(\n        defaultedOptions.gcTime,\n        MIN_SUSPENSE_TIME_MS\n      );\n    }\n  }\n};\nvar willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;\nvar shouldSuspend = (defaultedOptions, result) => defaultedOptions?.suspense && result.isPending;\nvar fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => {\n  errorResetBoundary.clearReset();\n});\nexport {\n  defaultThrowOnError,\n  ensureSuspenseTimers,\n  fetchOptimistic,\n  shouldSuspend,\n  willFetch\n};\n//# sourceMappingURL=suspense.js.map","\"use client\";\n\n// src/useQueries.ts\nimport * as React from \"react\";\nimport {\n  QueriesObserver,\n  QueryObserver,\n  noop,\n  notifyManager\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n  ensurePreventErrorBoundaryRetry,\n  getHasError,\n  useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport {\n  ensureSuspenseTimers,\n  fetchOptimistic,\n  shouldSuspend\n} from \"./suspense.js\";\nfunction useQueries({\n  queries,\n  ...options\n}, queryClient) {\n  const client = useQueryClient(queryClient);\n  const isRestoring = useIsRestoring();\n  const errorResetBoundary = useQueryErrorResetBoundary();\n  const defaultedQueries = React.useMemo(\n    () => queries.map((opts) => {\n      const defaultedOptions = client.defaultQueryOptions(\n        opts\n      );\n      defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : \"optimistic\";\n      return defaultedOptions;\n    }),\n    [queries, client, isRestoring]\n  );\n  defaultedQueries.forEach((queryOptions) => {\n    ensureSuspenseTimers(queryOptions);\n    const query = client.getQueryCache().get(queryOptions.queryHash);\n    ensurePreventErrorBoundaryRetry(queryOptions, errorResetBoundary, query);\n  });\n  useClearResetErrorBoundary(errorResetBoundary);\n  const [observer] = React.useState(\n    () => new QueriesObserver(\n      client,\n      defaultedQueries,\n      options\n    )\n  );\n  const [optimisticResult, getCombinedResult, trackResult] = observer.getOptimisticResult(\n    defaultedQueries,\n    options.combine\n  );\n  const shouldSubscribe = !isRestoring && options.subscribed !== false;\n  React.useSyncExternalStore(\n    React.useCallback(\n      (onStoreChange) => shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop,\n      [observer, shouldSubscribe]\n    ),\n    () => observer.getCurrentResult(),\n    () => observer.getCurrentResult()\n  );\n  React.useEffect(() => {\n    observer.setQueries(\n      defaultedQueries,\n      options\n    );\n  }, [defaultedQueries, options, observer]);\n  const shouldAtLeastOneSuspend = optimisticResult.some(\n    (result, index) => shouldSuspend(defaultedQueries[index], result)\n  );\n  const suspensePromises = shouldAtLeastOneSuspend ? optimisticResult.flatMap((result, index) => {\n    const opts = defaultedQueries[index];\n    if (opts && shouldSuspend(opts, result)) {\n      const queryObserver = new QueryObserver(client, opts);\n      return fetchOptimistic(opts, queryObserver, errorResetBoundary);\n    }\n    return [];\n  }) : [];\n  if (suspensePromises.length > 0) {\n    throw Promise.all(suspensePromises);\n  }\n  const firstSingleResultWhichShouldThrow = optimisticResult.find(\n    (result, index) => {\n      const query = defaultedQueries[index];\n      return query && getHasError({\n        result,\n        errorResetBoundary,\n        throwOnError: query.throwOnError,\n        query: client.getQueryCache().get(query.queryHash),\n        suspense: query.suspense\n      });\n    }\n  );\n  if (firstSingleResultWhichShouldThrow?.error) {\n    throw firstSingleResultWhichShouldThrow.error;\n  }\n  return getCombinedResult(trackResult());\n}\nexport {\n  useQueries\n};\n//# sourceMappingURL=useQueries.js.map","\"use client\";\n\n// src/useBaseQuery.ts\nimport * as React from \"react\";\nimport { environmentManager, noop, notifyManager } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n  ensurePreventErrorBoundaryRetry,\n  getHasError,\n  useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport {\n  ensureSuspenseTimers,\n  fetchOptimistic,\n  shouldSuspend,\n  willFetch\n} from \"./suspense.js\";\nfunction useBaseQuery(options, Observer, queryClient) {\n  if (process.env.NODE_ENV !== \"production\") {\n    if (typeof options !== \"object\" || Array.isArray(options)) {\n      throw new Error(\n        'Bad argument type. Starting with v5, only the \"Object\" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object'\n      );\n    }\n  }\n  const isRestoring = useIsRestoring();\n  const errorResetBoundary = useQueryErrorResetBoundary();\n  const client = useQueryClient(queryClient);\n  const defaultedOptions = client.defaultQueryOptions(options);\n  client.getDefaultOptions().queries?._experimental_beforeQuery?.(\n    defaultedOptions\n  );\n  const query = client.getQueryCache().get(defaultedOptions.queryHash);\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!defaultedOptions.queryFn) {\n      console.error(\n        `[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`\n      );\n    }\n  }\n  const subscribed = options.subscribed !== false;\n  defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : subscribed ? \"optimistic\" : void 0;\n  ensureSuspenseTimers(defaultedOptions);\n  ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary, query);\n  useClearResetErrorBoundary(errorResetBoundary);\n  const isNewCacheEntry = !client.getQueryCache().get(defaultedOptions.queryHash);\n  const [observer] = React.useState(\n    () => new Observer(\n      client,\n      defaultedOptions\n    )\n  );\n  const result = observer.getOptimisticResult(defaultedOptions);\n  const shouldSubscribe = !isRestoring && subscribed;\n  React.useSyncExternalStore(\n    React.useCallback(\n      (onStoreChange) => {\n        const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop;\n        observer.updateResult();\n        return unsubscribe;\n      },\n      [observer, shouldSubscribe]\n    ),\n    () => observer.getCurrentResult(),\n    () => observer.getCurrentResult()\n  );\n  React.useEffect(() => {\n    observer.setOptions(defaultedOptions);\n  }, [defaultedOptions, observer]);\n  if (shouldSuspend(defaultedOptions, result)) {\n    throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary);\n  }\n  if (getHasError({\n    result,\n    errorResetBoundary,\n    throwOnError: defaultedOptions.throwOnError,\n    query,\n    suspense: defaultedOptions.suspense\n  })) {\n    throw result.error;\n  }\n  ;\n  client.getDefaultOptions().queries?._experimental_afterQuery?.(\n    defaultedOptions,\n    result\n  );\n  if (defaultedOptions.experimental_prefetchInRender && !environmentManager.isServer() && willFetch(result, isRestoring)) {\n    const promise = isNewCacheEntry ? (\n      // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted\n      fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n    ) : (\n      // subscribe to the \"cache promise\" so that we can finalize the currentThenable once data comes in\n      query?.promise\n    );\n    promise?.catch(noop).finally(() => {\n      observer.updateResult();\n    });\n  }\n  return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result;\n}\nexport {\n  useBaseQuery\n};\n//# sourceMappingURL=useBaseQuery.js.map","\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n  return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n  useQuery\n};\n//# sourceMappingURL=useQuery.js.map","\"use client\";\n\n// src/useInfiniteQuery.ts\nimport { InfiniteQueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useInfiniteQuery(options, queryClient) {\n  return useBaseQuery(\n    options,\n    InfiniteQueryObserver,\n    queryClient\n  );\n}\nexport {\n  useInfiniteQuery\n};\n//# sourceMappingURL=useInfiniteQuery.js.map","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M236,200a12,12,0,0,1-24,0,84.09,84.09,0,0,0-84-84H61l27.52,27.51a12,12,0,0,1-17,17l-48-48a12,12,0,0,1,0-17l48-48a12,12,0,0,1,17,17L61,92h67A108.12,108.12,0,0,1,236,200Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M80,56v96L32,104Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,96H88V56a8,8,0,0,0-13.66-5.66l-48,48a8,8,0,0,0,0,11.32l48,48A8,8,0,0,0,88,152V112h40a88.1,88.1,0,0,1,88,88,8,8,0,0,0,16,0A104.11,104.11,0,0,0,128,96ZM72,132.69,43.31,104,72,75.31Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232,200a8,8,0,0,1-16,0,88.1,88.1,0,0,0-88-88H88v40a8,8,0,0,1-13.66,5.66l-48-48a8,8,0,0,1,0-11.32l48-48A8,8,0,0,1,88,56V96h40A104.11,104.11,0,0,1,232,200Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M230,200a6,6,0,0,1-12,0,90.1,90.1,0,0,0-90-90H46.49l37.75,37.76a6,6,0,1,1-8.48,8.48l-48-48a6,6,0,0,1,0-8.48l48-48a6,6,0,0,1,8.48,8.48L46.49,98H128A102.12,102.12,0,0,1,230,200Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232,200a8,8,0,0,1-16,0,88.1,88.1,0,0,0-88-88H51.31l34.35,34.34a8,8,0,0,1-11.32,11.32l-48-48a8,8,0,0,1,0-11.32l48-48A8,8,0,0,1,85.66,61.66L51.31,96H128A104.11,104.11,0,0,1,232,200Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,200a4,4,0,0,1-8,0,92.1,92.1,0,0,0-92-92H41.66l41.17,41.17a4,4,0,0,1-5.66,5.66l-48-48a4,4,0,0,1,0-5.66l48-48a4,4,0,0,1,5.66,5.66L41.66,100H128A100.11,100.11,0,0,1,228,200Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232.49,112.49l-48,48a12,12,0,0,1-17-17L195,116H128a84.09,84.09,0,0,0-84,84,12,12,0,0,1-24,0A108.12,108.12,0,0,1,128,92h67L167.51,64.48a12,12,0,0,1,17-17l48,48A12,12,0,0,1,232.49,112.49Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,104l-48,48V56Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M229.66,98.34l-48-48A8,8,0,0,0,168,56V96H128A104.11,104.11,0,0,0,24,200a8,8,0,0,0,16,0,88.1,88.1,0,0,1,88-88h40v40a8,8,0,0,0,13.66,5.66l48-48A8,8,0,0,0,229.66,98.34ZM184,132.69V75.31L212.69,104Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M229.66,109.66l-48,48A8,8,0,0,1,168,152V112H128a88.1,88.1,0,0,0-88,88,8,8,0,0,1-16,0A104.11,104.11,0,0,1,128,96h40V56a8,8,0,0,1,13.66-5.66l48,48A8,8,0,0,1,229.66,109.66Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228.24,108.24l-48,48a6,6,0,0,1-8.48-8.48L209.51,110H128a90.1,90.1,0,0,0-90,90,6,6,0,0,1-12,0A102.12,102.12,0,0,1,128,98h81.51L171.76,60.24a6,6,0,0,1,8.48-8.48l48,48A6,6,0,0,1,228.24,108.24Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M229.66,109.66l-48,48a8,8,0,0,1-11.32-11.32L204.69,112H128a88.1,88.1,0,0,0-88,88,8,8,0,0,1-16,0A104.11,104.11,0,0,1,128,96h76.69L170.34,61.66a8,8,0,0,1,11.32-11.32l48,48A8,8,0,0,1,229.66,109.66Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M226.83,106.83l-48,48a4,4,0,0,1-5.66-5.66L214.34,108H128a92.1,92.1,0,0,0-92,92,4,4,0,0,1-8,0A100.11,100.11,0,0,1,128,100h86.34L173.17,58.83a4,4,0,0,1,5.66-5.66l48,48A4,4,0,0,1,226.83,106.83Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208.49,152.49l-72,72a12,12,0,0,1-17,0l-72-72a12,12,0,0,1,17-17L116,187V40a12,12,0,0,1,24,0V187l51.51-51.52a12,12,0,0,1,17,17Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,144l-72,72L56,144Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M207.39,140.94A8,8,0,0,0,200,136H136V40a8,8,0,0,0-16,0v96H56a8,8,0,0,0-5.66,13.66l72,72a8,8,0,0,0,11.32,0l72-72A8,8,0,0,0,207.39,140.94ZM128,204.69,75.31,152H180.69Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M205.66,149.66l-72,72a8,8,0,0,1-11.32,0l-72-72A8,8,0,0,1,56,136h64V40a8,8,0,0,1,16,0v96h64a8,8,0,0,1,5.66,13.66Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M204.24,148.24l-72,72a6,6,0,0,1-8.48,0l-72-72a6,6,0,0,1,8.48-8.48L122,201.51V40a6,6,0,0,1,12,0V201.51l61.76-61.75a6,6,0,0,1,8.48,8.48Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M205.66,149.66l-72,72a8,8,0,0,1-11.32,0l-72-72a8,8,0,0,1,11.32-11.32L120,196.69V40a8,8,0,0,1,16,0V196.69l58.34-58.35a8,8,0,0,1,11.32,11.32Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M202.83,146.83l-72,72a4,4,0,0,1-5.66,0l-72-72a4,4,0,0,1,5.66-5.66L124,206.34V40a4,4,0,0,1,8,0V206.34l65.17-65.17a4,4,0,0,1,5.66,5.66Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M112,56V200L40,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,120H120V56a8,8,0,0,0-13.66-5.66l-72,72a8,8,0,0,0,0,11.32l72,72A8,8,0,0,0,120,200V136h96a8,8,0,0,0,0-16ZM104,180.69,51.31,128,104,75.31Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H120v64a8,8,0,0,1-13.66,5.66l-72-72a8,8,0,0,1,0-11.32l72-72A8,8,0,0,1,120,56v64h96A8,8,0,0,1,224,128Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M222,128a6,6,0,0,1-6,6H54.49l61.75,61.76a6,6,0,1,1-8.48,8.48l-72-72a6,6,0,0,1,0-8.48l72-72a6,6,0,0,1,8.48,8.48L54.49,122H216A6,6,0,0,1,222,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220,128a4,4,0,0,1-4,4H49.66l65.17,65.17a4,4,0,0,1-5.66,5.66l-72-72a4,4,0,0,1,0-5.66l72-72a4,4,0,0,1,5.66,5.66L49.66,124H216A4,4,0,0,1,220,128Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,128l-72,72V56Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M184,80V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V80a8,8,0,0,1,8-8H176A8,8,0,0,1,184,80Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M192,136v72a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V80A16,16,0,0,1,48,64h72a8,8,0,0,1,0,16H48V208H176V136a8,8,0,0,1,16,0Zm32-96a8,8,0,0,0-8-8H152a8,8,0,0,0-5.66,13.66L172.69,72l-42.35,42.34a8,8,0,0,0,11.32,11.32L184,83.31l26.34,26.35A8,8,0,0,0,224,104Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222,104a6,6,0,0,1-12,0V54.49l-69.75,69.75a6,6,0,0,1-8.48-8.48L201.51,46H152a6,6,0,0,1,0-12h64a6,6,0,0,1,6,6Zm-38,26a6,6,0,0,0-6,6v72a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V80a2,2,0,0,1,2-2h72a6,6,0,0,0,0-12H48A14,14,0,0,0,34,80V208a14,14,0,0,0,14,14H176a14,14,0,0,0,14-14V136A6,6,0,0,0,184,130Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220,104a4,4,0,0,1-8,0V49.66l-73.16,73.17a4,4,0,0,1-5.66-5.66L206.34,44H152a4,4,0,0,1,0-8h64a4,4,0,0,1,4,4Zm-36,28a4,4,0,0,0-4,4v72a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V80a4,4,0,0,1,4-4h72a4,4,0,0,0,0-8H48A12,12,0,0,0,36,80V208a12,12,0,0,0,12,12H176a12,12,0,0,0,12-12V136A4,4,0,0,0,184,132Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208.49,120.49a12,12,0,0,1-17,0L140,69V216a12,12,0,0,1-24,0V69L64.49,120.49a12,12,0,0,1-17-17l72-72a12,12,0,0,1,17,0l72,72A12,12,0,0,1,208.49,120.49Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,112H56l72-72Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M205.66,106.34l-72-72a8,8,0,0,0-11.32,0l-72,72A8,8,0,0,0,56,120h64v96a8,8,0,0,0,16,0V120h64a8,8,0,0,0,5.66-13.66ZM75.31,104,128,51.31,180.69,104Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M207.39,115.06A8,8,0,0,1,200,120H136v96a8,8,0,0,1-16,0V120H56a8,8,0,0,1-5.66-13.66l72-72a8,8,0,0,1,11.32,0l72,72A8,8,0,0,1,207.39,115.06Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M204.24,116.24a6,6,0,0,1-8.48,0L134,54.49V216a6,6,0,0,1-12,0V54.49L60.24,116.24a6,6,0,0,1-8.48-8.48l72-72a6,6,0,0,1,8.48,0l72,72A6,6,0,0,1,204.24,116.24Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M205.66,117.66a8,8,0,0,1-11.32,0L136,59.31V216a8,8,0,0,1-16,0V59.31L61.66,117.66a8,8,0,0,1-11.32-11.32l72-72a8,8,0,0,1,11.32,0l72,72A8,8,0,0,1,205.66,117.66Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M202.83,114.83a4,4,0,0,1-5.66,0L132,49.66V216a4,4,0,0,1-8,0V49.66L58.83,114.83a4,4,0,0,1-5.66-5.66l72-72a4,4,0,0,1,5.66,0l72,72A4,4,0,0,1,202.83,114.83Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M228,48V96a12,12,0,0,1-12,12H168a12,12,0,0,1,0-24h19l-7.8-7.8a75.55,75.55,0,0,0-53.32-22.26h-.43A75.49,75.49,0,0,0,72.39,75.57,12,12,0,1,1,55.61,58.41a99.38,99.38,0,0,1,69.87-28.47H126A99.42,99.42,0,0,1,196.2,59.23L204,67V48a12,12,0,0,1,24,0ZM183.61,180.43a75.49,75.49,0,0,1-53.09,21.63h-.43A75.55,75.55,0,0,1,76.77,179.8L69,172H88a12,12,0,0,0,0-24H40a12,12,0,0,0-12,12v48a12,12,0,0,0,24,0V189l7.8,7.8A99.42,99.42,0,0,0,130,226.06h.56a99.38,99.38,0,0,0,69.87-28.47,12,12,0,0,0-16.78-17.16Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1-5.66-13.66L180.65,72a79.48,79.48,0,0,0-54.72-22.09h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27,96,96,0,0,1,192,60.7l18.36-18.36A8,8,0,0,1,224,48ZM186.41,183.29A80,80,0,0,1,75.35,184l18.31-18.31A8,8,0,0,0,88,152H40a8,8,0,0,0-8,8v48a8,8,0,0,0,13.66,5.66L64,195.3a95.42,95.42,0,0,0,66,26.76h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222,48V96a6,6,0,0,1-6,6H168a6,6,0,0,1,0-12h33.52L183.47,72a81.51,81.51,0,0,0-57.53-24h-.46A81.5,81.5,0,0,0,68.19,71.28a6,6,0,1,1-8.38-8.58,93.38,93.38,0,0,1,65.67-26.76H126a93.45,93.45,0,0,1,66,27.53l18,18V48a6,6,0,0,1,12,0ZM187.81,184.72a81.5,81.5,0,0,1-57.29,23.34h-.46a81.51,81.51,0,0,1-57.53-24L54.48,166H88a6,6,0,0,0,0-12H40a6,6,0,0,0-6,6v48a6,6,0,0,0,12,0V174.48l18,18.05a93.45,93.45,0,0,0,66,27.53h.52a93.38,93.38,0,0,0,65.67-26.76,6,6,0,1,0-8.38-8.58Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220,48V96a4,4,0,0,1-4,4H168a4,4,0,0,1,0-8h38.34L184.89,70.54A84,84,0,0,0,66.8,69.85a4,4,0,1,1-5.6-5.72,92,92,0,0,1,129.34.76L212,86.34V48a4,4,0,0,1,8,0ZM189.2,186.15a83.44,83.44,0,0,1-58.68,23.91h-.47a83.52,83.52,0,0,1-58.94-24.6L49.66,164H88a4,4,0,0,0,0-8H40a4,4,0,0,0-4,4v48a4,4,0,0,0,8,0V169.66l21.46,21.45A91.43,91.43,0,0,0,130,218.06h.51a91.45,91.45,0,0,0,64.28-26.19,4,4,0,1,0-5.6-5.72Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M120.49,167.51a12,12,0,0,1,0,17l-32,32a12,12,0,0,1-17,0l-32-32a12,12,0,1,1,17-17L68,179V48a12,12,0,0,1,24,0V179l11.51-11.52A12,12,0,0,1,120.49,167.51Zm96-96-32-32a12,12,0,0,0-17,0l-32,32a12,12,0,0,0,17,17L164,77V208a12,12,0,0,0,24,0V77l11.51,11.52a12,12,0,0,0,17-17Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,48V208H80V48Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M117.66,170.34a8,8,0,0,1,0,11.32l-32,32a8,8,0,0,1-11.32,0l-32-32a8,8,0,0,1,11.32-11.32L72,188.69V48a8,8,0,0,1,16,0V188.69l18.34-18.35A8,8,0,0,1,117.66,170.34Zm96-96-32-32a8,8,0,0,0-11.32,0l-32,32a8,8,0,0,0,11.32,11.32L168,67.31V208a8,8,0,0,0,16,0V67.31l18.34,18.35a8,8,0,0,0,11.32-11.32Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M119.39,172.94a8,8,0,0,1-1.73,8.72l-32,32a8,8,0,0,1-11.32,0l-32-32A8,8,0,0,1,48,168H72V48a8,8,0,0,1,16,0V168h24A8,8,0,0,1,119.39,172.94Zm94.27-98.6-32-32a8,8,0,0,0-11.32,0l-32,32A8,8,0,0,0,144,88h24V208a8,8,0,0,0,16,0V88h24a8,8,0,0,0,5.66-13.66Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M116.24,171.76a6,6,0,0,1,0,8.48l-32,32a6,6,0,0,1-8.48,0l-32-32a6,6,0,0,1,8.48-8.48L74,193.51V48a6,6,0,0,1,12,0V193.51l21.76-21.75A6,6,0,0,1,116.24,171.76Zm96-96-32-32a6,6,0,0,0-8.48,0l-32,32a6,6,0,0,0,8.48,8.48L170,62.49V208a6,6,0,0,0,12,0V62.49l21.76,21.75a6,6,0,0,0,8.48-8.48Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M117.66,170.34a8,8,0,0,1,0,11.32l-32,32a8,8,0,0,1-11.32,0l-32-32a8,8,0,0,1,11.32-11.32L72,188.69V48a8,8,0,0,1,16,0V188.69l18.34-18.35A8,8,0,0,1,117.66,170.34Zm96-96-32-32a8,8,0,0,0-11.32,0l-32,32a8,8,0,0,0,11.32,11.32L168,67.31V208a8,8,0,0,0,16,0V67.31l18.34,18.35a8,8,0,0,0,11.32-11.32Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M114.83,173.17a4,4,0,0,1,0,5.66l-32,32a4,4,0,0,1-5.66,0l-32-32a4,4,0,0,1,5.66-5.66L76,198.34V48a4,4,0,0,1,8,0V198.34l25.17-25.17A4,4,0,0,1,114.83,173.17Zm96-96-32-32a4,4,0,0,0-5.66,0l-32,32a4,4,0,0,0,5.66,5.66L172,57.66V208a4,4,0,0,0,8,0V57.66l25.17,25.17a4,4,0,1,0,5.66-5.66Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,20a108,108,0,0,0,0,216c22.27,0,45.69-6.73,62.64-18a12,12,0,1,0-13.29-20c-13,8.63-31.89,14-49.35,14a84,84,0,1,1,84-84c0,9.29-1.67,17.08-4.69,21.95-2.64,4.24-6,6.05-11.31,6.05s-8.67-1.81-11.31-6.05c-3-4.87-4.69-12.66-4.69-21.95V88a12,12,0,0,0-23.49-3.46,52,52,0,1,0,8.86,79.57C172.3,174.3,182.81,180,196,180c24.67,0,40-19.92,40-52A108.12,108.12,0,0,0,128,20Zm0,136a28,28,0,1,1,28-28A28,28,0,0,1,128,156Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24a104,104,0,0,0,0,208c21.51,0,44.1-6.48,60.43-17.33a8,8,0,0,0-8.86-13.33C166,210.38,146.21,216,128,216a88,88,0,1,1,88-88c0,26.45-10.88,32-20,32s-20-5.55-20-32V88a8,8,0,0,0-16,0v4.26a48,48,0,1,0,5.93,65.1c6,12,16.35,18.64,30.07,18.64,22.54,0,36-17.94,36-48A104.11,104.11,0,0,0,128,24Zm0,136a32,32,0,1,1,32-32A32,32,0,0,1,128,160Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M232,128c0,.51,0,1,0,1.52-.34,14.26-5.63,30.48-28,30.48-23.14,0-28-17.4-28-32V88a8,8,0,0,0-8.53-8A8.17,8.17,0,0,0,160,88.27v4a48,48,0,1,0,6.73,64.05,40.19,40.19,0,0,0,3.38,5C175.48,168,185.71,176,204,176a54.81,54.81,0,0,0,9.22-.75,4,4,0,0,1,4.09,6A104.05,104.05,0,0,1,125.91,232C71.13,230.9,26.2,186.86,24.08,132.11A104,104,0,1,1,232,128ZM96,128a32,32,0,1,0,32-32A32,32,0,0,0,96,128Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,26a102,102,0,0,0,0,204c21.13,0,43.31-6.35,59.32-17a6,6,0,0,0-6.65-10c-13.9,9.25-34.09,15-52.67,15a90,90,0,1,1,90-90c0,29.58-13.78,34-22,34s-22-4.42-22-34V88a6,6,0,0,0-12,0v9a46,46,0,1,0,4.34,56.32C171.76,166.6,182,174,196,174c21.29,0,34-17.2,34-46A102.12,102.12,0,0,0,128,26Zm0,136a34,34,0,1,1,34-34A34,34,0,0,1,128,162Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24a104,104,0,0,0,0,208c21.51,0,44.1-6.48,60.43-17.33a8,8,0,0,0-8.86-13.33C166,210.38,146.21,216,128,216a88,88,0,1,1,88-88c0,26.45-10.88,32-20,32s-20-5.55-20-32V88a8,8,0,0,0-16,0v4.26a48,48,0,1,0,5.93,65.1c6,12,16.35,18.64,30.07,18.64,22.54,0,36-17.94,36-48A104.11,104.11,0,0,0,128,24Zm0,136a32,32,0,1,1,32-32A32,32,0,0,1,128,160Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,28a100,100,0,0,0,0,200c20.76,0,42.52-6.23,58.21-16.66a4,4,0,1,0-4.43-6.67C167.35,214.27,147.24,220,128,220a92,92,0,1,1,92-92c0,31.32-15,36-24,36s-24-4.68-24-36V88a4,4,0,0,0-8,0v14.75a44,44,0,1,0,2.82,45.94C171.46,163.58,181.66,172,196,172c20,0,32-16.45,32-44A100.11,100.11,0,0,0,128,28Zm0,136a36,36,0,1,1,36-36A36,36,0,0,1,128,164Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as A from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ A.createElement(A.Fragment, null, /* @__PURE__ */ A.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20ZM60,177.28A83.59,83.59,0,0,1,44.87,140H75.14A83.1,83.1,0,0,1,60,177.28ZM44.87,116A83.59,83.59,0,0,1,60,78.72,83.1,83.1,0,0,1,75.14,116ZM116,211.13a83.63,83.63,0,0,1-39-16.46A106.94,106.94,0,0,0,99.34,140H116ZM116,116H99.34A106.94,106.94,0,0,0,77,61.33a83.63,83.63,0,0,1,39-16.46Zm80-37.28A83.59,83.59,0,0,1,211.13,116H180.86A83.1,83.1,0,0,1,196,78.72ZM140,211.13V140h16.66A106.94,106.94,0,0,0,179,194.67,83.63,83.63,0,0,1,140,211.13ZM156.66,116H140V44.87a83.63,83.63,0,0,1,39,16.46A106.94,106.94,0,0,0,156.66,116ZM196,177.28A83.1,83.1,0,0,1,180.86,140h30.27A83.59,83.59,0,0,1,196,177.28Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ A.createElement(A.Fragment, null, /* @__PURE__ */ A.createElement(\n      \"path\",\n      {\n        d: \"M60,195.88h0l.12.12ZM60,60h0a96.43,96.43,0,0,0,0,135.88,96.09,96.09,0,0,0,28-67.94A96.09,96.09,0,0,0,60,60Zm136,0h0a96.43,96.43,0,0,0,0,135.88A96.43,96.43,0,0,0,196,60Zm0,135.88.12.12-.12-.12Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ A.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM40.37,136H79.63A87.2,87.2,0,0,1,60,183.83,87.54,87.54,0,0,1,40.37,136ZM136,120V40.37a87.59,87.59,0,0,1,48.68,20.37A103.06,103.06,0,0,0,160.3,120Zm-16,0H95.7A103.06,103.06,0,0,0,71.32,60.74,87.59,87.59,0,0,1,120,40.37Zm-40.37,0H40.37A87.54,87.54,0,0,1,60,72.17,87.2,87.2,0,0,1,79.63,120ZM95.7,136H120v79.63a87.59,87.59,0,0,1-48.68-20.37A103.09,103.09,0,0,0,95.7,136Zm40.3,0h24.3a103.09,103.09,0,0,0,24.38,59.26A87.59,87.59,0,0,1,136,215.63Zm40.37,0h39.26A87.54,87.54,0,0,1,196,183.83,87.2,87.2,0,0,1,176.37,136Zm0-16A87.2,87.2,0,0,1,196,72.17,87.54,87.54,0,0,1,215.63,120Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ A.createElement(A.Fragment, null, /* @__PURE__ */ A.createElement(\"path\", { d: \"M63.6,46.39a103.48,103.48,0,0,1,52-21.65,4,4,0,0,1,4.45,4V120H95.7A103.77,103.77,0,0,0,63.38,52.44,4,4,0,0,1,63.6,46.39ZM46,64.07a103.51,103.51,0,0,0-21.29,51.46,4,4,0,0,0,4,4.47H79.63A87.86,87.86,0,0,0,51.89,63.59,4,4,0,0,0,46,64.07ZM192.4,46.39a103.48,103.48,0,0,0-52-21.65,4,4,0,0,0-4.45,4V120h24.3a103.77,103.77,0,0,1,32.32-67.56A4,4,0,0,0,192.4,46.39Zm38.86,69.14A103.51,103.51,0,0,0,210,64.07a4,4,0,0,0-5.86-.48A87.86,87.86,0,0,0,176.37,120h50.91A4,4,0,0,0,231.26,115.53ZM24.74,140.47A103.51,103.51,0,0,0,46,191.93a4,4,0,0,0,5.86.48A87.86,87.86,0,0,0,79.63,136H28.72A4,4,0,0,0,24.74,140.47ZM210,191.93a103.51,103.51,0,0,0,21.29-51.46,4,4,0,0,0-4-4.47H176.37a87.86,87.86,0,0,0,27.74,56.41A4,4,0,0,0,210,191.93ZM63.6,209.61a103.48,103.48,0,0,0,52,21.65,4,4,0,0,0,4.45-4V136H95.7a103.77,103.77,0,0,1-32.32,67.56A4,4,0,0,0,63.6,209.61ZM160.3,136H136v91.28a4,4,0,0,0,4.45,4,103.48,103.48,0,0,0,52-21.65,4,4,0,0,0,.22-6.05A103.77,103.77,0,0,1,160.3,136Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ A.createElement(A.Fragment, null, /* @__PURE__ */ A.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26ZM60,69.09A89.23,89.23,0,0,1,81.78,122H38.2A89.65,89.65,0,0,1,60,69.09ZM38.2,134H81.78A89.23,89.23,0,0,1,60,186.91,89.65,89.65,0,0,1,38.2,134ZM122,217.8a89.66,89.66,0,0,1-53.5-22.34A101.18,101.18,0,0,0,93.82,134H122Zm0-95.8H93.82A101.18,101.18,0,0,0,68.5,60.54,89.66,89.66,0,0,1,122,38.2Zm95.8,0H174.22A89.23,89.23,0,0,1,196,69.09,89.65,89.65,0,0,1,217.8,122ZM134,38.2a89.66,89.66,0,0,1,53.5,22.34A101.18,101.18,0,0,0,162.18,122H134Zm0,179.6V134h28.18a101.18,101.18,0,0,0,25.32,61.46A89.66,89.66,0,0,1,134,217.8Zm62-30.89A89.23,89.23,0,0,1,174.22,134H217.8A89.65,89.65,0,0,1,196,186.91Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ A.createElement(A.Fragment, null, /* @__PURE__ */ A.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM60,72.17A87.2,87.2,0,0,1,79.63,120H40.37A87.54,87.54,0,0,1,60,72.17ZM136,120V40.37a87.59,87.59,0,0,1,48.68,20.37A103.06,103.06,0,0,0,160.3,120Zm-16,0H95.7A103.06,103.06,0,0,0,71.32,60.74,87.59,87.59,0,0,1,120,40.37ZM79.63,136A87.2,87.2,0,0,1,60,183.83,87.54,87.54,0,0,1,40.37,136Zm16.07,0H120v79.63a87.59,87.59,0,0,1-48.68-20.37A103.09,103.09,0,0,0,95.7,136Zm40.3,0h24.3a103.09,103.09,0,0,0,24.38,59.26A87.59,87.59,0,0,1,136,215.63Zm40.37,0h39.26A87.54,87.54,0,0,1,196,183.83,87.2,87.2,0,0,1,176.37,136Zm0-16A87.2,87.2,0,0,1,196,72.17,87.54,87.54,0,0,1,215.63,120Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ A.createElement(A.Fragment, null, /* @__PURE__ */ A.createElement(\"path\", { d: \"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28ZM60,66.07A91.22,91.22,0,0,1,83.9,124H36.09A91.7,91.7,0,0,1,60,66.07ZM132,124V36.09a91.63,91.63,0,0,1,58.32,24.3A99.24,99.24,0,0,0,164.09,124Zm-8,0H91.91A99.24,99.24,0,0,0,65.68,60.39,91.63,91.63,0,0,1,124,36.09Zm-40.1,8A91.22,91.22,0,0,1,60,189.93,91.7,91.7,0,0,1,36.09,132Zm8,0H124v87.91a91.63,91.63,0,0,1-58.32-24.3A99.24,99.24,0,0,0,91.91,132ZM132,132h32.09a99.24,99.24,0,0,0,26.23,63.61A91.63,91.63,0,0,1,132,219.91Zm40.1,0h47.81A91.7,91.7,0,0,1,196,189.93,91.22,91.22,0,0,1,172.1,132Zm0-8A91.22,91.22,0,0,1,196,66.07,91.7,91.7,0,0,1,219.91,124Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M225.29,165.93C216.61,151,212,129.57,212,104a84,84,0,0,0-168,0c0,25.58-4.59,47-13.27,61.93A20.08,20.08,0,0,0,30.66,186,19.77,19.77,0,0,0,48,196H84.18a44,44,0,0,0,87.64,0H208a19.77,19.77,0,0,0,17.31-10A20.08,20.08,0,0,0,225.29,165.93ZM128,212a20,20,0,0,1-19.6-16h39.2A20,20,0,0,1,128,212ZM54.66,172C63.51,154,68,131.14,68,104a60,60,0,0,1,120,0c0,27.13,4.48,50,13.33,68Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,192H48a8,8,0,0,1-6.88-12C47.71,168.6,56,139.81,56,104a72,72,0,0,1,144,0c0,35.82,8.3,64.6,14.9,76A8,8,0,0,1,208,192Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220.07,176.94C214.41,167.2,206,139.73,206,104a78,78,0,1,0-156,0c0,35.74-8.42,63.2-14.08,72.94A14,14,0,0,0,48,198H90.48a38,38,0,0,0,75,0H208a14,14,0,0,0,12.06-21.06ZM128,218a26,26,0,0,1-25.29-20h50.58A26,26,0,0,1,128,218Zm81.71-33a1.9,1.9,0,0,1-1.7,1H48a1.9,1.9,0,0,1-1.7-1,2,2,0,0,1,0-2C53.87,170,62,139.69,62,104a66,66,0,1,1,132,0c0,35.68,8.14,65.95,15.71,79A2,2,0,0,1,209.71,185Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M221.8,175.94C216.25,166.38,208,139.33,208,104a80,80,0,1,0-160,0c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.81a40,40,0,0,0,78.38,0H208a16,16,0,0,0,13.8-24.06ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a64,64,0,1,1,128,0c0,36.05,8.28,66.73,16,80Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M218.35,178C212.58,168,204,140.13,204,104a76,76,0,1,0-152,0c0,36.13-8.59,64-14.36,73.95A12,12,0,0,0,48,196H92.23a36,36,0,0,0,71.54,0H208A12,12,0,0,0,218.35,178ZM128,220a28,28,0,0,1-27.71-24h55.42A28,28,0,0,1,128,220Zm83.45-34a3.91,3.91,0,0,1-3.44,2H48a3.91,3.91,0,0,1-3.44-2,4,4,0,0,1,0-4C52,169.17,60,139.32,60,104a68,68,0,1,1,136,0c0,35.31,8,65.17,15.44,78A4,4,0,0,1,211.45,186Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M225.81,74.65A11.86,11.86,0,0,1,220.3,76a12,12,0,0,1-10.67-6.47,90.1,90.1,0,0,0-32-35.38,12,12,0,1,1,12.8-20.29,115.25,115.25,0,0,1,40.54,44.62A12,12,0,0,1,225.81,74.65ZM46.37,69.53a90.1,90.1,0,0,1,32-35.38A12,12,0,1,0,65.6,13.86,115.25,115.25,0,0,0,25.06,58.48a12,12,0,0,0,5.13,16.17A11.86,11.86,0,0,0,35.7,76,12,12,0,0,0,46.37,69.53Zm173.51,98.35A20,20,0,0,1,204,200H171.81a44,44,0,0,1-87.62,0H52a20,20,0,0,1-15.91-32.12c7.17-9.33,15.73-26.62,15.88-55.94A76,76,0,0,1,204,112C204.15,141.26,212.71,158.55,219.88,167.88ZM147.6,200H108.4a20,20,0,0,0,39.2,0Zm48.74-24c-8.16-13-16.19-33.57-16.34-63.94A52,52,0,1,0,76,112c-.15,30.42-8.18,51-16.34,64Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,192H48a8,8,0,0,1-6.88-12C47.71,168.6,56,147.81,56,112a72,72,0,0,1,144,0c0,35.82,8.3,56.6,14.9,68A8,8,0,0,1,208,192Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,71.1a8,8,0,0,1-10.78-3.42,94.13,94.13,0,0,0-33.46-36.91,8,8,0,1,1,8.54-13.54,111.46,111.46,0,0,1,39.12,43.09A8,8,0,0,1,224,71.1ZM35.71,72a8,8,0,0,0,7.1-4.32A94.13,94.13,0,0,1,76.27,30.77a8,8,0,1,0-8.54-13.54A111.46,111.46,0,0,0,28.61,60.32,8,8,0,0,0,35.71,72Zm186.1,103.94A16,16,0,0,1,208,200H167.2a40,40,0,0,1-78.4,0H48a16,16,0,0,1-13.79-24.06C43.22,160.39,48,138.28,48,112a80,80,0,0,1,160,0C208,138.27,212.78,160.38,221.81,175.94ZM150.62,200H105.38a24,24,0,0,0,45.24,0ZM208,184c-10.64-18.27-16-42.49-16-72a64,64,0,0,0-128,0c0,29.52-5.38,53.74-16,72Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,71.1a8,8,0,0,1-10.78-3.42,94.13,94.13,0,0,0-33.46-36.91,8,8,0,1,1,8.54-13.54,111.46,111.46,0,0,1,39.12,43.09A8,8,0,0,1,224,71.1ZM35.71,72a8,8,0,0,0,7.1-4.32A94.13,94.13,0,0,1,76.27,30.77a8,8,0,1,0-8.54-13.54A111.46,111.46,0,0,0,28.61,60.32,8,8,0,0,0,35.71,72Zm186.1,103.94A16,16,0,0,1,208,200H167.2a40,40,0,0,1-78.4,0H48a16,16,0,0,1-13.79-24.06C43.22,160.39,48,138.28,48,112a80,80,0,0,1,160,0C208,138.27,212.78,160.38,221.81,175.94ZM150.62,200H105.38a24,24,0,0,0,45.24,0Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M223.05,69.33A6,6,0,0,1,215,66.76,96,96,0,0,0,180.8,29.08a6,6,0,0,1,6.4-10.15,109.26,109.26,0,0,1,38.41,42.31A6,6,0,0,1,223.05,69.33ZM41,66.76A96,96,0,0,1,75.2,29.08a6,6,0,0,0-6.4-10.15A109.26,109.26,0,0,0,30.39,61.24,6,6,0,1,0,41,66.76Zm179,110.18A14,14,0,0,1,208,198h-42.5a38,38,0,0,1-75,0H48a14,14,0,0,1-12.06-21.06C45.13,161.09,50,138.63,50,112a78,78,0,0,1,156,0C206,139,210.74,160.86,220.08,176.94ZM153.29,198H102.71a26,26,0,0,0,50.58,0Zm56.42-15C199.29,165,194,141.15,194,112a66,66,0,0,0-132,0c0,29.16-5.29,53-15.71,71a2,2,0,0,0,0,2,1.9,1.9,0,0,0,1.7,1H208a1.9,1.9,0,0,0,1.7-1A2,2,0,0,0,209.71,183Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,71.1a8,8,0,0,1-10.78-3.42,94.13,94.13,0,0,0-33.46-36.91,8,8,0,1,1,8.54-13.54,111.46,111.46,0,0,1,39.12,43.09A8,8,0,0,1,224,71.1ZM35.71,72a8,8,0,0,0,7.1-4.32A94.13,94.13,0,0,1,76.27,30.77a8,8,0,1,0-8.54-13.54A111.46,111.46,0,0,0,28.61,60.32,8,8,0,0,0,35.71,72Zm186.1,103.94A16,16,0,0,1,208,200H167.2a40,40,0,0,1-78.4,0H48a16,16,0,0,1-13.79-24.06C43.22,160.39,48,138.28,48,112a80,80,0,0,1,160,0C208,138.27,212.78,160.38,221.81,175.94ZM150.62,200H105.38a24,24,0,0,0,45.24,0ZM208,184c-10.64-18.27-16-42.49-16-72a64,64,0,0,0-128,0c0,29.52-5.38,53.74-16,72Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222.13,67.55a3.94,3.94,0,0,1-1.84.45,4,4,0,0,1-3.55-2.16,99.41,99.41,0,0,0-34.87-38.46,4,4,0,1,1,4.26-6.76,107.34,107.34,0,0,1,37.71,41.54A4,4,0,0,1,222.13,67.55ZM39.26,65.84A99.41,99.41,0,0,1,74.13,27.38a4,4,0,0,0-4.26-6.76A107.34,107.34,0,0,0,32.16,62.16a4,4,0,0,0,1.71,5.39,3.94,3.94,0,0,0,1.84.45A4,4,0,0,0,39.26,65.84ZM218.36,178A12,12,0,0,1,208,196H163.77a36,36,0,0,1-71.54,0H48A12,12,0,0,1,37.64,178C47.17,161.56,52,139.37,52,112a76,76,0,0,1,152,0C204,139.36,208.83,161.55,218.36,178ZM155.71,196H100.29a28,28,0,0,0,55.42,0Zm55.73-14C201.19,164.34,196,140.79,196,112a68,68,0,0,0-136,0c0,28.8-5.19,52.34-15.44,70a4,4,0,0,0,0,4A3.89,3.89,0,0,0,48,188H208a3.89,3.89,0,0,0,3.43-2A4,4,0,0,0,211.44,182Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216.88,207.93l-160-176A12,12,0,1,0,39.12,48.07l14.8,16.29A83.58,83.58,0,0,0,44,104c0,25.58-4.59,47-13.27,61.93A20.08,20.08,0,0,0,30.68,186,19.75,19.75,0,0,0,48,196H84.19a44,44,0,0,0,87.62,0h1.79l25.52,28.07a12,12,0,0,0,17.76-16.14ZM68,104a59.84,59.84,0,0,1,3.52-20.29L151.78,172H54.68C63.52,154,68,131.14,68,104Zm60,108a20,20,0,0,1-19.6-16h39.2A20,20,0,0,1,128,212ZM88.89,42.35a12,12,0,0,1,6.37-15.73A84,84,0,0,1,212,104c0,18.68,2.38,34.93,7.07,48.28a12,12,0,1,1-22.64,8C190.83,144.32,188,125.4,188,104a60,60,0,0,0-83.38-55.28A12,12,0,0,1,88.89,42.35Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,192H48a8,8,0,0,1-6.88-12C47.71,168.6,56,139.81,56,104a72,72,0,0,1,144,0c0,35.82,8.3,64.6,14.9,76A8,8,0,0,1,208,192Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M53.92,34.62A8,8,0,1,0,42.08,45.38L58.82,63.8A79.59,79.59,0,0,0,48,104c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.8a40,40,0,0,0,78.4,0h15.44l19.44,21.38a8,8,0,1,0,11.84-10.76ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a63.65,63.65,0,0,1,6.26-27.62L168.09,184Zm166-4.73a8.13,8.13,0,0,1-2.93.55,8,8,0,0,1-7.44-5.08C196.35,156.19,192,129.75,192,104A64,64,0,0,0,96.43,48.31a8,8,0,0,1-7.9-13.91A80,80,0,0,1,208,104c0,35.35,8.05,58.59,10.52,64.88A8,8,0,0,1,214,179.25Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M221.84,192v0a1.85,1.85,0,0,1-3,.28L83.27,43.19a4,4,0,0,1,.8-6A79.55,79.55,0,0,1,129.17,24C173,24.66,207.8,61.1,208,104.92c.14,34.88,8.31,61.54,13.82,71A15.89,15.89,0,0,1,221.84,192Zm-7.92,18.62a8,8,0,0,1-11.85,10.76L182.62,200H167.16a40,40,0,0,1-78.41,0H47.91a15.78,15.78,0,0,1-13.59-7.59,16.42,16.42,0,0,1-.09-16.68c5.55-9.73,13.7-36.64,13.7-71.73A79.42,79.42,0,0,1,58.79,63.85L42,45.38A8,8,0,1,1,53.84,34.62ZM150.59,200H105.32a24,24,0,0,0,45.27,0Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M52.44,36A6,6,0,0,0,43.56,44L61.31,63.56A77.45,77.45,0,0,0,50,104c0,35.74-8.42,63.2-14.08,72.94A14,14,0,0,0,48,198h42.5a38,38,0,0,0,75,0h18l20,22a6,6,0,0,0,8.88-8.08ZM128,218a26,26,0,0,1-25.29-20h50.58A26,26,0,0,1,128,218ZM48,186a1.9,1.9,0,0,1-1.7-1,2,2,0,0,1,0-2C53.86,170,62,139.69,62,104a65.63,65.63,0,0,1,7.78-31.12L172.62,186Zm165.29-8.62a5.88,5.88,0,0,1-2.2.42,6,6,0,0,1-5.58-3.81c-7.2-18.31-11.49-44.48-11.49-70A66,66,0,0,0,95.45,46.57a6,6,0,1,1-5.93-10.43A78,78,0,0,1,206,104c0,35.7,8.16,59.24,10.66,65.61A6,6,0,0,1,213.27,177.38Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M53.92,34.62A8,8,0,1,0,42.08,45.38L58.82,63.8A79.59,79.59,0,0,0,48,104c0,35.34-8.26,62.38-13.81,71.94A16,16,0,0,0,48,200H88.8a40,40,0,0,0,78.4,0h15.44l19.44,21.38a8,8,0,1,0,11.84-10.76ZM128,216a24,24,0,0,1-22.62-16h45.24A24,24,0,0,1,128,216ZM48,184c7.7-13.24,16-43.92,16-80a63.65,63.65,0,0,1,6.26-27.62L168.09,184Zm166-4.73a8.13,8.13,0,0,1-2.93.55,8,8,0,0,1-7.44-5.08C196.35,156.19,192,129.75,192,104A64,64,0,0,0,96.43,48.31a8,8,0,0,1-7.9-13.91A80,80,0,0,1,208,104c0,35.35,8.05,58.59,10.52,64.88A8,8,0,0,1,214,179.25Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M51,37.31A4,4,0,0,0,45,42.69L63.8,63.32A75.52,75.52,0,0,0,52,104c0,36.13-8.58,64-14.36,73.95A12,12,0,0,0,48,196H92.23a36,36,0,0,0,71.54,0h20.64L205,218.69a4,4,0,1,0,5.92-5.38ZM128,220a28,28,0,0,1-27.71-24h55.42A28,28,0,0,1,128,220ZM48,188a3.89,3.89,0,0,1-3.43-2,4,4,0,0,1,0-4C52,169.17,60,139.32,60,104a67.58,67.58,0,0,1,9.4-34.51L177.14,188Zm164.55-12.48a3.94,3.94,0,0,1-1.46.28,4,4,0,0,1-3.72-2.54C200.24,155.17,196,129.28,196,104A68,68,0,0,0,94.46,44.83a4,4,0,1,1-4-6.95A76,76,0,0,1,204,104c0,36.05,8.26,59.89,10.79,66.34A4,4,0,0,1,212.53,175.52Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M184,28H72A20,20,0,0,0,52,48V224a12,12,0,0,0,18.36,10.18l57.63-36,57.65,36A12,12,0,0,0,204,224V48A20,20,0,0,0,184,28Zm-4,24V154.35l-45.65-28.53a12,12,0,0,0-12.72,0L76,154.35V52ZM134.35,173.82a12,12,0,0,0-12.72,0L76,202.35v-19.7l52-32.5,52,32.5v19.7Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M192,176v48l-64-40L64,224V176l64-40Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M184,32H72A16,16,0,0,0,56,48V224a8,8,0,0,0,12.24,6.78L128,193.43l59.77,37.35A8,8,0,0,0,200,224V48A16,16,0,0,0,184,32Zm0,16V161.57l-51.77-32.35a8,8,0,0,0-8.48,0L72,161.56V48ZM132.23,177.22a8,8,0,0,0-8.48,0L72,209.57V180.43l56-35,56,35v29.14Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M184,32H72A16,16,0,0,0,56,48V224a8,8,0,0,0,12.24,6.78L128,193.43l59.77,37.35A8,8,0,0,0,200,224V48A16,16,0,0,0,184,32ZM132.23,177.22a8,8,0,0,0-8.48,0L72,209.57V180.43l56-35,56,35v29.14Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M184,34H72A14,14,0,0,0,58,48V224a6,6,0,0,0,9.18,5.09l60.81-38,60.83,38A6,6,0,0,0,198,224V48A14,14,0,0,0,184,34ZM72,46H184a2,2,0,0,1,2,2V165.18l-54.83-34.27a6,6,0,0,0-6.36,0L70,165.17V48A2,2,0,0,1,72,46Zm59.17,132.91a6,6,0,0,0-6.36,0L70,213.17V179.33l58-36.25,58,36.25v33.84Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M184,32H72A16,16,0,0,0,56,48V224a8,8,0,0,0,12.24,6.78L128,193.43l59.77,37.35A8,8,0,0,0,200,224V48A16,16,0,0,0,184,32Zm0,16V161.57l-51.77-32.35a8,8,0,0,0-8.48,0L72,161.56V48ZM132.23,177.22a8,8,0,0,0-8.48,0L72,209.57V180.43l56-35,56,35v29.14Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M184,36H72A12,12,0,0,0,60,48V224a4,4,0,0,0,6.12,3.39L128,188.72l61.89,38.67A4,4,0,0,0,192,228a4.06,4.06,0,0,0,1.94-.5A4,4,0,0,0,196,224V48A12,12,0,0,0,184,36ZM72,44H184a4,4,0,0,1,4,4V168.78l-57.89-36.17a4,4,0,0,0-4.24,0L68,168.78V48A4,4,0,0,1,72,44Zm58.11,136.61a4,4,0,0,0-4.24,0L68,216.78V178.22l60-37.5,60,37.5v38.56Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168.49,199.51a12,12,0,0,1-17,17l-80-80a12,12,0,0,1,0-17l80-80a12,12,0,0,1,17,17L97,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M160,48V208L80,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M163.06,40.61a8,8,0,0,0-8.72,1.73l-80,80a8,8,0,0,0,0,11.32l80,80A8,8,0,0,0,168,208V48A8,8,0,0,0,163.06,40.61ZM152,188.69,91.31,128,152,67.31Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168,48V208a8,8,0,0,1-13.66,5.66l-80-80a8,8,0,0,1,0-11.32l80-80A8,8,0,0,1,168,48Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M164.24,203.76a6,6,0,1,1-8.48,8.48l-80-80a6,6,0,0,1,0-8.48l80-80a6,6,0,0,1,8.48,8.48L88.49,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M162.83,205.17a4,4,0,0,1-5.66,5.66l-80-80a4,4,0,0,1,0-5.66l80-80a4,4,0,1,1,5.66,5.66L85.66,128Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst t = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M184.49,136.49l-80,80a12,12,0,0,1-17-17L159,128,87.51,56.49a12,12,0,1,1,17-17l80,80A12,12,0,0,1,184.49,136.49Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M176,128,96,208V48Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M181.66,122.34l-80-80A8,8,0,0,0,88,48V208a8,8,0,0,0,13.66,5.66l80-80A8,8,0,0,0,181.66,122.34ZM104,188.69V67.31L164.69,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M181.66,133.66l-80,80A8,8,0,0,1,88,208V48a8,8,0,0,1,13.66-5.66l80,80A8,8,0,0,1,181.66,133.66Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M180.24,132.24l-80,80a6,6,0,0,1-8.48-8.48L167.51,128,91.76,52.24a6,6,0,0,1,8.48-8.48l80,80A6,6,0,0,1,180.24,132.24Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M178.83,130.83l-80,80a4,4,0,0,1-5.66-5.66L170.34,128,93.17,50.83a4,4,0,0,1,5.66-5.66l80,80A4,4,0,0,1,178.83,130.83Z\" }))\n  ]\n]);\nexport {\n  t as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216.49,168.49a12,12,0,0,1-17,0L128,97,56.49,168.49a12,12,0,0,1-17-17l80-80a12,12,0,0,1,17,0l80,80A12,12,0,0,1,216.49,168.49Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,160H48l80-80Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M213.66,154.34l-80-80a8,8,0,0,0-11.32,0l-80,80A8,8,0,0,0,48,168H208a8,8,0,0,0,5.66-13.66ZM67.31,152,128,91.31,188.69,152Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M215.39,163.06A8,8,0,0,1,208,168H48a8,8,0,0,1-5.66-13.66l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,215.39,163.06Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M212.24,164.24a6,6,0,0,1-8.48,0L128,88.49,52.24,164.24a6,6,0,0,1-8.48-8.48l80-80a6,6,0,0,1,8.48,0l80,80A6,6,0,0,1,212.24,164.24Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M213.66,165.66a8,8,0,0,1-11.32,0L128,91.31,53.66,165.66a8,8,0,0,1-11.32-11.32l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,213.66,165.66Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M210.83,162.83a4,4,0,0,1-5.66,0L128,85.66,50.83,162.83a4,4,0,0,1-5.66-5.66l80-80a4,4,0,0,1,5.66,0l80,80A4,4,0,0,1,210.83,162.83Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,20A108,108,0,0,0,31.85,177.23L21,209.66A20,20,0,0,0,46.34,235l32.43-10.81A108,108,0,1,0,128,20Zm0,192a84,84,0,0,1-42.06-11.27,12,12,0,0,0-6-1.62,12.1,12.1,0,0,0-3.8.62l-29.79,9.93,9.93-29.79a12,12,0,0,0-1-9.81A84,84,0,1,1,128,212Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M224,128A96,96,0,0,1,79.93,211.11h0L42.54,223.58a8,8,0,0,1-10.12-10.12l12.47-37.39h0A96,96,0,1,1,224,128Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,0,0,36.18,176.88L24.83,210.93a16,16,0,0,0,20.24,20.24l34.05-11.35A104,104,0,1,0,128,24Zm0,192a87.87,87.87,0,0,1-44.06-11.81,8,8,0,0,0-6.54-.67L40,216,52.47,178.6a8,8,0,0,0-.66-6.54A88,88,0,1,1,128,216Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232,128A104,104,0,0,1,79.12,219.82L45.07,231.17a16,16,0,0,1-20.24-20.24l11.35-34.05A104,104,0,1,1,232,128Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,26A102,102,0,0,0,38.35,176.69L26.73,211.56a14,14,0,0,0,17.71,17.71l34.87-11.62A102,102,0,1,0,128,26Zm0,192a90,90,0,0,1-45.06-12.08,6.09,6.09,0,0,0-3-.81,6.2,6.2,0,0,0-1.9.31L40.65,217.88a2,2,0,0,1-2.53-2.53L50.58,178a6,6,0,0,0-.5-4.91A90,90,0,1,1,128,218Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,0,0,36.18,176.88L24.83,210.93a16,16,0,0,0,20.24,20.24l34.05-11.35A104,104,0,1,0,128,24Zm0,192a87.87,87.87,0,0,1-44.06-11.81,8,8,0,0,0-6.54-.67L40,216,52.47,178.6a8,8,0,0,0-.66-6.54A88,88,0,1,1,128,216Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,28A100,100,0,0,0,40.53,176.5l-11.9,35.69a12,12,0,0,0,15.18,15.18l35.69-11.9A100,100,0,1,0,128,28Zm0,192a92,92,0,0,1-46.07-12.35,4.05,4.05,0,0,0-2-.54,3.93,3.93,0,0,0-1.27.21L41.28,219.78a4,4,0,0,1-5.06-5.06l12.46-37.38a4,4,0,0,0-.33-3.27A92,92,0,1,1,128,220Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,128a16,16,0,1,1-16-16A16,16,0,0,1,120,128Zm32-16a16,16,0,1,0,16,16A16,16,0,0,0,152,112Zm84,16A108,108,0,0,1,78.77,224.15L46.34,235A20,20,0,0,1,21,209.66l10.81-32.43A108,108,0,1,1,236,128Zm-24,0A84,84,0,1,0,55.27,170.06a12,12,0,0,1,1,9.81l-9.93,29.79,29.79-9.93a12.1,12.1,0,0,1,3.8-.62,12,12,0,0,1,6,1.62A84,84,0,0,0,212,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,128A96,96,0,0,1,79.93,211.11h0L42.54,223.58a8,8,0,0,1-10.12-10.12l12.47-37.39h0A96,96,0,1,1,224,128Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24A104,104,0,0,0,36.18,176.88L24.83,210.93a16,16,0,0,0,20.24,20.24l34.05-11.35A104,104,0,1,0,128,24Zm0,192a87.87,87.87,0,0,1-44.06-11.81,8,8,0,0,0-4-1.08,7.85,7.85,0,0,0-2.53.42L40,216,52.47,178.6a8,8,0,0,0-.66-6.54A88,88,0,1,1,128,216Zm12-88a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm-44,0a12,12,0,1,1-12-12A12,12,0,0,1,96,128Zm88,0a12,12,0,1,1-12-12A12,12,0,0,1,184,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24A104,104,0,0,0,36.18,176.88L24.83,210.93a16,16,0,0,0,20.24,20.24l34.05-11.35A104,104,0,1,0,128,24ZM84,140a12,12,0,1,1,12-12A12,12,0,0,1,84,140Zm44,0a12,12,0,1,1,12-12A12,12,0,0,1,128,140Zm44,0a12,12,0,1,1,12-12A12,12,0,0,1,172,140Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M138,128a10,10,0,1,1-10-10A10,10,0,0,1,138,128ZM84,118a10,10,0,1,0,10,10A10,10,0,0,0,84,118Zm88,0a10,10,0,1,0,10,10A10,10,0,0,0,172,118Zm58,10A102,102,0,0,1,79.31,217.65L44.44,229.27a14,14,0,0,1-17.71-17.71l11.62-34.87A102,102,0,1,1,230,128Zm-12,0A90,90,0,1,0,50.08,173.06a6,6,0,0,1,.5,4.91L38.12,215.35a2,2,0,0,0,2.53,2.53L78,205.42a6.2,6.2,0,0,1,1.9-.31,6.09,6.09,0,0,1,3,.81A90,90,0,0,0,218,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128ZM84,116a12,12,0,1,0,12,12A12,12,0,0,0,84,116Zm88,0a12,12,0,1,0,12,12A12,12,0,0,0,172,116Zm60,12A104,104,0,0,1,79.12,219.82L45.07,231.17a16,16,0,0,1-20.24-20.24l11.35-34.05A104,104,0,1,1,232,128Zm-16,0A88,88,0,1,0,51.81,172.06a8,8,0,0,1,.66,6.54L40,216,77.4,203.53a7.85,7.85,0,0,1,2.53-.42,8,8,0,0,1,4,1.08A88,88,0,0,0,216,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M136,128a8,8,0,1,1-8-8A8,8,0,0,1,136,128Zm-52-8a8,8,0,1,0,8,8A8,8,0,0,0,84,120Zm88,0a8,8,0,1,0,8,8A8,8,0,0,0,172,120Zm56,8A100,100,0,0,1,79.5,215.47l-35.69,11.9a12,12,0,0,1-15.18-15.18l11.9-35.69A100,100,0,1,1,228,128Zm-8,0A92,92,0,1,0,48.35,174.07a4,4,0,0,1,.33,3.27L36.22,214.72a4,4,0,0,0,5.06,5.06l37.38-12.46a3.93,3.93,0,0,1,1.27-.21,4.05,4.05,0,0,1,2,.54A92,92,0,0,0,220,128Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M132,20A104.11,104.11,0,0,0,28,124v84a20,20,0,0,0,20,20h84a104,104,0,0,0,0-208Zm0,184H52V124a80,80,0,1,1,80,80Zm-8-76a16,16,0,1,1-16-16A16,16,0,0,1,124,128Zm48,0a16,16,0,1,1-16-16A16,16,0,0,1,172,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,124h0a92,92,0,0,1-92,92H48a8,8,0,0,1-8-8V124a92,92,0,0,1,92-92h0A92,92,0,0,1,224,124Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M132,24A100.11,100.11,0,0,0,32,124v84a16,16,0,0,0,16,16h84a100,100,0,0,0,0-200Zm0,184H48V124a84,84,0,1,1,84,84Zm12-80a12,12,0,1,1-12-12A12,12,0,0,1,144,128Zm-44,0a12,12,0,1,1-12-12A12,12,0,0,1,100,128Zm88,0a12,12,0,1,1-12-12A12,12,0,0,1,188,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M132,24A100.11,100.11,0,0,0,32,124v84a16,16,0,0,0,16,16h84a100,100,0,0,0,0-200ZM88,140a12,12,0,1,1,12-12A12,12,0,0,1,88,140Zm44,0a12,12,0,1,1,12-12A12,12,0,0,1,132,140Zm44,0a12,12,0,1,1,12-12A12,12,0,0,1,176,140Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M142,128a10,10,0,1,1-10-10A10,10,0,0,1,142,128ZM88,118a10,10,0,1,0,10,10A10,10,0,0,0,88,118Zm88,0a10,10,0,1,0,10,10A10,10,0,0,0,176,118Zm54,6a98.11,98.11,0,0,1-98,98H48a14,14,0,0,1-14-14V124a98,98,0,0,1,196,0Zm-12,0a86,86,0,0,0-172,0v84a2,2,0,0,0,2,2h84A86.1,86.1,0,0,0,218,124Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M132,24A100.11,100.11,0,0,0,32,124v84a16,16,0,0,0,16,16h84a100,100,0,0,0,0-200Zm0,184H48V124a84,84,0,1,1,84,84Zm12-80a12,12,0,1,1-12-12A12,12,0,0,1,144,128Zm-44,0a12,12,0,1,1-12-12A12,12,0,0,1,100,128Zm88,0a12,12,0,1,1-12-12A12,12,0,0,1,188,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M140,128a8,8,0,1,1-8-8A8,8,0,0,1,140,128Zm-52-8a8,8,0,1,0,8,8A8,8,0,0,0,88,120Zm88,0a8,8,0,1,0,8,8A8,8,0,0,0,176,120Zm52,4a96.11,96.11,0,0,1-96,96H48a12,12,0,0,1-12-12V124a96,96,0,0,1,192,0Zm-8,0a88,88,0,0,0-176,0v84a4,4,0,0,0,4,4h84A88.1,88.1,0,0,0,220,124Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,44H40A20,20,0,0,0,20,64V224A19.82,19.82,0,0,0,31.56,242.1a20.14,20.14,0,0,0,8.49,1.9,19.91,19.91,0,0,0,12.82-4.72l.12-.11L84.47,212H216a20,20,0,0,0,20-20V64A20,20,0,0,0,216,44Zm-4,144H80a11.93,11.93,0,0,0-7.84,2.92L44,215.23V68H212ZM84,108A12,12,0,0,1,96,96h64a12,12,0,1,1,0,24H96A12,12,0,0,1,84,108Zm0,40a12,12,0,0,1,12-12h64a12,12,0,0,1,0,24H96A12,12,0,0,1,84,148Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,64V192a8,8,0,0,1-8,8H80L45.15,230.11A8,8,0,0,1,32,224V64a8,8,0,0,1,8-8H216A8,8,0,0,1,224,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H80a8,8,0,0,0-5.23,1.95L40,224V64H216ZM88,112a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H96A8,8,0,0,1,88,112Zm0,32a8,8,0,0,1,8-8h64a8,8,0,1,1,0,16H96A8,8,0,0,1,88,144Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H40A16,16,0,0,0,24,64V224a15.84,15.84,0,0,0,9.25,14.5A16.05,16.05,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM160,152H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Zm0-32H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,50H40A14,14,0,0,0,26,64V224a13.88,13.88,0,0,0,8.09,12.69A14.11,14.11,0,0,0,40,238a13.87,13.87,0,0,0,9-3.31l.06-.05L82.23,206H216a14,14,0,0,0,14-14V64A14,14,0,0,0,216,50Zm2,142a2,2,0,0,1-2,2H80a6,6,0,0,0-3.92,1.46L41.26,225.53A2,2,0,0,1,38,224V64a2,2,0,0,1,2-2H216a2,2,0,0,1,2,2Zm-52-80a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,112Zm0,32a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,144Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H80a8,8,0,0,0-5.23,1.95L40,224V64H216ZM88,112a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H96A8,8,0,0,1,88,112Zm0,32a8,8,0,0,1,8-8h64a8,8,0,1,1,0,16H96A8,8,0,0,1,88,144Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,52H40A12,12,0,0,0,28,64V224a11.89,11.89,0,0,0,6.93,10.88A12.17,12.17,0,0,0,40,236a11.89,11.89,0,0,0,7.69-2.83l0,0L81.49,204H216a12,12,0,0,0,12-12V64A12,12,0,0,0,216,52Zm4,140a4,4,0,0,1-4,4H80a4,4,0,0,0-2.62,1L42.56,227.06A4,4,0,0,1,36,224V64a4,4,0,0,1,4-4H216a4,4,0,0,1,4,4Zm-56-80a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,112Zm0,32a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,144Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,76H188V48a20,20,0,0,0-20-20H40A20,20,0,0,0,20,48V176a12,12,0,0,0,19.54,9.33l28.46-23V184a20,20,0,0,0,20,20h92.17l36.29,29.33A12,12,0,0,0,236,224V96A20,20,0,0,0,216,76ZM44,150.87V52H164v80H71.58A12,12,0,0,0,64,134.67Zm168,48-20-16.2a12,12,0,0,0-7.54-2.67H92V156h76a20,20,0,0,0,20-20V100h24Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,96V224l-39.58-32H88a8,8,0,0,1-8-8V144h88a8,8,0,0,0,8-8V88h40A8,8,0,0,1,224,96Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M232,96a16,16,0,0,0-16-16H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8Zm-42.55,89.78a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32V207.25Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,82H182V48a14,14,0,0,0-14-14H40A14,14,0,0,0,26,48V176a6,6,0,0,0,3.42,5.41A5.86,5.86,0,0,0,32,182a6,6,0,0,0,3.77-1.33L73.71,150H74v34a14,14,0,0,0,14,14h94.29l37.94,30.67A6,6,0,0,0,224,230a5.86,5.86,0,0,0,2.58-.59A6,6,0,0,0,230,224V96A14,14,0,0,0,216,82ZM71.58,138a6,6,0,0,0-3.77,1.33L38,163.43V48a2,2,0,0,1,2-2H168a2,2,0,0,1,2,2v88a2,2,0,0,1-2,2ZM218,211.43l-29.81-24.1a6,6,0,0,0-3.77-1.33H88a2,2,0,0,1-2-2V150h82a14,14,0,0,0,14-14V94h34a2,2,0,0,1,2,2Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,84H180V48a12,12,0,0,0-12-12H40A12,12,0,0,0,28,48V176a4,4,0,0,0,4,4,4,4,0,0,0,2.51-.89L73,148h3v36a12,12,0,0,0,12,12h95l38.49,31.11A4,4,0,0,0,224,228a4,4,0,0,0,4-4V96A12,12,0,0,0,216,84ZM71.58,140a4,4,0,0,0-2.51.89L36,167.62V48a4,4,0,0,1,4-4H168a4,4,0,0,1,4,4v88a4,4,0,0,1-4,4ZM220,215.62l-33.07-26.73a4,4,0,0,0-2.51-.89H88a4,4,0,0,1-4-4V148h84a12,12,0,0,0,12-12V92h36a4,4,0,0,1,4,4Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst t = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,48a20,20,0,0,0-20-20H48A20,20,0,0,0,28,48V208a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20Zm-35,68L140,63V52h11l53,53v11ZM140,97l19,19H140ZM204,71,185,52h19ZM116,52V68h0v48H52V52ZM105,204,52,151V140H63l53,53v11Zm11-45L97,140h19ZM52,185l19,19H52Zm88,19V188h0V140h64v64Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M40,128h88v88H48a8,8,0,0,1-8-8ZM208,40H128v88h88V48A8,8,0,0,0,208,40Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,88H136V48h72ZM120,48v72H48V48ZM48,136h72v72H48Zm160,72H136V136h72v72Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,176H128V128H48V48h80v80h80v80Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,34H48A14,14,0,0,0,34,48V208a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V48A14,14,0,0,0,208,34Zm-13.52,88L134,61.52V46h15.52L210,106.48V122ZM134,78.48,177.52,122H134ZM210,48V89.52L166.48,46H208A2,2,0,0,1,210,48ZM48,46h74v76H46V48A2,2,0,0,1,48,46Zm58.48,164L46,149.52V134H61.52L122,194.48V210ZM122,177.52,78.48,134H122ZM46,208V166.48L89.52,210H48A2,2,0,0,1,46,208Zm162,2H134V192h0V134h76v74A2,2,0,0,1,208,210Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm-12.69,88L136,60.69V48h12.69L208,107.32V120ZM136,83.31,172.69,120H136Zm72,1.38L171.31,48H208ZM120,48v72H48V48ZM107.31,208,48,148.69V136H60.69L120,195.31V208ZM120,172.69,83.31,136H120Zm-72-1.38L84.69,208H48ZM208,208H136V136h72v72Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,36H48A12,12,0,0,0,36,48V208a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V48A12,12,0,0,0,208,36Zm-14.34,88L132,62.34V44h18.34L212,105.66V124ZM132,73.66,182.34,124H132ZM212,48V94.34L161.66,44H208A4,4,0,0,1,212,48ZM48,44h76v80H44V48A4,4,0,0,1,48,44Zm57.66,168L44,150.34V132H62.34L124,193.66V212ZM124,182.34,73.66,132H124ZM44,208V161.66L94.34,212H48A4,4,0,0,1,44,208Zm164,4H132V132h80v76A4,4,0,0,1,208,212Z\" }))\n  ]\n]);\nexport {\n  t as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M152.41,88.56l-89.6,88a12,12,0,0,1-16.82,0L7.59,138.85a12,12,0,0,1,16.82-17.13l30,29.46,81.19-79.74a12,12,0,0,1,16.82,17.12Zm96.15-17a12,12,0,0,0-17-.15L150.4,151.18l-7.88-7.74a12,12,0,0,0-16.82,17.12l16.29,16a12,12,0,0,0,16.82,0l89.6-88A12,12,0,0,0,248.56,71.59Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M240,64V192a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V64A16,16,0,0,1,32,48H224A16,16,0,0,1,240,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M149.61,85.71l-89.6,88a8,8,0,0,1-11.22,0L10.39,136a8,8,0,1,1,11.22-11.41L54.4,156.79l84-82.5a8,8,0,1,1,11.22,11.42Zm96.1-11.32a8,8,0,0,0-11.32-.1l-84,82.5-18.83-18.5a8,8,0,0,0-11.21,11.42l24.43,24a8,8,0,0,0,11.22,0l89.6-88A8,8,0,0,0,245.71,74.39Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM72,168a8,8,0,0,1-5.66-2.34l-24-24a8,8,0,0,1,11.32-11.32L72,148.69l58.34-58.35a8,8,0,0,1,11.32,11.32l-64,64A8,8,0,0,1,72,168Zm141.66-66.34-64,64a8,8,0,0,1-11.32,0l-16-16a8,8,0,0,1,11.32-11.32L144,148.69l58.34-58.35a8,8,0,0,1,11.32,11.32Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M148.2,84.28l-89.6,88a6,6,0,0,1-8.4,0L11.8,134.57A6,6,0,1,1,20.2,126l34.2,33.58,85.4-83.87a6,6,0,1,1,8.4,8.56Zm96.08-8.48a6,6,0,0,0-8.48-.08l-85.4,83.87-20.23-19.87a6,6,0,1,0-8.41,8.56l24.44,24a6,6,0,0,0,8.4,0l89.6-88A6,6,0,0,0,244.28,75.8Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M149.61,85.71l-89.6,88a8,8,0,0,1-11.22,0L10.39,136a8,8,0,1,1,11.22-11.41L54.4,156.79l84-82.5a8,8,0,1,1,11.22,11.42Zm96.1-11.32a8,8,0,0,0-11.32-.1l-84,82.5-18.83-18.5a8,8,0,0,0-11.21,11.42l24.43,24a8,8,0,0,0,11.22,0l89.6-88A8,8,0,0,0,245.71,74.39Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M146.8,82.85l-89.6,88a4,4,0,0,1-5.6,0L13.2,133.14a4,4,0,0,1,5.6-5.71l35.6,35,86.8-85.24a4,4,0,0,1,5.6,5.7Zm96-5.65a4,4,0,0,0-5.65,0l-86.8,85.24-21.63-21.24a4,4,0,1,0-5.61,5.7l24.44,24a4,4,0,0,0,5.6,0l89.6-88A4,4,0,0,0,242.85,77.2Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212Zm68-84a12,12,0,0,1-12,12H128a12,12,0,0,1-12-12V72a12,12,0,0,1,24,0v44h44A12,12,0,0,1,196,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm56,112H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm0,192a90,90,0,1,1,90-90A90.1,90.1,0,0,1,128,218Zm62-90a6,6,0,0,1-6,6H128a6,6,0,0,1-6-6V72a6,6,0,0,1,12,0v50h50A6,6,0,0,1,190,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm0,192a92,92,0,1,1,92-92A92.1,92.1,0,0,1,128,220Zm60-92a4,4,0,0,1-4,4H128a4,4,0,0,1-4-4V72a4,4,0,0,1,8,0v52h52A4,4,0,0,1,188,128Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M140,80v41.21l34.17,20.5a12,12,0,1,1-12.34,20.58l-40-24A12,12,0,0,1,116,128V80a12,12,0,0,1,24,0ZM128,28A99.38,99.38,0,0,0,57.24,57.34c-4.69,4.74-9,9.37-13.24,14V64a12,12,0,0,0-24,0v40a12,12,0,0,0,12,12H72a12,12,0,0,0,0-24H57.77C63,86,68.37,80.22,74.26,74.26a76,76,0,1,1,1.58,109,12,12,0,0,0-16.48,17.46A100,100,0,1,0,128,28Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M136,80v43.47l36.12,21.67a8,8,0,0,1-8.24,13.72l-40-24A8,8,0,0,1,120,128V80a8,8,0,0,1,16,0Zm-8-48A95.44,95.44,0,0,0,60.08,60.15C52.81,67.51,46.35,74.59,40,82V64a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H72a8,8,0,0,0,0-16H49c7.15-8.42,14.27-16.35,22.39-24.57a80,80,0,1,1,1.66,114.75,8,8,0,1,0-11,11.64A96,96,0,1,0,128,32Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,128A96,96,0,0,1,62.11,197.82a8,8,0,1,1,11-11.64A80,80,0,1,0,71.43,71.43C67.9,75,64.58,78.51,61.35,82L77.66,98.34A8,8,0,0,1,72,112H32a8,8,0,0,1-8-8V64a8,8,0,0,1,13.66-5.66L50,70.7c3.22-3.49,6.54-7,10.06-10.55A96,96,0,0,1,224,128ZM128,72a8,8,0,0,0-8,8v48a8,8,0,0,0,3.88,6.86l40,24a8,8,0,1,0,8.24-13.72L136,123.47V80A8,8,0,0,0,128,72Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M134,80v44.6l37.09,22.25a6,6,0,0,1-6.18,10.3l-40-24A6,6,0,0,1,122,128V80a6,6,0,0,1,12,0Zm-6-46A93.4,93.4,0,0,0,61.51,61.56c-8.58,8.68-16,17-23.51,25.8V64a6,6,0,0,0-12,0v40a6,6,0,0,0,6,6H72a6,6,0,0,0,0-12H44.73C52.86,88.29,60.79,79.35,70,70a82,82,0,1,1,1.7,117.62,6,6,0,1,0-8.24,8.72A94,94,0,1,0,128,34Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M136,80v43.47l36.12,21.67a8,8,0,0,1-8.24,13.72l-40-24A8,8,0,0,1,120,128V80a8,8,0,0,1,16,0Zm-8-48A95.44,95.44,0,0,0,60.08,60.15C52.81,67.51,46.35,74.59,40,82V64a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H72a8,8,0,0,0,0-16H49c7.15-8.42,14.27-16.35,22.39-24.57a80,80,0,1,1,1.66,114.75,8,8,0,1,0-11,11.64A96,96,0,1,0,128,32Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M132,80v45.74l38.06,22.83a4,4,0,0,1-4.12,6.86l-40-24A4,4,0,0,1,124,128V80a4,4,0,0,1,8,0Zm-4-44A91.42,91.42,0,0,0,62.93,63C53.05,73,44.66,82.47,36,92.86V64a4,4,0,0,0-8,0v40a4,4,0,0,0,4,4H72a4,4,0,0,0,0-8H40.47C49.61,89,58.3,79,68.6,68.6a84,84,0,1,1,1.75,120.49,4,4,0,1,0-5.5,5.82A92,92,0,1,0,128,36Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M51.51,104.49l-32-32a12,12,0,0,1,0-17l32-32a12,12,0,1,1,17,17L45,64,68.49,87.51a12,12,0,0,1-17,17Zm48,0a12,12,0,0,0,17,0l32-32a12,12,0,0,0,0-17l-32-32a12,12,0,1,0-17,17L123,64,99.51,87.51A12,12,0,0,0,99.51,104.49ZM200,36H180a12,12,0,0,0,0,24h16V196H60V140a12,12,0,0,0-24,0v60a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V56A20,20,0,0,0,200,36Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M152,32V96a16,16,0,0,1-16,16H32A16,16,0,0,1,16,96V32A16,16,0,0,1,32,16H136A16,16,0,0,1,152,32Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M58.34,101.66l-32-32a8,8,0,0,1,0-11.32l32-32A8,8,0,0,1,69.66,37.66L43.31,64,69.66,90.34a8,8,0,0,1-11.32,11.32Zm40,0a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0,0-11.32l-32-32A8,8,0,0,0,98.34,37.66L124.69,64,98.34,90.34A8,8,0,0,0,98.34,101.66ZM200,40H176a8,8,0,0,0,0,16h24V200H56V136a8,8,0,0,0-16,0v64a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,40H168a16,16,0,0,0-16-16H32A16,16,0,0,0,16,40v80a16,16,0,0,0,16,16h8v64a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40ZM106.34,61.66a8,8,0,0,1,11.32-11.32l24,24a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L124.69,80Zm-64,24a8,8,0,0,1,0-11.32l24-24A8,8,0,0,1,77.66,61.66L59.31,80,77.66,98.34a8,8,0,0,1-11.32,11.32ZM200,200H56V136h96a16,16,0,0,0,16-16V56h32Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M59.76,100.24l-32-32a6,6,0,0,1,0-8.48l32-32a6,6,0,1,1,8.48,8.48L40.49,64,68.24,91.76a6,6,0,1,1-8.48,8.48Zm40,0a6,6,0,0,0,8.48,0l32-32a6,6,0,0,0,0-8.48l-32-32a6,6,0,1,0-8.48,8.48L127.51,64,99.76,91.76A6,6,0,0,0,99.76,100.24ZM200,42H176a6,6,0,0,0,0,12h24a2,2,0,0,1,2,2V200a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V136a6,6,0,0,0-12,0v64a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V56A14,14,0,0,0,200,42Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M58.34,101.66l-32-32a8,8,0,0,1,0-11.32l32-32A8,8,0,0,1,69.66,37.66L43.31,64,69.66,90.34a8,8,0,0,1-11.32,11.32Zm40,0a8,8,0,0,0,11.32,0l32-32a8,8,0,0,0,0-11.32l-32-32A8,8,0,0,0,98.34,37.66L124.69,64,98.34,90.34A8,8,0,0,0,98.34,101.66ZM200,40H176a8,8,0,0,0,0,16h24V200H56V136a8,8,0,0,0-16,0v64a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M61.17,98.83l-32-32a4,4,0,0,1,0-5.66l32-32a4,4,0,0,1,5.66,5.66L37.66,64,66.83,93.17a4,4,0,0,1-5.66,5.66Zm40,0a4,4,0,0,0,5.66,0l32-32a4,4,0,0,0,0-5.66l-32-32a4,4,0,0,0-5.66,5.66L130.34,64,101.17,93.17A4,4,0,0,0,101.17,98.83ZM200,44H176a4,4,0,0,0,0,8h24a4,4,0,0,1,4,4V200a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V136a4,4,0,0,0-8,0v64a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V56A12,12,0,0,0,200,44Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst l = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M71.68,97.22,34.74,128l36.94,30.78a12,12,0,1,1-15.36,18.44l-48-40a12,12,0,0,1,0-18.44l48-40A12,12,0,0,1,71.68,97.22Zm176,21.56-48-40a12,12,0,1,0-15.36,18.44L221.26,128l-36.94,30.78a12,12,0,1,0,15.36,18.44l48-40a12,12,0,0,0,0-18.44ZM164.1,28.72a12,12,0,0,0-15.38,7.18l-64,176a12,12,0,0,0,7.18,15.37A11.79,11.79,0,0,0,96,228a12,12,0,0,0,11.28-7.9l64-176A12,12,0,0,0,164.1,28.72Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M240,128l-48,40H64L16,128,64,88H192Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM92.8,145.6a8,8,0,1,1-9.6,12.8l-32-24a8,8,0,0,1,0-12.8l32-24a8,8,0,0,1,9.6,12.8L69.33,128Zm58.89-71.4-32,112a8,8,0,1,1-15.38-4.4l32-112a8,8,0,0,1,15.38,4.4Zm53.11,60.2-32,24a8,8,0,0,1-9.6-12.8L186.67,128,163.2,110.4a8,8,0,1,1,9.6-12.8l32,24a8,8,0,0,1,0,12.8Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M67.84,92.61,25.37,128l42.47,35.39a6,6,0,1,1-7.68,9.22l-48-40a6,6,0,0,1,0-9.22l48-40a6,6,0,0,1,7.68,9.22Zm176,30.78-48-40a6,6,0,1,0-7.68,9.22L230.63,128l-42.47,35.39a6,6,0,1,0,7.68,9.22l48-40a6,6,0,0,0,0-9.22Zm-81.79-89A6,6,0,0,0,154.36,38l-64,176A6,6,0,0,0,94,221.64a6.15,6.15,0,0,0,2,.36,6,6,0,0,0,5.64-3.95l64-176A6,6,0,0,0,162.05,34.36Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M66.56,91.07,22.25,128l44.31,36.93A4,4,0,0,1,64,172a3.94,3.94,0,0,1-2.56-.93l-48-40a4,4,0,0,1,0-6.14l48-40a4,4,0,0,1,5.12,6.14Zm176,33.86-48-40a4,4,0,1,0-5.12,6.14L233.75,128l-44.31,36.93a4,4,0,1,0,5.12,6.14l48-40a4,4,0,0,0,0-6.14ZM161.37,36.24a4,4,0,0,0-5.13,2.39l-64,176a4,4,0,0,0,2.39,5.13A4.12,4.12,0,0,0,96,220a4,4,0,0,0,3.76-2.63l64-176A4,4,0,0,0,161.37,36.24Z\" }))\n  ]\n]);\nexport {\n  l as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M212,76H32A12,12,0,0,0,20,88v48a100.24,100.24,0,0,0,26.73,68H32a12,12,0,0,0,0,24H208a12,12,0,0,0,0-24H193.27a100.75,100.75,0,0,0,20-32A44,44,0,0,0,256,128v-8A44.05,44.05,0,0,0,212,76Zm-16,60a76.27,76.27,0,0,1-42,68H86a76.27,76.27,0,0,1-42-68V100H196Zm36-8a20,20,0,0,1-12.57,18.55A97.17,97.17,0,0,0,220,136V101.68A20,20,0,0,1,232,120ZM68,48V24a12,12,0,0,1,24,0V48a12,12,0,0,1-24,0Zm40,0V24a12,12,0,0,1,24,0V48a12,12,0,0,1-24,0Zm40,0V24a12,12,0,0,1,24,0V48a12,12,0,0,1-24,0Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,88v48a88,88,0,0,1-51.3,80H83.3A88,88,0,0,1,32,136V88Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,80H32a8,8,0,0,0-8,8v48a96.3,96.3,0,0,0,32.54,72H32a8,8,0,0,0,0,16H208a8,8,0,0,0,0-16H183.46a96.59,96.59,0,0,0,27-40.09A40,40,0,0,0,248,128v-8A40,40,0,0,0,208,80Zm24,48a24,24,0,0,1-17.2,23,95.78,95.78,0,0,0,1.2-15V97.38A24,24,0,0,1,232,120ZM112,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm32,0V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0ZM80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M82,56V24a6,6,0,0,1,12,0V56a6,6,0,0,1-12,0Zm38,6a6,6,0,0,0,6-6V24a6,6,0,0,0-12,0V56A6,6,0,0,0,120,62Zm32,0a6,6,0,0,0,6-6V24a6,6,0,0,0-12,0V56A6,6,0,0,0,152,62Zm94,58v8a38,38,0,0,1-36.94,38,94.55,94.55,0,0,1-31.13,44H208a6,6,0,0,1,0,12H32a6,6,0,0,1,0-12H62.07A94.34,94.34,0,0,1,26,136V88a6,6,0,0,1,6-6H208A38,38,0,0,1,246,120Zm-44,16V94H38v42a82.27,82.27,0,0,0,46.67,74h70.66A82.27,82.27,0,0,0,202,136Zm32-16a26,26,0,0,0-20-25.29V136a93.18,93.18,0,0,1-1.69,17.64A26,26,0,0,0,234,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M84,56V24a4,4,0,0,1,8,0V56a4,4,0,0,1-8,0Zm36,4a4,4,0,0,0,4-4V24a4,4,0,0,0-8,0V56A4,4,0,0,0,120,60Zm32,0a4,4,0,0,0,4-4V24a4,4,0,0,0-8,0V56A4,4,0,0,0,152,60Zm92,60v8a36,36,0,0,1-36,36h-.41a92.53,92.53,0,0,1-35.76,48H208a4,4,0,0,1,0,8H32a4,4,0,0,1,0-8H68.17A92.34,92.34,0,0,1,28,136V88a4,4,0,0,1,4-4H208A36,36,0,0,1,244,120Zm-40,16V92H36v44a84.28,84.28,0,0,0,48.21,76h71.58A84.28,84.28,0,0,0,204,136Zm32-16a28,28,0,0,0-24-27.71V136a91.75,91.75,0,0,1-2.2,19.94A28,28,0,0,0,236,128Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40V168H168V88H88V40Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32Zm-8,128H176V88a8,8,0,0,0-8-8H96V48H208Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,34H88a6,6,0,0,0-6,6V82H40a6,6,0,0,0-6,6V216a6,6,0,0,0,6,6H168a6,6,0,0,0,6-6V174h42a6,6,0,0,0,6-6V40A6,6,0,0,0,216,34ZM162,210H46V94H162Zm48-48H174V88a6,6,0,0,0-6-6H94V46H210Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,36H88a4,4,0,0,0-4,4V84H40a4,4,0,0,0-4,4V216a4,4,0,0,0,4,4H168a4,4,0,0,0,4-4V172h44a4,4,0,0,0,4-4V40A4,4,0,0,0,216,36ZM164,212H44V92H164Zm48-48H172V88a4,4,0,0,0-4-4H92V44H212Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,68H164V32a20,20,0,0,0-20-20H112A20,20,0,0,0,92,32V68H56A20,20,0,0,0,36,88v32a20,20,0,0,0,20,20H92v84a20,20,0,0,0,20,20h32a20,20,0,0,0,20-20V140h36a20,20,0,0,0,20-20V88A20,20,0,0,0,200,68Zm-4,48H152a12,12,0,0,0-12,12v92H116V128a12,12,0,0,0-12-12H60V92h44a12,12,0,0,0,12-12V36h24V80a12,12,0,0,0,12,12h44Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,88v32a8,8,0,0,1-8,8H152v96a8,8,0,0,1-8,8H112a8,8,0,0,1-8-8V128H56a8,8,0,0,1-8-8V88a8,8,0,0,1,8-8h48V32a8,8,0,0,1,8-8h32a8,8,0,0,1,8,8V80h48A8,8,0,0,1,208,88Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,72H160V32a16,16,0,0,0-16-16H112A16,16,0,0,0,96,32V72H56A16,16,0,0,0,40,88v32a16,16,0,0,0,16,16H96v88a16,16,0,0,0,16,16h32a16,16,0,0,0,16-16V136h40a16,16,0,0,0,16-16V88A16,16,0,0,0,200,72Zm0,48H152a8,8,0,0,0-8,8v96H112V128a8,8,0,0,0-8-8H56V88h48a8,8,0,0,0,8-8V32h32V80a8,8,0,0,0,8,8h48Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,92v24a16,16,0,0,1-16,16H156v92a16,16,0,0,1-16,16H116a16,16,0,0,1-16-16V132H56a16,16,0,0,1-16-16V92A16,16,0,0,1,56,76h44V32a16,16,0,0,1,16-16h24a16,16,0,0,1,16,16V76h44A16,16,0,0,1,216,92Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,74H158V32a14,14,0,0,0-14-14H112A14,14,0,0,0,98,32V74H56A14,14,0,0,0,42,88v32a14,14,0,0,0,14,14H98v90a14,14,0,0,0,14,14h32a14,14,0,0,0,14-14V134h42a14,14,0,0,0,14-14V88A14,14,0,0,0,200,74Zm2,46a2,2,0,0,1-2,2H152a6,6,0,0,0-6,6v96a2,2,0,0,1-2,2H112a2,2,0,0,1-2-2V128a6,6,0,0,0-6-6H56a2,2,0,0,1-2-2V88a2,2,0,0,1,2-2h48a6,6,0,0,0,6-6V32a2,2,0,0,1,2-2h32a2,2,0,0,1,2,2V80a6,6,0,0,0,6,6h48a2,2,0,0,1,2,2Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,72H160V32a16,16,0,0,0-16-16H112A16,16,0,0,0,96,32V72H56A16,16,0,0,0,40,88v32a16,16,0,0,0,16,16H96v88a16,16,0,0,0,16,16h32a16,16,0,0,0,16-16V136h40a16,16,0,0,0,16-16V88A16,16,0,0,0,200,72Zm0,48H152a8,8,0,0,0-8,8v96H112V128a8,8,0,0,0-8-8H56V88h48a8,8,0,0,0,8-8V32h32V80a8,8,0,0,0,8,8h48Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,76H156V32a12,12,0,0,0-12-12H112a12,12,0,0,0-12,12V76H56A12,12,0,0,0,44,88v32a12,12,0,0,0,12,12h44v92a12,12,0,0,0,12,12h32a12,12,0,0,0,12-12V132h44a12,12,0,0,0,12-12V88A12,12,0,0,0,200,76Zm4,44a4,4,0,0,1-4,4H152a4,4,0,0,0-4,4v96a4,4,0,0,1-4,4H112a4,4,0,0,1-4-4V128a4,4,0,0,0-4-4H56a4,4,0,0,1-4-4V88a4,4,0,0,1,4-4h48a4,4,0,0,0,4-4V32a4,4,0,0,1,4-4h32a4,4,0,0,1,4,4V80a4,4,0,0,0,4,4h48a4,4,0,0,1,4,4Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,36H48A28,28,0,0,0,20,64V172a28,28,0,0,0,28,28h68v12H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24H140V200h68a28,28,0,0,0,28-28V64A28,28,0,0,0,208,36ZM48,60H208a4,4,0,0,1,4,4v72H44V64A4,4,0,0,1,48,60ZM208,176H48a4,4,0,0,1-4-4V160H212v12A4,4,0,0,1,208,176Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,64v88H32V64A16,16,0,0,1,48,48H208A16,16,0,0,1,224,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24h72v16H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V200h72a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40ZM48,56H208a8,8,0,0,1,8,8v80H40V64A8,8,0,0,1,48,56ZM208,184H48a8,8,0,0,1-8-8V160H216v16A8,8,0,0,1,208,184Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24h72v16H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V200h72a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40Zm0,144H48a8,8,0,0,1-8-8V160H216v16A8,8,0,0,1,208,184Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,42H48A22,22,0,0,0,26,64V176a22,22,0,0,0,22,22h74v20H96a6,6,0,0,0,0,12h64a6,6,0,0,0,0-12H134V198h74a22,22,0,0,0,22-22V64A22,22,0,0,0,208,42ZM48,54H208a10,10,0,0,1,10,10v82H38V64A10,10,0,0,1,48,54ZM208,186H48a10,10,0,0,1-10-10V158H218v18A10,10,0,0,1,208,186Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24h72v16H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V200h72a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40ZM48,56H208a8,8,0,0,1,8,8v80H40V64A8,8,0,0,1,48,56ZM208,184H48a8,8,0,0,1-8-8V160H216v16A8,8,0,0,1,208,184Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,44H48A20,20,0,0,0,28,64V176a20,20,0,0,0,20,20h76v24H96a4,4,0,0,0,0,8h64a4,4,0,0,0,0-8H132V196h76a20,20,0,0,0,20-20V64A20,20,0,0,0,208,44ZM48,52H208a12,12,0,0,1,12,12v84H36V64A12,12,0,0,1,48,52ZM208,188H48a12,12,0,0,1-12-12V156H220v20A12,12,0,0,1,208,188Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,72H212V64a28,28,0,0,0-28-28H40A28,28,0,0,0,12,64v88a28,28,0,0,0,28,28h96v12a28,28,0,0,0,28,28h60a28,28,0,0,0,28-28V100A28,28,0,0,0,224,72ZM40,156a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H184a4,4,0,0,1,4,4v8H164a28,28,0,0,0-28,28v56Zm188,36a4,4,0,0,1-4,4H164a4,4,0,0,1-4-4V100a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4ZM124,208a12,12,0,0,1-12,12H88a12,12,0,0,1,0-24h24A12,12,0,0,1,124,208Zm88-84a12,12,0,0,1-12,12H188a12,12,0,0,1,0-24h12A12,12,0,0,1,212,124Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M200,64V80H176a16,16,0,0,0-16,16v80H40a16,16,0,0,1-16-16V64A16,16,0,0,1,40,48H184A16,16,0,0,1,200,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72ZM40,168a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H184a8,8,0,0,1,8,8v8H176a24,24,0,0,0-24,24v72Zm192,24a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72Zm8,120a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,74H206V64a22,22,0,0,0-22-22H40A22,22,0,0,0,18,64v96a22,22,0,0,0,22,22H154v10a22,22,0,0,0,22,22h48a22,22,0,0,0,22-22V96A22,22,0,0,0,224,74ZM40,170a10,10,0,0,1-10-10V64A10,10,0,0,1,40,54H184a10,10,0,0,1,10,10V74H176a22,22,0,0,0-22,22v74Zm194,22a10,10,0,0,1-10,10H176a10,10,0,0,1-10-10V96a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10ZM134,208a6,6,0,0,1-6,6H88a6,6,0,0,1,0-12h40A6,6,0,0,1,134,208Zm80-96a6,6,0,0,1-6,6H192a6,6,0,0,1,0-12h16A6,6,0,0,1,214,112Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,72H208V64a24,24,0,0,0-24-24H40A24,24,0,0,0,16,64v96a24,24,0,0,0,24,24H152v8a24,24,0,0,0,24,24h48a24,24,0,0,0,24-24V96A24,24,0,0,0,224,72ZM40,168a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H184a8,8,0,0,1,8,8v8H176a24,24,0,0,0-24,24v72Zm192,24a8,8,0,0,1-8,8H176a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Zm-96,16a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h40A8,8,0,0,1,136,208Zm80-96a8,8,0,0,1-8,8H192a8,8,0,0,1,0-16h16A8,8,0,0,1,216,112Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,76H204V64a20,20,0,0,0-20-20H40A20,20,0,0,0,20,64v96a20,20,0,0,0,20,20H156v12a20,20,0,0,0,20,20h48a20,20,0,0,0,20-20V96A20,20,0,0,0,224,76ZM40,172a12,12,0,0,1-12-12V64A12,12,0,0,1,40,52H184a12,12,0,0,1,12,12V76H176a20,20,0,0,0-20,20v76Zm196,20a12,12,0,0,1-12,12H176a12,12,0,0,1-12-12V96a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12ZM132,208a4,4,0,0,1-4,4H88a4,4,0,0,1,0-8h40A4,4,0,0,1,132,208Zm80-96a4,4,0,0,1-4,4H192a4,4,0,0,1,0-8h16A4,4,0,0,1,212,112Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M108,60A16,16,0,1,1,92,44,16,16,0,0,1,108,60Zm56,16a16,16,0,1,0-16-16A16,16,0,0,0,164,76ZM92,112a16,16,0,1,0,16,16A16,16,0,0,0,92,112Zm72,0a16,16,0,1,0,16,16A16,16,0,0,0,164,112ZM92,180a16,16,0,1,0,16,16A16,16,0,0,0,92,180Zm72,0a16,16,0,1,0,16,16A16,16,0,0,0,164,180Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,32V224a16,16,0,0,1-16,16H64a16,16,0,0,1-16-16V32A16,16,0,0,1,64,16H192A16,16,0,0,1,208,32Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M104,60A12,12,0,1,1,92,48,12,12,0,0,1,104,60Zm60,12a12,12,0,1,0-12-12A12,12,0,0,0,164,72ZM92,116a12,12,0,1,0,12,12A12,12,0,0,0,92,116Zm72,0a12,12,0,1,0,12,12A12,12,0,0,0,164,116ZM92,184a12,12,0,1,0,12,12A12,12,0,0,0,92,184Zm72,0a12,12,0,1,0,12,12A12,12,0,0,0,164,184Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M192,16H64A16,16,0,0,0,48,32V224a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V32A16,16,0,0,0,192,16ZM100,200a12,12,0,1,1,12-12A12,12,0,0,1,100,200Zm0-60a12,12,0,1,1,12-12A12,12,0,0,1,100,140Zm0-60a12,12,0,1,1,12-12A12,12,0,0,1,100,80Zm56,120a12,12,0,1,1,12-12A12,12,0,0,1,156,200Zm0-60a12,12,0,1,1,12-12A12,12,0,0,1,156,140Zm0-60a12,12,0,1,1,12-12A12,12,0,0,1,156,80Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M102,60A10,10,0,1,1,92,50,10,10,0,0,1,102,60Zm62,10a10,10,0,1,0-10-10A10,10,0,0,0,164,70ZM92,118a10,10,0,1,0,10,10A10,10,0,0,0,92,118Zm72,0a10,10,0,1,0,10,10A10,10,0,0,0,164,118ZM92,186a10,10,0,1,0,10,10A10,10,0,0,0,92,186Zm72,0a10,10,0,1,0,10,10A10,10,0,0,0,164,186Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M104,60A12,12,0,1,1,92,48,12,12,0,0,1,104,60Zm60,12a12,12,0,1,0-12-12A12,12,0,0,0,164,72ZM92,116a12,12,0,1,0,12,12A12,12,0,0,0,92,116Zm72,0a12,12,0,1,0,12,12A12,12,0,0,0,164,116ZM92,184a12,12,0,1,0,12,12A12,12,0,0,0,92,184Zm72,0a12,12,0,1,0,12,12A12,12,0,0,0,164,184Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M100,60a8,8,0,1,1-8-8A8,8,0,0,1,100,60Zm64,8a8,8,0,1,0-8-8A8,8,0,0,0,164,68ZM92,120a8,8,0,1,0,8,8A8,8,0,0,0,92,120Zm72,0a8,8,0,1,0,8,8A8,8,0,0,0,164,120ZM92,188a8,8,0,1,0,8,8A8,8,0,0,0,92,188Zm72,0a8,8,0,1,0,8,8A8,8,0,0,0,164,188Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M144,128a16,16,0,1,1-16-16A16,16,0,0,1,144,128ZM60,112a16,16,0,1,0,16,16A16,16,0,0,0,60,112Zm136,0a16,16,0,1,0,16,16A16,16,0,0,0,196,112Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M240,96v64a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V96A16,16,0,0,1,32,80H224A16,16,0,0,1,240,96Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm56-12a12,12,0,1,0,12,12A12,12,0,0,0,196,116ZM60,116a12,12,0,1,0,12,12A12,12,0,0,0,60,116Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V96A16,16,0,0,0,224,80ZM60,140a12,12,0,1,1,12-12A12,12,0,0,1,60,140Zm68,0a12,12,0,1,1,12-12A12,12,0,0,1,128,140Zm68,0a12,12,0,1,1,12-12A12,12,0,0,1,196,140Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M138,128a10,10,0,1,1-10-10A10,10,0,0,1,138,128ZM60,118a10,10,0,1,0,10,10A10,10,0,0,0,60,118Zm136,0a10,10,0,1,0,10,10A10,10,0,0,0,196,118Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M140,128a12,12,0,1,1-12-12A12,12,0,0,1,140,128Zm56-12a12,12,0,1,0,12,12A12,12,0,0,0,196,116ZM60,116a12,12,0,1,0,12,12A12,12,0,0,0,60,116Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M136,128a8,8,0,1,1-8-8A8,8,0,0,1,136,128Zm-76-8a8,8,0,1,0,8,8A8,8,0,0,0,60,120Zm136,0a8,8,0,1,0,8,8A8,8,0,0,0,196,120Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,96a32,32,0,1,0,32,32A32,32,0,0,0,128,96Zm0,40a8,8,0,1,1,8-8A8,8,0,0,1,128,136Zm0-56A32,32,0,1,0,96,48,32,32,0,0,0,128,80Zm0-40a8,8,0,1,1-8,8A8,8,0,0,1,128,40Zm0,136a32,32,0,1,0,32,32A32,32,0,0,0,128,176Zm0,40a8,8,0,1,1,8-8A8,8,0,0,1,128,216Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M152,128a24,24,0,1,1-24-24A24,24,0,0,1,152,128ZM128,72a24,24,0,1,0-24-24A24,24,0,0,0,128,72Zm0,112a24,24,0,1,0,24,24A24,24,0,0,0,128,184Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,96a32,32,0,1,0,32,32A32,32,0,0,0,128,96Zm0,48a16,16,0,1,1,16-16A16,16,0,0,1,128,144Zm0-64A32,32,0,1,0,96,48,32,32,0,0,0,128,80Zm0-48a16,16,0,1,1-16,16A16,16,0,0,1,128,32Zm0,144a32,32,0,1,0,32,32A32,32,0,0,0,128,176Zm0,48a16,16,0,1,1,16-16A16,16,0,0,1,128,224Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M156,128a28,28,0,1,1-28-28A28,28,0,0,1,156,128ZM128,76a28,28,0,1,0-28-28A28,28,0,0,0,128,76Zm0,104a28,28,0,1,0,28,28A28,28,0,0,0,128,180Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,98a30,30,0,1,0,30,30A30,30,0,0,0,128,98Zm0,48a18,18,0,1,1,18-18A18,18,0,0,1,128,146Zm0-68A30,30,0,1,0,98,48,30,30,0,0,0,128,78Zm0-48a18,18,0,1,1-18,18A18,18,0,0,1,128,30Zm0,148a30,30,0,1,0,30,30A30,30,0,0,0,128,178Zm0,48a18,18,0,1,1,18-18A18,18,0,0,1,128,226Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,96a32,32,0,1,0,32,32A32,32,0,0,0,128,96Zm0,48a16,16,0,1,1,16-16A16,16,0,0,1,128,144Zm0-64A32,32,0,1,0,96,48,32,32,0,0,0,128,80Zm0-48a16,16,0,1,1-16,16A16,16,0,0,1,128,32Zm0,144a32,32,0,1,0,32,32A32,32,0,0,0,128,176Zm0,48a16,16,0,1,1,16-16A16,16,0,0,1,128,224Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,100a28,28,0,1,0,28,28A28,28,0,0,0,128,100Zm0,48a20,20,0,1,1,20-20A20,20,0,0,1,128,148Zm0-72a28,28,0,1,0-28-28A28,28,0,0,0,128,76Zm0-48a20,20,0,1,1-20,20A20,20,0,0,1,128,28Zm0,152a28,28,0,1,0,28,28A28,28,0,0,0,128,180Zm0,48a20,20,0,1,1,20-20A20,20,0,0,1,128,228Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M71.51,88.49a12,12,0,0,1,17-17L116,99V24a12,12,0,0,1,24,0V99l27.51-27.52a12,12,0,0,1,17,17l-48,48a12,12,0,0,1-17,0ZM224,116H188a12,12,0,0,0,0,24h32v56H36V140H68a12,12,0,0,0,0-24H32a20,20,0,0,0-20,20v64a20,20,0,0,0,20,20H224a20,20,0,0,0,20-20V136A20,20,0,0,0,224,116Zm-20,52a16,16,0,1,0-16,16A16,16,0,0,0,204,168Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M232,136v64a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V136a8,8,0,0,1,8-8H224A8,8,0,0,1,232,136Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M240,136v64a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V136a16,16,0,0,1,16-16H72a8,8,0,0,1,0,16H32v64H224V136H184a8,8,0,0,1,0-16h40A16,16,0,0,1,240,136Zm-117.66-2.34a8,8,0,0,0,11.32,0l48-48a8,8,0,0,0-11.32-11.32L136,108.69V24a8,8,0,0,0-16,0v84.69L85.66,74.34A8,8,0,0,0,74.34,85.66ZM200,168a12,12,0,1,0-12,12A12,12,0,0,0,200,168Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M74.34,85.66A8,8,0,0,1,85.66,74.34L120,108.69V24a8,8,0,0,1,16,0v84.69l34.34-34.35a8,8,0,0,1,11.32,11.32l-48,48a8,8,0,0,1-11.32,0ZM240,136v64a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V136a16,16,0,0,1,16-16H84.4a4,4,0,0,1,2.83,1.17L111,145A24,24,0,0,0,145,145l23.8-23.8A4,4,0,0,1,171.6,120H224A16,16,0,0,1,240,136Zm-40,32a12,12,0,1,0-12,12A12,12,0,0,0,200,168Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M238,136v64a14,14,0,0,1-14,14H32a14,14,0,0,1-14-14V136a14,14,0,0,1,14-14H72a6,6,0,0,1,0,12H32a2,2,0,0,0-2,2v64a2,2,0,0,0,2,2H224a2,2,0,0,0,2-2V136a2,2,0,0,0-2-2H184a6,6,0,0,1,0-12h40A14,14,0,0,1,238,136Zm-114.24-3.76a6,6,0,0,0,8.48,0l48-48a6,6,0,0,0-8.48-8.48L134,113.51V24a6,6,0,0,0-12,0v89.51L84.24,75.76a6,6,0,0,0-8.48,8.48ZM198,168a10,10,0,1,0-10,10A10,10,0,0,0,198,168Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M240,136v64a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V136a16,16,0,0,1,16-16H72a8,8,0,0,1,0,16H32v64H224V136H184a8,8,0,0,1,0-16h40A16,16,0,0,1,240,136Zm-117.66-2.34a8,8,0,0,0,11.32,0l48-48a8,8,0,0,0-11.32-11.32L136,108.69V24a8,8,0,0,0-16,0v84.69L85.66,74.34A8,8,0,0,0,74.34,85.66ZM200,168a12,12,0,1,0-12,12A12,12,0,0,0,200,168Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M236,136v64a12,12,0,0,1-12,12H32a12,12,0,0,1-12-12V136a12,12,0,0,1,12-12H72a4,4,0,0,1,0,8H32a4,4,0,0,0-4,4v64a4,4,0,0,0,4,4H224a4,4,0,0,0,4-4V136a4,4,0,0,0-4-4H184a4,4,0,0,1,0-8h40A12,12,0,0,1,236,136Zm-110.83-5.17a4,4,0,0,0,5.66,0l48-48a4,4,0,1,0-5.66-5.66L132,118.34V24a4,4,0,0,0-8,0v94.34L82.83,77.17a4,4,0,0,0-5.66,5.66ZM196,168a8,8,0,1,0-8,8A8,8,0,0,0,196,168Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M228,144v64a12,12,0,0,1-12,12H40a12,12,0,0,1-12-12V144a12,12,0,0,1,24,0v52H204V144a12,12,0,0,1,24,0Zm-108.49,8.49a12,12,0,0,0,17,0l40-40a12,12,0,0,0-17-17L140,115V32a12,12,0,0,0-24,0v83L96.49,95.51a12,12,0,0,0-17,17Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M216,48V208H40V48A16,16,0,0,1,56,32H200A16,16,0,0,1,216,48Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40A8,8,0,0,0,168,96H136V32a8,8,0,0,0-16,0V96H88a8,8,0,0,0-5.66,13.66Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222,144v64a6,6,0,0,1-6,6H40a6,6,0,0,1-6-6V144a6,6,0,0,1,12,0v58H210V144a6,6,0,0,1,12,0Zm-98.24,4.24a6,6,0,0,0,8.48,0l40-40a6,6,0,0,0-8.48-8.48L134,129.51V32a6,6,0,0,0-12,0v97.51L92.24,99.76a6,6,0,0,0-8.48,8.48Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220,144v64a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V144a4,4,0,0,1,8,0v60H212V144a4,4,0,0,1,8,0Zm-94.83,2.83a4,4,0,0,0,5.66,0l40-40a4,4,0,1,0-5.66-5.66L132,134.34V32a4,4,0,0,0-8,0V134.34L90.83,101.17a4,4,0,0,0-5.66,5.66Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,44H32A12,12,0,0,0,20,56V192a20,20,0,0,0,20,20H216a20,20,0,0,0,20-20V56A12,12,0,0,0,224,44ZM193.15,68,128,127.72,62.85,68ZM44,188V83.28l75.89,69.57a12,12,0,0,0,16.22,0L212,83.28V188Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,56l-96,88L32,56Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM203.43,64,128,133.15,52.57,64ZM216,192H40V74.19l82.59,75.71a8,8,0,0,0,10.82,0L216,74.19V192Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-8,144H40V74.19l82.59,75.71a8,8,0,0,0,10.82,0L216,74.19V192Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,50H32a6,6,0,0,0-6,6V192a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A6,6,0,0,0,224,50ZM208.58,62,128,135.86,47.42,62ZM216,194H40a2,2,0,0,1-2-2V69.64l86,78.78a6,6,0,0,0,8.1,0L218,69.64V192A2,2,0,0,1,216,194Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48ZM203.43,64,128,133.15,52.57,64ZM216,192H40V74.19l82.59,75.71a8,8,0,0,0,10.82,0L216,74.19V192Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,52H32a4,4,0,0,0-4,4V192a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A4,4,0,0,0,224,52Zm-10.28,8L128,138.57,42.28,60ZM216,196H40a4,4,0,0,1-4-4V65.09L125.3,147a4,4,0,0,0,5.4,0L220,65.09V192A4,4,0,0,1,216,196Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216.49,79.52l-56-56A12,12,0,0,0,152,20H56A20,20,0,0,0,36,40V216a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V88A12,12,0,0,0,216.49,79.52ZM160,57l23,23H160ZM60,212V44h76V92a12,12,0,0,0,12,12h48V212Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,88H152V32Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM152,88V44l44,44Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M212.24,83.76l-56-56A6,6,0,0,0,152,26H56A14,14,0,0,0,42,40V216a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V88A6,6,0,0,0,212.24,83.76ZM158,46.48,193.52,82H158ZM200,218H56a2,2,0,0,1-2-2V40a2,2,0,0,1,2-2h90V88a6,6,0,0,0,6,6h50V216A2,2,0,0,1,200,218Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M213.66,82.34l-56-56A8,8,0,0,0,152,24H56A16,16,0,0,0,40,40V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V88A8,8,0,0,0,213.66,82.34ZM160,51.31,188.69,80H160ZM200,216H56V40h88V88a8,8,0,0,0,8,8h48V216Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M210.83,85.17l-56-56A4,4,0,0,0,152,28H56A12,12,0,0,0,44,40V216a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V88A4,4,0,0,0,210.83,85.17ZM156,41.65,198.34,84H156ZM200,220H56a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h92V88a4,4,0,0,0,4,4h52V216A4,4,0,0,1,200,220Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst t = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M40.14,46.88A12,12,0,0,0,36,56V224a12,12,0,0,0,24,0V181.72c22.84-17.12,42.1-9.12,70.68,5,16.23,8,34.74,17.2,54.8,17.2,14.72,0,30.28-4.94,46.38-18.88A12,12,0,0,0,236,176V56a12,12,0,0,0-19.86-9.07c-24.71,21.41-44.53,13.31-74.82-1.68C113.19,31.27,78.17,13.94,40.14,46.88ZM212,170.26c-22.84,17.13-42.1,9.11-70.68-5C118.16,153.76,90.33,140,60,153.87V61.69c22.84-17.12,42.1-9.12,70.68,5,16.23,8,34.74,17.2,54.8,17.2A63,63,0,0,0,212,78.08Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M224,56V176c-64,55.43-112-55.43-176,0V56C112,.57,160,111.43,224,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M42.76,50A8,8,0,0,0,40,56V224a8,8,0,0,0,16,0V179.77c26.79-21.16,49.87-9.75,76.45,3.41,16.4,8.11,34.06,16.85,53,16.85,13.93,0,28.54-4.75,43.82-18a8,8,0,0,0,2.76-6V56A8,8,0,0,0,218.76,50c-28,24.23-51.72,12.49-79.21-1.12C111.07,34.76,78.78,18.79,42.76,50ZM216,172.25c-26.79,21.16-49.87,9.74-76.45-3.41-25-12.35-52.81-26.13-83.55-8.4V59.79c26.79-21.16,49.87-9.75,76.45,3.4,25,12.35,52.82,26.13,83.55,8.4Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232,56V176a8,8,0,0,1-2.76,6c-15.28,13.23-29.89,18-43.82,18-18.91,0-36.57-8.74-53-16.85C105.87,170,82.79,158.61,56,179.77V224a8,8,0,0,1-16,0V56a8,8,0,0,1,2.77-6h0c36-31.18,68.31-15.21,96.79-1.12C167,62.46,190.79,74.2,218.76,50A8,8,0,0,1,232,56Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M44.08,51.37A6,6,0,0,0,42,55.9V224a6,6,0,0,0,12,0V178.78c28.08-22.79,51.88-11,79.34,2.57,16.12,8,33.49,16.58,52,16.58,13.57,0,27.76-4.6,42.56-17.42A6,6,0,0,0,230,176V55.9a6,6,0,0,0-9.93-4.54c-29,25.12-53.28,13.09-81.41-.84C110.77,36.71,79,21.16,44.08,51.37ZM218,173.17c-28.08,22.8-51.88,11-79.34-2.58C113.4,158.08,85.09,144.07,54,164V58.72c28.08-22.8,51.88-11,79.34,2.56C158.6,73.79,186.91,87.8,218,67.91Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M42.76,50A8,8,0,0,0,40,56V224a8,8,0,0,0,16,0V179.77c26.79-21.16,49.87-9.75,76.45,3.41,16.4,8.11,34.06,16.85,53,16.85,13.93,0,28.54-4.75,43.82-18a8,8,0,0,0,2.76-6V56A8,8,0,0,0,218.76,50c-28,24.23-51.72,12.49-79.21-1.12C111.07,34.76,78.78,18.79,42.76,50ZM216,172.25c-26.79,21.16-49.87,9.74-76.45-3.41-25-12.35-52.81-26.13-83.55-8.4V59.79c26.79-21.16,49.87-9.75,76.45,3.4,25,12.35,52.82,26.13,83.55,8.4Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M45.39,53.06a4,4,0,0,0-1.39,3V224a4,4,0,0,0,8,0V177.87c29.41-24.39,55.08-11.69,82.23,1.73,16.5,8.17,33.33,16.5,51.13,16.5,13.14,0,26.81-4.55,41.26-17.06a4,4,0,0,0,1.38-3v-120a4,4,0,0,0-6.62-3c-30,26-56,13.07-83.61-.57C109.07,38.28,79.4,23.62,45.39,53.06ZM220,174.17c-29.41,24.4-55.08,11.7-82.23-1.73-26.82-13.27-54.5-27-85.77-4.66V57.92c29.41-24.4,55.08-11.7,82.23,1.73,26.82,13.27,54.5,27,85.77,4.66Z\" }))\n  ]\n]);\nexport {\n  t as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M225.15,197.71,164,95.81V44h4a12,12,0,0,0,0-24H88a12,12,0,0,0,0,24h4V95.81L30.85,197.71A20,20,0,0,0,48,228H208a20,20,0,0,0,17.15-30.29ZM140,44V99.14a12,12,0,0,0,1.71,6.17l35.13,58.54c-10.79.86-25.15-1.31-43.42-10.56-14-7.08-27.46-11.33-40.27-12.76l21.14-35.22A12,12,0,0,0,116,99.14V44ZM55.06,204,79,164.19c13-1.11,27.62,2.42,43.62,10.52,19.61,9.92,36.25,13.31,49.85,13.31A75.44,75.44,0,0,0,190.11,186l10.83,18Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,216H48a8,8,0,0,1-6.86-12.12l30.48-50.8h0c13.23-2.48,32-1.41,56.37,10.92,32.25,16.33,54.75,12.91,67.5,7.65h0l19.34,32.23A8,8,0,0,1,208,216Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M221.69,199.77,160,96.92V40h8a8,8,0,0,0,0-16H88a8,8,0,0,0,0,16h8V96.92L34.31,199.77A16,16,0,0,0,48,224H208a16,16,0,0,0,13.72-24.23ZM110.86,103.25A7.93,7.93,0,0,0,112,99.14V40h32V99.14a7.93,7.93,0,0,0,1.14,4.11L183.36,167c-12,2.37-29.07,1.37-51.75-10.11-15.91-8.05-31.05-12.32-45.22-12.81ZM48,208l28.54-47.58c14.25-1.73,30.31,1.85,47.82,10.72,19,9.61,35,12.88,48,12.88a69.89,69.89,0,0,0,19.55-2.7L208,208Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M221.69,199.77,160,96.92V40h8a8,8,0,0,0,0-16H88a8,8,0,0,0,0,16h8V96.92L34.31,199.77A16,16,0,0,0,48,224H208a16,16,0,0,0,13.72-24.23Zm-90.08-42.91c-15.91-8.05-31.05-12.32-45.22-12.81l24.47-40.8A7.93,7.93,0,0,0,112,99.14V40h32V99.14a7.93,7.93,0,0,0,1.14,4.11L183.36,167C171.4,169.34,154.29,168.34,131.61,156.86Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220,200.8,158,97.48V38h10a6,6,0,0,0,0-12H88a6,6,0,0,0,0,12H98V97.48L36,200.8A14,14,0,0,0,48,222H208a14,14,0,0,0,12-21.2ZM109.15,102.23a6,6,0,0,0,.85-3.09V38h36V99.14a6,6,0,0,0,.85,3.09l39.65,66.08c-12.41,3.16-30.86,3-55.79-9.66-16.94-8.58-33-12.8-47.83-12.64ZM209.72,209a2,2,0,0,1-1.74,1H48a2,2,0,0,1-1.71-3l29-48.41c14.89-2.08,31.68,1.55,49.94,10.79C144,178.8,159.67,182,172.42,182A67.89,67.89,0,0,0,192.89,179l16.8,28A2,2,0,0,1,209.72,209Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M221.69,199.77,160,96.92V40h8a8,8,0,0,0,0-16H88a8,8,0,0,0,0,16h8V96.92L34.31,199.77A16,16,0,0,0,48,224H208a16,16,0,0,0,13.72-24.23ZM110.86,103.25A7.93,7.93,0,0,0,112,99.14V40h32V99.14a7.93,7.93,0,0,0,1.14,4.11L183.36,167c-12,2.37-29.07,1.37-51.75-10.11-15.91-8.05-31.05-12.32-45.22-12.81ZM48,208l28.54-47.58c14.25-1.74,30.31,1.85,47.82,10.72,19,9.61,35,12.88,48,12.88a69.89,69.89,0,0,0,19.55-2.7L208,208Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M218.27,201.83,156,98V36h12a4,4,0,0,0,0-8H88a4,4,0,0,0,0,8h12V98L37.73,201.83A12,12,0,0,0,48,220H208a12,12,0,0,0,10.29-18.17ZM107.43,101.2a4.07,4.07,0,0,0,.57-2.06V36h40V99.14a4.07,4.07,0,0,0,.57,2.06l41,68.33c-12.76,3.94-32.54,4.68-59.75-9.1-18-9.14-35-13.24-50.54-12.29ZM211.46,210a3.94,3.94,0,0,1-3.48,2H48a4,4,0,0,1-3.43-6.06l29.53-49.21c15.54-2.43,33.05,1.21,52.07,10.84C144.54,176.86,160,180,172.42,180a65,65,0,0,0,21.36-3.46l17.63,29.38A3.92,3.92,0,0,1,211.46,210Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst l = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M234.29,47.91A20,20,0,0,0,216,36H40A20,20,0,0,0,25.2,69.45l.12.14L92,140.75V216a20,20,0,0,0,31.1,16.64l32-21.33A20,20,0,0,0,164,194.66V140.75l66.67-71.16.12-.14A20,20,0,0,0,234.29,47.91Zm-91,79.89A12,12,0,0,0,140,136v56.52l-24,16V136a12,12,0,0,0-3.25-8.2L49.23,60H206.77Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M221.9,61.38,152,136v58.65a8,8,0,0,1-3.56,6.66l-32,21.33A8,8,0,0,1,104,216V136L34.1,61.38A8,8,0,0,1,40,48H216A8,8,0,0,1,221.9,61.38Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M230.6,49.53A15.81,15.81,0,0,0,216,40H40A16,16,0,0,0,28.19,66.76l.08.09L96,139.17V216a16,16,0,0,0,24.87,13.32l32-21.34A16,16,0,0,0,160,194.66V139.17l67.74-72.32.08-.09A15.8,15.8,0,0,0,230.6,49.53ZM40,56h0Zm106.18,74.58A8,8,0,0,0,144,136v58.66L112,216V136a8,8,0,0,0-2.16-5.47L40,56H216Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M227.81,66.76l-.08.09L160,139.17v55.49A16,16,0,0,1,152.87,208l-32,21.34A16,16,0,0,1,96,216V139.17L28.27,66.85l-.08-.09A16,16,0,0,1,40,40H216a16,16,0,0,1,11.84,26.76Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228.77,50.34A13.8,13.8,0,0,0,216,42H40A14,14,0,0,0,29.67,65.42l.06.07L98,138.38V216a14,14,0,0,0,21.77,11.64l32-21.33A14,14,0,0,0,158,194.66V138.38l68.33-73A13.82,13.82,0,0,0,228.77,50.34Zm-11.26,6.94L147.62,131.9A6,6,0,0,0,146,136v58.66a2,2,0,0,1-.89,1.67l-32,21.33A2,2,0,0,1,110,216V136a6,6,0,0,0-1.62-4.1L38.53,57.32A2,2,0,0,1,40,54H216a1.9,1.9,0,0,1,1.83,1.19A1.86,1.86,0,0,1,217.51,57.28Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M230.6,49.53A15.81,15.81,0,0,0,216,40H40A16,16,0,0,0,28.19,66.76l.08.09L96,139.17V216a16,16,0,0,0,24.87,13.32l32-21.34A16,16,0,0,0,160,194.66V139.17l67.74-72.32.08-.09A15.8,15.8,0,0,0,230.6,49.53ZM40,56h0Zm106.18,74.58A8,8,0,0,0,144,136v58.66L112,216V136a8,8,0,0,0-2.16-5.47L40,56H216Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M227,51.15A11.85,11.85,0,0,0,216,44H40a12,12,0,0,0-8.88,20.07l.05.05L100,137.59V216a12,12,0,0,0,18.66,10l32-21.33a12,12,0,0,0,5.35-10V137.59l68.86-73.52A11.85,11.85,0,0,0,227,51.15Zm-8,7.5-69.9,74.62A4,4,0,0,0,148,136v58.65a4,4,0,0,1-1.78,3.33l-32,21.33A4,4,0,0,1,108,216V136a4,4,0,0,0-1.08-2.74L37.05,58.67A4,4,0,0,1,40,52H216a4,4,0,0,1,3,6.65Z\" }))\n  ]\n]);\nexport {\n  l as default\n};\n","import * as a from \"react\";\nconst l = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,76a52,52,0,1,0,52,52A52.06,52.06,0,0,0,128,76Zm0,80a28,28,0,1,1,28-28A28,28,0,0,1,128,156Zm113.86-49.57A12,12,0,0,0,236,98.34L208.21,82.49l-.11-31.31a12,12,0,0,0-4.25-9.12,116,116,0,0,0-38-21.41,12,12,0,0,0-9.68.89L128,37.27,99.83,21.53a12,12,0,0,0-9.7-.9,116.06,116.06,0,0,0-38,21.47,12,12,0,0,0-4.24,9.1l-.14,31.34L20,98.35a12,12,0,0,0-5.85,8.11,110.7,110.7,0,0,0,0,43.11A12,12,0,0,0,20,157.66l27.82,15.85.11,31.31a12,12,0,0,0,4.25,9.12,116,116,0,0,0,38,21.41,12,12,0,0,0,9.68-.89L128,218.73l28.14,15.74a12,12,0,0,0,9.7.9,116.06,116.06,0,0,0,38-21.47,12,12,0,0,0,4.24-9.1l.14-31.34,27.81-15.81a12,12,0,0,0,5.85-8.11A110.7,110.7,0,0,0,241.86,106.43Zm-22.63,33.18-26.88,15.28a11.94,11.94,0,0,0-4.55,4.59c-.54,1-1.11,1.93-1.7,2.88a12,12,0,0,0-1.83,6.31L184.13,199a91.83,91.83,0,0,1-21.07,11.87l-27.15-15.19a12,12,0,0,0-5.86-1.53h-.29c-1.14,0-2.3,0-3.44,0a12.08,12.08,0,0,0-6.14,1.51L93,210.82A92.27,92.27,0,0,1,71.88,199l-.11-30.24a12,12,0,0,0-1.83-6.32c-.58-.94-1.16-1.91-1.7-2.88A11.92,11.92,0,0,0,63.7,155L36.8,139.63a86.53,86.53,0,0,1,0-23.24l26.88-15.28a12,12,0,0,0,4.55-4.58c.54-1,1.11-1.94,1.7-2.89a12,12,0,0,0,1.83-6.31L71.87,57A91.83,91.83,0,0,1,92.94,45.17l27.15,15.19a11.92,11.92,0,0,0,6.15,1.52c1.14,0,2.3,0,3.44,0a12.08,12.08,0,0,0,6.14-1.51L163,45.18A92.27,92.27,0,0,1,184.12,57l.11,30.24a12,12,0,0,0,1.83,6.32c.58.94,1.16,1.91,1.7,2.88A11.92,11.92,0,0,0,192.3,101l26.9,15.33A86.53,86.53,0,0,1,219.23,139.61Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M230.1,108.76,198.25,90.62c-.64-1.16-1.31-2.29-2-3.41l-.12-36A104.61,104.61,0,0,0,162,32L130,49.89c-1.34,0-2.69,0-4,0L94,32A104.58,104.58,0,0,0,59.89,51.25l-.16,36c-.7,1.12-1.37,2.26-2,3.41l-31.84,18.1a99.15,99.15,0,0,0,0,38.46l31.85,18.14c.64,1.16,1.31,2.29,2,3.41l.12,36A104.61,104.61,0,0,0,94,224l32-17.87c1.34,0,2.69,0,4,0L162,224a104.58,104.58,0,0,0,34.08-19.25l.16-36c.7-1.12,1.37-2.26,2-3.41l31.84-18.1A99.15,99.15,0,0,0,230.1,108.76ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm109.94-52.79a8,8,0,0,0-3.89-5.4l-29.83-17-.12-33.62a8,8,0,0,0-2.83-6.08,111.91,111.91,0,0,0-36.72-20.67,8,8,0,0,0-6.46.59L128,41.85,97.88,25a8,8,0,0,0-6.47-.6A111.92,111.92,0,0,0,54.73,45.15a8,8,0,0,0-2.83,6.07l-.15,33.65-29.83,17a8,8,0,0,0-3.89,5.4,106.47,106.47,0,0,0,0,41.56,8,8,0,0,0,3.89,5.4l29.83,17,.12,33.63a8,8,0,0,0,2.83,6.08,111.91,111.91,0,0,0,36.72,20.67,8,8,0,0,0,6.46-.59L128,214.15,158.12,231a7.91,7.91,0,0,0,3.9,1,8.09,8.09,0,0,0,2.57-.42,112.1,112.1,0,0,0,36.68-20.73,8,8,0,0,0,2.83-6.07l.15-33.65,29.83-17a8,8,0,0,0,3.89-5.4A106.47,106.47,0,0,0,237.94,107.21Zm-15,34.91-28.57,16.25a8,8,0,0,0-3,3c-.58,1-1.19,2.06-1.81,3.06a7.94,7.94,0,0,0-1.22,4.21l-.15,32.25a95.89,95.89,0,0,1-25.37,14.3L134,199.13a8,8,0,0,0-3.91-1h-.19c-1.21,0-2.43,0-3.64,0a8.1,8.1,0,0,0-4.1,1l-28.84,16.1A96,96,0,0,1,67.88,201l-.11-32.2a8,8,0,0,0-1.22-4.22c-.62-1-1.23-2-1.8-3.06a8.09,8.09,0,0,0-3-3.06l-28.6-16.29a90.49,90.49,0,0,1,0-28.26L61.67,97.63a8,8,0,0,0,3-3c.58-1,1.19-2.06,1.81-3.06a7.94,7.94,0,0,0,1.22-4.21l.15-32.25a95.89,95.89,0,0,1,25.37-14.3L122,56.87a8,8,0,0,0,4.1,1c1.21,0,2.43,0,3.64,0a8,8,0,0,0,4.1-1l28.84-16.1A96,96,0,0,1,188.12,55l.11,32.2a8,8,0,0,0,1.22,4.22c.62,1,1.23,2,1.8,3.06a8.09,8.09,0,0,0,3,3.06l28.6,16.29A90.49,90.49,0,0,1,222.9,142.12Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M237.94,107.21a8,8,0,0,0-3.89-5.4l-29.83-17-.12-33.62a8,8,0,0,0-2.83-6.08,111.91,111.91,0,0,0-36.72-20.67,8,8,0,0,0-6.46.59L128,41.85,97.88,25a8,8,0,0,0-6.47-.6A111.92,111.92,0,0,0,54.73,45.15a8,8,0,0,0-2.83,6.07l-.15,33.65-29.83,17a8,8,0,0,0-3.89,5.4,106.47,106.47,0,0,0,0,41.56,8,8,0,0,0,3.89,5.4l29.83,17,.12,33.63a8,8,0,0,0,2.83,6.08,111.91,111.91,0,0,0,36.72,20.67,8,8,0,0,0,6.46-.59L128,214.15,158.12,231a7.91,7.91,0,0,0,3.9,1,8.09,8.09,0,0,0,2.57-.42,112.1,112.1,0,0,0,36.68-20.73,8,8,0,0,0,2.83-6.07l.15-33.65,29.83-17a8,8,0,0,0,3.89-5.4A106.47,106.47,0,0,0,237.94,107.21ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,82a46,46,0,1,0,46,46A46.06,46.06,0,0,0,128,82Zm0,80a34,34,0,1,1,34-34A34,34,0,0,1,128,162Zm108-54.4a6,6,0,0,0-2.92-4L202.64,86.22l-.42-.71L202.1,51.2A6,6,0,0,0,200,46.64a110.12,110.12,0,0,0-36.07-20.31,6,6,0,0,0-4.84.45L128.46,43.86h-1L96.91,26.76a6,6,0,0,0-4.86-.44A109.92,109.92,0,0,0,56,46.68a6,6,0,0,0-2.12,4.55l-.16,34.34c-.14.23-.28.47-.41.71L22.91,103.57A6,6,0,0,0,20,107.62a104.81,104.81,0,0,0,0,40.78,6,6,0,0,0,2.92,4l30.42,17.33.42.71.12,34.31A6,6,0,0,0,56,209.36a110.12,110.12,0,0,0,36.07,20.31,6,6,0,0,0,4.84-.45l30.61-17.08h1l30.56,17.1A6.09,6.09,0,0,0,162,230a5.83,5.83,0,0,0,1.93-.32,109.92,109.92,0,0,0,36-20.36,6,6,0,0,0,2.12-4.55l.16-34.34c.14-.23.28-.47.41-.71l30.42-17.29a6,6,0,0,0,2.92-4.05A104.81,104.81,0,0,0,236,107.6Zm-11.25,35.79L195.32,160.1a6.07,6.07,0,0,0-2.28,2.3c-.59,1-1.21,2.11-1.86,3.14a6,6,0,0,0-.91,3.16l-.16,33.21a98.15,98.15,0,0,1-27.52,15.53L133,200.88a6,6,0,0,0-2.93-.77h-.14c-1.24,0-2.5,0-3.74,0a6,6,0,0,0-3.07.76L93.45,217.43a98,98,0,0,1-27.56-15.49l-.12-33.17a6,6,0,0,0-.91-3.16c-.64-1-1.27-2.08-1.86-3.14a6,6,0,0,0-2.27-2.3L31.3,143.4a93,93,0,0,1,0-30.79L60.68,95.9A6.07,6.07,0,0,0,63,93.6c.59-1,1.21-2.11,1.86-3.14a6,6,0,0,0,.91-3.16l.16-33.21A98.15,98.15,0,0,1,93.41,38.56L123,55.12a5.81,5.81,0,0,0,3.07.76c1.24,0,2.5,0,3.74,0a6,6,0,0,0,3.07-.76l29.65-16.56a98,98,0,0,1,27.56,15.49l.12,33.17a6,6,0,0,0,.91,3.16c.64,1,1.27,2.08,1.86,3.14a6,6,0,0,0,2.27,2.3L224.7,112.6A93,93,0,0,1,224.73,143.39Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm109.94-52.79a8,8,0,0,0-3.89-5.4l-29.83-17-.12-33.62a8,8,0,0,0-2.83-6.08,111.91,111.91,0,0,0-36.72-20.67,8,8,0,0,0-6.46.59L128,41.85,97.88,25a8,8,0,0,0-6.47-.6A112.1,112.1,0,0,0,54.73,45.15a8,8,0,0,0-2.83,6.07l-.15,33.65-29.83,17a8,8,0,0,0-3.89,5.4,106.47,106.47,0,0,0,0,41.56,8,8,0,0,0,3.89,5.4l29.83,17,.12,33.62a8,8,0,0,0,2.83,6.08,111.91,111.91,0,0,0,36.72,20.67,8,8,0,0,0,6.46-.59L128,214.15,158.12,231a7.91,7.91,0,0,0,3.9,1,8.09,8.09,0,0,0,2.57-.42,112.1,112.1,0,0,0,36.68-20.73,8,8,0,0,0,2.83-6.07l.15-33.65,29.83-17a8,8,0,0,0,3.89-5.4A106.47,106.47,0,0,0,237.94,107.21Zm-15,34.91-28.57,16.25a8,8,0,0,0-3,3c-.58,1-1.19,2.06-1.81,3.06a7.94,7.94,0,0,0-1.22,4.21l-.15,32.25a95.89,95.89,0,0,1-25.37,14.3L134,199.13a8,8,0,0,0-3.91-1h-.19c-1.21,0-2.43,0-3.64,0a8.08,8.08,0,0,0-4.1,1l-28.84,16.1A96,96,0,0,1,67.88,201l-.11-32.2a8,8,0,0,0-1.22-4.22c-.62-1-1.23-2-1.8-3.06a8.09,8.09,0,0,0-3-3.06l-28.6-16.29a90.49,90.49,0,0,1,0-28.26L61.67,97.63a8,8,0,0,0,3-3c.58-1,1.19-2.06,1.81-3.06a7.94,7.94,0,0,0,1.22-4.21l.15-32.25a95.89,95.89,0,0,1,25.37-14.3L122,56.87a8,8,0,0,0,4.1,1c1.21,0,2.43,0,3.64,0a8.08,8.08,0,0,0,4.1-1l28.84-16.1A96,96,0,0,1,188.12,55l.11,32.2a8,8,0,0,0,1.22,4.22c.62,1,1.23,2,1.8,3.06a8.09,8.09,0,0,0,3,3.06l28.6,16.29A90.49,90.49,0,0,1,222.9,142.12Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,84a44,44,0,1,0,44,44A44.05,44.05,0,0,0,128,84Zm0,80a36,36,0,1,1,36-36A36,36,0,0,1,128,164Zm106-56a4,4,0,0,0-2-2.7l-30.89-17.6q-.47-.82-1-1.62L200.1,51.2a3.94,3.94,0,0,0-1.42-3,107.8,107.8,0,0,0-35.41-19.94,4,4,0,0,0-3.23.29L129,45.87h-2l-31-17.36a4,4,0,0,0-3.23-.3,108.05,108.05,0,0,0-35.39,20,4,4,0,0,0-1.41,3l-.16,34.9-1,1.62L23.9,105.3A4,4,0,0,0,22,108a102.76,102.76,0,0,0,0,40,4,4,0,0,0,1.95,2.7l30.89,17.6q.47.83,1,1.62l.12,34.87a3.94,3.94,0,0,0,1.42,3,107.8,107.8,0,0,0,35.41,19.94,4,4,0,0,0,3.23-.29L127,210.13h2l31,17.36a4,4,0,0,0,3.23.3,108.05,108.05,0,0,0,35.39-20,4,4,0,0,0,1.41-3l.16-34.9,1-1.62L232.1,150.7a4,4,0,0,0,2-2.71A102.76,102.76,0,0,0,234,108Zm-7.48,36.67L196.3,161.84a4,4,0,0,0-1.51,1.53c-.61,1.09-1.25,2.17-1.91,3.24a3.92,3.92,0,0,0-.61,2.1l-.16,34.15a99.8,99.8,0,0,1-29.7,16.77l-30.4-17a4.06,4.06,0,0,0-2-.51H130c-1.28,0-2.57,0-3.84,0a4.1,4.1,0,0,0-2.05.51l-30.45,17A100.23,100.23,0,0,1,63.89,202.9l-.12-34.12a3.93,3.93,0,0,0-.61-2.11c-.66-1-1.3-2.14-1.91-3.23a4,4,0,0,0-1.51-1.53L29.49,144.68a94.78,94.78,0,0,1,0-33.34L59.7,94.16a4,4,0,0,0,1.51-1.53c.61-1.09,1.25-2.17,1.91-3.23a4,4,0,0,0,.61-2.11l.16-34.15a99.8,99.8,0,0,1,29.7-16.77l30.4,17a4.1,4.1,0,0,0,2.05.51c1.28,0,2.57,0,3.84,0a4,4,0,0,0,2.05-.51l30.45-17A100.23,100.23,0,0,1,192.11,53.1l.12,34.12a3.93,3.93,0,0,0,.61,2.11c.66,1,1.3,2.14,1.91,3.23a4,4,0,0,0,1.51,1.53l30.25,17.23A94.78,94.78,0,0,1,226.54,144.66Z\" }))\n  ]\n]);\nexport {\n  l as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M148,72V184a12,12,0,0,1-24,0V72a12,12,0,0,1,24,0Zm84,12a12,12,0,0,0,0-24H176a12,12,0,0,0-12,12V184a12,12,0,0,0,24,0V140h36a12,12,0,0,0,0-24H188V84ZM96,116H72a12,12,0,0,0,0,24H84v12a20,20,0,0,1-40,0V104A20,20,0,0,1,64,84c9.42,0,18.18,6.45,20.38,15a12,12,0,1,0,23.24-6C102.7,73.88,84.35,60,64,60a44.05,44.05,0,0,0-44,44v48a44,44,0,0,0,88,0V128A12,12,0,0,0,96,116Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,56V200a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M144,72V184a8,8,0,0,1-16,0V72a8,8,0,0,1,16,0Zm88-8H176a8,8,0,0,0-8,8V184a8,8,0,0,0,16,0V136h40a8,8,0,0,0,0-16H184V80h48a8,8,0,0,0,0-16ZM96,120H72a8,8,0,0,0,0,16H88v16a24,24,0,0,1-48,0V104A24,24,0,0,1,64,80c11.19,0,21.61,7.74,24.25,18a8,8,0,0,0,15.5-4C99.27,76.62,82.56,64,64,64a40,40,0,0,0-40,40v48a40,40,0,0,0,80,0V128A8,8,0,0,0,96,120Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM112,144a32,32,0,0,1-64,0V112a32,32,0,0,1,55.85-21.33,8,8,0,1,1-11.92,10.66A16,16,0,0,0,64,112v32a16,16,0,0,0,32,0v-8H88a8,8,0,0,1,0-16h16a8,8,0,0,1,8,8Zm32,24a8,8,0,0,1-16,0V88a8,8,0,0,1,16,0Zm60-72H176v24h20a8,8,0,0,1,0,16H176v32a8,8,0,0,1-16,0V88a8,8,0,0,1,8-8h36a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M142,72V184a6,6,0,0,1-12,0V72a6,6,0,0,1,12,0Zm90-6H176a6,6,0,0,0-6,6V184a6,6,0,0,0,12,0V134h42a6,6,0,0,0,0-12H182V78h50a6,6,0,0,0,0-12ZM96,122H72a6,6,0,0,0,0,12H90v18a26,26,0,0,1-52,0V104A26,26,0,0,1,64,78c12.07,0,23.33,8.38,26.19,19.5a6,6,0,1,0,11.62-3C97.56,78,81.66,66,64,66a38,38,0,0,0-38,38v48a38,38,0,0,0,76,0V128A6,6,0,0,0,96,122Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M144,72V184a8,8,0,0,1-16,0V72a8,8,0,0,1,16,0Zm88-8H176a8,8,0,0,0-8,8V184a8,8,0,0,0,16,0V136h40a8,8,0,0,0,0-16H184V80h48a8,8,0,0,0,0-16ZM96,120H72a8,8,0,0,0,0,16H88v16a24,24,0,0,1-48,0V104A24,24,0,0,1,64,80c11.19,0,21.61,7.74,24.25,18a8,8,0,0,0,15.5-4C99.27,76.62,82.56,64,64,64a40,40,0,0,0-40,40v48a40,40,0,0,0,80,0V128A8,8,0,0,0,96,120Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M140,72V184a4,4,0,0,1-8,0V72a4,4,0,0,1,8,0Zm92-4H176a4,4,0,0,0-4,4V184a4,4,0,0,0,8,0V132h44a4,4,0,0,0,0-8H180V76h52a4,4,0,0,0,0-8ZM96,124H72a4,4,0,0,0,0,8H92v20a28,28,0,0,1-56,0V104A28,28,0,0,1,64,76c13,0,25,9,28.13,21a4,4,0,1,0,7.74-2C95.85,79.36,80.76,68,64,68a36,36,0,0,0-36,36v48a36,36,0,0,0,72,0V128A4,4,0,0,0,96,124Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,187a113.4,113.4,0,0,1-20.39-35h40.82a116.94,116.94,0,0,1-10,20.77A108.61,108.61,0,0,1,128,207Zm-26.49-59a135.42,135.42,0,0,1,0-40h53a135.42,135.42,0,0,1,0,40ZM44,128a83.49,83.49,0,0,1,2.43-20H77.25a160.63,160.63,0,0,0,0,40H46.43A83.49,83.49,0,0,1,44,128Zm84-79a113.4,113.4,0,0,1,20.39,35H107.59a116.94,116.94,0,0,1,10-20.77A108.61,108.61,0,0,1,128,49Zm50.73,59h30.82a83.52,83.52,0,0,1,0,40H178.75a160.63,160.63,0,0,0,0-40Zm20.77-24H173.71a140.82,140.82,0,0,0-15.5-34.36A84.51,84.51,0,0,1,199.52,84ZM97.79,49.64A140.82,140.82,0,0,0,82.29,84H56.48A84.51,84.51,0,0,1,97.79,49.64ZM56.48,172H82.29a140.82,140.82,0,0,0,15.5,34.36A84.51,84.51,0,0,1,56.48,172Zm101.73,34.36A140.82,140.82,0,0,0,173.71,172h25.81A84.51,84.51,0,0,1,158.21,206.36Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24h0A104,104,0,1,0,232,128,104.12,104.12,0,0,0,128,24Zm88,104a87.61,87.61,0,0,1-3.33,24H174.16a157.44,157.44,0,0,0,0-48h38.51A87.61,87.61,0,0,1,216,128ZM102,168H154a115.11,115.11,0,0,1-26,45A115.27,115.27,0,0,1,102,168Zm-3.9-16a140.84,140.84,0,0,1,0-48h59.88a140.84,140.84,0,0,1,0,48ZM40,128a87.61,87.61,0,0,1,3.33-24H81.84a157.44,157.44,0,0,0,0,48H43.33A87.61,87.61,0,0,1,40,128ZM154,88H102a115.11,115.11,0,0,1,26-45A115.27,115.27,0,0,1,154,88Zm52.33,0H170.71a135.28,135.28,0,0,0-22.3-45.6A88.29,88.29,0,0,1,206.37,88ZM107.59,42.4A135.28,135.28,0,0,0,85.29,88H49.63A88.29,88.29,0,0,1,107.59,42.4ZM49.63,168H85.29a135.28,135.28,0,0,0,22.3,45.6A88.29,88.29,0,0,1,49.63,168Zm98.78,45.6a135.28,135.28,0,0,0,22.3-45.6h35.66A88.29,88.29,0,0,1,148.41,213.6Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24h0A104,104,0,1,0,232,128,104.12,104.12,0,0,0,128,24Zm78.36,64H170.71a135.28,135.28,0,0,0-22.3-45.6A88.29,88.29,0,0,1,206.37,88ZM216,128a87.61,87.61,0,0,1-3.33,24H174.16a157.44,157.44,0,0,0,0-48h38.51A87.61,87.61,0,0,1,216,128ZM128,43a115.27,115.27,0,0,1,26,45H102A115.11,115.11,0,0,1,128,43ZM102,168H154a115.11,115.11,0,0,1-26,45A115.27,115.27,0,0,1,102,168Zm-3.9-16a140.84,140.84,0,0,1,0-48h59.88a140.84,140.84,0,0,1,0,48Zm50.35,61.6a135.28,135.28,0,0,0,22.3-45.6h35.66A88.29,88.29,0,0,1,148.41,213.6Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm81.57,64H169.19a132.58,132.58,0,0,0-25.73-50.67A90.29,90.29,0,0,1,209.57,90ZM218,128a89.7,89.7,0,0,1-3.83,26H171.81a155.43,155.43,0,0,0,0-52h42.36A89.7,89.7,0,0,1,218,128Zm-90,87.83a110,110,0,0,1-15.19-19.45A124.24,124.24,0,0,1,99.35,166h57.3a124.24,124.24,0,0,1-13.46,30.38A110,110,0,0,1,128,215.83ZM96.45,154a139.18,139.18,0,0,1,0-52h63.1a139.18,139.18,0,0,1,0,52ZM38,128a89.7,89.7,0,0,1,3.83-26H84.19a155.43,155.43,0,0,0,0,52H41.83A89.7,89.7,0,0,1,38,128Zm90-87.83a110,110,0,0,1,15.19,19.45A124.24,124.24,0,0,1,156.65,90H99.35a124.24,124.24,0,0,1,13.46-30.38A110,110,0,0,1,128,40.17Zm-15.46-.84A132.58,132.58,0,0,0,86.81,90H46.43A90.29,90.29,0,0,1,112.54,39.33ZM46.43,166H86.81a132.58,132.58,0,0,0,25.73,50.67A90.29,90.29,0,0,1,46.43,166Zm97,50.67A132.58,132.58,0,0,0,169.19,166h40.38A90.29,90.29,0,0,1,143.46,216.67Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24h0A104,104,0,1,0,232,128,104.12,104.12,0,0,0,128,24Zm88,104a87.61,87.61,0,0,1-3.33,24H174.16a157.44,157.44,0,0,0,0-48h38.51A87.61,87.61,0,0,1,216,128ZM102,168H154a115.11,115.11,0,0,1-26,45A115.27,115.27,0,0,1,102,168Zm-3.9-16a140.84,140.84,0,0,1,0-48h59.88a140.84,140.84,0,0,1,0,48ZM40,128a87.61,87.61,0,0,1,3.33-24H81.84a157.44,157.44,0,0,0,0,48H43.33A87.61,87.61,0,0,1,40,128ZM154,88H102a115.11,115.11,0,0,1,26-45A115.27,115.27,0,0,1,154,88Zm52.33,0H170.71a135.28,135.28,0,0,0-22.3-45.6A88.29,88.29,0,0,1,206.37,88ZM107.59,42.4A135.28,135.28,0,0,0,85.29,88H49.63A88.29,88.29,0,0,1,107.59,42.4ZM49.63,168H85.29a135.28,135.28,0,0,0,22.3,45.6A88.29,88.29,0,0,1,49.63,168Zm98.78,45.6a135.28,135.28,0,0,0,22.3-45.6h35.66A88.29,88.29,0,0,1,148.41,213.6Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,28h0A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm0,190.61c-6.33-6.09-23-24.41-31.27-54.61h62.54C151,194.2,134.33,212.52,128,218.61ZM94.82,156a140.42,140.42,0,0,1,0-56h66.36a140.42,140.42,0,0,1,0,56ZM128,37.39c6.33,6.09,23,24.41,31.27,54.61H96.73C105,61.8,121.67,43.48,128,37.39ZM169.41,100h46.23a92.09,92.09,0,0,1,0,56H169.41a152.65,152.65,0,0,0,0-56Zm43.25-8h-45a129.39,129.39,0,0,0-29.19-55.4A92.25,92.25,0,0,1,212.66,92ZM117.54,36.6A129.39,129.39,0,0,0,88.35,92h-45A92.25,92.25,0,0,1,117.54,36.6ZM40.36,100H86.59a152.65,152.65,0,0,0,0,56H40.36a92.09,92.09,0,0,1,0-56Zm3,64h45a129.39,129.39,0,0,0,29.19,55.4A92.25,92.25,0,0,1,43.34,164Zm95.12,55.4A129.39,129.39,0,0,0,167.65,164h45A92.25,92.25,0,0,1,138.46,219.4Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,36H56A20,20,0,0,0,36,56V200a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V56A20,20,0,0,0,200,36Zm-4,80H140V60h56ZM116,60v56H60V60ZM60,140h56v56H60Zm80,56V140h56v56Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M208,56V200a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,80H136V56h64ZM120,56v64H56V56ZM56,136h64v64H56Zm144,64H136V136h64v64Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,56v60a4,4,0,0,1-4,4H136V44a4,4,0,0,1,4-4h60A16,16,0,0,1,216,56ZM116,40H56A16,16,0,0,0,40,56v60a4,4,0,0,0,4,4h76V44A4,4,0,0,0,116,40Zm96,96H136v76a4,4,0,0,0,4,4h60a16,16,0,0,0,16-16V140A4,4,0,0,0,212,136ZM40,140v60a16,16,0,0,0,16,16h60a4,4,0,0,0,4-4V136H44A4,4,0,0,0,40,140Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,42H56A14,14,0,0,0,42,56V200a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V56A14,14,0,0,0,200,42Zm2,14v66H134V54h66A2,2,0,0,1,202,56ZM56,54h66v68H54V56A2,2,0,0,1,56,54ZM54,200V134h68v68H56A2,2,0,0,1,54,200Zm146,2H134V134h68v66A2,2,0,0,1,200,202Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,80H136V56h64ZM120,56v64H56V56ZM56,136h64v64H56Zm144,64H136V136h64v64Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,44H56A12,12,0,0,0,44,56V200a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V56A12,12,0,0,0,200,44Zm4,12v68H132V52h68A4,4,0,0,1,204,56ZM56,52h68v72H52V56A4,4,0,0,1,56,52ZM52,200V132h72v72H56A4,4,0,0,1,52,200Zm148,4H132V132h72v68A4,4,0,0,1,200,204Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst l = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,84H180.2l7.61-41.85a12,12,0,0,0-23.62-4.3L155.8,84H116.2l7.61-41.85a12,12,0,1,0-23.62-4.3L91.8,84H48a12,12,0,0,0,0,24H87.44l-7.27,40H32a12,12,0,0,0,0,24H75.8l-7.61,41.85a12,12,0,0,0,9.66,14A11.43,11.43,0,0,0,80,228a12,12,0,0,0,11.8-9.86L100.2,172h39.6l-7.61,41.85a12,12,0,0,0,9.66,14,11.43,11.43,0,0,0,2.16.2,12,12,0,0,0,11.8-9.86L164.2,172H208a12,12,0,0,0,0-24H168.56l7.27-40H224a12,12,0,0,0,0-24Zm-79.83,64H104.56l7.27-40h39.61Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M165.82,96l-11.64,64h-64l11.64-64Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,88H175.4l8.47-46.57a8,8,0,0,0-15.74-2.86l-9,49.43H111.4l8.47-46.57a8,8,0,0,0-15.74-2.86L95.14,88H48a8,8,0,0,0,0,16H92.23L83.5,152H32a8,8,0,0,0,0,16H80.6l-8.47,46.57a8,8,0,0,0,6.44,9.3A7.79,7.79,0,0,0,80,224a8,8,0,0,0,7.86-6.57l9-49.43H144.6l-8.47,46.57a8,8,0,0,0,6.44,9.3A7.79,7.79,0,0,0,144,224a8,8,0,0,0,7.86-6.57l9-49.43H208a8,8,0,0,0,0-16H163.77l8.73-48H224a8,8,0,0,0,0-16Zm-76.5,64H99.77l8.73-48h47.73Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M116.25,112h31.5l-8,32h-31.5ZM224,48V208a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32H208A16,16,0,0,1,224,48Zm-16,56a8,8,0,0,0-8-8H168.25l7.51-30.06a8,8,0,0,0-15.52-3.88L151.75,96h-31.5l7.51-30.06a8,8,0,0,0-15.52-3.88L103.75,96H64a8,8,0,0,0,0,16H99.75l-8,32H56a8,8,0,0,0,0,16H87.75l-7.51,30.06a8,8,0,0,0,5.82,9.7,8.13,8.13,0,0,0,2,.24,8,8,0,0,0,7.75-6.06L104.25,160h31.5l-7.51,30.06a8,8,0,0,0,5.82,9.7A8.13,8.13,0,0,0,136,200a8,8,0,0,0,7.75-6.06L152.25,160H192a8,8,0,0,0,0-16H156.25l8-32H200A8,8,0,0,0,208,104Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,90H173l8.89-48.93a6,6,0,1,0-11.8-2.14L160.81,90H109l8.89-48.93a6,6,0,0,0-11.8-2.14L96.81,90H48a6,6,0,0,0,0,12H94.63l-9.46,52H32a6,6,0,0,0,0,12H83L74.1,214.93a6,6,0,0,0,4.83,7A5.64,5.64,0,0,0,80,222a6,6,0,0,0,5.89-4.93L95.19,166H147l-8.89,48.93a6,6,0,0,0,4.83,7,5.64,5.64,0,0,0,1.08.1,6,6,0,0,0,5.89-4.93L159.19,166H208a6,6,0,0,0,0-12H161.37l9.46-52H224a6,6,0,0,0,0-12Zm-74.83,64H97.37l9.46-52h51.8Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,88H175.4l8.47-46.57a8,8,0,0,0-15.74-2.86l-9,49.43H111.4l8.47-46.57a8,8,0,0,0-15.74-2.86L95.14,88H48a8,8,0,0,0,0,16H92.23L83.5,152H32a8,8,0,0,0,0,16H80.6l-8.47,46.57a8,8,0,0,0,6.44,9.3A7.79,7.79,0,0,0,80,224a8,8,0,0,0,7.86-6.57l9-49.43H144.6l-8.47,46.57a8,8,0,0,0,6.44,9.3A7.79,7.79,0,0,0,144,224a8,8,0,0,0,7.86-6.57l9-49.43H208a8,8,0,0,0,0-16H163.77l8.73-48H224a8,8,0,0,0,0-16Zm-76.5,64H99.77l8.73-48h47.73Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,92H170.61l9.33-51.28a4,4,0,1,0-7.88-1.44L162.48,92H106.61l9.33-51.28a4,4,0,1,0-7.88-1.44L98.48,92H48a4,4,0,0,0,0,8H97L86.84,156H32a4,4,0,0,0,0,8H85.39l-9.33,51.28a4,4,0,0,0,3.22,4.65A3.65,3.65,0,0,0,80,220a4,4,0,0,0,3.94-3.29L93.52,164h55.87l-9.33,51.28a4,4,0,0,0,3.22,4.65,3.65,3.65,0,0,0,.72.07,4,4,0,0,0,3.94-3.29L157.52,164H208a4,4,0,0,0,0-8H159l10.19-56H224a4,4,0,0,0,0-8Zm-73.16,64H95l10.19-56H161Z\" }))\n  ]\n]);\nexport {\n  l as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,148H172V108h44a12,12,0,0,0,0-24H172V40a12,12,0,0,0-24,0V84H108V40a12,12,0,0,0-24,0V84H40a12,12,0,0,0,0,24H84v40H40a12,12,0,0,0,0,24H84v44a12,12,0,0,0,24,0V172h40v44a12,12,0,0,0,24,0V172h44a12,12,0,0,0,0-24Zm-108,0V108h40v40Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M160,96v64H96V96Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,152H168V104h48a8,8,0,0,0,0-16H168V40a8,8,0,0,0-16,0V88H104V40a8,8,0,0,0-16,0V88H40a8,8,0,0,0,0,16H88v48H40a8,8,0,0,0,0,16H88v48a8,8,0,0,0,16,0V168h48v48a8,8,0,0,0,16,0V168h48a8,8,0,0,0,0-16Zm-112,0V104h48v48Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M112,112h32v32H112ZM224,48V208a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32H208A16,16,0,0,1,224,48Zm-64,96V112h32a8,8,0,0,0,0-16H160V64a8,8,0,0,0-16,0V96H112V64a8,8,0,0,0-16,0V96H64a8,8,0,0,0,0,16H96v32H64a8,8,0,0,0,0,16H96v32a8,8,0,0,0,16,0V160h32v32a8,8,0,0,0,16,0V160h32a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,154H166V102h50a6,6,0,0,0,0-12H166V40a6,6,0,0,0-12,0V90H102V40a6,6,0,0,0-12,0V90H40a6,6,0,0,0,0,12H90v52H40a6,6,0,0,0,0,12H90v50a6,6,0,0,0,12,0V166h52v50a6,6,0,0,0,12,0V166h50a6,6,0,0,0,0-12Zm-114,0V102h52v52Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,152H168V104h48a8,8,0,0,0,0-16H168V40a8,8,0,0,0-16,0V88H104V40a8,8,0,0,0-16,0V88H40a8,8,0,0,0,0,16H88v48H40a8,8,0,0,0,0,16H88v48a8,8,0,0,0,16,0V168h48v48a8,8,0,0,0,16,0V168h48a8,8,0,0,0,0-16Zm-112,0V104h48v48Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,156H164V100h52a4,4,0,0,0,0-8H164V40a4,4,0,0,0-8,0V92H100V40a4,4,0,0,0-8,0V92H40a4,4,0,0,0,0,8H92v56H40a4,4,0,0,0,0,8H92v52a4,4,0,0,0,8,0V164h56v52a4,4,0,0,0,8,0V164h52a4,4,0,0,0,0-8Zm-116,0V100h56v56Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M204.73,51.85A108.07,108.07,0,0,0,20,128v56a28,28,0,0,0,28,28H64a28,28,0,0,0,28-28V144a28,28,0,0,0-28-28H44.84A84.05,84.05,0,0,1,128,44h.64a83.7,83.7,0,0,1,82.52,72H192a28,28,0,0,0-28,28v40a28,28,0,0,0,28,28h16a28,28,0,0,0,28-28V128A107.34,107.34,0,0,0,204.73,51.85ZM64,140a4,4,0,0,1,4,4v40a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V140Zm148,44a4,4,0,0,1-4,4H192a4,4,0,0,1-4-4V144a4,4,0,0,1,4-4h20Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M80,144v40a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V128H64A16,16,0,0,1,80,144Zm112-16a16,16,0,0,0-16,16v40a16,16,0,0,0,16,16h16a16,16,0,0,0,16-16V128Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M201.89,54.66A104.08,104.08,0,0,0,24,128v56a24,24,0,0,0,24,24H64a24,24,0,0,0,24-24V144a24,24,0,0,0-24-24H40.36A88,88,0,0,1,128,40h.67a87.71,87.71,0,0,1,87,80H192a24,24,0,0,0-24,24v40a24,24,0,0,0,24,24h16a24,24,0,0,0,24-24V128A103.41,103.41,0,0,0,201.89,54.66ZM64,136a8,8,0,0,1,8,8v40a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V136Zm152,48a8,8,0,0,1-8,8H192a8,8,0,0,1-8-8V144a8,8,0,0,1,8-8h24Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M232,128v56a24,24,0,0,1-24,24H192a24,24,0,0,1-24-24V144a24,24,0,0,1,24-24h23.65a87.71,87.71,0,0,0-87-80H128a88,88,0,0,0-87.64,80H64a24,24,0,0,1,24,24v40a24,24,0,0,1-24,24H48a24,24,0,0,1-24-24V128A104.11,104.11,0,0,1,201.89,54.66,103.41,103.41,0,0,1,232,128Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200.47,56.07A101.37,101.37,0,0,0,128.77,26H128A102,102,0,0,0,26,128v56a22,22,0,0,0,22,22H64a22,22,0,0,0,22-22V144a22,22,0,0,0-22-22H38.2A90.12,90.12,0,0,1,192,64.52,89.41,89.41,0,0,1,217.81,122H192a22,22,0,0,0-22,22v40a22,22,0,0,0,22,22h16a22,22,0,0,0,22-22V128A101.44,101.44,0,0,0,200.47,56.07ZM64,134a10,10,0,0,1,10,10v40a10,10,0,0,1-10,10H48a10,10,0,0,1-10-10V134Zm154,50a10,10,0,0,1-10,10H192a10,10,0,0,1-10-10V144a10,10,0,0,1,10-10h26Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M201.89,54.66A103.43,103.43,0,0,0,128.79,24H128A104,104,0,0,0,24,128v56a24,24,0,0,0,24,24H64a24,24,0,0,0,24-24V144a24,24,0,0,0-24-24H40.36A88,88,0,0,1,128,40h.67a87.71,87.71,0,0,1,87,80H192a24,24,0,0,0-24,24v40a24,24,0,0,0,24,24h16a24,24,0,0,0,24-24V128A103.41,103.41,0,0,0,201.89,54.66ZM64,136a8,8,0,0,1,8,8v40a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V136Zm152,48a8,8,0,0,1-8,8H192a8,8,0,0,1-8-8V144a8,8,0,0,1,8-8h24Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M199.05,57.48A100.07,100.07,0,0,0,28,128v56a20,20,0,0,0,20,20H64a20,20,0,0,0,20-20V144a20,20,0,0,0-20-20H36.08A92,92,0,0,1,128,36h.7a91.75,91.75,0,0,1,91.22,88H192a20,20,0,0,0-20,20v40a20,20,0,0,0,20,20h16a20,20,0,0,0,20-20V128A99.43,99.43,0,0,0,199.05,57.48ZM64,132a12,12,0,0,1,12,12v40a12,12,0,0,1-12,12H48a12,12,0,0,1-12-12V132Zm156,52a12,12,0,0,1-12,12H192a12,12,0,0,1-12-12V144a12,12,0,0,1,12-12h28Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M178,36c-20.09,0-37.92,7.93-50,21.56C115.92,43.93,98.09,36,78,36a66.08,66.08,0,0,0-66,66c0,72.34,105.81,130.14,110.31,132.57a12,12,0,0,0,11.38,0C138.19,232.14,244,174.34,244,102A66.08,66.08,0,0,0,178,36Zm-5.49,142.36A328.69,328.69,0,0,1,128,210.16a328.69,328.69,0,0,1-44.51-31.8C61.82,159.77,36,131.42,36,102A42,42,0,0,1,78,60c17.8,0,32.7,9.4,38.89,24.54a12,12,0,0,0,22.22,0C145.3,69.4,160.2,60,178,60a42,42,0,0,1,42,42C220,131.42,194.18,159.77,172.51,178.36Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M232,102c0,66-104,122-104,122S24,168,24,102A54,54,0,0,1,78,48c22.59,0,41.94,12.31,50,32,8.06-19.69,27.41-32,50-32A54,54,0,0,1,232,102Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,70,103.79,126.66,108.21,129a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40ZM128,214.8C109.74,204.16,32,155.69,32,102A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46C224,155.61,146.24,204.15,128,214.8Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M240,102c0,70-103.79,126.66-108.21,129a8,8,0,0,1-7.58,0C119.79,228.66,16,172,16,102A62.07,62.07,0,0,1,78,40c20.65,0,38.73,8.88,50,23.89C139.27,48.88,157.35,40,178,40A62.07,62.07,0,0,1,240,102Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M178,42c-21,0-39.26,9.47-50,25.34C117.26,51.47,99,42,78,42a60.07,60.07,0,0,0-60,60c0,29.2,18.2,59.59,54.1,90.31a334.68,334.68,0,0,0,53.06,37,6,6,0,0,0,5.68,0,334.68,334.68,0,0,0,53.06-37C219.8,161.59,238,131.2,238,102A60.07,60.07,0,0,0,178,42ZM128,217.11C111.59,207.64,30,157.72,30,102A48.05,48.05,0,0,1,78,54c20.28,0,37.31,10.83,44.45,28.27a6,6,0,0,0,11.1,0C140.69,64.83,157.72,54,178,54a48.05,48.05,0,0,1,48,48C226,157.72,144.41,207.64,128,217.11Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,70,103.79,126.66,108.21,129a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40ZM128,214.8C109.74,204.16,32,155.69,32,102A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46C224,155.61,146.24,204.15,128,214.8Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M178,44c-21.44,0-39.92,10.19-50,27.07C117.92,54.19,99.44,44,78,44a58.07,58.07,0,0,0-58,58c0,28.59,18,58.47,53.4,88.79a333.81,333.81,0,0,0,52.7,36.73,4,4,0,0,0,3.8,0,333.81,333.81,0,0,0,52.7-36.73C218,160.47,236,130.59,236,102A58.07,58.07,0,0,0,178,44ZM128,219.42c-14-8-100-59.35-100-117.42A50.06,50.06,0,0,1,78,52c21.11,0,38.85,11.31,46.3,29.51a4,4,0,0,0,7.4,0C139.15,63.31,156.89,52,178,52a50.06,50.06,0,0,1,50,50C228,160,142,211.46,128,219.42Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222.14,105.85l-80-80a20,20,0,0,0-28.28,0l-80,80A19.86,19.86,0,0,0,28,120v96a12,12,0,0,0,12,12h64a12,12,0,0,0,12-12V164h24v52a12,12,0,0,0,12,12h64a12,12,0,0,0,12-12V120A19.86,19.86,0,0,0,222.14,105.85ZM204,204H164V152a12,12,0,0,0-12-12H104a12,12,0,0,0-12,12v52H52V121.65l76-76,76,76Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M216,120v96H152V152H104v64H40V120a8,8,0,0,1,2.34-5.66l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,216,120Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M219.31,108.68l-80-80a16,16,0,0,0-22.62,0l-80,80A15.87,15.87,0,0,0,32,120v96a8,8,0,0,0,8,8h64a8,8,0,0,0,8-8V160h32v56a8,8,0,0,0,8,8h64a8,8,0,0,0,8-8V120A15.87,15.87,0,0,0,219.31,108.68ZM208,208H160V152a8,8,0,0,0-8-8H104a8,8,0,0,0-8,8v56H48V120l80-80,80,80Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,120v96a8,8,0,0,1-8,8H160a8,8,0,0,1-8-8V164a4,4,0,0,0-4-4H108a4,4,0,0,0-4,4v52a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V120a16,16,0,0,1,4.69-11.31l80-80a16,16,0,0,1,22.62,0l80,80A16,16,0,0,1,224,120Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M217.9,110.1l-80-80a14,14,0,0,0-19.8,0l-80,80A13.92,13.92,0,0,0,34,120v96a6,6,0,0,0,6,6h64a6,6,0,0,0,6-6V158h36v58a6,6,0,0,0,6,6h64a6,6,0,0,0,6-6V120A13.92,13.92,0,0,0,217.9,110.1ZM210,210H158V152a6,6,0,0,0-6-6H104a6,6,0,0,0-6,6v58H46V120a2,2,0,0,1,.58-1.42l80-80a2,2,0,0,1,2.84,0l80,80A2,2,0,0,1,210,120Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M219.31,108.68l-80-80a16,16,0,0,0-22.62,0l-80,80A15.87,15.87,0,0,0,32,120v96a8,8,0,0,0,8,8h64a8,8,0,0,0,8-8V160h32v56a8,8,0,0,0,8,8h64a8,8,0,0,0,8-8V120A15.87,15.87,0,0,0,219.31,108.68ZM208,208H160V152a8,8,0,0,0-8-8H104a8,8,0,0,0-8,8v56H48V120l80-80,80,80Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216.49,111.51l-80-80a12,12,0,0,0-17,0l-80,80A12,12,0,0,0,36,120v96a4,4,0,0,0,4,4h64a4,4,0,0,0,4-4V156h40v60a4,4,0,0,0,4,4h64a4,4,0,0,0,4-4V120A12,12,0,0,0,216.49,111.51ZM212,212H156V152a4,4,0,0,0-4-4H104a4,4,0,0,0-4,4v60H44V120a4,4,0,0,1,1.17-2.83l80-80a4,4,0,0,1,5.66,0l80,80A4,4,0,0,1,212,120Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M144,96a16,16,0,1,1,16,16A16,16,0,0,1,144,96Zm92-40V200a20,20,0,0,1-20,20H40a20,20,0,0,1-20-20V56A20,20,0,0,1,40,36H216A20,20,0,0,1,236,56ZM44,60v79.72l33.86-33.86a20,20,0,0,1,28.28,0L147.31,147l17.18-17.17a20,20,0,0,1,28.28,0L212,149.09V60Zm0,136H162.34L92,125.66l-48,48Zm168,0V183l-33.37-33.37L164.28,164l32,32Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,56V178.06l-39.72-39.72a8,8,0,0,0-11.31,0L147.31,164,97.66,114.34a8,8,0,0,0-11.32,0L32,168.69V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM156,88a12,12,0,1,1-12,12A12,12,0,0,1,156,88Zm60,112H40V160.69l46.34-46.35a8,8,0,0,1,11.32,0h0L165,181.66a8,8,0,0,0,11.32-11.32l-17.66-17.65L173,138.34a8,8,0,0,1,11.31,0L216,170.07V200Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,42H40A14,14,0,0,0,26,56V200a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM40,54H216a2,2,0,0,1,2,2V163.57L188.53,134.1a14,14,0,0,0-19.8,0l-21.42,21.42L101.9,110.1a14,14,0,0,0-19.8,0L38,154.2V56A2,2,0,0,1,40,54ZM38,200V171.17l52.58-52.58a2,2,0,0,1,2.84,0L176.83,202H40A2,2,0,0,1,38,200Zm178,2H193.8l-38-38,21.41-21.42a2,2,0,0,1,2.83,0l38,38V200A2,2,0,0,1,216,202ZM146,100a10,10,0,1,1,10,10A10,10,0,0,1,146,100Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,44H40A12,12,0,0,0,28,56V200a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM40,52H216a4,4,0,0,1,4,4V168.4l-32.89-32.89a12,12,0,0,0-17,0l-22.83,22.83-46.82-46.83a12,12,0,0,0-17,0L36,159V56A4,4,0,0,1,40,52ZM36,200V170.34l53.17-53.17a4,4,0,0,1,5.66,0L181.66,204H40A4,4,0,0,1,36,200Zm180,4H193l-40-40,22.83-22.83a4,4,0,0,1,5.66,0L220,179.71V200A4,4,0,0,1,216,204ZM148,100a8,8,0,1,1,8,8A8,8,0,0,1,148,100Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M160,88a16,16,0,1,1,16,16A16,16,0,0,1,160,88Zm76-32V160a20,20,0,0,1-20,20H204v20a20,20,0,0,1-20,20H40a20,20,0,0,1-20-20V88A20,20,0,0,1,40,68H60V56A20,20,0,0,1,80,36H216A20,20,0,0,1,236,56ZM180,180H80a20,20,0,0,1-20-20V92H44V196H180Zm-21.66-24L124,121.66,89.66,156ZM212,60H84v67.72l25.86-25.86a20,20,0,0,1,28.28,0L192.28,156H212Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,56v82.06l-23.72-23.72a8,8,0,0,0-11.31,0L163.31,140,113.66,90.34a8,8,0,0,0-11.32,0L64,128.69V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM72,56H216v62.75l-10.07-10.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L72,109.37ZM184,200H40V88H56v80a16,16,0,0,0,16,16H184Zm32-32H72V132l36-36,49.66,49.66a8,8,0,0,0,11.31,0L194.63,120,216,141.38V168ZM160,84a12,12,0,1,1,12,12A12,12,0,0,1,160,84Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM172,72a12,12,0,1,1-12,12A12,12,0,0,1,172,72Zm12,128H40V88H56v80a16,16,0,0,0,16,16H184Zm32-32H72V120.69l30.34-30.35a8,8,0,0,1,11.32,0L163.31,140,189,114.34a8,8,0,0,1,11.31,0L216,130.07V168Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,42H72A14,14,0,0,0,58,56V74H40A14,14,0,0,0,26,88V200a14,14,0,0,0,14,14H184a14,14,0,0,0,14-14V182h18a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM70,56a2,2,0,0,1,2-2H216a2,2,0,0,1,2,2v67.57L204.53,110.1a14,14,0,0,0-19.8,0l-21.42,21.41L117.9,86.1a14,14,0,0,0-19.8,0L70,114.2ZM186,200a2,2,0,0,1-2,2H40a2,2,0,0,1-2-2V88a2,2,0,0,1,2-2H58v82a14,14,0,0,0,14,14H186Zm30-30H72a2,2,0,0,1-2-2V131.17l36.58-36.58a2,2,0,0,1,2.83,0l49.66,49.66a6,6,0,0,0,8.49,0l25.65-25.66a2,2,0,0,1,2.83,0l22,22V168A2,2,0,0,1,216,170ZM162,84a10,10,0,1,1,10,10A10,10,0,0,1,162,84Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM72,56H216v62.75l-10.07-10.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L72,109.37ZM184,200H40V88H56v80a16,16,0,0,0,16,16H184Zm32-32H72V132l36-36,49.66,49.66a8,8,0,0,0,11.31,0L194.63,120,216,141.38V168ZM160,84a12,12,0,1,1,12,12A12,12,0,0,1,160,84Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,44H72A12,12,0,0,0,60,56V76H40A12,12,0,0,0,28,88V200a12,12,0,0,0,12,12H184a12,12,0,0,0,12-12V180h20a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM68,56a4,4,0,0,1,4-4H216a4,4,0,0,1,4,4v72.4l-16.89-16.89a12,12,0,0,0-17,0l-22.83,22.83L116.49,87.51a12,12,0,0,0-17,0L68,119ZM188,200a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V88a4,4,0,0,1,4-4H60v84a12,12,0,0,0,12,12H188Zm28-28H72a4,4,0,0,1-4-4V130.34l37.17-37.17a4,4,0,0,1,5.66,0l49.66,49.66a4,4,0,0,0,5.65,0l25.66-25.66a4,4,0,0,1,5.66,0L220,139.71V168A4,4,0,0,1,216,172ZM164,84a8,8,0,1,1,8,8A8,8,0,0,1,164,84Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,44H32A20,20,0,0,0,12,64V192a20,20,0,0,0,20,20H224a20,20,0,0,0,20-20V64A20,20,0,0,0,224,44Zm-4,144H36V68H220ZM52,128a12,12,0,0,1,12-12H192a12,12,0,0,1,0,24H64A12,12,0,0,1,52,128Zm0-36A12,12,0,0,1,64,80H192a12,12,0,0,1,0,24H64A12,12,0,0,1,52,92Zm0,72a12,12,0,0,1,12-12h8a12,12,0,0,1,0,24H64A12,12,0,0,1,52,164Zm108,0a12,12,0,0,1-12,12H108a12,12,0,0,1,0-24h40A12,12,0,0,1,160,164Zm44,0a12,12,0,0,1-12,12h-8a12,12,0,0,1,0-24h8A12,12,0,0,1,204,164Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M232,64V192a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H224A8,8,0,0,1,232,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,144H32V64H224V192Zm-16-64a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16H200A8,8,0,0,1,208,128Zm0-32a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16H200A8,8,0,0,1,208,96ZM72,160a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16h8A8,8,0,0,1,72,160Zm96,0a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,160Zm40,0a8,8,0,0,1-8,8h-8a8,8,0,0,1,0-16h8A8,8,0,0,1,208,160Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM64,168H48a8,8,0,0,1,0-16H64a8,8,0,0,1,0,16Zm96,0H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Zm48,0H192a8,8,0,0,1,0-16h16a8,8,0,0,1,0,16Zm0-32H48a8,8,0,0,1,0-16H208a8,8,0,0,1,0,16Zm0-32H48a8,8,0,0,1,0-16H208a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,50H32A14,14,0,0,0,18,64V192a14,14,0,0,0,14,14H224a14,14,0,0,0,14-14V64A14,14,0,0,0,224,50Zm2,142a2,2,0,0,1-2,2H32a2,2,0,0,1-2-2V64a2,2,0,0,1,2-2H224a2,2,0,0,1,2,2Zm-20-64a6,6,0,0,1-6,6H56a6,6,0,0,1,0-12H200A6,6,0,0,1,206,128Zm0-32a6,6,0,0,1-6,6H56a6,6,0,0,1,0-12H200A6,6,0,0,1,206,96ZM70,160a6,6,0,0,1-6,6H56a6,6,0,0,1,0-12h8A6,6,0,0,1,70,160Zm96,0a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,160Zm40,0a6,6,0,0,1-6,6h-8a6,6,0,0,1,0-12h8A6,6,0,0,1,206,160Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,48H32A16,16,0,0,0,16,64V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,144H32V64H224V192Zm-16-64a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16H200A8,8,0,0,1,208,128Zm0-32a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16H200A8,8,0,0,1,208,96ZM72,160a8,8,0,0,1-8,8H56a8,8,0,0,1,0-16h8A8,8,0,0,1,72,160Zm96,0a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,160Zm40,0a8,8,0,0,1-8,8h-8a8,8,0,0,1,0-16h8A8,8,0,0,1,208,160Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,52H32A12,12,0,0,0,20,64V192a12,12,0,0,0,12,12H224a12,12,0,0,0,12-12V64A12,12,0,0,0,224,52Zm4,140a4,4,0,0,1-4,4H32a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H224a4,4,0,0,1,4,4Zm-24-64a4,4,0,0,1-4,4H56a4,4,0,0,1,0-8H200A4,4,0,0,1,204,128Zm0-32a4,4,0,0,1-4,4H56a4,4,0,0,1,0-8H200A4,4,0,0,1,204,96ZM68,160a4,4,0,0,1-4,4H56a4,4,0,0,1,0-8h8A4,4,0,0,1,68,160Zm96,0a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,160Zm40,0a4,4,0,0,1-4,4h-8a4,4,0,0,1,0-8h8A4,4,0,0,1,204,160Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M227.42,39.86a12,12,0,0,0-11.28-11.28c-39.6-2.33-74.59,2.34-104,13.87C84,53.48,62.31,70.58,49.39,91.9c-17.62,29.11-17.66,64.45-.45,98.19L31.51,207.52a12,12,0,0,0,17,17l17.43-17.43c16.74,8.54,33.88,12.85,50.45,12.85a91.31,91.31,0,0,0,47.74-13.3c21.32-12.92,38.42-34.62,49.45-62.75C225.08,114.46,229.75,79.46,227.42,39.86ZM151.66,186.08C131.57,198.25,108,199.17,83.94,189l84.54-84.54a12,12,0,1,0-17-17L67,172.06c-10.14-24-9.22-47.63,3-67.72,20.91-34.53,70.54-53.72,134-52.25C205.38,115.53,186.19,165.17,151.66,186.08Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M63.81,192.19c-47.89-79.81,16-159.62,151.64-151.64C223.43,176.23,143.62,240.08,63.81,192.19Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M223.45,40.07a8,8,0,0,0-7.52-7.52C139.8,28.08,78.82,51,52.82,94a87.09,87.09,0,0,0-12.76,49c.57,15.92,5.21,32,13.79,47.85l-19.51,19.5a8,8,0,0,0,11.32,11.32l19.5-19.51C81,210.73,97.09,215.37,113,215.94q1.67.06,3.33.06A86.93,86.93,0,0,0,162,203.18C205,177.18,227.93,116.21,223.45,40.07ZM153.75,189.5c-22.75,13.78-49.68,14-76.71.77l88.63-88.62a8,8,0,0,0-11.32-11.32L65.73,179c-13.19-27-13-54,.77-76.71,22.09-36.47,74.6-56.44,141.31-54.06C210.2,114.89,190.22,167.41,153.75,189.5Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M223.45,40.07a8,8,0,0,0-7.52-7.52C139.8,28.08,78.82,51,52.82,94a87.09,87.09,0,0,0-12.76,49A101.72,101.72,0,0,0,46.7,175.2a4,4,0,0,0,6.61,1.43l85-86.3a8,8,0,0,1,11.32,11.32L56.74,195.94,42.55,210.13a8.2,8.2,0,0,0-.6,11.1,8,8,0,0,0,11.71.43l16.79-16.79c14.14,6.84,28.41,10.57,42.56,11.07q1.67.06,3.33.06A86.93,86.93,0,0,0,162,203.18C205,177.18,227.93,116.21,223.45,40.07Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M221.45,40.19a6,6,0,0,0-5.64-5.64C140.43,30.11,80.14,52.71,54.53,95c-17.44,28.79-16.76,62.8,1.79,96.2L35.76,211.76a6,6,0,1,0,8.48,8.48L64.8,199.68c17.27,9.59,34.7,14.41,51.49,14.41A85.38,85.38,0,0,0,161,201.47C203.29,175.86,225.88,115.57,221.45,40.19Zm-66.66,151c-24.08,14.58-52.64,14.37-81.13-.39l90.59-90.59a6,6,0,0,0-8.48-8.48L65.18,182.34c-14.76-28.49-15-57-.39-81.13,22.68-37.43,76.63-57.8,145-54.95C212.59,114.58,192.22,168.54,154.79,191.21Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M223.45,40.07a8,8,0,0,0-7.52-7.52C139.8,28.08,78.82,51,52.82,94a87.09,87.09,0,0,0-12.76,49c.57,15.92,5.21,32,13.79,47.85l-19.51,19.5a8,8,0,0,0,11.32,11.32l19.5-19.51C81,210.73,97.09,215.37,113,215.94q1.67.06,3.33.06A86.93,86.93,0,0,0,162,203.18C205,177.18,227.93,116.21,223.45,40.07ZM153.75,189.5c-22.75,13.78-49.68,14-76.71.77l88.63-88.62a8,8,0,0,0-11.32-11.32L65.73,179c-13.19-27-13-54,.77-76.71,22.09-36.47,74.6-56.44,141.31-54.06C210.2,114.89,190.22,167.41,153.75,189.5Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M219.45,40.31a4,4,0,0,0-3.76-3.76C141.06,32.16,81.46,54.39,56.24,96,39,124.56,39.9,158.37,58.8,191.54L37.17,213.17a4,4,0,0,0,5.66,5.66l21.63-21.64c17.39,9.91,35,14.89,51.83,14.89A83.43,83.43,0,0,0,160,199.76C201.61,174.54,223.84,114.93,219.45,40.31ZM155.82,192.92c-25.37,15.37-55.56,14.75-85.48-1.61l92.5-92.49a4,4,0,0,0-5.66-5.66l-92.49,92.5c-16.36-29.92-17-60.11-1.61-85.48C86.34,61.77,141.72,41,211.66,44.34,215,114.28,194.23,169.66,155.82,192.92Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M180,232a12,12,0,0,1-12,12H88a12,12,0,0,1,0-24h80A12,12,0,0,1,180,232Zm40-128a91.51,91.51,0,0,1-35.17,72.35A12.26,12.26,0,0,0,180,186v2a20,20,0,0,1-20,20H96a20,20,0,0,1-20-20v-2a12,12,0,0,0-4.7-9.51A91.57,91.57,0,0,1,36,104.52C35.73,54.69,76,13.2,125.79,12A92,92,0,0,1,220,104Zm-24,0a68,68,0,0,0-69.65-68C89.56,36.88,59.8,67.55,60,104.38a67.71,67.71,0,0,0,26.1,53.19A35.87,35.87,0,0,1,100,184h56.1A36.13,36.13,0,0,1,170,157.49,67.68,67.68,0,0,0,196,104Zm-20.07-5.32a48.5,48.5,0,0,0-31.91-40,12,12,0,0,0-8,22.62,24.31,24.31,0,0,1,16.09,20,12,12,0,0,0,23.86-2.64Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,104a79.86,79.86,0,0,1-30.59,62.92A24.29,24.29,0,0,0,168,186v6a8,8,0,0,1-8,8H96a8,8,0,0,1-8-8v-6a24.11,24.11,0,0,0-9.3-19A79.87,79.87,0,0,1,48,104.45C47.76,61.09,82.72,25,126.07,24A80,80,0,0,1,208,104Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-32.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M174,232a6,6,0,0,1-6,6H88a6,6,0,0,1,0-12h80A6,6,0,0,1,174,232Zm40-128a85.56,85.56,0,0,1-32.88,67.64A18.23,18.23,0,0,0,174,186v6a14,14,0,0,1-14,14H96a14,14,0,0,1-14-14v-6a18,18,0,0,0-7-14.23h0a85.59,85.59,0,0,1-33-67.24C41.74,57.91,79.39,19.12,125.93,18A86,86,0,0,1,214,104Zm-12,0a74,74,0,0,0-75.79-74C86.17,31,53.78,64.34,54,104.42a73.67,73.67,0,0,0,28.4,57.87A29.92,29.92,0,0,1,94,186v6a2,2,0,0,0,2,2h64a2,2,0,0,0,2-2v-6a30.18,30.18,0,0,1,11.7-23.78A73.59,73.59,0,0,0,202,104Zm-20.08-9A55.58,55.58,0,0,0,137,50.08a6,6,0,1,0-2,11.84C152.38,64.84,167.13,79.6,170.08,97a6,6,0,0,0,5.91,5,6.87,6.87,0,0,0,1-.08A6,6,0,0,0,181.92,95Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M172,232a4,4,0,0,1-4,4H88a4,4,0,0,1,0-8h80A4,4,0,0,1,172,232Zm40-128a83.59,83.59,0,0,1-32.11,66.06A20.2,20.2,0,0,0,172,186v6a12,12,0,0,1-12,12H96a12,12,0,0,1-12-12v-6a20,20,0,0,0-7.76-15.81A83.58,83.58,0,0,1,44,104.47C43.75,59,80.52,21.09,126,20a84,84,0,0,1,86,84Zm-8,0a76,76,0,0,0-77.83-76C85,29,51.77,63.27,52,104.43a75.62,75.62,0,0,0,29.17,59.43A28,28,0,0,1,92,186v6a4,4,0,0,0,4,4h64a4,4,0,0,0,4-4v-6a28.14,28.14,0,0,1,10.94-22.2A75.62,75.62,0,0,0,204,104ZM136.66,52.06a4,4,0,0,0-1.32,7.88C153.53,63,169,78.45,172.06,96.67A4,4,0,0,0,176,100a3.88,3.88,0,0,0,.67-.06,4,4,0,0,0,3.27-4.61A53.51,53.51,0,0,0,136.66,52.06Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M218.34,119.6,183.6,154.34a46.58,46.58,0,0,1-44.31,12.26c-.31.34-.62.67-.95,1L103.6,202.34A46.63,46.63,0,1,1,37.66,136.4L72.4,101.66A46.6,46.6,0,0,1,116.71,89.4c.31-.34.62-.67,1-1L152.4,53.66a46.63,46.63,0,0,1,65.94,65.94Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,7.78,8.22H152a8,8,0,0,0,8-7.78A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM115.7,192.49a43.31,43.31,0,0,1-55-66.43l25.37-25.37a43.35,43.35,0,0,1,61.25,0,42.9,42.9,0,0,1,9.95,15.43,8,8,0,1,1-15,5.6A27.33,27.33,0,0,0,97.37,112L72,137.37a27.32,27.32,0,0,0,34.68,41.91,8,8,0,1,1,9,13.21Zm79.61-62.55-25.37,25.37A43,43,0,0,1,139.32,168h0a43.35,43.35,0,0,1-40.53-28.12,8,8,0,1,1,15-5.6A27.35,27.35,0,0,0,139.28,152h0a27.14,27.14,0,0,0,19.32-8L184,118.63a27.32,27.32,0,0,0-34.68-41.91,8,8,0,1,1-9-13.21,43.32,43.32,0,0,1,55,66.43Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M238,88.18a52.42,52.42,0,0,1-15.4,35.66l-34.75,34.75A52.28,52.28,0,0,1,150.62,174h-.05A52.63,52.63,0,0,1,98,119.9a6,6,0,0,1,6-5.84h.17a6,6,0,0,1,5.83,6.16A40.62,40.62,0,0,0,150.58,162h0a40.4,40.4,0,0,0,28.73-11.9l34.75-34.74A40.63,40.63,0,0,0,156.63,57.9l-11,11a6,6,0,0,1-8.49-8.49l11-11a52.62,52.62,0,0,1,74.43,0A52.83,52.83,0,0,1,238,88.18Zm-127.62,98.9-11,11A40.36,40.36,0,0,1,70.6,210h0a40.63,40.63,0,0,1-28.7-69.36L76.62,105.9A40.63,40.63,0,0,1,146,135.77a6,6,0,0,0,5.83,6.16H152a6,6,0,0,0,6-5.84A52.63,52.63,0,0,0,68.14,97.42L33.38,132.16A52.63,52.63,0,0,0,70.56,222h0a52.26,52.26,0,0,0,37.22-15.42l11-11a6,6,0,1,0-8.49-8.48Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M236,88.12a50.44,50.44,0,0,1-14.81,34.31l-34.75,34.74A50.33,50.33,0,0,1,150.62,172h-.05A50.63,50.63,0,0,1,100,120a4,4,0,0,1,4-3.89h.11a4,4,0,0,1,3.89,4.11A42.64,42.64,0,0,0,150.58,164h0a42.32,42.32,0,0,0,30.14-12.49l34.75-34.74a42.63,42.63,0,1,0-60.29-60.28l-11,11a4,4,0,0,1-5.66-5.65l11-11A50.64,50.64,0,0,1,236,88.12ZM111.78,188.49l-11,11A42.33,42.33,0,0,1,70.6,212h0a42.63,42.63,0,0,1-30.11-72.77l34.75-34.74A42.63,42.63,0,0,1,148,135.82a4,4,0,0,0,8,.23A50.64,50.64,0,0,0,69.55,98.83L34.8,133.57A50.63,50.63,0,0,0,70.56,220h0a50.33,50.33,0,0,0,35.81-14.83l11-11a4,4,0,1,0-5.65-5.66Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M76,64A12,12,0,0,1,88,52H216a12,12,0,0,1,0,24H88A12,12,0,0,1,76,64Zm140,52H88a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24Zm0,64H88a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24ZM44,112a16,16,0,1,0,16,16A16,16,0,0,0,44,112Zm0-64A16,16,0,1,0,60,64,16,16,0,0,0,44,48Zm0,128a16,16,0,1,0,16,16A16,16,0,0,0,44,176Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,64V192H88V64Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M80,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H88A8,8,0,0,1,80,64Zm136,56H88a8,8,0,1,0,0,16H216a8,8,0,0,0,0-16Zm0,64H88a8,8,0,1,0,0,16H216a8,8,0,0,0,0-16ZM44,52A12,12,0,1,0,56,64,12,12,0,0,0,44,52Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,116Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,180Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM68,188a12,12,0,1,1,12-12A12,12,0,0,1,68,188Zm0-48a12,12,0,1,1,12-12A12,12,0,0,1,68,140Zm0-48A12,12,0,1,1,80,80,12,12,0,0,1,68,92Zm124,92H104a8,8,0,0,1,0-16h88a8,8,0,0,1,0,16Zm0-48H104a8,8,0,0,1,0-16h88a8,8,0,0,1,0,16Zm0-48H104a8,8,0,0,1,0-16h88a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M82,64a6,6,0,0,1,6-6H216a6,6,0,0,1,0,12H88A6,6,0,0,1,82,64Zm134,58H88a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12Zm0,64H88a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12ZM44,54A10,10,0,1,0,54,64,10,10,0,0,0,44,54Zm0,128a10,10,0,1,0,10,10A10,10,0,0,0,44,182Zm0-64a10,10,0,1,0,10,10A10,10,0,0,0,44,118Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M80,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H88A8,8,0,0,1,80,64Zm136,56H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,64H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM44,52A12,12,0,1,0,56,64,12,12,0,0,0,44,52Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,116Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,180Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M84,64a4,4,0,0,1,4-4H216a4,4,0,0,1,0,8H88A4,4,0,0,1,84,64Zm132,60H88a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8Zm0,64H88a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8ZM44,120a8,8,0,1,0,8,8A8,8,0,0,0,44,120Zm0-64a8,8,0,1,0,8,8A8,8,0,0,0,44,56Zm0,128a8,8,0,1,0,8,8A8,8,0,0,0,44,184Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M28,64A12,12,0,0,1,40,52H216a12,12,0,0,1,0,24H40A12,12,0,0,1,28,64Zm12,76h64a12,12,0,0,0,0-24H40a12,12,0,0,0,0,24Zm80,40H40a12,12,0,0,0,0,24h80a12,12,0,0,0,0-24Zm120.49,20.49a12,12,0,0,1-17,0l-18.08-18.08a44,44,0,1,1,17-17l18.08,18.07A12,12,0,0,1,240.49,200.49ZM184,164a20,20,0,1,0-20-20A20,20,0,0,0,184,164Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,144a32,32,0,1,1-32-32A32,32,0,0,1,216,144Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,72h72a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm88,48H40a8,8,0,0,0,0,16h88a8,8,0,0,0,0-16Zm109.66,13.66a8,8,0,0,1-11.32,0L206,177.36A40,40,0,1,1,217.36,166l20.3,20.3A8,8,0,0,1,237.66,197.66ZM184,168a24,24,0,1,0-24-24A24,24,0,0,0,184,168Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,72h72a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm88,48H40a8,8,0,0,0,0,16h88a8,8,0,0,0,0-16Zm109.66,2.34L217.36,166A40,40,0,1,0,206,177.36l20.3,20.3a8,8,0,0,0,11.32-11.32Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M34,64a6,6,0,0,1,6-6H216a6,6,0,0,1,0,12H40A6,6,0,0,1,34,64Zm6,70h72a6,6,0,0,0,0-12H40a6,6,0,0,0,0,12Zm88,52H40a6,6,0,0,0,0,12h88a6,6,0,0,0,0-12Zm108.24,10.24a6,6,0,0,1-8.48,0l-21.49-21.48a38.06,38.06,0,1,1,8.49-8.49l21.48,21.49A6,6,0,0,1,236.24,196.24ZM184,170a26,26,0,1,0-26-26A26,26,0,0,0,184,170Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,72h72a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm88,48H40a8,8,0,0,0,0,16h88a8,8,0,0,0,0-16Zm109.66,13.66a8,8,0,0,1-11.32,0L206,177.36A40,40,0,1,1,217.36,166l20.3,20.3A8,8,0,0,1,237.66,197.66ZM184,168a24,24,0,1,0-24-24A24,24,0,0,0,184,168Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M36,64a4,4,0,0,1,4-4H216a4,4,0,0,1,0,8H40A4,4,0,0,1,36,64Zm4,68h72a4,4,0,0,0,0-8H40a4,4,0,0,0,0,8Zm88,56H40a4,4,0,0,0,0,8h88a4,4,0,0,0,0-8Zm106.83,6.83a4,4,0,0,1-5.66,0l-22.72-22.72a36.06,36.06,0,1,1,5.66-5.66l22.72,22.72A4,4,0,0,1,234.83,194.83ZM184,172a28,28,0,1,0-28-28A28,28,0,0,0,184,172Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M228,128a12,12,0,0,1-12,12H116a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128ZM116,76H216a12,12,0,0,0,0-24H116a12,12,0,0,0,0,24ZM216,180H116a12,12,0,0,0,0,24H216a12,12,0,0,0,0-24ZM44,59.31V104a12,12,0,0,0,24,0V40A12,12,0,0,0,50.64,29.27l-16,8a12,12,0,0,0,9.36,22Zm39.73,96.86a27.7,27.7,0,0,0-11.2-18.63A28.89,28.89,0,0,0,32.9,143a27.71,27.71,0,0,0-4.17,7.54,12,12,0,0,0,22.55,8.21,4,4,0,0,1,.58-1,4.78,4.78,0,0,1,6.5-.82,3.82,3.82,0,0,1,1.61,2.6,3.63,3.63,0,0,1-.77,2.77l-.13.17L30.39,200.82A12,12,0,0,0,40,220H72a12,12,0,0,0,0-24H64l14.28-19.11A27.48,27.48,0,0,0,83.73,156.17Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,64V192H104V64Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H104a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM104,72H216a8,8,0,0,0,0-16H104a8,8,0,0,0,0,16ZM216,184H104a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM43.58,55.16,48,52.94V104a8,8,0,0,0,16,0V40a8,8,0,0,0-11.58-7.16l-16,8a8,8,0,0,0,7.16,14.32ZM79.77,156.72a23.73,23.73,0,0,0-9.6-15.95,24.86,24.86,0,0,0-34.11,4.7,23.63,23.63,0,0,0-3.57,6.46,8,8,0,1,0,15,5.47,7.84,7.84,0,0,1,1.18-2.13,8.76,8.76,0,0,1,12-1.59A7.91,7.91,0,0,1,63.93,159a7.64,7.64,0,0,1-1.57,5.78,1,1,0,0,0-.08.11L33.59,203.21A8,8,0,0,0,40,216H72a8,8,0,0,0,0-16H56l19.08-25.53A23.47,23.47,0,0,0,79.77,156.72Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM56.84,75.58a8,8,0,0,1,3.58-10.74l16-8A8,8,0,0,1,88,64v48a8,8,0,0,1-16,0V76.94l-4.42,2.22A8,8,0,0,1,56.84,75.58ZM92,180a8,8,0,0,1,0,16H68a8,8,0,0,1-6.4-12.8l21.67-28.89A3.92,3.92,0,0,0,84,152a4,4,0,0,0-7.77-1.33,8,8,0,0,1-15.09-5.34,20,20,0,1,1,35,18.53L84,180Zm100,4H120a8,8,0,0,1,0-16h72a8,8,0,0,1,0,16Zm0-48H120a8,8,0,0,1,0-16h72a8,8,0,0,1,0,16Zm0-48H120a8,8,0,0,1,0-16h72a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222,128a6,6,0,0,1-6,6H104a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128ZM104,70H216a6,6,0,0,0,0-12H104a6,6,0,0,0,0,12ZM216,186H104a6,6,0,0,0,0,12H216a6,6,0,0,0,0-12ZM42.68,53.37,50,49.71V104a6,6,0,0,0,12,0V40a6,6,0,0,0-8.68-5.37l-16,8a6,6,0,0,0,5.36,10.74ZM72,202H52l21.48-28.74A21.5,21.5,0,0,0,77.79,157,21.75,21.75,0,0,0,69,142.38a22.86,22.86,0,0,0-31.35,4.31,22.18,22.18,0,0,0-3.28,5.92,6,6,0,0,0,11.28,4.11,9.87,9.87,0,0,1,1.48-2.67,10.78,10.78,0,0,1,14.78-2,9.89,9.89,0,0,1,4,6.61,9.64,9.64,0,0,1-2,7.28l-.06.09L35.2,204.41A6,6,0,0,0,40,214H72a6,6,0,0,0,0-12Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H104a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM104,72H216a8,8,0,0,0,0-16H104a8,8,0,0,0,0,16ZM216,184H104a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM43.58,55.16,48,52.94V104a8,8,0,0,0,16,0V40a8,8,0,0,0-11.58-7.16l-16,8a8,8,0,0,0,7.16,14.32ZM79.77,156.72a23.73,23.73,0,0,0-9.6-15.95,24.86,24.86,0,0,0-34.11,4.7,23.63,23.63,0,0,0-3.57,6.46,8,8,0,1,0,15,5.47,7.84,7.84,0,0,1,1.18-2.13,8.76,8.76,0,0,1,12-1.59A7.91,7.91,0,0,1,63.93,159a7.64,7.64,0,0,1-1.57,5.78,1,1,0,0,0-.08.11L33.59,203.21A8,8,0,0,0,40,216H72a8,8,0,0,0,0-16H56l19.08-25.53A23.47,23.47,0,0,0,79.77,156.72Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220,128a4,4,0,0,1-4,4H104a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128ZM104,68H216a4,4,0,0,0,0-8H104a4,4,0,0,0,0,8ZM216,188H104a4,4,0,0,0,0,8H216a4,4,0,0,0,0-8ZM41.79,51.58,52,46.47V104a4,4,0,0,0,8,0V40a4,4,0,0,0-5.79-3.58l-16,8a4,4,0,1,0,3.58,7.16ZM72,204H48l23.85-31.92a19.54,19.54,0,0,0,4-14.8,19.76,19.76,0,0,0-8-13.28,20.84,20.84,0,0,0-28.59,3.92,19.85,19.85,0,0,0-3,5.38A4,4,0,0,0,43.76,156a12.1,12.1,0,0,1,1.78-3.22,12.78,12.78,0,0,1,17.54-2.37,11.85,11.85,0,0,1,4.81,7.94,11.65,11.65,0,0,1-2.41,8.85L36.8,205.61A4,4,0,0,0,40,212H72a4,4,0,0,0,0-8Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,76H180V56A52,52,0,0,0,76,56V76H48A20,20,0,0,0,28,96V208a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V96A20,20,0,0,0,208,76ZM100,56a28,28,0,0,1,56,0V76H100ZM204,204H52V100H204Zm-60-52a16,16,0,1,1-16-16A16,16,0,0,1,144,152Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M216,96V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8H208A8,8,0,0,1,216,96Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Zm-68-56a12,12,0,1,1-12-12A12,12,0,0,1,140,152Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80Zm-80,84a12,12,0,1,1,12-12A12,12,0,0,1,128,164Zm32-84H96V56a32,32,0,0,1,64,0Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,82H174V56a46,46,0,0,0-92,0V82H48A14,14,0,0,0,34,96V208a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V96A14,14,0,0,0,208,82ZM94,56a34,34,0,0,1,68,0V82H94ZM210,208a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V96a2,2,0,0,1,2-2H208a2,2,0,0,1,2,2Zm-72-56a10,10,0,1,1-10-10A10,10,0,0,1,138,152Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Zm-68-56a12,12,0,1,1-12-12A12,12,0,0,1,140,152Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,84H172V56a44,44,0,0,0-88,0V84H48A12,12,0,0,0,36,96V208a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V96A12,12,0,0,0,208,84ZM92,56a36,36,0,0,1,72,0V84H92ZM212,208a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V96a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Zm-76-56a8,8,0,1,1-8-8A8,8,0,0,1,136,152Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232.49,215.51,185,168a92.12,92.12,0,1,0-17,17l47.53,47.54a12,12,0,0,0,17-17ZM44,112a68,68,0,1,1,68,68A68.07,68.07,0,0,1,44,112Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M192,112a80,80,0,1,1-80-80A80,80,0,0,1,192,112Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M229.66,218.34,179.6,168.28a88.21,88.21,0,1,0-11.32,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168,112a56,56,0,1,1-56-56A56,56,0,0,1,168,112Zm61.66,117.66a8,8,0,0,1-11.32,0l-50.06-50.07a88,88,0,1,1,11.32-11.31l50.06,50.06A8,8,0,0,1,229.66,229.66ZM112,184a72,72,0,1,0-72-72A72.08,72.08,0,0,0,112,184Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228.24,219.76l-51.38-51.38a86.15,86.15,0,1,0-8.48,8.48l51.38,51.38a6,6,0,0,0,8.48-8.48ZM38,112a74,74,0,1,1,74,74A74.09,74.09,0,0,1,38,112Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M226.83,221.17l-52.7-52.7a84.1,84.1,0,1,0-5.66,5.66l52.7,52.7a4,4,0,0,0,5.66-5.66ZM36,112a76,76,0,1,1,76,76A76.08,76.08,0,0,1,36,112Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M172,104a12,12,0,0,1-12,12H140v20a12,12,0,0,1-24,0V116H96a12,12,0,0,1,0-24h20V72a12,12,0,0,1,24,0V92h20A12,12,0,0,1,172,104Zm48,0c0,32.38-14.85,66.57-42.94,98.87a259,259,0,0,1-42.18,39,12,12,0,0,1-13.76,0C117.64,239.4,36,181.36,36,104a92,92,0,0,1,184,0Zm-24,0a68,68,0,0,0-136,0c0,33.31,20,63.37,36.7,82.71A249.35,249.35,0,0,0,128,216.89a249.35,249.35,0,0,0,31.3-30.18C176,167.37,196,137.31,196,104Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,104c0,72-80,128-80,128S48,176,48,104a80,80,0,0,1,160,0Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,16a88.1,88.1,0,0,0-88,88c0,31.4,14.51,64.68,42,96.25a254.19,254.19,0,0,0,41.45,38.3,8,8,0,0,0,9.18,0A254.19,254.19,0,0,0,174,200.25c27.45-31.57,42-64.85,42-96.25A88.1,88.1,0,0,0,128,16Zm0,206c-16.53-13-72-60.75-72-118a72,72,0,0,1,144,0C200,161.23,144.53,209,128,222Zm40-118a8,8,0,0,1-8,8H136v24a8,8,0,0,1-16,0V112H96a8,8,0,0,1,0-16h24V72a8,8,0,0,1,16,0V96h24A8,8,0,0,1,168,104Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,16a88.1,88.1,0,0,0-88,88c0,31.4,14.51,64.68,42,96.25a254.19,254.19,0,0,0,41.45,38.3,8,8,0,0,0,9.18,0A254.19,254.19,0,0,0,174,200.25c27.45-31.57,42-64.85,42-96.25A88.1,88.1,0,0,0,128,16Zm32,96H136v24a8,8,0,0,1-16,0V112H96a8,8,0,0,1,0-16h24V72a8,8,0,0,1,16,0V96h24a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M166,104a6,6,0,0,1-6,6H134v26a6,6,0,0,1-12,0V110H96a6,6,0,0,1,0-12h26V72a6,6,0,0,1,12,0V98h26A6,6,0,0,1,166,104Zm48,0c0,30.91-14.34,63.74-41.47,94.94a252.32,252.32,0,0,1-41.09,38,6,6,0,0,1-6.88,0,252.32,252.32,0,0,1-41.09-38C56.34,167.74,42,134.91,42,104a86,86,0,0,1,172,0Zm-12,0a74,74,0,0,0-148,0c0,59.62,59,108.93,74,120.51C143,212.93,202,163.62,202,104Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,16a88.1,88.1,0,0,0-88,88c0,31.4,14.51,64.68,42,96.25a254.19,254.19,0,0,0,41.45,38.3,8,8,0,0,0,9.18,0A254.19,254.19,0,0,0,174,200.25c27.45-31.57,42-64.85,42-96.25A88.1,88.1,0,0,0,128,16Zm0,206c-16.53-13-72-60.75-72-118a72,72,0,0,1,144,0C200,161.23,144.53,209,128,222Zm40-118a8,8,0,0,1-8,8H136v24a8,8,0,0,1-16,0V112H96a8,8,0,0,1,0-16h24V72a8,8,0,0,1,16,0V96h24A8,8,0,0,1,168,104Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M164,104a4,4,0,0,1-4,4H132v28a4,4,0,0,1-8,0V108H96a4,4,0,0,1,0-8h28V72a4,4,0,0,1,8,0v28h28A4,4,0,0,1,164,104Zm48,0c0,30.42-14.17,62.79-41,93.62a250,250,0,0,1-40.73,37.66,4,4,0,0,1-4.58,0A250,250,0,0,1,85,197.62C58.17,166.79,44,134.42,44,104a84,84,0,0,1,168,0Zm-8,0a76,76,0,0,0-152,0c0,35.9,21.15,67.8,38.9,88.23A254.62,254.62,0,0,0,128,227a254.62,254.62,0,0,0,37.1-34.81C182.85,171.8,204,139.9,204,104Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,180a52.06,52.06,0,0,0,52-52V64A52,52,0,0,0,76,64v64A52.06,52.06,0,0,0,128,180ZM100,64a28,28,0,0,1,56,0v64a28,28,0,0,1-56,0Zm40,155.22V240a12,12,0,0,1-24,0V219.22A92.14,92.14,0,0,1,36,128a12,12,0,0,1,24,0,68,68,0,0,0,136,0,12,12,0,0,1,24,0A92.14,92.14,0,0,1,140,219.22Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M168,64v64a40,40,0,0,1-40,40h0a40,40,0,0,1-40-40V64a40,40,0,0,1,40-40h0A40,40,0,0,1,168,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,176a48.05,48.05,0,0,0,48-48V64a48,48,0,0,0-96,0v64A48.05,48.05,0,0,0,128,176ZM96,64a32,32,0,0,1,64,0v64a32,32,0,0,1-64,0Zm40,143.6V240a8,8,0,0,1-16,0V207.6A80.11,80.11,0,0,1,48,128a8,8,0,0,1,16,0,64,64,0,0,0,128,0,8,8,0,0,1,16,0A80.11,80.11,0,0,1,136,207.6Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M80,128V64a48,48,0,0,1,96,0v64a48,48,0,0,1-96,0Zm128,0a8,8,0,0,0-16,0,64,64,0,0,1-128,0,8,8,0,0,0-16,0,80.11,80.11,0,0,0,72,79.6V240a8,8,0,0,0,16,0V207.6A80.11,80.11,0,0,0,208,128Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,174a46.06,46.06,0,0,0,46-46V64a46,46,0,0,0-92,0v64A46.06,46.06,0,0,0,128,174ZM94,64a34,34,0,0,1,68,0v64a34,34,0,0,1-68,0Zm40,141.75V240a6,6,0,0,1-12,0V205.75A78.09,78.09,0,0,1,50,128a6,6,0,0,1,12,0,66,66,0,0,0,132,0,6,6,0,0,1,12,0A78.09,78.09,0,0,1,134,205.75Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,176a48.05,48.05,0,0,0,48-48V64a48,48,0,0,0-96,0v64A48.05,48.05,0,0,0,128,176ZM96,64a32,32,0,0,1,64,0v64a32,32,0,0,1-64,0Zm40,143.6V240a8,8,0,0,1-16,0V207.6A80.11,80.11,0,0,1,48,128a8,8,0,0,1,16,0,64,64,0,0,0,128,0,8,8,0,0,1,16,0A80.11,80.11,0,0,1,136,207.6Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,172a44.05,44.05,0,0,0,44-44V64a44,44,0,0,0-88,0v64A44.05,44.05,0,0,0,128,172ZM92,64a36,36,0,0,1,72,0v64a36,36,0,0,1-72,0Zm40,139.89V240a4,4,0,0,1-8,0V203.89A76.09,76.09,0,0,1,52,128a4,4,0,0,1,8,0,68,68,0,0,0,136,0,4,4,0,0,1,8,0A76.09,76.09,0,0,1,132,203.89Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M56.88,39.93A12,12,0,1,0,39.12,56.07L76,96.64V128a52,52,0,0,0,72.11,48l11.26,12.39A67.34,67.34,0,0,1,128,196a68.07,68.07,0,0,1-68-68,12,12,0,0,0-24,0,92.14,92.14,0,0,0,80,91.22V240a12,12,0,0,0,24,0V219.23a90.39,90.39,0,0,0,35.92-12.68l23.2,25.52a12,12,0,0,0,17.76-16.14ZM128,156a28,28,0,0,1-28-28v-5l29.9,32.89C129.27,156,128.64,156,128,156Zm63-2.42A67.63,67.63,0,0,0,196,128a12,12,0,0,1,24,0,91.48,91.48,0,0,1-6.74,34.61,12,12,0,0,1-22.23-9ZM85.7,33.75A52,52,0,0,1,180,64v56.54a12,12,0,0,1-24,0V64a28,28,0,0,0-50.79-16.28,12,12,0,0,1-19.51-14Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M168,64v64a40,40,0,0,1-40,40h0a40,40,0,0,1-40-40V64a40,40,0,0,1,40-40h0A40,40,0,0,1,168,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M213.92,218.62l-160-176A8,8,0,0,0,42.08,53.38L80,95.09V128a48,48,0,0,0,69.11,43.12l11.1,12.2A63.41,63.41,0,0,1,128,192a64.07,64.07,0,0,1-64-64,8,8,0,0,0-16,0,80.11,80.11,0,0,0,72,79.6V240a8,8,0,0,0,16,0V207.59a78.83,78.83,0,0,0,35.16-12.22l30.92,34a8,8,0,1,0,11.84-10.76ZM128,160a32,32,0,0,1-32-32V112.69l41.66,45.82A32,32,0,0,1,128,160Zm57.52-3.91A63.32,63.32,0,0,0,192,128a8,8,0,0,1,16,0,79.16,79.16,0,0,1-8.11,35.12,8,8,0,0,1-7.19,4.49,7.88,7.88,0,0,1-3.51-.82A8,8,0,0,1,185.52,156.09ZM84,44.87A48,48,0,0,1,176,64v64a49.19,49.19,0,0,1-.26,5,8,8,0,0,1-8,7.17,8.13,8.13,0,0,1-.84,0,8,8,0,0,1-7.12-8.79c.11-1.1.17-2.24.17-3.36V64A32,32,0,0,0,98.64,51.25,8,8,0,1,1,84,44.87Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M213.38,229.92a8,8,0,0,1-11.3-.54l-30.92-34A78.83,78.83,0,0,1,136,207.59V240a8,8,0,0,1-16,0V207.6A80.11,80.11,0,0,1,48,128a8,8,0,0,1,16,0,64.07,64.07,0,0,0,64,64,63.41,63.41,0,0,0,32.21-8.68l-11.1-12.2A48,48,0,0,1,80,128V95.09L42.08,53.38A8,8,0,0,1,53.92,42.62l160,176A8,8,0,0,1,213.38,229.92Zm-24.19-63.13a7.88,7.88,0,0,0,3.51.82,8,8,0,0,0,7.19-4.49A79.16,79.16,0,0,0,208,128a8,8,0,0,0-16,0,63.32,63.32,0,0,1-6.48,28.09A8,8,0,0,0,189.19,166.79Zm-27.33-29.22A8,8,0,0,0,175.74,133a49.49,49.49,0,0,0,.26-5V64A48,48,0,0,0,84,44.87a8,8,0,0,0,1.41,8.57Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M212.44,220,52.44,44A6,6,0,0,0,43.56,52L82,94.32V128a46,46,0,0,0,67.56,40.64l13.75,15.12A65.26,65.26,0,0,1,128,194a66.08,66.08,0,0,1-66-66,6,6,0,0,0-12,0,78.09,78.09,0,0,0,72,77.75V240a6,6,0,0,0,12,0V205.77a76.93,76.93,0,0,0,37.48-13L203.56,228a6,6,0,0,0,8.88-8.08ZM128,162a34,34,0,0,1-34-34V107.52l47.12,51.84A33.82,33.82,0,0,1,128,162Zm59.32-5A65.38,65.38,0,0,0,194,128a6,6,0,0,1,12,0,77.33,77.33,0,0,1-7.9,34.25A6,6,0,1,1,187.32,157ZM85.8,45.67A46,46,0,0,1,174,64v64a45.17,45.17,0,0,1-.25,4.81,6,6,0,0,1-6,5.38q-.31,0-.63,0a6,6,0,0,1-5.34-6.59A35.41,35.41,0,0,0,162,128V64A34,34,0,0,0,96.8,50.45a6,6,0,0,1-11-4.78Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M213.92,218.62l-160-176A8,8,0,0,0,42.08,53.38L80,95.09V128a48,48,0,0,0,69.11,43.12l11.1,12.2A63.41,63.41,0,0,1,128,192a64.07,64.07,0,0,1-64-64,8,8,0,0,0-16,0,80.11,80.11,0,0,0,72,79.6V240a8,8,0,0,0,16,0V207.59a78.83,78.83,0,0,0,35.16-12.22l30.92,34a8,8,0,1,0,11.84-10.76ZM128,160a32,32,0,0,1-32-32V112.69l41.66,45.82A32,32,0,0,1,128,160Zm57.52-3.91A63.32,63.32,0,0,0,192,128a8,8,0,0,1,16,0,79.16,79.16,0,0,1-8.11,35.12,8,8,0,0,1-7.19,4.49,7.88,7.88,0,0,1-3.51-.82A8,8,0,0,1,185.52,156.09ZM84,44.87A48,48,0,0,1,176,64v64a49.19,49.19,0,0,1-.26,5,8,8,0,0,1-8,7.17,8.13,8.13,0,0,1-.84,0,8,8,0,0,1-7.12-8.79c.11-1.1.17-2.24.17-3.36V64A32,32,0,0,0,98.64,51.25,8,8,0,1,1,84,44.87Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M211,221.31,51,45.31A4,4,0,0,0,45,50.69L84,93.55V128a44,44,0,0,0,66,38.12l16.38,18A67.21,67.21,0,0,1,128,196a68.07,68.07,0,0,1-68-68,4,4,0,0,0-8,0,76.09,76.09,0,0,0,72,75.89V240a4,4,0,0,0,8,0V203.89a75.1,75.1,0,0,0,39.79-13.77L205,226.69a4,4,0,1,0,5.92-5.38ZM128,164a36,36,0,0,1-36-36V102.35L144.43,160A35.83,35.83,0,0,1,128,164Zm61.12-6.15A67.44,67.44,0,0,0,196,128a4,4,0,0,1,8,0,75.28,75.28,0,0,1-7.7,33.37,4,4,0,0,1-7.18-3.52ZM87.63,46.46A44,44,0,0,1,172,64v64a44.2,44.2,0,0,1-.24,4.61,4,4,0,0,1-4,3.58l-.42,0a4,4,0,0,1-3.57-4.39A36.67,36.67,0,0,0,164,128V64A36,36,0,0,0,95,49.66a4,4,0,0,1-7.34-3.2Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,128a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H72a8,8,0,0,1,0-16H184a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M222,128a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220,128a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,36H48A28,28,0,0,0,20,64V176a28,28,0,0,0,28,28H208a28,28,0,0,0,28-28V64A28,28,0,0,0,208,36Zm4,140a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Zm-40,52a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,228ZM160.49,103.51a12,12,0,0,1-17,17L140,117v35a12,12,0,0,1-24,0V117l-3.51,3.52a12,12,0,0,1-17-17l24-24a12,12,0,0,1,17,0Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,64V176a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V64A16,16,0,0,1,48,48H208A16,16,0,0,1,224,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24H208a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40Zm8,136a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H208a8,8,0,0,1,8,8Zm-48,48a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,224ZM157.66,106.34a8,8,0,0,1-11.32,11.32L136,107.31V152a8,8,0,0,1-16,0V107.31l-10.34,10.35a8,8,0,0,1-11.32-11.32l24-24a8,8,0,0,1,11.32,0Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M168,224a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,224ZM232,64V176a24,24,0,0,1-24,24H48a24,24,0,0,1-24-24V64A24,24,0,0,1,48,40H208A24,24,0,0,1,232,64Zm-74.34,42.34-24-24a8,8,0,0,0-11.32,0l-24,24a8,8,0,0,0,11.32,11.32L120,107.31V152a8,8,0,0,0,16,0V107.31l10.34,10.35a8,8,0,0,0,11.32-11.32Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,42H48A22,22,0,0,0,26,64V176a22,22,0,0,0,22,22H208a22,22,0,0,0,22-22V64A22,22,0,0,0,208,42Zm10,134a10,10,0,0,1-10,10H48a10,10,0,0,1-10-10V64A10,10,0,0,1,48,54H208a10,10,0,0,1,10,10Zm-52,48a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,224Zm-9.76-116.24a6,6,0,1,1-8.48,8.48L134,102.49V152a6,6,0,0,1-12,0V102.49l-13.76,13.75a6,6,0,0,1-8.48-8.48l24-24a6,6,0,0,1,8.48,0Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24H208a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40Zm8,136a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H208a8,8,0,0,1,8,8Zm-48,48a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,224ZM157.66,106.34a8,8,0,0,1-11.32,11.32L136,107.31V152a8,8,0,0,1-16,0V107.31l-10.34,10.35a8,8,0,0,1-11.32-11.32l24-24a8,8,0,0,1,11.32,0Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,44H48A20,20,0,0,0,28,64V176a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V64A20,20,0,0,0,208,44Zm12,132a12,12,0,0,1-12,12H48a12,12,0,0,1-12-12V64A12,12,0,0,1,48,52H208a12,12,0,0,1,12,12Zm-56,48a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,224Zm-9.17-114.83a4,4,0,0,1-5.66,5.66L132,97.66V152a4,4,0,0,1-8,0V97.66l-17.17,17.17a4,4,0,0,1-5.66-5.66l24-24a4,4,0,0,1,5.66,0Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M236,32a12,12,0,0,0-12-12c-44.78,0-90,48.54-115.9,82a64,64,0,0,0-80,62c0,12-3.1,22.71-9.23,31.76A43,43,0,0,1,9.4,206.05a11.88,11.88,0,0,0-4.91,13.38A12.07,12.07,0,0,0,16.11,228h76A64,64,0,0,0,154,148C187.49,122.05,236,76.8,236,32ZM209.62,46.39c-4,12.92-13.15,27.49-26.92,42.91-3,3.39-6.16,6.7-9.35,9.89a104.31,104.31,0,0,0-16.5-16.51c3.19-3.19,6.49-6.32,9.88-9.35C182.15,59.55,196.71,50.43,209.62,46.39ZM92.07,204H42a80.17,80.17,0,0,0,10.14-40,40,40,0,1,1,40,40Zm38.18-91.32c3.12-3.93,6.55-8.09,10.23-12.35a80.52,80.52,0,0,1,15.23,15.24c-4.26,3.68-8.42,7.11-12.35,10.23A64.43,64.43,0,0,0,130.25,112.68Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M224,32c0,32.81-31.64,67.43-58.64,91.05A84.39,84.39,0,0,0,133,90.64C156.57,63.64,191.19,32,224,32Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M232,32a8,8,0,0,0-8-8c-44.08,0-89.31,49.71-114.43,82.63A60,60,0,0,0,32,164c0,30.88-19.54,44.73-20.47,45.37A8,8,0,0,0,16,224H92a60,60,0,0,0,57.37-77.57C182.3,121.31,232,76.08,232,32ZM92,208H34.63C41.38,198.41,48,183.92,48,164a44,44,0,1,1,44,44Zm32.42-94.45q5.14-6.66,10.09-12.55A76.23,76.23,0,0,1,155,121.49q-5.9,4.94-12.55,10.09A60.54,60.54,0,0,0,124.42,113.55Zm42.7-2.68a92.57,92.57,0,0,0-22-22c31.78-34.53,55.75-45,69.9-47.91C212.17,55.12,201.65,79.09,167.12,110.87Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232,32a8,8,0,0,0-8-8c-44.08,0-89.31,49.71-114.43,82.63A60,60,0,0,0,32,164c0,30.88-19.54,44.73-20.47,45.37A8,8,0,0,0,16,224H92a60,60,0,0,0,57.37-77.57C182.3,121.31,232,76.08,232,32ZM124.42,113.55q5.14-6.66,10.09-12.55A76.23,76.23,0,0,1,155,121.49q-5.9,4.94-12.55,10.09A60.54,60.54,0,0,0,124.42,113.55Zm42.7-2.68a92.57,92.57,0,0,0-22-22c31.78-34.53,55.75-45,69.9-47.91C212.17,55.12,201.65,79.09,167.12,110.87Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,26c-20.8,0-44.11,11.41-69.3,33.9C136.62,76.06,121,94.9,110.3,109A58,58,0,0,0,34,164c0,32.07-20.43,46.39-21.35,47A6,6,0,0,0,16,222H92a58,58,0,0,0,55-76.3c14.08-10.67,32.92-26.32,49.08-44.4C218.59,76.11,230,52.8,230,32A6,6,0,0,0,224,26ZM92,210H30.65C37.92,200.85,46,185.78,46,164a46,46,0,1,1,46,46Zm29.49-95.91c3.6-4.67,7.88-10,12.71-15.69a78.17,78.17,0,0,1,23.4,23.4c-5.67,4.83-11,9.11-15.69,12.71A58.38,58.38,0,0,0,121.49,114.09Zm45.2-.3a90.24,90.24,0,0,0-24.48-24.48C163.05,66.46,191,42,217.56,38.44,214,65,189.54,93,166.69,113.79Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232,32a8,8,0,0,0-8-8c-44.08,0-89.31,49.71-114.43,82.63A60,60,0,0,0,32,164c0,30.88-19.54,44.73-20.47,45.37A8,8,0,0,0,16,224H92a60,60,0,0,0,57.37-77.57C182.3,121.31,232,76.08,232,32ZM92,208H34.63C41.38,198.41,48,183.92,48,164a44,44,0,1,1,44,44Zm32.42-94.45q5.14-6.66,10.09-12.55A76.23,76.23,0,0,1,155,121.49q-5.9,4.94-12.55,10.09A60.54,60.54,0,0,0,124.42,113.55Zm42.7-2.68a92.57,92.57,0,0,0-22-22c31.78-34.53,55.75-45,69.9-47.91C212.17,55.12,201.65,79.09,167.12,110.87Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,28c-20.29,0-43.16,11.24-68,33.4-18.47,16.49-34.39,35.83-45,49.93A56,56,0,0,0,36,164c0,33.22-21.26,48-22.22,48.68A4,4,0,0,0,16,220H92a56,56,0,0,0,52.67-75c14.11-10.63,33.44-26.55,49.93-45C216.76,75.16,228,52.29,228,32A4,4,0,0,0,224,28ZM92,212H26.35C33.91,203.69,44,188.08,44,164a48,48,0,1,1,48,48Zm26.52-97.31c4.13-5.44,9.32-12,15.29-18.9a80.08,80.08,0,0,1,26.4,26.4c-6.94,6-13.46,11.16-18.9,15.29A56.32,56.32,0,0,0,118.52,114.69Zm47.77,2.14a88.17,88.17,0,0,0-27.12-27.12C161,65.43,191.26,38.63,219.82,36.18,217.37,64.74,190.57,95,166.29,116.83Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M203.57,51A107.9,107.9,0,0,0,20,128c0,44.72,27.6,82.25,72,97.94A36,36,0,0,0,140,192a12,12,0,0,1,12-12h46.21a35.79,35.79,0,0,0,35.1-28A108.6,108.6,0,0,0,236,127.09,107.23,107.23,0,0,0,203.57,51Zm6.34,95.67a11.91,11.91,0,0,1-11.7,9.3H152a36,36,0,0,0-36,36,12,12,0,0,1-16,11.3c-16.65-5.88-30.65-15.76-40.48-28.56A76,76,0,0,1,44,128a84,84,0,0,1,83.13-84H128a84.35,84.35,0,0,1,84,83.29A84.72,84.72,0,0,1,209.91,146.71ZM144,76a16,16,0,1,1-16-16A16,16,0,0,1,144,76Zm-44,24A16,16,0,1,1,84,84,16,16,0,0,1,100,100Zm0,56a16,16,0,1,1-16-16A16,16,0,0,1,100,156Zm88-56a16,16,0,1,1-16-16A16,16,0,0,1,188,100Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,127.17a96.48,96.48,0,0,1-2.39,22.18A24,24,0,0,1,198.21,168H152a24,24,0,0,0-24,24,24,24,0,0,1-32,22.61C58.73,201.44,32,169.81,32,128a96,96,0,0,1,95-96C179.84,31.47,223.55,74.35,224,127.17Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89Zm13,93.71A15.89,15.89,0,0,1,198.21,160H152a32,32,0,0,0-32,32,16,16,0,0,1-21.31,15.07C62.49,194.3,40,164,40,128a88,88,0,0,1,87.09-88h.9a88.35,88.35,0,0,1,88,87.25A88.86,88.86,0,0,1,213.81,147.6ZM140,76a12,12,0,1,1-12-12A12,12,0,0,1,140,76ZM96,100A12,12,0,1,1,84,88,12,12,0,0,1,96,100Zm0,56a12,12,0,1,1-12-12A12,12,0,0,1,96,156Zm88-56a12,12,0,1,1-12-12A12,12,0,0,1,184,100Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89ZM84,168a12,12,0,1,1,12-12A12,12,0,0,1,84,168Zm0-56a12,12,0,1,1,12-12A12,12,0,0,1,84,112Zm44-24a12,12,0,1,1,12-12A12,12,0,0,1,128,88Zm44,24a12,12,0,1,1,12-12A12,12,0,0,1,172,112Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M199.37,55.31A101.32,101.32,0,0,0,128,26h-1A102,102,0,0,0,26,128c0,42.09,26.07,77.44,68,92.26A30.21,30.21,0,0,0,104.11,222,30.06,30.06,0,0,0,134,192a18,18,0,0,1,18-18h46.21a29.82,29.82,0,0,0,29.25-23.31A102.71,102.71,0,0,0,230,127.11,101.25,101.25,0,0,0,199.37,55.31ZM215.76,148a17.89,17.89,0,0,1-17.55,14H152a30,30,0,0,0-30,30,18,18,0,0,1-24,17C61,195.86,38,164.85,38,128a90,90,0,0,1,89.07-90H128a90.34,90.34,0,0,1,90,89.22A90.46,90.46,0,0,1,215.76,148ZM138,76a10,10,0,1,1-10-10A10,10,0,0,1,138,76ZM94,100A10,10,0,1,1,84,90,10,10,0,0,1,94,100Zm0,56a10,10,0,1,1-10-10A10,10,0,0,1,94,156Zm88-56a10,10,0,1,1-10-10A10,10,0,0,1,182,100Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200.77,53.89A103.27,103.27,0,0,0,128,24h-1.07A104,104,0,0,0,24,128c0,43,26.58,79.06,69.36,94.17A32,32,0,0,0,136,192a16,16,0,0,1,16-16h46.21a31.81,31.81,0,0,0,31.2-24.88,104.43,104.43,0,0,0,2.59-24A103.28,103.28,0,0,0,200.77,53.89Zm13,93.71A15.89,15.89,0,0,1,198.21,160H152a32,32,0,0,0-32,32,16,16,0,0,1-21.31,15.07C62.49,194.3,40,164,40,128a88,88,0,0,1,87.09-88h.9a88.35,88.35,0,0,1,88,87.25A88.86,88.86,0,0,1,213.81,147.6ZM140,76a12,12,0,1,1-12-12A12,12,0,0,1,140,76ZM96,100A12,12,0,1,1,84,88,12,12,0,0,1,96,100Zm0,56a12,12,0,1,1-12-12A12,12,0,0,1,96,156Zm88-56a12,12,0,1,1-12-12A12,12,0,0,1,184,100Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M198,56.74A99.31,99.31,0,0,0,128,28h-1A100,100,0,0,0,28,128c0,41.22,25.55,75.85,66.69,90.38a28.34,28.34,0,0,0,9.42,1.63A28,28,0,0,0,132,192a20,20,0,0,1,20-20h46.21a27.84,27.84,0,0,0,27.3-21.76,100.37,100.37,0,0,0,2.49-23.1A99.26,99.26,0,0,0,198,56.74Zm19.74,91.72A19.89,19.89,0,0,1,198.21,164H152a28,28,0,0,0-28,28,20,20,0,0,1-26.64,18.83C59.51,197.46,36,165.72,36,128a92,92,0,0,1,91.05-92H128a92,92,0,0,1,89.72,112.46ZM136,76a8,8,0,1,1-8-8A8,8,0,0,1,136,76ZM92,100a8,8,0,1,1-8-8A8,8,0,0,1,92,100Zm0,56a8,8,0,1,1-8-8A8,8,0,0,1,92,156Zm88-56a8,8,0,1,1-8-8A8,8,0,0,1,180,100Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M230.14,25.86a20,20,0,0,0-19.57-5.11l-.22.07L18.44,79a20,20,0,0,0-3.06,37.25L99,157l40.71,83.65a19.81,19.81,0,0,0,18,11.38c.57,0,1.15,0,1.73-.07A19.82,19.82,0,0,0,177,237.56L235.18,45.65a1.42,1.42,0,0,0,.07-.22A20,20,0,0,0,230.14,25.86ZM156.91,221.07l-34.37-70.64,46-45.95a12,12,0,0,0-17-17l-46,46L34.93,99.09,210,46Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M223.69,42.18l-58.22,192a8,8,0,0,1-14.92,1.25L108,148,20.58,105.45a8,8,0,0,1,1.25-14.92l192-58.22A8,8,0,0,1,223.69,42.18Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14,0-.07-40.06-82.3,48-48a8,8,0,0,0-11.31-11.31l-48,48L24.08,98.25l-.07,0,.14,0L216,40Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M231.4,44.34s0,.1,0,.15l-58.2,191.94a15.88,15.88,0,0,1-14,11.51q-.69.06-1.38.06a15.86,15.86,0,0,1-14.42-9.15L107,164.15a4,4,0,0,1,.77-4.58l57.92-57.92a8,8,0,0,0-11.31-11.31L96.43,148.26a4,4,0,0,1-4.58.77L17.08,112.64a16,16,0,0,1,2.49-29.8l191.94-58.2.15,0A16,16,0,0,1,231.4,44.34Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M225.88,30.12a13.83,13.83,0,0,0-13.7-3.58l-.11,0L20.14,84.77A14,14,0,0,0,18,110.85l85.56,41.64L145.12,238a13.87,13.87,0,0,0,12.61,8c.4,0,.81,0,1.21-.05a13.9,13.9,0,0,0,12.29-10.09l58.2-191.93,0-.11A13.83,13.83,0,0,0,225.88,30.12Zm-8,10.4L159.73,232.43l0,.11a2,2,0,0,1-3.76.26l-40.68-83.58,49-49a6,6,0,1,0-8.49-8.49l-49,49L23.15,100a2,2,0,0,1,.31-3.74l.11,0L215.48,38.08a1.94,1.94,0,0,1,1.92.52A2,2,0,0,1,217.92,40.52Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14,0-.07-40.06-82.3,48-48a8,8,0,0,0-11.31-11.31l-48,48L24.08,98.25l-.07,0,.14,0L216,40Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224.47,31.52a11.87,11.87,0,0,0-11.82-3L20.74,86.67a12,12,0,0,0-1.91,22.38L105,151l41.92,86.15A11.88,11.88,0,0,0,157.74,244c.34,0,.69,0,1,0a11.89,11.89,0,0,0,10.52-8.63l58.21-192,0-.08A11.85,11.85,0,0,0,224.47,31.52Zm-4.62,9.54-58.23,192a4,4,0,0,1-7.48.59l-41.3-84.86,50-50a4,4,0,1,0-5.66-5.66l-50,50-84.9-41.31a3.88,3.88,0,0,1-2.27-4,3.93,3.93,0,0,1,3-3.54L214.9,36.16A3.93,3.93,0,0,1,216,36a4,4,0,0,1,2.79,1.19A3.93,3.93,0,0,1,219.85,41.06Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,28H160a20,20,0,0,0-20,20V208a20,20,0,0,0,20,20h40a20,20,0,0,0,20-20V48A20,20,0,0,0,200,28Zm-4,176H164V52h32ZM96,28H56A20,20,0,0,0,36,48V208a20,20,0,0,0,20,20H96a20,20,0,0,0,20-20V48A20,20,0,0,0,96,28ZM92,204H60V52H92Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,48V208a8,8,0,0,1-8,8H160a8,8,0,0,1-8-8V48a8,8,0,0,1,8-8h40A8,8,0,0,1,208,48ZM96,40H56a8,8,0,0,0-8,8V208a8,8,0,0,0,8,8H96a8,8,0,0,0,8-8V48A8,8,0,0,0,96,40Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,32H160a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm0,176H160V48h40ZM96,32H56A16,16,0,0,0,40,48V208a16,16,0,0,0,16,16H96a16,16,0,0,0,16-16V48A16,16,0,0,0,96,32Zm0,176H56V48H96Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48V208a16,16,0,0,1-16,16H160a16,16,0,0,1-16-16V48a16,16,0,0,1,16-16h40A16,16,0,0,1,216,48ZM96,32H56A16,16,0,0,0,40,48V208a16,16,0,0,0,16,16H96a16,16,0,0,0,16-16V48A16,16,0,0,0,96,32Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,34H160a14,14,0,0,0-14,14V208a14,14,0,0,0,14,14h40a14,14,0,0,0,14-14V48A14,14,0,0,0,200,34Zm2,174a2,2,0,0,1-2,2H160a2,2,0,0,1-2-2V48a2,2,0,0,1,2-2h40a2,2,0,0,1,2,2ZM96,34H56A14,14,0,0,0,42,48V208a14,14,0,0,0,14,14H96a14,14,0,0,0,14-14V48A14,14,0,0,0,96,34Zm2,174a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V48a2,2,0,0,1,2-2H96a2,2,0,0,1,2,2Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,32H160a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16h40a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm0,176H160V48h40ZM96,32H56A16,16,0,0,0,40,48V208a16,16,0,0,0,16,16H96a16,16,0,0,0,16-16V48A16,16,0,0,0,96,32Zm0,176H56V48H96Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,36H160a12,12,0,0,0-12,12V208a12,12,0,0,0,12,12h40a12,12,0,0,0,12-12V48A12,12,0,0,0,200,36Zm4,172a4,4,0,0,1-4,4H160a4,4,0,0,1-4-4V48a4,4,0,0,1,4-4h40a4,4,0,0,1,4,4ZM96,36H56A12,12,0,0,0,44,48V208a12,12,0,0,0,12,12H96a12,12,0,0,0,12-12V48A12,12,0,0,0,96,36Zm4,172a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V48a4,4,0,0,1,4-4H96a4,4,0,0,1,4,4Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst t = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm84,108a83.43,83.43,0,0,1-9,37.84l-63-44.09V44.87A84.12,84.12,0,0,1,212,128ZM116,44.87v76.88L53,165.84a83.93,83.93,0,0,1,63-121ZM66.83,185.48,116,151.05v60.08A83.86,83.86,0,0,1,66.83,185.48ZM140,211.13V151.05l49.17,34.43A83.86,83.86,0,0,1,140,211.13Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.48,87.48,0,0,1-11.64,43.7L136,123.84V40.37A88.11,88.11,0,0,1,216,128ZM120,40.37v83.47L51.64,171.7A88,88,0,0,1,120,40.37ZM60.84,184.79,120,143.37v72.26A87.85,87.85,0,0,1,60.84,184.79ZM136,215.63V143.37l59.16,41.42A87.85,87.85,0,0,1,136,215.63Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M136,143.37l46,32.2a71.86,71.86,0,0,1-46,24ZM56,128a71.61,71.61,0,0,0,8.81,34.48L120,123.84V56.46A72.08,72.08,0,0,0,56,128Zm64,71.54V143.37l-46,32.2A71.86,71.86,0,0,0,120,199.54ZM136,56.46v67.38l55.19,38.64A72,72,0,0,0,136,56.46ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm90,102a89.44,89.44,0,0,1-13,46.58l-71-49.7V38.2A90.12,90.12,0,0,1,218,128ZM122,38.2v86.68l-71,49.7A90,90,0,0,1,122,38.2ZM57.92,184.4,122,139.53V217.8A89.93,89.93,0,0,1,57.92,184.4ZM134,217.8V139.53l64.08,44.87A89.93,89.93,0,0,1,134,217.8Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm88,104a87.48,87.48,0,0,1-11.64,43.7L136,123.84V40.37A88.11,88.11,0,0,1,216,128ZM120,40.37v83.47L51.64,171.7A88,88,0,0,1,120,40.37ZM60.84,184.79,120,143.37v72.26A87.85,87.85,0,0,1,60.84,184.79ZM136,215.63V143.37l59.16,41.42A87.85,87.85,0,0,1,136,215.63Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm92,100a91.44,91.44,0,0,1-14.44,49.43L132,125.92V36.09A92.11,92.11,0,0,1,220,128ZM124,36.09v89.83L50.44,177.43A92,92,0,0,1,124,36.09ZM55,184l69-48.29v84.23A91.94,91.94,0,0,1,55,184Zm77,35.94V135.68L201,184A91.94,91.94,0,0,1,132,219.91Z\" }))\n  ]\n]);\nexport {\n  t as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M230.14,70.54,185.46,25.85a20,20,0,0,0-28.29,0L33.86,149.17A19.85,19.85,0,0,0,28,163.31V208a20,20,0,0,0,20,20H92.69a19.86,19.86,0,0,0,14.14-5.86L230.14,98.82a20,20,0,0,0,0-28.28ZM91,204H52V165l84-84,39,39ZM192,103,153,64l18.34-18.34,39,39Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M221.66,90.34,192,120,136,64l29.66-29.66a8,8,0,0,1,11.31,0L221.66,79A8,8,0,0,1,221.66,90.34Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M227.31,73.37,182.63,28.68a16,16,0,0,0-22.63,0L36.69,152A15.86,15.86,0,0,0,32,163.31V208a16,16,0,0,0,16,16H92.69A15.86,15.86,0,0,0,104,219.31L227.31,96a16,16,0,0,0,0-22.63ZM92.69,208H48V163.31l88-88L180.69,120ZM192,108.68,147.31,64l24-24L216,84.68Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M227.31,73.37,182.63,28.68a16,16,0,0,0-22.63,0L36.69,152A15.86,15.86,0,0,0,32,163.31V208a16,16,0,0,0,16,16H92.69A15.86,15.86,0,0,0,104,219.31L227.31,96a16,16,0,0,0,0-22.63ZM192,108.68,147.31,64l24-24L216,84.68Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M225.9,74.78,181.21,30.09a14,14,0,0,0-19.8,0L38.1,153.41a13.94,13.94,0,0,0-4.1,9.9V208a14,14,0,0,0,14,14H92.69a13.94,13.94,0,0,0,9.9-4.1L225.9,94.58a14,14,0,0,0,0-19.8ZM94.1,209.41a2,2,0,0,1-1.41.59H48a2,2,0,0,1-2-2V163.31a2,2,0,0,1,.59-1.41L136,72.48,183.51,120ZM217.41,86.1,192,111.51,144.49,64,169.9,38.58a2,2,0,0,1,2.83,0l44.68,44.69a2,2,0,0,1,0,2.83Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M227.31,73.37,182.63,28.68a16,16,0,0,0-22.63,0L36.69,152A15.86,15.86,0,0,0,32,163.31V208a16,16,0,0,0,16,16H92.69A15.86,15.86,0,0,0,104,219.31L227.31,96a16,16,0,0,0,0-22.63ZM92.69,208H48V163.31l88-88L180.69,120ZM192,108.68,147.31,64l24-24L216,84.68Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224.49,76.2,179.8,31.51a12,12,0,0,0-17,0L133.17,61.17h0L39.52,154.83A11.9,11.9,0,0,0,36,163.31V208a12,12,0,0,0,12,12H92.69a12,12,0,0,0,8.48-3.51L224.48,93.17a12,12,0,0,0,0-17Zm-129,134.63A4,4,0,0,1,92.69,212H48a4,4,0,0,1-4-4V163.31a4,4,0,0,1,1.17-2.83L136,69.65,186.34,120ZM218.83,87.51,192,114.34,141.66,64l26.82-26.83a4,4,0,0,1,5.66,0l44.69,44.68a4,4,0,0,1,0,5.66Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212ZM108,80a20,20,0,1,1,20,20A20,20,0,0,1,108,80Zm76,40a12,12,0,0,1-12,12H140v.51l26.12,41.05a12,12,0,0,1-3.68,16.56A11.83,11.83,0,0,1,156,192a12,12,0,0,1-10.13-5.56L128,158.35l-17.88,28.09a12,12,0,0,1-20.24-12.88L116,132.51V132H84a12,12,0,0,1,0-24h88A12,12,0,0,1,184,120Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM112,80a16,16,0,1,1,16,16A16,16,0,0,1,112,80Zm72,32a8,8,0,0,1-8,8H136v13.58l30.66,46a8,8,0,0,1-13.32,8.88l-25.34-38-25.34,38a8,8,0,1,1-13.32-8.88l30.66-46V120H80a8,8,0,0,1,0-16h96A8,8,0,0,1,184,112Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,40a16,16,0,1,1-16,16A16,16,0,0,1,128,64Zm48,56H136v13.58l30.66,46a8,8,0,0,1-13.32,8.88l-25.34-38-25.34,38a8,8,0,1,1-13.32-8.88l30.66-46V120H80a8,8,0,0,1,0-16h96a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm0,192a90,90,0,1,1,90-90A90.1,90.1,0,0,1,128,218ZM114,80a14,14,0,1,1,14,14A14,14,0,0,1,114,80Zm68,32a6,6,0,0,1-6,6H134v16.18l31,46.49a6,6,0,1,1-10,6.66l-27-40.51-27,40.51a6,6,0,1,1-10-6.66l31-46.49V118H80a6,6,0,0,1,0-12h96A6,6,0,0,1,182,112Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM112,80a16,16,0,1,1,16,16A16,16,0,0,1,112,80Zm72,32a8,8,0,0,1-8,8H136v13.58l30.66,46a8,8,0,0,1-13.32,8.88l-25.34-38-25.34,38a8,8,0,1,1-13.32-8.88l30.66-46V120H80a8,8,0,0,1,0-16h96A8,8,0,0,1,184,112Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm0,192a92,92,0,1,1,92-92A92.1,92.1,0,0,1,128,220ZM116,80a12,12,0,1,1,12,12A12,12,0,0,1,116,80Zm64,32a4,4,0,0,1-4,4H132v18.79l31.33,47a4,4,0,0,1-6.66,4.44l-28.67-43-28.67,43a4,4,0,1,1-6.66-4.44l31.33-47V116H80a4,4,0,0,1,0-8h96A4,4,0,0,1,180,112Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,154.8l-47.09-21.11-.18-.08a19.94,19.94,0,0,0-19,1.75,13.08,13.08,0,0,0-1.12.84l-22.31,19c-13-7.05-26.43-20.37-33.49-33.21l19.06-22.66a11.76,11.76,0,0,0,.85-1.15,20,20,0,0,0,1.66-18.83,1.42,1.42,0,0,1-.08-.18L101.2,32A20.06,20.06,0,0,0,80.42,20.15,60.27,60.27,0,0,0,28,80c0,81.61,66.39,148,148,148a60.27,60.27,0,0,0,59.85-52.42A20.06,20.06,0,0,0,224,154.8ZM176,204A124.15,124.15,0,0,1,52,80,36.29,36.29,0,0,1,80.48,44.46l18.82,42L80.14,109.28a12,12,0,0,0-.86,1.16A20,20,0,0,0,78,130.08c9.42,19.28,28.83,38.56,48.31,48A20,20,0,0,0,146,176.63a11.63,11.63,0,0,0,1.11-.85l22.43-19.07,42,18.81A36.29,36.29,0,0,1,176,204Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M223.94,174.08A48.33,48.33,0,0,1,176,216,136,136,0,0,1,40,80,48.33,48.33,0,0,1,81.92,32.06a8,8,0,0,1,8.3,4.8l21.13,47.2a8,8,0,0,1-.66,7.53L89.32,117a7.93,7.93,0,0,0-.54,7.81c8.27,16.93,25.77,34.22,42.75,42.41a7.92,7.92,0,0,0,7.83-.59l25-21.3a8,8,0,0,1,7.59-.69l47.16,21.13A8,8,0,0,1,223.94,174.08Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M231.88,175.08A56.26,56.26,0,0,1,176,224C96.6,224,32,159.4,32,80A56.26,56.26,0,0,1,80.92,24.12a16,16,0,0,1,16.62,9.52l21.12,47.15,0,.12A16,16,0,0,1,117.39,96c-.18.27-.37.52-.57.77L96,121.45c7.49,15.22,23.41,31,38.83,38.51l24.34-20.71a8.12,8.12,0,0,1,.75-.56,16,16,0,0,1,15.17-1.4l.13.06,47.11,21.11A16,16,0,0,1,231.88,175.08Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M221.59,160.3l-47.24-21.17a14,14,0,0,0-13.28,1.22,4.81,4.81,0,0,0-.56.42l-24.69,21a1.88,1.88,0,0,1-1.68.06c-15.87-7.66-32.31-24-40-39.65a1.91,1.91,0,0,1,0-1.68l21.07-25a6.13,6.13,0,0,0,.42-.58,14,14,0,0,0,1.12-13.27L95.73,34.49a14,14,0,0,0-14.56-8.38A54.24,54.24,0,0,0,34,80c0,78.3,63.7,142,142,142a54.25,54.25,0,0,0,53.89-47.17A14,14,0,0,0,221.59,160.3ZM176,210C104.32,210,46,151.68,46,80A42.23,42.23,0,0,1,82.67,38h.23a2,2,0,0,1,1.84,1.31l21.1,47.11a2,2,0,0,1,0,1.67L84.73,113.15a4.73,4.73,0,0,0-.43.57,14,14,0,0,0-.91,13.73c8.87,18.16,27.17,36.32,45.53,45.19a14,14,0,0,0,13.77-1c.19-.13.38-.27.56-.42l24.68-21a1.92,1.92,0,0,1,1.6-.1l47.25,21.17a2,2,0,0,1,1.21,2A42.24,42.24,0,0,1,176,210Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222.37,158.46l-47.11-21.11-.13-.06a16,16,0,0,0-15.17,1.4,8.12,8.12,0,0,0-.75.56L134.87,160c-15.42-7.49-31.34-23.29-38.83-38.51l20.78-24.71c.2-.25.39-.5.57-.77a16,16,0,0,0,1.32-15.06l0-.12L97.54,33.64a16,16,0,0,0-16.62-9.52A56.26,56.26,0,0,0,32,80c0,79.4,64.6,144,144,144a56.26,56.26,0,0,0,55.88-48.92A16,16,0,0,0,222.37,158.46ZM176,208A128.14,128.14,0,0,1,48,80,40.2,40.2,0,0,1,82.87,40a.61.61,0,0,0,0,.12l21,47L83.2,111.86a6.13,6.13,0,0,0-.57.77,16,16,0,0,0-1,15.7c9.06,18.53,27.73,37.06,46.46,46.11a16,16,0,0,0,15.75-1.14,8.44,8.44,0,0,0,.74-.56L168.89,152l47,21.05h0s.08,0,.11,0A40.21,40.21,0,0,1,176,208Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220.78,162.13,173.56,141A12,12,0,0,0,162.18,142a3.37,3.37,0,0,0-.38.28L137,163.42a3.93,3.93,0,0,1-3.7.21c-16.24-7.84-33.05-24.52-40.89-40.57a3.9,3.9,0,0,1,.18-3.69l21.2-25.21c.1-.12.19-.25.28-.38a12,12,0,0,0,1-11.36L93.9,35.28a12,12,0,0,0-12.48-7.19A52.25,52.25,0,0,0,36,80c0,77.2,62.8,140,140,140a52.25,52.25,0,0,0,51.91-45.42A12,12,0,0,0,220.78,162.13ZM220,173.58A44.23,44.23,0,0,1,176,212C103.22,212,44,152.78,44,80A44.23,44.23,0,0,1,82.42,36a3.87,3.87,0,0,1,.48,0,4,4,0,0,1,3.67,2.49l21.11,47.14a4,4,0,0,1-.23,3.6l-21.19,25.2c-.1.13-.2.25-.29.39a12,12,0,0,0-.78,11.75c8.69,17.79,26.61,35.58,44.6,44.27a12,12,0,0,0,11.79-.87l.37-.28,24.83-21.12a3.93,3.93,0,0,1,3.57-.27l47.21,21.16A4,4,0,0,1,220,173.58Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst l = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M234.39,87.29c-57.67-57.72-155.11-57.72-212.78,0-21.45,21.47-23.52,53.13-5,77a20,20,0,0,0,22.92,6.37L88.4,153.29l.45-.16A20,20,0,0,0,101,138.47l5.44-27.24a72.48,72.48,0,0,1,42.76-.09L155,138.62a20,20,0,0,0,12.14,14.49l.45.17,48.94,17.37a20,20,0,0,0,22.91-6.37C257.91,140.42,255.84,108.76,234.39,87.29Zm-12.23,59.9L178,131.5,172.24,104a20,20,0,0,0-13-14.8,96.49,96.49,0,0,0-62.94.14A20,20,0,0,0,83.4,104.24L78,131.53,33.84,147.19c-9.16-13.85-7.41-30.77,4.73-42.92C62.81,80,95.41,67.88,128,67.88S193.19,80,217.43,104.27C229.57,116.42,231.32,133.35,222.16,147.19ZM228,200a12,12,0,0,1-12,12H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,200Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M230,157a8,8,0,0,1-9.26,2.47L171.58,142a8,8,0,0,1-4.86-5.8l-6.21-29.74a7.94,7.94,0,0,0-5.14-5.9,84.39,84.39,0,0,0-55.1.13,7.93,7.93,0,0,0-5.12,6l-5.9,29.51A8,8,0,0,1,84.38,142L35.29,159.42A8,8,0,0,1,26,157c-14.6-18.83-13.26-43.83,4-61.12,53.11-53.11,142.77-53.11,195.88,0C243.23,113.12,244.57,138.12,230,157Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M231.59,90.13h0C175.44,34,80.56,34,24.41,90.13c-20,20-21.92,49.49-4.69,71.71A16,16,0,0,0,32.35,168a15.8,15.8,0,0,0,5.75-1.08l49-17.37.29-.11a16,16,0,0,0,9.75-11.73l5.9-29.52a76.52,76.52,0,0,1,49.68-.11h0l6.21,29.75a16,16,0,0,0,9.72,11.59l.29.11,49,17.39a16,16,0,0,0,18.38-5.06C253.51,139.62,251.58,110.13,231.59,90.13ZM223.67,152l-.3-.12-48.82-17.33-6.21-29.74A16,16,0,0,0,158,93a92.56,92.56,0,0,0-60.34.13,16,16,0,0,0-10.32,12l-5.9,29.51L32.63,151.86c-.1,0-.17.13-.27.17-12.33-15.91-11-36.23,3.36-50.58,25-25,58.65-37.53,92.28-37.53s67.27,12.51,92.28,37.53C234.61,115.8,236,136.12,223.67,152Zm.32,48a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,200Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M236.28,161.84a16,16,0,0,1-18.38,5.06l-49-17.39-.29-.11a16,16,0,0,1-9.72-11.59l-6.21-29.75h0a76.52,76.52,0,0,0-49.68.11l-5.9,29.52a16,16,0,0,1-9.75,11.73l-.29.11-49,17.37A15.8,15.8,0,0,1,32.35,168a16,16,0,0,1-12.63-6.14c-17.23-22.22-15.3-51.71,4.69-71.71,56.15-56.17,151-56.17,207.18,0h0C251.58,110.13,253.51,139.62,236.28,161.84ZM216,192H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M230.19,91.55h0c-55.39-55.4-149-55.4-204.38,0C6.56,110.82,4.7,139.22,21.29,160.61A14,14,0,0,0,37.39,165l49-17.38.22-.09a13.93,13.93,0,0,0,8.53-10.25l5.9-29.52a1.93,1.93,0,0,1,1.21-1.47,78.53,78.53,0,0,1,51.18-.11,1.93,1.93,0,0,1,1.22,1.45l6.21,29.75a14,14,0,0,0,8.5,10.14l.23.08,49,17.4a14,14,0,0,0,16.1-4.42C251.3,139.22,249.44,110.82,230.19,91.55Zm-5,61.71a2,2,0,0,1-2.29.58l-.22-.09-49-17.38A2,2,0,0,1,172.6,135l-6.22-29.74a14,14,0,0,0-9.06-10.35,90.53,90.53,0,0,0-59,.13,14,14,0,0,0-9,10.45L83.37,135a2,2,0,0,1-1.15,1.44L33.28,153.75l-.22.09a2,2,0,0,1-2.29-.58c-13-16.74-11.56-38.12,3.53-53.22,25.39-25.4,59.55-38.1,93.7-38.1s68.31,12.7,93.7,38.1C236.79,115.14,238.21,136.52,225.23,153.26ZM222,200a6,6,0,0,1-6,6H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,200Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M231.59,90.13h0C175.44,34,80.56,34,24.41,90.13c-20,20-21.92,49.49-4.69,71.71A16,16,0,0,0,32.35,168a15.8,15.8,0,0,0,5.75-1.08l49-17.37.29-.11a16,16,0,0,0,9.75-11.73l5.9-29.52a76.52,76.52,0,0,1,49.68-.11h0l6.21,29.75a16,16,0,0,0,9.72,11.59l.29.11,49,17.39a16,16,0,0,0,18.38-5.06C253.51,139.62,251.58,110.13,231.59,90.13ZM223.67,152l-.3-.12-48.82-17.33-6.21-29.74A16,16,0,0,0,158,93a92.56,92.56,0,0,0-60.34.13,16,16,0,0,0-10.32,12l-5.9,29.51L32.63,151.86c-.1,0-.17.13-.27.17-12.33-15.91-11-36.23,3.36-50.58,25-25,58.65-37.53,92.28-37.53s67.27,12.51,92.28,37.53C234.61,115.8,236,136.12,223.67,152Zm.32,48a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,200Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M228.79,93C174.15,38.34,81.85,38.34,27.21,93,8.69,111.5,6.9,138.81,22.85,159.39a12,12,0,0,0,13.83,3.77l49-17.39.15-.06a12,12,0,0,0,7.31-8.79l5.9-29.51a3.93,3.93,0,0,1,2.51-3,80.59,80.59,0,0,1,52.5-.12,3.94,3.94,0,0,1,2.52,2.94L162.81,137a12,12,0,0,0,7.29,8.69l.15.06,49.07,17.41a12,12,0,0,0,13.83-3.77C249.1,138.81,247.31,111.5,228.79,93Zm-2,61.51a4,4,0,0,1-4.61,1.21l-.15-.06L173,138.24a4,4,0,0,1-2.37-2.87l-6.21-29.75a12,12,0,0,0-7.75-8.87,88.63,88.63,0,0,0-57.74.14,12,12,0,0,0-7.72,9l-5.9,29.51A4,4,0,0,1,83,138.26l-49,17.38-.15.06a4,4,0,0,1-4.61-1.21c-13.42-17.3-11.9-40.26,3.69-55.85C58.65,72.85,93.33,60,128,60s69.35,12.89,95.13,38.68C238.71,114.23,240.24,137.19,226.82,154.49ZM220,200a4,4,0,0,1-4,4H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,200Z\" }))\n  ]\n]);\nexport {\n  l as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M234.49,111.07,90.41,22.94A20,20,0,0,0,60,39.87V216.13a20,20,0,0,0,30.41,16.93l144.08-88.13a19.82,19.82,0,0,0,0-33.86ZM84,208.85V47.15L216.16,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M228.23,134.69,84.15,222.81A8,8,0,0,1,72,216.12V39.88a8,8,0,0,1,12.15-6.69l144.08,88.12A7.82,7.82,0,0,1,228.23,134.69Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M240,128a15.74,15.74,0,0,1-7.6,13.51L88.32,229.65a16,16,0,0,1-16.2.3A15.86,15.86,0,0,1,64,216.13V39.87a15.86,15.86,0,0,1,8.12-13.82,16,16,0,0,1,16.2.3L232.4,114.49A15.74,15.74,0,0,1,240,128Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M231.36,116.19,87.28,28.06a14,14,0,0,0-14.18-.27A13.69,13.69,0,0,0,66,39.87V216.13a13.69,13.69,0,0,0,7.1,12.08,14,14,0,0,0,14.18-.27l144.08-88.13a13.82,13.82,0,0,0,0-23.62Zm-6.26,13.38L81,217.7a2,2,0,0,1-2.06,0,1.78,1.78,0,0,1-1-1.61V39.87a1.78,1.78,0,0,1,1-1.61A2.06,2.06,0,0,1,80,38a2,2,0,0,1,1,.31L225.1,126.43a1.82,1.82,0,0,1,0,3.14Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M230.32,117.9,86.24,29.79a11.91,11.91,0,0,0-12.17-.23A11.71,11.71,0,0,0,68,39.89V216.11a11.71,11.71,0,0,0,6.07,10.33,11.91,11.91,0,0,0,12.17-.23L230.32,138.1a11.82,11.82,0,0,0,0-20.2Zm-4.18,13.37L82.06,219.39a4,4,0,0,1-4.07.07,3.77,3.77,0,0,1-2-3.35V39.89a3.77,3.77,0,0,1,2-3.35,4,4,0,0,1,4.07.07l144.08,88.12a3.8,3.8,0,0,1,0,6.54Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212Zm52-84a12,12,0,0,1-12,12H140v28a12,12,0,0,1-24,0V140H88a12,12,0,0,1,0-24h28V88a12,12,0,0,1,24,0v28h28A12,12,0,0,1,180,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm48-88a8,8,0,0,1-8,8H136v32a8,8,0,0,1-16,0V136H88a8,8,0,0,1,0-16h32V88a8,8,0,0,1,16,0v32h32A8,8,0,0,1,176,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.13,104.13,0,0,0,128,24Zm40,112H136v32a8,8,0,0,1-16,0V136H88a8,8,0,0,1,0-16h32V88a8,8,0,0,1,16,0v32h32a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm0,192a90,90,0,1,1,90-90A90.1,90.1,0,0,1,128,218Zm46-90a6,6,0,0,1-6,6H134v34a6,6,0,0,1-12,0V134H88a6,6,0,0,1,0-12h34V88a6,6,0,0,1,12,0v34h34A6,6,0,0,1,174,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm48-88a8,8,0,0,1-8,8H136v32a8,8,0,0,1-16,0V136H88a8,8,0,0,1,0-16h32V88a8,8,0,0,1,16,0v32h32A8,8,0,0,1,176,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm0,192a92,92,0,1,1,92-92A92.1,92.1,0,0,1,128,220Zm44-92a4,4,0,0,1-4,4H132v36a4,4,0,0,1-8,0V132H88a4,4,0,0,1,0-8h36V88a4,4,0,0,1,8,0v36h36A4,4,0,0,1,172,128Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M238.15,78.54,177.46,17.86a20,20,0,0,0-28.3,0L97.2,70c-12.43-3.33-36.68-5.72-61.74,14.5a20,20,0,0,0-1.6,29.73l45.46,45.47-39.8,39.8a12,12,0,0,0,17,17l39.8-39.81,45.47,45.46A20,20,0,0,0,155.91,228c.46,0,.93,0,1.4-.05A20,20,0,0,0,171.87,220c4.69-6.23,11-16.13,14.44-28s3.45-22.88.16-33.4l51.7-51.87A20,20,0,0,0,238.15,78.54Zm-74.26,68.79a12,12,0,0,0-2.23,13.84c3.43,6.86,6.9,21-6.28,40.65L54.08,100.53c21.09-14.59,39.53-6.64,41-6a11.67,11.67,0,0,0,13.81-2.29l54.43-54.61,55,55Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M229.66,98.34,172.39,155.8c11.46,22.93-1.72,45.86-10.11,57a8,8,0,0,1-12,.83L42.34,105.76A8,8,0,0,1,43,93.85c29.65-23.92,57.4-10,57.4-10l57.27-57.46a8,8,0,0,1,11.31,0L229.66,87A8,8,0,0,1,229.66,98.34Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M235.32,81.37,174.63,20.69a16,16,0,0,0-22.63,0L98.37,74.49c-10.66-3.34-35-7.37-60.4,13.14a16,16,0,0,0-1.29,23.78L85,159.71,42.34,202.34a8,8,0,0,0,11.32,11.32L96.29,171l48.29,48.29A16,16,0,0,0,155.9,224c.38,0,.75,0,1.13,0a15.93,15.93,0,0,0,11.64-6.33c19.64-26.1,17.75-47.32,13.19-60L235.33,104A16,16,0,0,0,235.32,81.37ZM224,92.69h0l-57.27,57.46a8,8,0,0,0-1.49,9.22c9.46,18.93-1.8,38.59-9.34,48.62L48,100.08c12.08-9.74,23.64-12.31,32.48-12.31A40.13,40.13,0,0,1,96.81,91a8,8,0,0,0,9.25-1.51L163.32,32,224,92.68Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M235.33,104l-53.47,53.65c4.56,12.67,6.45,33.89-13.19,60A15.93,15.93,0,0,1,157,224c-.38,0-.75,0-1.13,0a16,16,0,0,1-11.32-4.69L96.29,171,53.66,213.66a8,8,0,0,1-11.32-11.32L85,159.71l-48.3-48.3A16,16,0,0,1,38,87.63c25.42-20.51,49.75-16.48,60.4-13.14L152,20.7a16,16,0,0,1,22.63,0l60.69,60.68A16,16,0,0,1,235.33,104Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M233.91,82.79,173.22,22.1a14,14,0,0,0-19.81,0L98.93,76.77c-9.52-3.25-34-8.34-59.71,12.41A14,14,0,0,0,38.1,110l49.71,49.71-44.05,44a6,6,0,1,0,8.48,8.48l44.05-44.05L146,217.89a14,14,0,0,0,9.9,4.11q.49,0,1,0a14,14,0,0,0,10.19-5.54c19.72-26.21,17.15-47.23,12.46-59.3l54.37-54.55A14,14,0,0,0,233.91,82.79ZM225.42,94.1h0l-57.27,57.46a6,6,0,0,0-1.11,6.92c9.94,19.88-1.71,40.32-9.54,50.72a2,2,0,0,1-3,.2L46.58,101.51a2,2,0,0,1,.18-3c12.5-10.09,24.5-12.76,33.7-12.76a42.13,42.13,0,0,1,17.25,3.41A6,6,0,0,0,104.64,88L161.9,30.59a2,2,0,0,1,2.83,0l60.69,60.68A2,2,0,0,1,225.42,94.1Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M235.32,81.37,174.63,20.69a16,16,0,0,0-22.63,0L98.37,74.49c-10.66-3.34-35-7.37-60.4,13.14a16,16,0,0,0-1.29,23.78L85,159.71,42.34,202.34a8,8,0,0,0,11.32,11.32L96.29,171l48.29,48.29A16,16,0,0,0,155.9,224c.38,0,.75,0,1.13,0a15.93,15.93,0,0,0,11.64-6.33c19.64-26.1,17.75-47.32,13.19-60L235.33,104A16,16,0,0,0,235.32,81.37ZM224,92.69h0l-57.27,57.46a8,8,0,0,0-1.49,9.22c9.46,18.93-1.8,38.59-9.34,48.62L48,100.08c12.08-9.74,23.64-12.31,32.48-12.31A40.13,40.13,0,0,1,96.81,91a8,8,0,0,0,9.25-1.51L163.32,32,224,92.68Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M232.49,84.2,171.8,23.51a12,12,0,0,0-17,0L99.45,79.07c-8.08-3-32.79-9.45-59,11.67a12,12,0,0,0-1,17.84l51.13,51.13L45.17,205.17a4,4,0,0,0,5.66,5.66l45.46-45.47,51.12,51.12A12,12,0,0,0,155.9,220c.28,0,.57,0,.85,0a12,12,0,0,0,8.73-4.74c19.83-26.36,16.51-47.18,11.71-58.57l55.3-55.49A12,12,0,0,0,232.49,84.2Zm-5.66,11.31h0L169.56,153a4,4,0,0,0-.75,4.61c10.43,20.85-1.62,42-9.73,52.83a4,4,0,0,1-6,.4L45.17,102.93a4,4,0,0,1,.33-6C58.44,86.53,70.86,83.74,80.44,83.74A43.9,43.9,0,0,1,98.6,87.38a4,4,0,0,0,4.62-.75l57.27-57.46a4,4,0,0,1,5.66,0l60.68,60.69A4,4,0,0,1,226.83,95.51Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M56.88,31.93A12,12,0,1,0,39.12,48.07L60,71A76,76,0,0,0,35.46,84.51a20,20,0,0,0-1.6,29.73l45.46,45.47-39.8,39.8a12,12,0,0,0,17,17l39.8-39.81,45.47,45.46A20,20,0,0,0,155.9,228c.47,0,.94,0,1.41-.05A20,20,0,0,0,171.87,220a97.47,97.47,0,0,0,9.54-15.46l17.72,19.49a12,12,0,1,0,17.76-16.14Zm98.49,169.88L54.08,100.52C62,95,70.31,92.12,78.91,91.83l84.51,93A62,62,0,0,1,155.37,201.81Zm82.78-95-39,39.11a12,12,0,1,1-17-16.95l36.19-36.3-55-55L130.59,70.5a12,12,0,0,1-17-16.94l35.57-35.69a20,20,0,0,1,28.3,0l60.69,60.68A20,20,0,0,1,238.15,106.83Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M229.66,98.34,172.39,155.8c11.46,22.93-1.72,45.86-10.11,57a8,8,0,0,1-12,.83L42.34,105.76A8,8,0,0,1,43,93.85c29.65-23.92,57.4-10,57.4-10l57.27-57.46a8,8,0,0,1,11.31,0L229.66,87A8,8,0,0,1,229.66,98.34Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M53.92,34.62A8,8,0,1,0,42.08,45.38L67.37,73.2A69.82,69.82,0,0,0,38,87.63a16,16,0,0,0-1.29,23.78L85,159.71,42.34,202.34a8,8,0,0,0,11.32,11.32L96.29,171l48.29,48.29A16,16,0,0,0,155.9,224c.38,0,.75,0,1.13,0a15.93,15.93,0,0,0,11.64-6.33,89.75,89.75,0,0,0,11.58-20.27l21.84,24a8,8,0,1,0,11.84-10.76ZM155.9,208,48,100.08C58.23,91.83,69.2,87.72,80.66,87.81l87.16,95.88C165.59,193.56,160.24,202.23,155.9,208Zm79.42-104-44.64,44.79a8,8,0,1,1-11.33-11.3L224,92.7,163.32,32,122.1,73.35a8,8,0,0,1-11.33-11.29L152,20.7a16,16,0,0,1,22.63,0l60.69,60.68A16,16,0,0,1,235.32,104Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M235.33,104l-47.62,47.78a4,4,0,0,1-5.79-.14L108,70.27a4,4,0,0,1,.13-5.51L152,20.7a16,16,0,0,1,22.63,0l60.69,60.68A16,16,0,0,1,235.33,104ZM53.92,34.62a8,8,0,0,0-12,.21,8.18,8.18,0,0,0,.37,10.75L67.32,73.15C58.26,75.09,48.2,79.37,38,87.63a16,16,0,0,0-1.29,23.78L85,159.71,42.55,202.14a8.17,8.17,0,0,0-.6,11.09,8,8,0,0,0,11.71.43L96.29,171l48.29,48.29A16,16,0,0,0,155.9,224c.38,0,.75,0,1.13,0a15.93,15.93,0,0,0,11.64-6.33,88.62,88.62,0,0,0,11.64-20.2l21.77,23.95a8,8,0,1,0,11.84-10.76Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M52.44,36A6,6,0,0,0,43.56,44L71.27,74.51C61.78,76,50.6,80,39.22,89.18A14,14,0,0,0,38.1,110l49.71,49.71-44.05,44a6,6,0,1,0,8.48,8.48l44.05-44.05L146,217.89a14,14,0,0,0,9.9,4.11q.49,0,1,0a14,14,0,0,0,10.19-5.54,85.51,85.51,0,0,0,12.44-22.84l24,26.45a6,6,0,1,0,8.87-8.08ZM157.49,209.21a2,2,0,0,1-3,.2L46.58,101.51a2,2,0,0,1,.18-3c13.18-10.64,25.84-12.9,34.79-12.7L170,183.11C167.83,193.74,162.11,203.07,157.49,209.21Zm76.42-106.62-44.65,44.78a6,6,0,1,1-8.5-8.47l44.65-44.79a2,2,0,0,0,0-2.84L164.73,30.59a2,2,0,0,0-2.83,0L120.68,71.94a6,6,0,0,1-8.5-8.47l41.23-41.36a14,14,0,0,1,19.81,0l60.69,60.69A14,14,0,0,1,233.91,102.59Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M53.92,34.62A8,8,0,1,0,42.08,45.38L67.37,73.2A69.82,69.82,0,0,0,38,87.63a16,16,0,0,0-1.29,23.78L85,159.71,42.34,202.34a8,8,0,0,0,11.32,11.32L96.29,171l48.29,48.29A16,16,0,0,0,155.9,224c.38,0,.75,0,1.13,0a15.93,15.93,0,0,0,11.64-6.33,89.75,89.75,0,0,0,11.58-20.27l21.84,24a8,8,0,1,0,11.84-10.76ZM155.9,208,48,100.08C58.23,91.83,69.2,87.72,80.66,87.81l87.16,95.88C165.59,193.56,160.24,202.23,155.9,208Zm79.42-104-44.64,44.79a8,8,0,1,1-11.33-11.3L224,92.7,163.32,32,122.1,73.35a8,8,0,0,1-11.33-11.29L152,20.7a16,16,0,0,1,22.63,0l60.69,60.68A16,16,0,0,1,235.32,104Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M51,37.31A4,4,0,0,0,45,42.69L75.35,76c-9.93.88-22.26,4.54-34.87,14.71a12,12,0,0,0-1,17.84l51.13,51.13L45.17,205.17a4,4,0,0,0,5.66,5.66l45.46-45.47,51.12,51.12A12,12,0,0,0,155.9,220c.28,0,.57,0,.85,0a12,12,0,0,0,8.73-4.74,81.06,81.06,0,0,0,13.19-25.55l26.37,29a4,4,0,1,0,5.92-5.38ZM159.08,210.42a4,4,0,0,1-6,.4L45.17,102.93a4,4,0,0,1,.33-6c14.08-11.36,27.62-13.5,37-13.12l89.69,98.65C170.07,193.92,164,203.92,159.08,210.42Zm73.41-109.25L187.85,146a4,4,0,0,1-5.67-5.64l44.65-44.8a4,4,0,0,0,0-5.66L166.15,29.17a4,4,0,0,0-5.66,0L119.27,70.53a4,4,0,0,1-5.67-5.65l41.23-41.36a12,12,0,0,1,17,0L232.49,84.2A12,12,0,0,1,232.49,101.17Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M100,52H40A20,20,0,0,0,20,72v64a20,20,0,0,0,20,20H96v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,100,52Zm-4,80H44V76H96ZM216,52H156a20,20,0,0,0-20,20v64a20,20,0,0,0,20,20h56v4a28,28,0,0,1-28,28,12,12,0,0,0,0,24,52.06,52.06,0,0,0,52-52V72A20,20,0,0,0,216,52Zm-4,80H160V76h52Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M108,72v72H40a8,8,0,0,1-8-8V72a8,8,0,0,1,8-8h60A8,8,0,0,1,108,72Zm108-8H156a8,8,0,0,0-8,8v64a8,8,0,0,0,8,8h68V72A8,8,0,0,0,216,64Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M116,72v88a48.05,48.05,0,0,1-48,48,8,8,0,0,1,0-16,32,32,0,0,0,32-32v-8H40a16,16,0,0,1-16-16V72A16,16,0,0,1,40,56h60A16,16,0,0,1,116,72ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M100,58H40A14,14,0,0,0,26,72v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,100,58Zm2,80H40a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2ZM216,58H156a14,14,0,0,0-14,14v64a14,14,0,0,0,14,14h62v10a34,34,0,0,1-34,34,6,6,0,0,0,0,12,46.06,46.06,0,0,0,46-46V72A14,14,0,0,0,216,58Zm2,80H156a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2h60a2,2,0,0,1,2,2Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M100,60H40A12,12,0,0,0,28,72v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,100,60Zm4,80H40a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4ZM216,60H156a12,12,0,0,0-12,12v64a12,12,0,0,0,12,12h64v12a36,36,0,0,1-36,36,4,4,0,0,0,0,8,44.05,44.05,0,0,0,44-44V72A12,12,0,0,0,216,60Zm4,80H156a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4h60a4,4,0,0,1,4,4Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,156a43.78,43.78,0,0,0-29.09,11L106.1,140.8a44.07,44.07,0,0,0,0-25.6L146.91,89a43.83,43.83,0,1,0-13-20.17L93.09,95a44,44,0,1,0,0,65.94L133.9,187.2A44,44,0,1,0,176,156Zm0-120a20,20,0,1,1-20,20A20,20,0,0,1,176,36ZM64,148a20,20,0,1,1,20-20A20,20,0,0,1,64,148Zm112,72a20,20,0,1,1,20-20A20,20,0,0,1,176,220Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M208,200a32,32,0,1,1-32-32A32,32,0,0,1,208,200ZM176,88a32,32,0,1,0-32-32A32,32,0,0,0,176,88Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,160a39.89,39.89,0,0,0-28.62,12.09l-46.1-29.63a39.8,39.8,0,0,0,0-28.92l46.1-29.63a40,40,0,1,0-8.66-13.45l-46.1,29.63a40,40,0,1,0,0,55.82l46.1,29.63A40,40,0,1,0,176,160Zm0-128a24,24,0,1,1-24,24A24,24,0,0,1,176,32ZM64,152a24,24,0,1,1,24-24A24,24,0,0,1,64,152Zm112,72a24,24,0,1,1,24-24A24,24,0,0,1,176,224Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M212,200a36,36,0,1,1-69.85-12.25l-53-34.05a36,36,0,1,1,0-51.4l53-34a36.09,36.09,0,1,1,8.67,13.45l-53,34.05a36,36,0,0,1,0,24.5l53,34.05A36,36,0,0,1,212,200Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,162a37.91,37.91,0,0,0-28.3,12.67L98.8,143.24a37.89,37.89,0,0,0,0-30.48l48.9-31.43a38,38,0,1,0-6.5-10.09L92.3,102.67a38,38,0,1,0,0,50.66l48.9,31.43A38,38,0,1,0,176,162Zm0-132a26,26,0,1,1-26,26A26,26,0,0,1,176,30ZM64,154a26,26,0,1,1,26-26A26,26,0,0,1,64,154Zm112,72a26,26,0,1,1,26-26A26,26,0,0,1,176,226Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,160a39.89,39.89,0,0,0-28.62,12.09l-46.1-29.63a39.8,39.8,0,0,0,0-28.92l46.1-29.63a40,40,0,1,0-8.66-13.45l-46.1,29.63a40,40,0,1,0,0,55.82l46.1,29.63A40,40,0,1,0,176,160Zm0-128a24,24,0,1,1-24,24A24,24,0,0,1,176,32ZM64,152a24,24,0,1,1,24-24A24,24,0,0,1,64,152Zm112,72a24,24,0,1,1,24-24A24,24,0,0,1,176,224Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M176,164a36,36,0,0,0-27.92,13.3L96.25,144a35.92,35.92,0,0,0,0-32L148.08,78.7A35.93,35.93,0,1,0,143.75,72L91.92,105.3a36,36,0,1,0,0,45.4L143.75,184A36,36,0,1,0,176,164Zm0-136a28,28,0,1,1-28,28A28,28,0,0,1,176,28ZM64,156a28,28,0,1,1,28-28A28,28,0,0,1,64,156Zm112,72a28,28,0,1,1,28-28A28,28,0,0,1,176,228Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,36H48A20,20,0,0,0,28,56v56c0,54.29,26.32,87.22,48.4,105.29,23.71,19.39,47.44,26,48.44,26.29a12.1,12.1,0,0,0,6.32,0c1-.28,24.73-6.9,48.44-26.29,22.08-18.07,48.4-51,48.4-105.29V56A20,20,0,0,0,208,36Zm-4,76c0,35.71-13.09,64.69-38.91,86.15A126.28,126.28,0,0,1,128,219.38a126.14,126.14,0,0,1-37.09-21.23C65.09,176.69,52,147.71,52,112V60H204Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M216,56v56c0,96-88,120-88,120S40,208,40,112V56a8,8,0,0,1,8-8H208A8,8,0,0,1,216,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm0,72c0,37.07-13.66,67.16-40.6,89.42A129.3,129.3,0,0,1,128,223.62a128.25,128.25,0,0,1-38.92-21.81C61.82,179.51,48,149.3,48,112l0-56,160,0Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,42H48A14,14,0,0,0,34,56v56c0,51.94,25.12,83.4,46.2,100.64,22.73,18.6,45.27,24.89,46.22,25.15a6,6,0,0,0,3.16,0c.95-.26,23.49-6.55,46.22-25.15C196.88,195.4,222,163.94,222,112V56A14,14,0,0,0,208,42Zm2,70c0,37.76-13.94,68.39-41.44,91.06A131.17,131.17,0,0,1,128,225.72a130.94,130.94,0,0,1-40.56-22.66C59.94,180.39,46,149.76,46,112V56a2,2,0,0,1,2-2H208a2,2,0,0,1,2,2Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm0,72c0,37.07-13.66,67.16-40.6,89.42A129.3,129.3,0,0,1,128,223.62a128.25,128.25,0,0,1-38.92-21.81C61.82,179.51,48,149.3,48,112l0-56,160,0Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,44H48A12,12,0,0,0,36,56v56c0,51.16,24.73,82.12,45.47,99.1,22.4,18.32,44.55,24.5,45.48,24.76a4,4,0,0,0,2.1,0c.93-.26,23.08-6.44,45.48-24.76,20.74-17,45.47-47.94,45.47-99.1V56A12,12,0,0,0,208,44Zm4,68c0,38.44-14.23,69.63-42.29,92.71A132.45,132.45,0,0,1,128,227.82a132.23,132.23,0,0,1-41.71-23.11C58.23,181.63,44,150.44,44,112V56a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M116,132V96a12,12,0,0,1,24,0v36a12,12,0,0,1-24,0Zm12,56a16,16,0,1,0-16-16A16,16,0,0,0,128,188ZM228,56v56c0,54.29-26.32,87.22-48.4,105.29-23.71,19.39-47.44,26-48.44,26.29a12.1,12.1,0,0,1-6.32,0c-1-.28-24.73-6.9-48.44-26.29C54.32,199.22,28,166.29,28,112V56A20,20,0,0,1,48,36H208A20,20,0,0,1,228,56Zm-24,4H52v52c0,35.71,13.09,64.69,38.91,86.15A126.14,126.14,0,0,0,128,219.38a126.28,126.28,0,0,0,37.09-21.23C190.91,176.69,204,147.71,204,112Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M216,56v56c0,96-88,120-88,120S40,208,40,112V56a8,8,0,0,1,8-8H208A8,8,0,0,1,216,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,136V96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,48a12,12,0,1,0-12-12A12,12,0,0,0,128,184ZM224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Zm-16,0L48,56l0,56c0,37.3,13.82,67.51,41.07,89.81A128.25,128.25,0,0,0,128,223.62a129.3,129.3,0,0,0,39.41-22.2C194.34,179.16,208,149.07,208,112Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40ZM120,96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,184Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M122,136V96a6,6,0,0,1,12,0v40a6,6,0,0,1-12,0Zm6,26a10,10,0,1,0,10,10A10,10,0,0,0,128,162ZM222,56v56c0,51.94-25.12,83.4-46.2,100.64-22.73,18.6-45.27,24.89-46.22,25.15a6,6,0,0,1-3.16,0c-1-.26-23.49-6.55-46.22-25.15C59.12,195.4,34,163.94,34,112V56A14,14,0,0,1,48,42H208A14,14,0,0,1,222,56Zm-12,0a2,2,0,0,0-2-2H48a2,2,0,0,0-2,2v56c0,37.75,13.94,68.39,41.44,91.06A130.94,130.94,0,0,0,128,225.72a131.17,131.17,0,0,0,40.56-22.66C196.06,180.39,210,149.75,210,112Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,136V96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,48a12,12,0,1,0-12-12A12,12,0,0,0,128,184ZM224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Zm-16,0L48,56l0,56c0,37.3,13.82,67.51,41.07,89.81A128.25,128.25,0,0,0,128,223.62a129.3,129.3,0,0,0,39.41-22.2C194.34,179.16,208,149.07,208,112Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M124,136V96a4,4,0,0,1,8,0v40a4,4,0,0,1-8,0Zm4,28a8,8,0,1,0,8,8A8,8,0,0,0,128,164ZM220,56v56c0,51.16-24.73,82.12-45.47,99.1-22.4,18.32-44.55,24.5-45.48,24.76a4,4,0,0,1-2.1,0c-.93-.26-23.08-6.44-45.48-24.76C60.73,194.12,36,163.16,36,112V56A12,12,0,0,1,48,44H208A12,12,0,0,1,220,56Zm-8,0a4,4,0,0,0-4-4H48a4,4,0,0,0-4,4v56c0,38.44,14.23,69.63,42.29,92.71A132.23,132.23,0,0,0,128,227.82a132.45,132.45,0,0,0,41.71-23.11C197.77,181.63,212,150.44,212,112Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M144.49,136.49l-40,40a12,12,0,0,1-17-17L107,140H24a12,12,0,0,1,0-24h83L87.51,96.49a12,12,0,0,1,17-17l40,40A12,12,0,0,1,144.49,136.49ZM200,28H136a12,12,0,0,0,0,24h52V204H136a12,12,0,0,0,0,24h64a12,12,0,0,0,12-12V40A12,12,0,0,0,200,28Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M200,40V216H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M141.66,133.66l-40,40a8,8,0,0,1-11.32-11.32L116.69,136H24a8,8,0,0,1,0-16h92.69L90.34,93.66a8,8,0,0,1,11.32-11.32l40,40A8,8,0,0,1,141.66,133.66ZM200,32H136a8,8,0,0,0,0,16h56V208H136a8,8,0,0,0,0,16h64a8,8,0,0,0,8-8V40A8,8,0,0,0,200,32Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M141.66,133.66l-40,40A8,8,0,0,1,88,168V136H24a8,8,0,0,1,0-16H88V88a8,8,0,0,1,13.66-5.66l40,40A8,8,0,0,1,141.66,133.66ZM200,32H136a8,8,0,0,0,0,16h56V208H136a8,8,0,0,0,0,16h64a8,8,0,0,0,8-8V40A8,8,0,0,0,200,32Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M140.24,132.24l-40,40a6,6,0,0,1-8.48-8.48L121.51,134H24a6,6,0,0,1,0-12h97.51L91.76,92.24a6,6,0,0,1,8.48-8.48l40,40A6,6,0,0,1,140.24,132.24ZM200,34H136a6,6,0,0,0,0,12h58V210H136a6,6,0,0,0,0,12h64a6,6,0,0,0,6-6V40A6,6,0,0,0,200,34Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M141.66,133.66l-40,40a8,8,0,0,1-11.32-11.32L116.69,136H24a8,8,0,0,1,0-16h92.69L90.34,93.66a8,8,0,0,1,11.32-11.32l40,40A8,8,0,0,1,141.66,133.66ZM200,32H136a8,8,0,0,0,0,16h56V208H136a8,8,0,0,0,0,16h64a8,8,0,0,0,8-8V40A8,8,0,0,0,200,32Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M138.83,130.83l-40,40a4,4,0,0,1-5.66-5.66L126.34,132H24a4,4,0,0,1,0-8H126.34L93.17,90.83a4,4,0,0,1,5.66-5.66l40,40A4,4,0,0,1,138.83,130.83ZM200,36H136a4,4,0,0,0,0,8h60V212H136a4,4,0,0,0,0,8h64a4,4,0,0,0,4-4V40A4,4,0,0,0,200,36Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M124,216a12,12,0,0,1-12,12H48a12,12,0,0,1-12-12V40A12,12,0,0,1,48,28h64a12,12,0,0,1,0,24H60V204h52A12,12,0,0,1,124,216Zm108.49-96.49-40-40a12,12,0,0,0-17,17L195,116H112a12,12,0,0,0,0,24h83l-19.52,19.51a12,12,0,0,0,17,17l40-40A12,12,0,0,0,232.49,119.51Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,56V200a16,16,0,0,1-16,16H48V40H208A16,16,0,0,1,224,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,216a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H56V208h56A8,8,0,0,1,120,216Zm109.66-93.66-40-40a8,8,0,0,0-11.32,11.32L204.69,120H112a8,8,0,0,0,0,16h92.69l-26.35,26.34a8,8,0,0,0,11.32,11.32l40-40A8,8,0,0,0,229.66,122.34Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,216a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H56V208h56A8,8,0,0,1,120,216Zm109.66-93.66-40-40A8,8,0,0,0,176,88v32H112a8,8,0,0,0,0,16h64v32a8,8,0,0,0,13.66,5.66l40-40A8,8,0,0,0,229.66,122.34Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M118,216a6,6,0,0,1-6,6H48a6,6,0,0,1-6-6V40a6,6,0,0,1,6-6h64a6,6,0,0,1,0,12H54V210h58A6,6,0,0,1,118,216Zm110.24-92.24-40-40a6,6,0,0,0-8.48,8.48L209.51,122H112a6,6,0,0,0,0,12h97.51l-29.75,29.76a6,6,0,1,0,8.48,8.48l40-40A6,6,0,0,0,228.24,123.76Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,216a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H56V208h56A8,8,0,0,1,120,216Zm109.66-93.66-40-40a8,8,0,0,0-11.32,11.32L204.69,120H112a8,8,0,0,0,0,16h92.69l-26.35,26.34a8,8,0,0,0,11.32,11.32l40-40A8,8,0,0,0,229.66,122.34Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M116,216a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h64a4,4,0,0,1,0,8H52V212h60A4,4,0,0,1,116,216Zm110.83-90.83-40-40a4,4,0,0,0-5.66,5.66L214.34,124H112a4,4,0,0,0,0,8H214.34l-33.17,33.17a4,4,0,0,0,5.66,5.66l40-40A4,4,0,0,0,226.83,125.17Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M178.39,158c-11,19.06-29.39,30-50.39,30s-39.36-10.93-50.39-30a12,12,0,0,1,20.78-12c3.89,6.73,12.91,18,29.61,18s25.72-11.28,29.61-18a12,12,0,1,1,20.78,12ZM236,128A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128ZM92,124a16,16,0,1,0-16-16A16,16,0,0,0,92,124Zm72-32a16,16,0,1,0,16,16A16,16,0,0,0,164,92Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Zm-1.08,48c-10.29,17.79-27.39,28-46.92,28s-36.63-10.2-46.92-28a8,8,0,1,1,13.84-8c7.47,12.91,19.21,20,33.08,20s25.61-7.1,33.08-20a8,8,0,1,1,13.84,8Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM92,96a12,12,0,1,1-12,12A12,12,0,0,1,92,96Zm82.92,60c-10.29,17.79-27.39,28-46.92,28s-36.63-10.2-46.92-28a8,8,0,1,1,13.84-8c7.47,12.91,19.21,20,33.08,20s25.61-7.1,33.08-20a8,8,0,1,1,13.84,8ZM164,120a12,12,0,1,1,12-12A12,12,0,0,1,164,120Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M173.19,155c-9.92,17.16-26.39,27-45.19,27s-35.27-9.84-45.19-27a6,6,0,0,1,10.38-6c7.84,13.54,20.2,21,34.81,21s27-7.46,34.81-21a6,6,0,1,1,10.38,6ZM230,128A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128ZM92,118a10,10,0,1,0-10-10A10,10,0,0,0,92,118Zm72-20a10,10,0,1,0,10,10A10,10,0,0,0,164,98Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Zm-1.07,48c-10.29,17.79-27.4,28-46.93,28s-36.63-10.2-46.92-28a8,8,0,1,1,13.84-8c7.47,12.91,19.21,20,33.08,20s25.61-7.1,33.07-20a8,8,0,0,1,13.86,8Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M171.46,154c-9.55,16.52-25.39,26-43.46,26s-33.91-9.48-43.46-26a4,4,0,0,1,6.92-4c8.21,14.19,21.19,22,36.54,22s28.33-7.81,36.54-22a4,4,0,1,1,6.92,4ZM228,128A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128ZM92,116a8,8,0,1,0-8-8A8,8,0,0,0,92,116Zm72-16a8,8,0,1,0,8,8A8,8,0,0,0,164,100Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212ZM76,108a16,16,0,1,1,16,16A16,16,0,0,1,76,108Zm104,0a16,16,0,1,1-16-16A16,16,0,0,1,180,108Zm-3.26,57a12,12,0,0,1-19.48,14,36,36,0,0,0-58.52,0,12,12,0,0,1-19.48-14,60,60,0,0,1,97.48,0Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Zm-1.08,64a8,8,0,1,1-13.84,8c-7.47-12.91-19.21-20-33.08-20s-25.61,7.1-33.08,20a8,8,0,1,1-13.84-8c10.29-17.79,27.39-28,46.92-28S164.63,154.2,174.92,172Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM92,96a12,12,0,1,1-12,12A12,12,0,0,1,92,96Zm80,86.92A8,8,0,0,1,161.08,180c-7.47-12.91-19.21-20-33.08-20s-25.61,7.1-33.08,20a8,8,0,1,1-13.84-8c10.29-17.79,27.39-28,46.92-28s36.63,10.2,46.92,28A8,8,0,0,1,172,182.92ZM164,120a12,12,0,1,1,12-12A12,12,0,0,1,164,120Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm0,192a90,90,0,1,1,90-90A90.1,90.1,0,0,1,128,218ZM82,108a10,10,0,1,1,10,10A10,10,0,0,1,82,108Zm92,0a10,10,0,1,1-10-10A10,10,0,0,1,174,108Zm-.81,65a6,6,0,0,1-10.38,6c-7.84-13.54-20.2-21-34.81-21s-27,7.46-34.81,21a6,6,0,0,1-5.2,3,5.9,5.9,0,0,1-3-.81A6,6,0,0,1,82.81,173c9.92-17.16,26.39-27,45.19-27S163.27,155.84,173.19,173Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Zm-1.08,64a8,8,0,1,1-13.84,8c-7.47-12.91-19.21-20-33.08-20s-25.61,7.1-33.08,20a8,8,0,1,1-13.84-8c10.29-17.79,27.39-28,46.92-28S164.63,154.2,174.92,172Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm0,192a92,92,0,1,1,92-92A92.1,92.1,0,0,1,128,220ZM84,108a8,8,0,1,1,8,8A8,8,0,0,1,84,108Zm88,0a8,8,0,1,1-8-8A8,8,0,0,1,172,108Zm-.54,66a4,4,0,0,1-1.46,5.46,3.93,3.93,0,0,1-2,.54,4,4,0,0,1-3.46-2c-8.21-14.19-21.19-22-36.54-22s-28.33,7.81-36.54,22a4,4,0,0,1-6.92-4c9.55-16.52,25.4-26,43.46-26S161.91,157.48,171.46,174Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,128a12,12,0,0,1-12,12H48a12,12,0,0,1,0-24h68A12,12,0,0,1,128,128ZM48,76H180a12,12,0,0,0,0-24H48a12,12,0,0,0,0,24Zm52,104H48a12,12,0,0,0,0,24h52a12,12,0,0,0,0-24Zm132.49-20.49a12,12,0,0,0-17,0L196,179V112a12,12,0,0,0-24,0v67l-19.51-19.52a12,12,0,0,0-17,17l40,40a12,12,0,0,0,17,0l40-40A12,12,0,0,0,232.49,159.51Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,80v88l-24,24H48V64H208A16,16,0,0,1,224,80Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,128a8,8,0,0,1-8,8H48a8,8,0,0,1,0-16h72A8,8,0,0,1,128,128ZM48,72H184a8,8,0,0,0,0-16H48a8,8,0,0,0,0,16Zm56,112H48a8,8,0,0,0,0,16h56a8,8,0,0,0,0-16Zm125.66-21.66a8,8,0,0,0-11.32,0L192,188.69V112a8,8,0,0,0-16,0v76.69l-26.34-26.35a8,8,0,0,0-11.32,11.32l40,40a8,8,0,0,0,11.32,0l40-40A8,8,0,0,0,229.66,162.34Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM72,72h96a8,8,0,0,1,0,16H72a8,8,0,0,1,0-16Zm40,112H72a8,8,0,0,1,0-16h40a8,8,0,0,1,0,16Zm8-48H72a8,8,0,0,1,0-16h48a8,8,0,0,1,0,16Zm77.66,29.66-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L160,164.69V120a8,8,0,0,1,16,0v44.69l10.34-10.35a8,8,0,0,1,11.32,11.32Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M126,128a6,6,0,0,1-6,6H48a6,6,0,0,1,0-12h72A6,6,0,0,1,126,128ZM48,70H184a6,6,0,0,0,0-12H48a6,6,0,0,0,0,12Zm56,116H48a6,6,0,0,0,0,12h56a6,6,0,0,0,0-12Zm124.24-22.24a6,6,0,0,0-8.48,0L190,193.51V112a6,6,0,0,0-12,0v81.51l-29.76-29.75a6,6,0,0,0-8.48,8.48l40,40a6,6,0,0,0,8.48,0l40-40A6,6,0,0,0,228.24,163.76Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128,128a8,8,0,0,1-8,8H48a8,8,0,0,1,0-16h72A8,8,0,0,1,128,128ZM48,72H184a8,8,0,0,0,0-16H48a8,8,0,0,0,0,16Zm56,112H48a8,8,0,0,0,0,16h56a8,8,0,0,0,0-16Zm125.66-21.66a8,8,0,0,0-11.32,0L192,188.69V112a8,8,0,0,0-16,0v76.69l-26.34-26.35a8,8,0,0,0-11.32,11.32l40,40a8,8,0,0,0,11.32,0l40-40A8,8,0,0,0,229.66,162.34Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M124,128a4,4,0,0,1-4,4H48a4,4,0,0,1,0-8h72A4,4,0,0,1,124,128ZM48,68H184a4,4,0,0,0,0-8H48a4,4,0,0,0,0,8Zm56,120H48a4,4,0,0,0,0,8h56a4,4,0,0,0,0-8Zm122.83-22.83a4,4,0,0,0-5.66,0L188,198.34V112a4,4,0,0,0-8,0v86.34l-33.17-33.17a4,4,0,0,0-5.66,5.66l40,40a4,4,0,0,0,5.66,0l40-40A4,4,0,0,0,226.83,165.17Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M157.27,21.22a12,12,0,0,0-12.64,1.31L75.88,76H32A20,20,0,0,0,12,96v64a20,20,0,0,0,20,20H75.88l68.75,53.47A12,12,0,0,0,164,224V32A12,12,0,0,0,157.27,21.22ZM36,100H68v56H36Zm104,99.46L92,162.13V93.87l48-37.33ZM212,128a44,44,0,0,1-11,29.11,12,12,0,1,1-18-15.88,20,20,0,0,0,0-26.43,12,12,0,0,1,18-15.86A43.94,43.94,0,0,1,212,128Zm40,0a83.87,83.87,0,0,1-21.39,56,12,12,0,0,1-17.89-16,60,60,0,0,0,0-80,12,12,0,1,1,17.88-16A83.87,83.87,0,0,1,252,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M80,88v80H32a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm54-106.08a40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,0,1,12-10.58ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M160,32.25V223.69a8.29,8.29,0,0,1-3.91,7.18,8,8,0,0,1-9-.56l-65.57-51A4,4,0,0,1,80,176.16V79.84a4,4,0,0,1,1.55-3.15l65.57-51a8,8,0,0,1,10,.16A8.27,8.27,0,0,1,160,32.25ZM60,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H60a4,4,0,0,0,4-4V84A4,4,0,0,0,60,80Zm126.77,20.84a8,8,0,0,0-.72,11.3,24,24,0,0,1,0,31.72,8,8,0,1,0,12,10.58,40,40,0,0,0,0-52.88A8,8,0,0,0,186.74,100.84Zm40.89-26.17a8,8,0,1,0-11.92,10.66,64,64,0,0,1,0,85.34,8,8,0,1,0,11.92,10.66,80,80,0,0,0,0-106.66Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M154.64,26.61a6,6,0,0,0-6.32.65L77.94,82H32A14,14,0,0,0,18,96v64a14,14,0,0,0,14,14H77.94l70.38,54.74A6,6,0,0,0,158,224V32A6,6,0,0,0,154.64,26.61ZM30,160V96a2,2,0,0,1,2-2H74v68H32A2,2,0,0,1,30,160Zm116,51.73L86,165.07V90.93l60-46.66Zm50.53-108.85a38,38,0,0,1,0,50.24,6,6,0,1,1-9-7.94,26,26,0,0,0,0-34.37,6,6,0,0,1,9-7.93ZM246,128a77.86,77.86,0,0,1-19.86,52,6,6,0,1,1-8.94-8,66,66,0,0,0,0-88,6,6,0,1,1,8.94-8A77.86,77.86,0,0,1,246,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88,164.09V91.91l56-43.55Zm54-106.08a40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.58,24,24,0,0,0,0-31.72,8,8,0,0,1,12-10.58ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M153.76,28.41a4,4,0,0,0-4.22.43L78.63,84H32A12,12,0,0,0,20,96v64a12,12,0,0,0,12,12H78.63l70.91,55.16A4.07,4.07,0,0,0,152,228a3.92,3.92,0,0,0,1.76-.41A4,4,0,0,0,156,224V32A4,4,0,0,0,153.76,28.41ZM28,160V96a4,4,0,0,1,4-4H76v72H32A4,4,0,0,1,28,160Zm120,55.82L84,166V90l64-49.78Zm47-111.61a36,36,0,0,1,0,47.59,4,4,0,1,1-6-5.3,28,28,0,0,0,0-37,4,4,0,0,1,6-5.28ZM244,128a75.88,75.88,0,0,1-19.35,50.67,4,4,0,0,1-6-5.34,68,68,0,0,0,0-90.66,4,4,0,0,1,6-5.34A75.88,75.88,0,0,1,244,128Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M56.88,31.93A12,12,0,1,0,39.12,48.07L64.51,76H32A20,20,0,0,0,12,96v64a20,20,0,0,0,20,20H75.88l68.75,53.47A12,12,0,0,0,164,224V185.44l35.12,38.63a12,12,0,0,0,17.76-16.14ZM36,100H68v56H36Zm104,99.46L92,162.13V106.24L140,159Zm-31-134a12,12,0,0,1,2.11-16.84l33.51-26.07A12,12,0,0,1,164,32V94.94a12,12,0,0,1-24,0V56.54l-14.15,11A12,12,0,0,1,109,65.44Zm74,49.35a12,12,0,0,1,18-15.85,44,44,0,0,1,5.55,50.21,12,12,0,0,1-21-11.55A19.67,19.67,0,0,0,188,128,20,20,0,0,0,183,114.79ZM252,128a84.18,84.18,0,0,1-19.11,53.35,12,12,0,1,1-18.53-15.25A60,60,0,0,0,212.73,88a12,12,0,1,1,17.88-16A83.87,83.87,0,0,1,252,128Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M80,88v80H32a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M53.92,34.62A8,8,0,1,0,42.08,45.38L73.55,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V175.09l42.08,46.29a8,8,0,1,0,11.84-10.76ZM32,96H72v64H32ZM144,207.64,88,164.09V95.89l56,61.6Zm42-63.77a24,24,0,0,0,0-31.72,8,8,0,1,1,12-10.57,40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.59Zm-80.16-76a8,8,0,0,1,1.4-11.23l39.85-31A8,8,0,0,1,160,32v74.83a8,8,0,0,1-16,0V48.36l-26.94,21A8,8,0,0,1,105.84,67.91ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M213.92,210.62a8,8,0,1,1-11.84,10.76L160,175.09v48.6a8.29,8.29,0,0,1-3.91,7.18,8,8,0,0,1-9-.56l-65.55-51A4,4,0,0,1,80,176.18V87.09L42.08,45.38A8,8,0,1,1,53.92,34.62Zm-27.21-55.46a8,8,0,0,0,11.29-.7,40,40,0,0,0,0-52.88,8,8,0,1,0-12,10.57,24,24,0,0,1,0,31.72A8,8,0,0,0,186.71,155.16Zm40.92-80.49a8,8,0,1,0-11.92,10.66,64,64,0,0,1,0,85.34,8,8,0,1,0,11.92,10.66,80,80,0,0,0,0-106.66ZM153,119.87a4,4,0,0,0,7-2.7V32.25a8.27,8.27,0,0,0-2.88-6.4,8,8,0,0,0-10-.16L103.83,59.33a4,4,0,0,0-.5,5.85ZM60,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H60a4,4,0,0,0,4-4V84A4,4,0,0,0,60,80Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M52.44,36A6,6,0,0,0,43.56,44L78,81.94l-.08.06H32A14,14,0,0,0,18,96v64a14,14,0,0,0,14,14H77.94l70.38,54.74A6,6,0,0,0,158,224V169.92L203.56,220a6,6,0,0,0,8.88-8.08ZM30,160V96a2,2,0,0,1,2-2H74v68H32A2,2,0,0,1,30,160Zm116,51.73L86,165.07V90.93l.11-.08L146,156.72Zm41.5-66.53a26,26,0,0,0,0-34.37,6,6,0,1,1,9-7.93,38,38,0,0,1,0,50.24,6,6,0,0,1-9-7.94ZM107.41,66.68a6,6,0,0,1,1.06-8.42l39.85-31A6,6,0,0,1,158,32v74.83a6,6,0,0,1-12,0V44.27L115.83,67.73A6,6,0,0,1,107.41,66.68ZM246,128a77.86,77.86,0,0,1-19.86,52,6,6,0,1,1-8.94-8,66,66,0,0,0,0-88,6,6,0,1,1,8.94-8A77.86,77.86,0,0,1,246,128Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M53.92,34.62A8,8,0,1,0,42.08,45.38L73.55,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V175.09l42.08,46.29a8,8,0,1,0,11.84-10.76ZM32,96H72v64H32ZM144,207.64,88,164.09V95.89l56,61.6Zm42-63.77a24,24,0,0,0,0-31.72,8,8,0,1,1,12-10.57,40,40,0,0,1,0,52.88,8,8,0,0,1-12-10.59Zm-80.16-76a8,8,0,0,1,1.4-11.23l39.85-31A8,8,0,0,1,160,32v74.83a8,8,0,0,1-16,0V48.36l-26.94,21A8,8,0,0,1,105.84,67.91ZM248,128a79.9,79.9,0,0,1-20.37,53.34,8,8,0,0,1-11.92-10.67,64,64,0,0,0,0-85.33,8,8,0,1,1,11.92-10.67A79.83,79.83,0,0,1,248,128Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M51,37.31A4,4,0,0,0,45,42.69L81,82.19,78.63,84H32A12,12,0,0,0,20,96v64a12,12,0,0,0,12,12H78.63l70.91,55.16A4.07,4.07,0,0,0,152,228a3.92,3.92,0,0,0,1.76-.41A4,4,0,0,0,156,224V164.75l49,53.94a4,4,0,1,0,5.92-5.38ZM28,160V96a4,4,0,0,1,4-4H76v72H32A4,4,0,0,1,28,160Zm120,55.82L84,166V90l2.35-1.83L148,156Zm41-69.3a28,28,0,0,0,0-37,4,4,0,1,1,6-5.29,36,36,0,0,1,0,47.59,4,4,0,1,1-6-5.29ZM109,65.45a4,4,0,0,1,.7-5.61l39.85-31A4,4,0,0,1,156,32v74.83a4,4,0,0,1-8,0V40.18l-33.39,26A4,4,0,0,1,109,65.45ZM244,128a75.88,75.88,0,0,1-19.35,50.67,4,4,0,0,1-6-5.34,68,68,0,0,0,0-90.66,4,4,0,0,1,6-5.34A75.88,75.88,0,0,1,244,128Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M100,36H56A20,20,0,0,0,36,56v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,100,36ZM96,96H60V60H96ZM200,36H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,200,36Zm-4,60H160V60h36Zm-96,40H56a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,100,136Zm-4,60H60V160H96Zm104-60H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,200,136Zm-4,60H160V160h36Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M112,56v48a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h48A8,8,0,0,1,112,56Zm88-8H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V56A8,8,0,0,0,200,48Zm-96,96H56a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,104,144Zm96,0H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,200,144Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,136H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48ZM104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,56v48a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40h48A16,16,0,0,1,120,56Zm80-16H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm-96,96H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm96,0H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M104,42H56A14,14,0,0,0,42,56v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,104,42Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,200,42Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm-98,34H56a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,104,138Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,200,138Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M104,44H56A12,12,0,0,0,44,56v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,104,44Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,200,44Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4ZM104,140H56a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,104,140Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,200,140Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst l = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M243,96a20.33,20.33,0,0,0-17.74-14l-56.59-4.57L146.83,24.62a20.36,20.36,0,0,0-37.66,0L87.35,77.44,30.76,82A20.45,20.45,0,0,0,19.1,117.88l43.18,37.24-13.2,55.7A20.37,20.37,0,0,0,79.57,233L128,203.19,176.43,233a20.39,20.39,0,0,0,30.49-22.15l-13.2-55.7,43.18-37.24A20.43,20.43,0,0,0,243,96ZM172.53,141.7a12,12,0,0,0-3.84,11.86L181.58,208l-47.29-29.08a12,12,0,0,0-12.58,0L74.42,208l12.89-54.4a12,12,0,0,0-3.84-11.86L41.2,105.24l55.4-4.47a12,12,0,0,0,10.13-7.38L128,41.89l21.27,51.5a12,12,0,0,0,10.13,7.38l55.4,4.47Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M229.06,108.79l-48.7,42,14.88,62.79a8.4,8.4,0,0,1-12.52,9.17L128,189.09,73.28,222.74a8.4,8.4,0,0,1-12.52-9.17l14.88-62.79-48.7-42A8.46,8.46,0,0,1,31.73,94L95.64,88.8l24.62-59.6a8.36,8.36,0,0,1,15.48,0l24.62,59.6L224.27,94A8.46,8.46,0,0,1,229.06,108.79Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M239.18,97.26A16.38,16.38,0,0,0,224.92,86l-59-4.76L143.14,26.15a16.36,16.36,0,0,0-30.27,0L90.11,81.23,31.08,86a16.46,16.46,0,0,0-9.37,28.86l45,38.83L53,211.75a16.38,16.38,0,0,0,24.5,17.82L128,198.49l50.53,31.08A16.4,16.4,0,0,0,203,211.75l-13.76-58.07,45-38.83A16.43,16.43,0,0,0,239.18,97.26Zm-15.34,5.47-48.7,42a8,8,0,0,0-2.56,7.91l14.88,62.8a.37.37,0,0,1-.17.48c-.18.14-.23.11-.38,0l-54.72-33.65a8,8,0,0,0-8.38,0L69.09,215.94c-.15.09-.19.12-.38,0a.37.37,0,0,1-.17-.48l14.88-62.8a8,8,0,0,0-2.56-7.91l-48.7-42c-.12-.1-.23-.19-.13-.5s.18-.27.33-.29l63.92-5.16A8,8,0,0,0,103,91.86l24.62-59.61c.08-.17.11-.25.35-.25s.27.08.35.25L153,91.86a8,8,0,0,0,6.75,4.92l63.92,5.16c.15,0,.24,0,.33.29S224,102.63,223.84,102.73Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M234.29,114.85l-45,38.83L203,211.75a16.4,16.4,0,0,1-24.5,17.82L128,198.49,77.47,229.57A16.4,16.4,0,0,1,53,211.75l13.76-58.07-45-38.83A16.46,16.46,0,0,1,31.08,86l59-4.76,22.76-55.08a16.36,16.36,0,0,1,30.27,0l22.75,55.08,59,4.76a16.46,16.46,0,0,1,9.37,28.86Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M237.28,97.87A14.18,14.18,0,0,0,224.76,88l-60.25-4.87-23.22-56.2a14.37,14.37,0,0,0-26.58,0L91.49,83.11,31.24,88a14.18,14.18,0,0,0-12.52,9.89A14.43,14.43,0,0,0,23,113.32L69,152.93l-14,59.25a14.4,14.4,0,0,0,5.59,15,14.1,14.1,0,0,0,15.91.6L128,196.12l51.58,31.71a14.1,14.1,0,0,0,15.91-.6,14.4,14.4,0,0,0,5.59-15l-14-59.25L233,113.32A14.43,14.43,0,0,0,237.28,97.87Zm-12.14,6.37-48.69,42a6,6,0,0,0-1.92,5.92l14.88,62.79a2.35,2.35,0,0,1-.95,2.57,2.24,2.24,0,0,1-2.6.1L131.14,184a6,6,0,0,0-6.28,0L70.14,217.61a2.24,2.24,0,0,1-2.6-.1,2.35,2.35,0,0,1-1-2.57l14.88-62.79a6,6,0,0,0-1.92-5.92l-48.69-42a2.37,2.37,0,0,1-.73-2.65,2.28,2.28,0,0,1,2.07-1.65l63.92-5.16a6,6,0,0,0,5.06-3.69l24.63-59.6a2.35,2.35,0,0,1,4.38,0l24.63,59.6a6,6,0,0,0,5.06,3.69l63.92,5.16a2.28,2.28,0,0,1,2.07,1.65A2.37,2.37,0,0,1,225.14,104.24Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M239.18,97.26A16.38,16.38,0,0,0,224.92,86l-59-4.76L143.14,26.15a16.36,16.36,0,0,0-30.27,0L90.11,81.23,31.08,86a16.46,16.46,0,0,0-9.37,28.86l45,38.83L53,211.75a16.38,16.38,0,0,0,24.5,17.82L128,198.49l50.53,31.08A16.4,16.4,0,0,0,203,211.75l-13.76-58.07,45-38.83A16.43,16.43,0,0,0,239.18,97.26Zm-15.34,5.47-48.7,42a8,8,0,0,0-2.56,7.91l14.88,62.8a.37.37,0,0,1-.17.48c-.18.14-.23.11-.38,0l-54.72-33.65a8,8,0,0,0-8.38,0L69.09,215.94c-.15.09-.19.12-.38,0a.37.37,0,0,1-.17-.48l14.88-62.8a8,8,0,0,0-2.56-7.91l-48.7-42c-.12-.1-.23-.19-.13-.5s.18-.27.33-.29l63.92-5.16A8,8,0,0,0,103,91.86l24.62-59.61c.08-.17.11-.25.35-.25s.27.08.35.25L153,91.86a8,8,0,0,0,6.75,4.92l63.92,5.16c.15,0,.24,0,.33.29S224,102.63,223.84,102.73Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M235.36,98.49A12.21,12.21,0,0,0,224.59,90l-61.47-5L139.44,27.67a12.37,12.37,0,0,0-22.88,0L92.88,85,31.41,90a12.45,12.45,0,0,0-7.07,21.84l46.85,40.41L56.87,212.64a12.35,12.35,0,0,0,18.51,13.49L128,193.77l52.62,32.36a12.12,12.12,0,0,0,13.69-.51,12.28,12.28,0,0,0,4.82-13l-14.32-60.42,46.85-40.41A12.29,12.29,0,0,0,235.36,98.49Zm-8.93,7.26-48.68,42a4,4,0,0,0-1.28,3.95l14.87,62.79a4.37,4.37,0,0,1-1.72,4.65,4.24,4.24,0,0,1-4.81.18L130.1,185.67a4,4,0,0,0-4.2,0L71.19,219.32a4.24,4.24,0,0,1-4.81-.18,4.37,4.37,0,0,1-1.72-4.65L79.53,151.7a4,4,0,0,0-1.28-3.95l-48.68-42A4.37,4.37,0,0,1,28.25,101a4.31,4.31,0,0,1,3.81-3L96,92.79a4,4,0,0,0,3.38-2.46L124,30.73a4.35,4.35,0,0,1,8.08,0l24.62,59.6A4,4,0,0,0,160,92.79l63.9,5.15a4.31,4.31,0,0,1,3.81,3A4.37,4.37,0,0,1,226.43,105.75Z\" }))\n  ]\n]);\nexport {\n  l as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168,28H88A60.07,60.07,0,0,0,28,88v80a60.07,60.07,0,0,0,60,60h48a11.9,11.9,0,0,0,3.79-.62c27.63-9.21,78.38-60,87.59-87.59A11.9,11.9,0,0,0,228,136V88A60.07,60.07,0,0,0,168,28ZM52,168V88A36,36,0,0,1,88,52h80a36,36,0,0,1,36,36v36H184a60.07,60.07,0,0,0-60,60v20H88A36,36,0,0,1,52,168Zm96,27.63V184a36,36,0,0,1,36-36h11.63C184,164.11,164.11,184,148,195.63Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M216,136c-8,24-56,72-80,80V184a48,48,0,0,1,48-48Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M168,32H88A56.06,56.06,0,0,0,32,88v80a56.06,56.06,0,0,0,56,56h48a8.07,8.07,0,0,0,2.53-.41c26.23-8.75,76.31-58.83,85.06-85.06A8.07,8.07,0,0,0,224,136V88A56.06,56.06,0,0,0,168,32ZM48,168V88A40,40,0,0,1,88,48h80a40,40,0,0,1,40,40v40H184a56.06,56.06,0,0,0-56,56v24H88A40,40,0,0,1,48,168Zm96,35.14V184a40,40,0,0,1,40-40h19.14C191,163.5,163.5,191,144,203.14Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168,32H88A56.06,56.06,0,0,0,32,88v80a56.06,56.06,0,0,0,56,56h48a8.07,8.07,0,0,0,2.53-.41c26.23-8.75,76.31-58.83,85.06-85.06A8.07,8.07,0,0,0,224,136V88A56.06,56.06,0,0,0,168,32ZM136,207.42V176a40,40,0,0,1,40-40h31.42C198.16,157.55,157.55,198.16,136,207.42Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168,34H88A54.06,54.06,0,0,0,34,88v80a54.06,54.06,0,0,0,54,54h48a5.86,5.86,0,0,0,1.9-.31c25.84-8.61,75.18-57.95,83.79-83.79A5.86,5.86,0,0,0,222,136V88A54.06,54.06,0,0,0,168,34ZM46,168V88A42,42,0,0,1,88,46h80a42,42,0,0,1,42,42v42H184a54.06,54.06,0,0,0-54,54v26H88A42,42,0,0,1,46,168Zm96,38.67V184a42,42,0,0,1,42-42h22.67C194.84,163.1,163.1,194.84,142,206.67Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168,32H88A56.06,56.06,0,0,0,32,88v80a56.06,56.06,0,0,0,56,56h48a8.07,8.07,0,0,0,2.53-.41c26.23-8.75,76.31-58.83,85.06-85.06A8.07,8.07,0,0,0,224,136V88A56.06,56.06,0,0,0,168,32ZM48,168V88A40,40,0,0,1,88,48h80a40,40,0,0,1,40,40v40H184a56.06,56.06,0,0,0-56,56v24H88A40,40,0,0,1,48,168Zm96,35.14V184a40,40,0,0,1,40-40h19.14C191,163.5,163.5,191,144,203.14Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168,36H88A52.06,52.06,0,0,0,36,88v80a52.06,52.06,0,0,0,52,52h48a3.83,3.83,0,0,0,1.26-.21c25.46-8.48,74.05-57.07,82.53-82.53A3.83,3.83,0,0,0,220,136V88A52.06,52.06,0,0,0,168,36ZM44,168V88A44.05,44.05,0,0,1,88,44h80a44.05,44.05,0,0,1,44,44v44H184a52.06,52.06,0,0,0-52,52v28H88A44.05,44.05,0,0,1,44,168Zm96,42V184a44.05,44.05,0,0,1,44-44h26C198.9,162.23,162.23,198.9,140,210Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,36H56A20,20,0,0,0,36,56V200a20,20,0,0,0,20,20H200a20,20,0,0,0,20-20V56A20,20,0,0,0,200,36Zm-4,160H60V60H196Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M208,56V200a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,160H56V56H200V200Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,42H56A14,14,0,0,0,42,56V200a14,14,0,0,0,14,14H200a14,14,0,0,0,14-14V56A14,14,0,0,0,200,42Zm2,158a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2H200a2,2,0,0,1,2,2Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,160H56V56H200V200Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,44H56A12,12,0,0,0,44,56V200a12,12,0,0,0,12,12H200a12,12,0,0,0,12-12V56A12,12,0,0,0,200,44Zm4,156a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4H200a4,4,0,0,1,4,4Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M116,36V20a12,12,0,0,1,24,0V36a12,12,0,0,1-24,0Zm80,92a68,68,0,1,1-68-68A68.07,68.07,0,0,1,196,128Zm-24,0a44,44,0,1,0-44,44A44.05,44.05,0,0,0,172,128ZM51.51,68.49a12,12,0,1,0,17-17l-12-12a12,12,0,0,0-17,17Zm0,119-12,12a12,12,0,0,0,17,17l12-12a12,12,0,1,0-17-17ZM196,72a12,12,0,0,0,8.49-3.51l12-12a12,12,0,0,0-17-17l-12,12A12,12,0,0,0,196,72Zm8.49,115.51a12,12,0,0,0-17,17l12,12a12,12,0,0,0,17-17ZM48,128a12,12,0,0,0-12-12H20a12,12,0,0,0,0,24H36A12,12,0,0,0,48,128Zm80,80a12,12,0,0,0-12,12v16a12,12,0,0,0,24,0V220A12,12,0,0,0,128,208Zm108-92H220a12,12,0,0,0,0,24h16a12,12,0,0,0,0-24Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M184,128a56,56,0,1,1-56-56A56,56,0,0,1,184,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm8,24a64,64,0,1,0,64,64A64.07,64.07,0,0,0,128,64ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M122,40V16a6,6,0,0,1,12,0V40a6,6,0,0,1-12,0Zm68,88a62,62,0,1,1-62-62A62.07,62.07,0,0,1,190,128Zm-12,0a50,50,0,1,0-50,50A50.06,50.06,0,0,0,178,128ZM59.76,68.24a6,6,0,1,0,8.48-8.48l-16-16a6,6,0,0,0-8.48,8.48Zm0,119.52-16,16a6,6,0,1,0,8.48,8.48l16-16a6,6,0,1,0-8.48-8.48ZM192,70a6,6,0,0,0,4.24-1.76l16-16a6,6,0,0,0-8.48-8.48l-16,16A6,6,0,0,0,192,70Zm4.24,117.76a6,6,0,0,0-8.48,8.48l16,16a6,6,0,0,0,8.48-8.48ZM46,128a6,6,0,0,0-6-6H16a6,6,0,0,0,0,12H40A6,6,0,0,0,46,128Zm82,82a6,6,0,0,0-6,6v24a6,6,0,0,0,12,0V216A6,6,0,0,0,128,210Zm112-88H216a6,6,0,0,0,0,12h24a6,6,0,0,0,0-12Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M124,40V16a4,4,0,0,1,8,0V40a4,4,0,0,1-8,0Zm64,88a60,60,0,1,1-60-60A60.07,60.07,0,0,1,188,128Zm-8,0a52,52,0,1,0-52,52A52.06,52.06,0,0,0,180,128ZM61.17,66.83a4,4,0,0,0,5.66-5.66l-16-16a4,4,0,0,0-5.66,5.66Zm0,122.34-16,16a4,4,0,0,0,5.66,5.66l16-16a4,4,0,0,0-5.66-5.66ZM192,68a4,4,0,0,0,2.83-1.17l16-16a4,4,0,1,0-5.66-5.66l-16,16A4,4,0,0,0,192,68Zm2.83,121.17a4,4,0,0,0-5.66,5.66l16,16a4,4,0,0,0,5.66-5.66ZM40,124H16a4,4,0,0,0,0,8H40a4,4,0,0,0,0-8Zm88,88a4,4,0,0,0-4,4v24a4,4,0,0,0,8,0V216A4,4,0,0,0,128,212Zm112-88H216a4,4,0,0,0,0,8h24a4,4,0,0,0,0-8Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M120,137,48,201A12,12,0,1,1,32,183l61.91-55L32,73A12,12,0,1,1,48,55l72,64A12,12,0,0,1,120,137Zm96,43H120a12,12,0,0,0,0,24h96a12,12,0,0,0,0-24Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,80V192H40V64H200A16,16,0,0,1,216,80Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M117.31,134l-72,64a8,8,0,1,1-10.63-12L100,128,34.69,70A8,8,0,1,1,45.32,58l72,64a8,8,0,0,1,0,12ZM216,184H120a8,8,0,0,0,0,16h96a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM77.66,173.66a8,8,0,0,1-11.32-11.32L100.69,128,66.34,93.66A8,8,0,0,1,77.66,82.34l40,40a8,8,0,0,1,0,11.32ZM192,176H128a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M116,132.48l-72,64a6,6,0,0,1-8-9L103,128,36,68.49a6,6,0,0,1,8-9l72,64a6,6,0,0,1,0,9ZM216,186H120a6,6,0,0,0,0,12h96a6,6,0,0,0,0-12Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M117.31,134l-72,64a8,8,0,1,1-10.63-12L100,128,34.69,70A8,8,0,1,1,45.32,58l72,64a8,8,0,0,1,0,12ZM216,184H120a8,8,0,0,0,0,16h96a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M116,128a4,4,0,0,1-1.34,3l-72,64a4,4,0,1,1-5.32-6L106,128,37.34,67a4,4,0,0,1,5.32-6l72,64A4,4,0,0,1,116,128Zm100,60H120a4,4,0,0,0,0,8h96a4,4,0,0,0,0-8Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M90.86,50.89a12,12,0,0,0-21.72,0l-64,136a12,12,0,0,0,21.71,10.22L42.44,164h75.12l15.58,33.11a12,12,0,0,0,21.72-10.22ZM53.74,140,80,84.18,106.27,140ZM200,84c-13.85,0-24.77,3.86-32.45,11.48a12,12,0,1,0,16.9,17c3-3,8.26-4.52,15.55-4.52,11,0,20,7.18,20,16v4.39A47.28,47.28,0,0,0,200,124c-24.26,0-44,17.94-44,40s19.74,40,44,40a47.18,47.18,0,0,0,22-5.38A12,12,0,0,0,244,192V124C244,101.94,224.26,84,200,84Zm0,96c-11,0-20-7.18-20-16s9-16,20-16,20,7.18,20,16S211,180,200,180Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M232,164c0,15.46-14.33,28-32,28s-32-12.54-32-28,14.33-28,32-28S232,148.54,232,164ZM34.82,152h90.36L80,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M87.24,52.59a8,8,0,0,0-14.48,0l-64,136a8,8,0,1,0,14.48,6.81L39.9,160h80.2l16.66,35.4a8,8,0,1,0,14.48-6.81ZM47.43,144,80,74.79,112.57,144ZM200,96c-12.76,0-22.73,3.47-29.63,10.32a8,8,0,0,0,11.26,11.36c3.8-3.77,10-5.68,18.37-5.68,13.23,0,24,9,24,20v3.22A42.76,42.76,0,0,0,200,128c-22.06,0-40,16.15-40,36s17.94,36,40,36a42.73,42.73,0,0,0,24-7.25,8,8,0,0,0,16-.75V132C240,112.15,222.06,96,200,96Zm0,88c-13.23,0-24-9-24-20s10.77-20,24-20,24,9,24,20S213.23,184,200,184Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,156c0,6.5-7.33,12-16,12s-16-5.5-16-12,7.33-12,16-12S200,149.5,200,156ZM232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM143.37,172.88l-44-104a8,8,0,0,0-14.74,0l-44,104a8,8,0,0,0,14.74,6.24L66.84,152h50.32l11.47,27.12a8,8,0,0,0,14.74-6.24ZM216,124c0-15.44-14.36-28-32-28a34.86,34.86,0,0,0-20.78,6.68,8,8,0,0,0,9.56,12.83A18.84,18.84,0,0,1,184,112c8.56,0,15.8,5.36,16,11.76v8A35.24,35.24,0,0,0,184,128c-17.64,0-32,12.56-32,28s14.36,28,32,28a35.13,35.13,0,0,0,16.93-4.26A8,8,0,0,0,216,176ZM73.61,136h36.78L92,92.53Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M85.43,53.45a6,6,0,0,0-10.86,0l-64,136a6,6,0,1,0,10.86,5.11L38.63,158h82.74l17.2,36.55a6,6,0,1,0,10.86-5.11ZM44.28,146,80,70.09,115.72,146ZM200,98c-12.21,0-21.71,3.28-28.23,9.74a6,6,0,0,0,8.46,8.52c4.18-4.15,10.84-6.26,19.77-6.26,14.34,0,26,9.87,26,22v7.24A40.36,40.36,0,0,0,200,130c-20.95,0-38,15.25-38,34s17.05,34,38,34a40.36,40.36,0,0,0,26-9.24V192a6,6,0,0,0,12,0V132C238,113.25,221,98,200,98Zm0,88c-14.34,0-26-9.87-26-22s11.66-22,26-22,26,9.87,26,22S214.34,186,200,186Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M87.24,52.59a8,8,0,0,0-14.48,0l-64,136a8,8,0,1,0,14.48,6.81L39.9,160h80.2l16.66,35.4a8,8,0,1,0,14.48-6.81ZM47.43,144,80,74.79,112.57,144ZM200,96c-12.76,0-22.73,3.47-29.63,10.32a8,8,0,0,0,11.26,11.36c3.8-3.77,10-5.68,18.37-5.68,13.23,0,24,9,24,20v3.22A42.76,42.76,0,0,0,200,128c-22.06,0-40,16.15-40,36s17.94,36,40,36a42.73,42.73,0,0,0,24-7.25,8,8,0,0,0,16-.75V132C240,112.15,222.06,96,200,96Zm0,88c-13.23,0-24-9-24-20s10.77-20,24-20,24,9,24,20S213.23,184,200,184Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M83.62,54.3a4,4,0,0,0-7.24,0l-64,136a4,4,0,0,0,7.24,3.4L37.36,156h85.28l17.74,37.7a4,4,0,1,0,7.24-3.4ZM41.13,148,80,65.39,118.87,148ZM200,100c-11.67,0-20.69,3.08-26.82,9.16a4,4,0,1,0,5.64,5.68c4.57-4.54,11.7-6.84,21.18-6.84,15.44,0,28,10.77,28,24v11.92A37.78,37.78,0,0,0,200,132c-19.85,0-36,14.35-36,32s16.15,32,36,32a37.78,37.78,0,0,0,28-11.92V192a4,4,0,0,0,8,0V132C236,114.36,219.85,100,200,100Zm0,88c-15.44,0-28-10.77-28-24s12.56-24,28-24,28,10.77,28,24S215.44,188,200,188Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M185.08,114.46A48,48,0,0,0,148,36H80A12,12,0,0,0,68,48V200a12,12,0,0,0,12,12h80a52,52,0,0,0,25.08-97.54ZM92,60h56a24,24,0,0,1,0,48H92Zm68,128H92V132h68a28,28,0,0,1,0,56Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M200,160a40,40,0,0,1-40,40H80V48h68a36,36,0,0,1,0,72h12A40,40,0,0,1,200,160Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M178.48,115.7A44,44,0,0,0,148,40H80a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8h80a48,48,0,0,0,18.48-92.3ZM88,56h60a28,28,0,0,1,0,56H88Zm72,136H88V128h72a32,32,0,0,1,0,64Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M168,156a20,20,0,0,1-20,20H96V136h52A20,20,0,0,1,168,156ZM224,48V208a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32H208A16,16,0,0,1,224,48ZM184,156a36,36,0,0,0-18-31.15A36,36,0,0,0,140,64H88a8,8,0,0,0-8,8V184a8,8,0,0,0,8,8h60A36,36,0,0,0,184,156Zm-24-56a20,20,0,0,0-20-20H96v40h44A20,20,0,0,0,160,100Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M174.69,116.41A42,42,0,0,0,148,42H80a6,6,0,0,0-6,6V200a6,6,0,0,0,6,6h80a46,46,0,0,0,14.69-89.59ZM86,54h62a30,30,0,0,1,0,60H86Zm74,140H86V126h74a34,34,0,0,1,0,68Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M178.48,115.7A44,44,0,0,0,148,40H80a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8h80a48,48,0,0,0,18.48-92.3ZM88,56h60a28,28,0,0,1,0,56H88Zm72,136H88V128h72a32,32,0,0,1,0,64Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M170.27,117.21A40,40,0,0,0,148,44H80a4,4,0,0,0-4,4V200a4,4,0,0,0,4,4h80a44,44,0,0,0,10.27-86.79ZM84,52h64a32,32,0,0,1,0,64H84Zm76,144H84V124h76a36,36,0,0,1,0,72Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M236,112v96a12,12,0,0,1-24,0V134.42L206.66,138a12,12,0,0,1-13.32-20l24-16A12,12,0,0,1,236,112ZM144,44a12,12,0,0,0-12,12v48H52V56a12,12,0,0,0-24,0V176a12,12,0,0,0,24,0V128h80v48a12,12,0,0,0,24,0V56A12,12,0,0,0,144,44Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M224,72V208H56a16,16,0,0,1-16-16V56H208A16,16,0,0,1,224,72Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm75.77,49a8,8,0,0,0-8.21.39l-24,16a8,8,0,1,0,8.88,13.32L216,127V208a8,8,0,0,0,16,0V112A8,8,0,0,0,227.77,105Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM144,160a8,8,0,0,1-16,0V128H72v32a8,8,0,0,1-16,0V80a8,8,0,0,1,16,0v32h56V80a8,8,0,0,1,16,0Zm56,16a8,8,0,0,1-16,0V111l-11.56,7.71a8,8,0,1,1-8.88-13.32l24-16A8,8,0,0,1,200,96Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M230,112v96a6,6,0,0,1-12,0V123.21L203.33,133a6,6,0,0,1-6.66-10l24-16a6,6,0,0,1,9.33,5ZM144,50a6,6,0,0,0-6,6v54H46V56a6,6,0,0,0-12,0V176a6,6,0,0,0,12,0V122h92v54a6,6,0,0,0,12,0V56A6,6,0,0,0,144,50Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm75.77,49a8,8,0,0,0-8.21.39l-24,16a8,8,0,1,0,8.88,13.32L216,127V208a8,8,0,0,0,16,0V112A8,8,0,0,0,227.77,105Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M228,112v96a4,4,0,0,1-8,0V119.47l-17.78,11.86a4,4,0,1,1-4.44-6.66l24-16A4,4,0,0,1,228,112ZM144,52a4,4,0,0,0-4,4v56H44V56a4,4,0,0,0-8,0V176a4,4,0,0,0,8,0V120h96v56a4,4,0,0,0,8,0V56A4,4,0,0,0,144,52Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M252,180a40,40,0,0,1-68.57,28,12,12,0,1,1,17.14-16.79A16,16,0,1,0,212,164a12,12,0,0,1-9.83-18.88L217,124H192a12,12,0,0,1,0-24h48a12,12,0,0,1,9.83,18.88l-18.34,26.2A40,40,0,0,1,252,180ZM144,44a12,12,0,0,0-12,12v48H52V56a12,12,0,0,0-24,0V176a12,12,0,0,0,24,0V128h80v48a12,12,0,0,0,24,0V56A12,12,0,0,0,144,44Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M240,72V192a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56H224A16,16,0,0,1,240,72Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm73.52,90.63,21-30A8,8,0,0,0,240,104H192a8,8,0,0,0,0,16h32.63l-19.18,27.41A8,8,0,0,0,212,160a20,20,0,1,1-14.29,34,8,8,0,1,0-11.42,11.19A36,36,0,0,0,248,180,36.07,36.07,0,0,0,225.52,146.63Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM128,160a8,8,0,0,1-16,0V128H72v32a8,8,0,0,1-16,0V80a8,8,0,0,1,16,0v32h40V80a8,8,0,0,1,16,0Zm40,24a32,32,0,0,1-21.34-8.15,8,8,0,1,1,10.68-11.92A16,16,0,1,0,168,136a8,8,0,0,1-6.4-12.8L176,104H152a8,8,0,0,1,0-16h40a8,8,0,0,1,6.4,12.8l-16.71,22.28A32,32,0,0,1,168,184Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M246,180a34,34,0,0,1-58.29,23.79,6,6,0,0,1,8.58-8.39A22,22,0,1,0,212,158a6,6,0,0,1-4.92-9.44L228.48,118H192a6,6,0,0,1,0-12h48a6,6,0,0,1,4.91,9.44l-22.52,32.18A34.06,34.06,0,0,1,246,180ZM144,50a6,6,0,0,0-6,6v54H46V56a6,6,0,0,0-12,0V176a6,6,0,0,0,12,0V122h92v54a6,6,0,0,0,12,0V56A6,6,0,0,0,144,50Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm73.52,90.63,21-30A8,8,0,0,0,240,104H192a8,8,0,0,0,0,16h32.63l-19.18,27.41A8,8,0,0,0,212,160a20,20,0,1,1-14.29,34,8,8,0,1,0-11.42,11.19A36,36,0,0,0,248,180,36.07,36.07,0,0,0,225.52,146.63Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M244,180a32,32,0,0,1-54.86,22.4,4,4,0,0,1,5.72-5.6A24,24,0,1,0,212,156a4,4,0,0,1-3.28-6.29L232.32,116H192a4,4,0,0,1,0-8h48a4,4,0,0,1,3.28,6.29L219.12,148.8A32.06,32.06,0,0,1,244,180ZM144,52a4,4,0,0,0-4,4v56H44V56a4,4,0,0,0-8,0V176a4,4,0,0,0,8,0V120h96v56a4,4,0,0,0,8,0V56A4,4,0,0,0,144,52Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M156,56V176a12,12,0,0,1-24,0V128H52v48a12,12,0,0,1-24,0V56a12,12,0,0,1,24,0v48h80V56a12,12,0,0,1,24,0Zm84,140H216l28.74-38.33A36,36,0,1,0,182.05,124a12,12,0,0,0,22.63,8,11.67,11.67,0,0,1,1.73-3.22,12,12,0,1,1,19.15,14.46L182.4,200.8A12,12,0,0,0,192,220h48a12,12,0,0,0,0-24Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M240,72V208H56a16,16,0,0,1-16-16V56H224A16,16,0,0,1,240,72Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M248,208a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.16-57.56a16,16,0,1,0-25.54-19.27,16.28,16.28,0,0,0-2.32,4.3,8,8,0,1,1-15.08-5.34,32,32,0,1,1,55.73,29.93L208,200h32A8,8,0,0,1,248,208ZM144,48a8,8,0,0,0-8,8v52H48V56a8,8,0,0,0-16,0V176a8,8,0,0,0,16,0V124h88v52a8,8,0,0,0,16,0V56A8,8,0,0,0,144,48Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM128,160a8,8,0,0,1-16,0V128H72v32a8,8,0,0,1-16,0V80a8,8,0,0,1,16,0v32h40V80a8,8,0,0,1,16,0Zm64,24H152a8,8,0,0,1-6.4-12.8l36-48a12,12,0,1,0-19.15-14.46,13.06,13.06,0,0,0-2.58,4.81,8,8,0,1,1-15.68-3.18,28.17,28.17,0,1,1,50.2,22.44L168,168h24a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M150,56V176a6,6,0,0,1-12,0V122H46v54a6,6,0,0,1-12,0V56a6,6,0,0,1,12,0v54h92V56a6,6,0,0,1,12,0Zm90,146H204L240,154.05A30,30,0,1,0,187.71,126,6,6,0,1,0,199,130a18,18,0,0,1,14.47-11.82,18,18,0,0,1,16.87,28.66L187.2,204.4A6,6,0,0,0,192,214h48a6,6,0,0,0,0-12Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M152,56V176a8,8,0,0,1-16,0V124H48v52a8,8,0,0,1-16,0V56a8,8,0,0,1,16,0v52h88V56a8,8,0,0,1,16,0Zm88,144H208l33.55-44.74a32,32,0,1,0-55.73-29.93,8,8,0,1,0,15.08,5.34,16.28,16.28,0,0,1,2.32-4.3,16,16,0,1,1,25.54,19.27L185.6,203.2A8,8,0,0,0,192,216h48a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M148,56V176a4,4,0,0,1-8,0V120H44v56a4,4,0,0,1-8,0V56a4,4,0,0,1,8,0v56h96V56a4,4,0,0,1,8,0Zm92,148H200l38.36-51.15a28,28,0,1,0-48.77-26.18,4,4,0,1,0,7.54,2.66A20.36,20.36,0,0,1,200,124,20,20,0,0,1,232,148L188.8,205.6A4,4,0,0,0,192,212h48a4,4,0,0,0,0-8Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M204,56a12,12,0,0,1-12,12H160.65l-40,120H144a12,12,0,0,1,0,24H64a12,12,0,0,1,0-24H95.35l40-120H112a12,12,0,0,1,0-24h80A12,12,0,0,1,204,56Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M192,56,144,200H64L112,56Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,56a8,8,0,0,1-8,8H157.77L115.1,192H144a8,8,0,0,1,0,16H64a8,8,0,0,1,0-16H98.23L140.9,64H112a8,8,0,0,1,0-16h80A8,8,0,0,1,200,56Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM176,80H153.64l-34.29,96H136a8,8,0,0,1,0,16H80a8,8,0,0,1,0-16h22.36l34.29-96H120a8,8,0,0,1,0-16h56a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M198,56a6,6,0,0,1-6,6H156.32l-44,132H144a6,6,0,0,1,0,12H64a6,6,0,0,1,0-12H99.68l44-132H112a6,6,0,0,1,0-12h80A6,6,0,0,1,198,56Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M200,56a8,8,0,0,1-8,8H157.77L115.1,192H144a8,8,0,0,1,0,16H64a8,8,0,0,1,0-16H98.23L140.9,64H112a8,8,0,0,1,0-16h80A8,8,0,0,1,200,56Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M196,56a4,4,0,0,1-4,4H154.88L109.55,196H144a4,4,0,0,1,0,8H64a4,4,0,0,1,0-8h37.12L146.45,60H112a4,4,0,0,1,0-8h80A4,4,0,0,1,196,56Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M228,128a12,12,0,0,1-12,12H185.86A41.48,41.48,0,0,1,196,168c0,14.45-7.81,28.32-21.43,38.05C162,215.05,145.44,220,128,220s-34-4.95-46.57-13.95C67.81,196.32,60,182.45,60,168a12,12,0,0,1,24,0c0,15.18,20.15,28,44,28s44-12.82,44-28c0-12.76-9.3-20.18-35.35-28H40a12,12,0,0,1,0-24H216A12,12,0,0,1,228,128ZM75.11,100a12,12,0,0,0,12-12c0-16,17.58-28,40.89-28,17.36,0,31.37,6.65,37.48,17.78a12,12,0,0,0,21-11.56C176.13,47.3,154.25,36,128,36,91,36,63.11,58.35,63.11,88A12,12,0,0,0,75.11,100Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M176,72l-55.31,51.05c-24-6.7-45.58-14.26-45.58-35,0-22.09,22-40,52.89-40C151.2,48,168.37,57.64,176,72Zm-55.31,51.05L72,168c0,22.09,25.07,40,56,40s56-17.91,56-40C184,138.43,150.52,131.4,120.69,123.05Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H175.93c9.19,7.11,16.07,17.2,16.07,32,0,13.34-7,25.7-19.75,34.79C160.33,211.31,144.61,216,128,216s-32.33-4.69-44.25-13.21C71,193.7,64,181.34,64,168a8,8,0,0,1,16,0c0,17.35,22,32,48,32s48-14.65,48-32c0-14.85-10.54-23.58-38.77-32H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM76.33,104a8,8,0,0,0,7.61-10.49A17.3,17.3,0,0,1,83.11,88c0-18.24,19.3-32,44.89-32,18.84,0,34.16,7.42,41,19.85a8,8,0,0,0,14-7.7C173.33,50.52,152.77,40,128,40,93.29,40,67.11,60.63,67.11,88a33.73,33.73,0,0,0,1.62,10.49A8,8,0,0,0,76.33,104Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM82.71,94.58C86,76.57,104.58,64,128,64c18.2,0,33.59,7.41,41.18,19.83a8,8,0,1,1-13.66,8.34C150.94,84.66,140.39,80,128,80c-15.3,0-27.73,7.33-29.55,17.42A8,8,0,0,1,90.59,104a7.76,7.76,0,0,1-1.43-.13A8,8,0,0,1,82.71,94.58ZM192,136H168.29A28.45,28.45,0,0,1,176,156c0,20.19-21.08,36-48,36-23.89,0-43.83-12.78-47.43-30.4a8,8,0,1,1,15.67-3.2c2,9.87,16,17.6,31.76,17.6,17.35,0,32-9.16,32-20,0-9.14-6.76-14.43-25.72-20H64a8,8,0,0,1,0-16H192a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M222,128a6,6,0,0,1-6,6H169.45c11.28,6.92,20.55,17.38,20.55,34,0,25.36-27.81,46-62,46s-62-20.64-62-46a6,6,0,0,1,12,0c0,18.75,22.43,34,50,34s50-15.25,50-34c0-18.23-15.46-26.59-40.47-34H40a6,6,0,0,1,0-12H216A6,6,0,0,1,222,128ZM76.33,102a6.2,6.2,0,0,0,1.88-.3A6,6,0,0,0,82,94.13,19.74,19.74,0,0,1,81.11,88c0-19.38,20.16-34,46.89-34,19.58,0,35.56,7.81,42.74,20.89a6,6,0,0,0,10.52-5.78C171.94,52.13,152,42,128,42,94.43,42,69.11,61.77,69.11,88a31.62,31.62,0,0,0,1.52,9.87A6,6,0,0,0,76.33,102Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H175.93c9.19,7.11,16.07,17.2,16.07,32,0,13.34-7,25.7-19.75,34.79C160.33,211.31,144.61,216,128,216s-32.33-4.69-44.25-13.21C71,193.7,64,181.34,64,168a8,8,0,0,1,16,0c0,17.35,22,32,48,32s48-14.65,48-32c0-14.85-10.54-23.58-38.77-32H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM76.33,104a8,8,0,0,0,7.61-10.49A17.3,17.3,0,0,1,83.11,88c0-18.24,19.3-32,44.89-32,18.84,0,34.16,7.42,41,19.85a8,8,0,0,0,14-7.7C173.33,50.52,152.77,40,128,40,93.29,40,67.11,60.63,67.11,88a33.73,33.73,0,0,0,1.62,10.49A8,8,0,0,0,76.33,104Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M220,128a4,4,0,0,1-4,4H161.16c15.45,7.24,26.84,17.8,26.84,36,0,24.26-26.92,44-60,44s-60-19.74-60-44a4,4,0,0,1,8,0c0,19.85,23.33,36,52,36s52-16.15,52-36c0-19.54-16.13-28.3-42.18-36H40a4,4,0,0,1,0-8H216A4,4,0,0,1,220,128ZM76.33,100a3.85,3.85,0,0,0,1.25-.2,4,4,0,0,0,2.55-5,21.9,21.9,0,0,1-1-6.75c0-20.52,21-36,48.89-36,20.32,0,37,8.2,44.49,21.92a4,4,0,0,0,7-3.85C170.54,53.75,151.29,44,128,44,95.57,44,71.11,62.92,71.11,88a29.76,29.76,0,0,0,1.42,9.25A4,4,0,0,0,76.33,100Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M204,224a12,12,0,0,1-12,12H64a12,12,0,0,1,0-24H192A12,12,0,0,1,204,224Zm-76-28a68.07,68.07,0,0,0,68-68V56a12,12,0,0,0-24,0v72a44,44,0,0,1-88,0V56a12,12,0,0,0-24,0v72A68.07,68.07,0,0,0,128,196Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M184,56v80a56,56,0,0,1-112,0V56Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM80,72a8,8,0,0,1,16,0v48a32,32,0,0,0,64,0V72a8,8,0,0,1,16,0v48a48,48,0,0,1-96,0Zm96,128H80a8,8,0,0,1,0-16h96a8,8,0,0,1,0,16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M198,224a6,6,0,0,1-6,6H64a6,6,0,0,1,0-12H192A6,6,0,0,1,198,224Zm-70-26a62.07,62.07,0,0,0,62-62V56a6,6,0,0,0-12,0v80a50,50,0,0,1-100,0V56a6,6,0,0,0-12,0v80A62.07,62.07,0,0,0,128,198Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M196,224a4,4,0,0,1-4,4H64a4,4,0,0,1,0-8H192A4,4,0,0,1,196,224Zm-68-28a60.07,60.07,0,0,0,60-60V56a4,4,0,0,0-8,0v80a52,52,0,0,1-104,0V56a4,4,0,0,0-8,0v80A60.07,60.07,0,0,0,128,196Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,28H48A20,20,0,0,0,28,48V208a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V48A20,20,0,0,0,208,28Zm-4,24v92H179.31a19.86,19.86,0,0,0-14.14,5.86L147,168H109L90.83,149.86A19.86,19.86,0,0,0,76.69,144H52V52ZM52,204V168H75l18.14,18.14A19.86,19.86,0,0,0,107.31,192h41.38a19.86,19.86,0,0,0,14.14-5.86L181,168h23v36Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M216,48V160H179.31a8,8,0,0,0-5.66,2.34l-19.31,19.32a8,8,0,0,1-5.66,2.34H107.31a8,8,0,0,1-5.66-2.34L82.34,162.34A8,8,0,0,0,76.68,160H40V48a8,8,0,0,1,8-8H208A8,8,0,0,1,216,48Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,16V152h-28.7A15.86,15.86,0,0,0,168,156.69L148.69,176H107.31L88,156.68A15.89,15.89,0,0,0,76.69,152H48V48Zm0,160H48V168H76.69L96,187.32A15.89,15.89,0,0,0,107.31,192h41.38A15.86,15.86,0,0,0,160,187.31L179.31,168H208v40Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,176H48V168H76.69L96,187.32A15.89,15.89,0,0,0,107.31,192h41.38A15.86,15.86,0,0,0,160,187.31L179.31,168H208v40Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,34H48A14,14,0,0,0,34,48V208a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V48A14,14,0,0,0,208,34ZM48,46H208a2,2,0,0,1,2,2V154H179.31a13.94,13.94,0,0,0-9.9,4.1L150.1,177.41a2,2,0,0,1-1.41.59H107.31a2,2,0,0,1-1.41-.58L86.59,158.1a13.94,13.94,0,0,0-9.9-4.1H46V48A2,2,0,0,1,48,46ZM208,210H48a2,2,0,0,1-2-2V166H76.69a2,2,0,0,1,1.41.58L97.41,185.9a13.94,13.94,0,0,0,9.9,4.1h41.38a13.94,13.94,0,0,0,9.9-4.1l19.31-19.31a2,2,0,0,1,1.41-.59H210v42A2,2,0,0,1,208,210Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,16V152h-28.7A15.86,15.86,0,0,0,168,156.69L148.69,176H107.31L88,156.69A15.86,15.86,0,0,0,76.69,152H48V48Zm0,160H48V168H76.69L96,187.31A15.86,15.86,0,0,0,107.31,192h41.38A15.86,15.86,0,0,0,160,187.31L179.31,168H208v40Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208,36H48A12,12,0,0,0,36,48V208a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V48A12,12,0,0,0,208,36ZM48,44H208a4,4,0,0,1,4,4V156H179.31a12,12,0,0,0-8.48,3.51l-19.32,19.32a4,4,0,0,1-2.82,1.17H107.31a4,4,0,0,1-2.82-1.17L85.17,159.51A12,12,0,0,0,76.69,156H44V48A4,4,0,0,1,48,44ZM208,212H48a4,4,0,0,1-4-4V164H76.69a4,4,0,0,1,2.82,1.17l19.32,19.32a12,12,0,0,0,8.48,3.51h41.38a12,12,0,0,0,8.48-3.51l19.32-19.32a4,4,0,0,1,2.82-1.17H212v44A4,4,0,0,1,208,212Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20ZM79.57,196.57a60,60,0,0,1,96.86,0,83.72,83.72,0,0,1-96.86,0ZM100,120a28,28,0,1,1,28,28A28,28,0,0,1,100,120ZM194,179.94a83.48,83.48,0,0,0-29-23.42,52,52,0,1,0-74,0,83.48,83.48,0,0,0-29,23.42,84,84,0,1,1,131.9,0Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n      \"path\",\n      {\n        d: \"M224,128a95.76,95.76,0,0,1-31.8,71.37A72,72,0,0,0,128,160a40,40,0,1,0-40-40,40,40,0,0,0,40,40,72,72,0,0,0-64.2,39.37h0A96,96,0,1,1,224,128Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120Zm97.76,66.41a79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75,88,88,0,1,1,131.52,0Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M172,120a44,44,0,1,1-44-44A44.05,44.05,0,0,1,172,120Zm60,8A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88.09,88.09,0,0,0-91.47-87.93C77.43,41.89,39.87,81.12,40,128.25a87.65,87.65,0,0,0,22.24,58.16A79.71,79.71,0,0,1,84,165.1a4,4,0,0,1,4.83.32,59.83,59.83,0,0,0,78.28,0,4,4,0,0,1,4.83-.32,79.71,79.71,0,0,1,21.79,21.31A87.62,87.62,0,0,0,216,128Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26ZM71.44,198a66,66,0,0,1,113.12,0,89.8,89.8,0,0,1-113.12,0ZM94,120a34,34,0,1,1,34,34A34,34,0,0,1,94,120Zm99.51,69.64a77.53,77.53,0,0,0-40-31.38,46,46,0,1,0-51,0,77.53,77.53,0,0,0-40,31.38,90,90,0,1,1,131,0Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120Zm97.76,66.41a79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75,88,88,0,1,1,131.52,0Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28ZM68.87,198.42a68,68,0,0,1,118.26,0,91.8,91.8,0,0,1-118.26,0Zm124.3-5.55a75.61,75.61,0,0,0-44.51-34,44,44,0,1,0-41.32,0,75.61,75.61,0,0,0-44.51,34,92,92,0,1,1,130.34,0ZM128,156a36,36,0,1,1,36-36A36,36,0,0,1,128,156Z\" }))\n  ]\n]);\nexport {\n  a as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M256,136a12,12,0,0,1-12,12H204a12,12,0,0,1,0-24h40A12,12,0,0,1,256,136Zm-54.81,56.28a12,12,0,1,1-18.38,15.44C169.12,191.42,145,172,108,172c-28.89,0-55.46,12.68-74.81,35.72a12,12,0,0,1-18.38-15.44A124.08,124.08,0,0,1,63.5,156.53a72,72,0,1,1,89,0A124,124,0,0,1,201.19,192.28ZM108,148a48,48,0,1,0-48-48A48.05,48.05,0,0,0,108,148Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M168,100a60,60,0,1,1-60-60A60,60,0,0,1,168,100Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M256,136a8,8,0,0,1-8,8H200a8,8,0,0,1,0-16h48A8,8,0,0,1,256,136Zm-57.87,58.85a8,8,0,0,1-12.26,10.3C165.75,181.19,138.09,168,108,168s-57.75,13.19-77.87,37.15a8,8,0,0,1-12.25-10.3c14.94-17.78,33.52-30.41,54.17-37.17a68,68,0,1,1,71.9,0C164.6,164.44,183.18,177.07,198.13,194.85ZM108,152a52,52,0,1,0-52-52A52.06,52.06,0,0,0,108,152Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M198.13,194.85A8,8,0,0,1,192,208H24a8,8,0,0,1-6.12-13.15c14.94-17.78,33.52-30.41,54.17-37.17a68,68,0,1,1,71.9,0C164.6,164.44,183.18,177.07,198.13,194.85ZM248,128H200a8,8,0,0,0,0,16h48a8,8,0,0,0,0-16Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M254,136a6,6,0,0,1-6,6H200a6,6,0,0,1,0-12h48A6,6,0,0,1,254,136Zm-57.41,60.14a6,6,0,1,1-9.18,7.72C166.9,179.45,138.69,166,108,166s-58.89,13.45-79.41,37.86a6,6,0,0,1-9.18-7.72C35.14,177.41,55,164.48,77,158.26a66,66,0,1,1,62,0C161,164.48,180.86,177.41,196.59,196.14ZM108,154a54,54,0,1,0-54-54A54.06,54.06,0,0,0,108,154Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M256,136a8,8,0,0,1-8,8H200a8,8,0,0,1,0-16h48A8,8,0,0,1,256,136Zm-57.87,58.85a8,8,0,0,1-12.26,10.3C165.75,181.19,138.09,168,108,168s-57.75,13.19-77.87,37.15a8,8,0,0,1-12.25-10.3c14.94-17.78,33.52-30.41,54.17-37.17a68,68,0,1,1,71.9,0C164.6,164.44,183.18,177.07,198.13,194.85ZM108,152a52,52,0,1,0-52-52A52.06,52.06,0,0,0,108,152Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M252,136a4,4,0,0,1-4,4H200a4,4,0,0,1,0-8h48A4,4,0,0,1,252,136Zm-56.94,61.43a4,4,0,0,1-6.12,5.14C168,177.7,139.3,164,108,164s-60,13.7-80.94,38.57a4,4,0,1,1-6.12-5.14c16.71-19.9,38.13-33.13,61.89-38.59a64,64,0,1,1,50.34,0C156.93,164.3,178.35,177.53,195.06,197.43ZM108,156a56,56,0,1,0-56-56A56.06,56.06,0,0,0,108,156Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M256,136a12,12,0,0,1-12,12h-8v8a12,12,0,0,1-24,0v-8h-8a12,12,0,0,1,0-24h8v-8a12,12,0,0,1,24,0v8h8A12,12,0,0,1,256,136Zm-54.81,56.28a12,12,0,1,1-18.38,15.44C169.12,191.42,145,172,108,172c-28.89,0-55.46,12.68-74.81,35.72a12,12,0,0,1-18.38-15.44A124.08,124.08,0,0,1,63.5,156.53a72,72,0,1,1,89,0A124,124,0,0,1,201.19,192.28ZM108,148a48,48,0,1,0-48-48A48.05,48.05,0,0,0,108,148Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M168,100a60,60,0,1,1-60-60A60,60,0,0,1,168,100Z\", opacity: \"0.2\" }), /* @__PURE__ */ a.createElement(\"path\", { d: \"M256,136a8,8,0,0,1-8,8H232v16a8,8,0,0,1-16,0V144H200a8,8,0,0,1,0-16h16V112a8,8,0,0,1,16,0v16h16A8,8,0,0,1,256,136Zm-57.87,58.85a8,8,0,0,1-12.26,10.3C165.75,181.19,138.09,168,108,168s-57.75,13.19-77.87,37.15a8,8,0,0,1-12.25-10.3c14.94-17.78,33.52-30.41,54.17-37.17a68,68,0,1,1,71.9,0C164.6,164.44,183.18,177.07,198.13,194.85ZM108,152a52,52,0,1,0-52-52A52.06,52.06,0,0,0,108,152Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M256,136a8,8,0,0,1-8,8H232v16a8,8,0,0,1-16,0V144H200a8,8,0,0,1,0-16h16V112a8,8,0,0,1,16,0v16h16A8,8,0,0,1,256,136ZM144,157.68a68,68,0,1,0-71.9,0c-20.65,6.76-39.23,19.39-54.17,37.17A8,8,0,0,0,24,208H192a8,8,0,0,0,6.13-13.15C183.18,177.07,164.6,164.44,144,157.68Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M254,136a6,6,0,0,1-6,6H230v18a6,6,0,0,1-12,0V142H200a6,6,0,0,1,0-12h18V112a6,6,0,0,1,12,0v18h18A6,6,0,0,1,254,136Zm-57.41,60.14a6,6,0,1,1-9.18,7.72C166.9,179.45,138.69,166,108,166s-58.89,13.45-79.41,37.86a6,6,0,0,1-9.18-7.72C35.14,177.41,55,164.48,77,158.25a66,66,0,1,1,62,0C161,164.48,180.86,177.41,196.59,196.14ZM108,154a54,54,0,1,0-54-54A54.06,54.06,0,0,0,108,154Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M256,136a8,8,0,0,1-8,8H232v16a8,8,0,0,1-16,0V144H200a8,8,0,0,1,0-16h16V112a8,8,0,0,1,16,0v16h16A8,8,0,0,1,256,136Zm-57.87,58.85a8,8,0,0,1-12.26,10.3C165.75,181.19,138.09,168,108,168s-57.75,13.19-77.87,37.15a8,8,0,0,1-12.25-10.3c14.94-17.78,33.52-30.41,54.17-37.17a68,68,0,1,1,71.9,0C164.6,164.44,183.18,177.07,198.13,194.85ZM108,152a52,52,0,1,0-52-52A52.06,52.06,0,0,0,108,152Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M252,136a4,4,0,0,1-4,4H228v20a4,4,0,0,1-8,0V140H200a4,4,0,0,1,0-8h20V112a4,4,0,0,1,8,0v20h20A4,4,0,0,1,252,136Zm-56.94,61.43a4,4,0,0,1-6.12,5.14C168,177.7,139.3,164,108,164s-60,13.7-80.94,38.57a4,4,0,1,1-6.12-5.14c16.71-19.9,38.13-33.13,61.89-38.59a64,64,0,1,1,50.34,0C156.93,164.3,178.35,177.53,195.06,197.43ZM108,156a56,56,0,1,0-56-56A56.06,56.06,0,0,0,108,156Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M164.38,181.1a52,52,0,1,0-72.76,0,75.89,75.89,0,0,0-30,28.89,12,12,0,0,0,20.78,12,53,53,0,0,1,91.22,0,12,12,0,1,0,20.78-12A75.89,75.89,0,0,0,164.38,181.1ZM100,144a28,28,0,1,1,28,28A28,28,0,0,1,100,144Zm147.21,9.59a12,12,0,0,1-16.81-2.39c-8.33-11.09-19.85-19.59-29.33-21.64a12,12,0,0,1-1.82-22.91,20,20,0,1,0-24.78-28.3,12,12,0,1,1-21-11.6,44,44,0,1,1,73.28,48.35,92.18,92.18,0,0,1,22.85,21.69A12,12,0,0,1,247.21,153.59Zm-192.28-24c-9.48,2.05-21,10.55-29.33,21.65A12,12,0,0,1,6.41,136.79,92.37,92.37,0,0,1,29.26,115.1a44,44,0,1,1,73.28-48.35,12,12,0,1,1-21,11.6,20,20,0,1,0-24.78,28.3,12,12,0,0,1-1.82,22.91Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M168,144a40,40,0,1,1-40-40A40,40,0,0,1,168,144ZM64,56A32,32,0,1,0,96,88,32,32,0,0,0,64,56Zm128,0a32,32,0,1,0,32,32A32,32,0,0,0,192,56Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M244.8,150.4a8,8,0,0,1-11.2-1.6A51.6,51.6,0,0,0,192,128a8,8,0,0,1,0-16,24,24,0,1,0-23.24-30,8,8,0,1,1-15.5-4A40,40,0,1,1,219,117.51a67.94,67.94,0,0,1,27.43,21.68A8,8,0,0,1,244.8,150.4ZM190.92,212a8,8,0,1,1-13.85,8,57,57,0,0,0-98.15,0,8,8,0,1,1-13.84-8,72.06,72.06,0,0,1,33.74-29.92,48,48,0,1,1,58.36,0A72.06,72.06,0,0,1,190.92,212ZM128,176a32,32,0,1,0-32-32A32,32,0,0,0,128,176ZM72,120a8,8,0,0,0-8-8A24,24,0,1,1,87.24,82a8,8,0,1,0,15.5-4A40,40,0,1,0,37,117.51,67.94,67.94,0,0,0,9.6,139.19a8,8,0,1,0,12.8,9.61A51.6,51.6,0,0,1,64,128,8,8,0,0,0,72,120Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M64.12,147.8a4,4,0,0,1-4,4.2H16a8,8,0,0,1-7.8-6.17,8.35,8.35,0,0,1,1.62-6.93A67.79,67.79,0,0,1,37,117.51a40,40,0,1,1,66.46-35.8,3.94,3.94,0,0,1-2.27,4.18A64.08,64.08,0,0,0,64,144C64,145.28,64,146.54,64.12,147.8Zm182-8.91A67.76,67.76,0,0,0,219,117.51a40,40,0,1,0-66.46-35.8,3.94,3.94,0,0,0,2.27,4.18A64.08,64.08,0,0,1,192,144c0,1.28,0,2.54-.12,3.8a4,4,0,0,0,4,4.2H240a8,8,0,0,0,7.8-6.17A8.33,8.33,0,0,0,246.17,138.89Zm-89,43.18a48,48,0,1,0-58.37,0A72.13,72.13,0,0,0,65.07,212,8,8,0,0,0,72,224H184a8,8,0,0,0,6.93-12A72.15,72.15,0,0,0,157.19,182.07Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M243.6,148.8a6,6,0,0,1-8.4-1.2A53.58,53.58,0,0,0,192,126a6,6,0,0,1,0-12,26,26,0,1,0-25.18-32.5,6,6,0,0,1-11.62-3,38,38,0,1,1,59.91,39.63A65.69,65.69,0,0,1,244.8,140.4,6,6,0,0,1,243.6,148.8ZM189.19,213a6,6,0,0,1-2.19,8.2,5.9,5.9,0,0,1-3,.81,6,6,0,0,1-5.2-3,59,59,0,0,0-101.62,0,6,6,0,1,1-10.38-6A70.1,70.1,0,0,1,103,182.55a46,46,0,1,1,50.1,0A70.1,70.1,0,0,1,189.19,213ZM128,178a34,34,0,1,0-34-34A34,34,0,0,0,128,178ZM70,120a6,6,0,0,0-6-6A26,26,0,1,1,89.18,81.49a6,6,0,1,0,11.62-3,38,38,0,1,0-59.91,39.63A65.69,65.69,0,0,0,11.2,140.4a6,6,0,1,0,9.6,7.2A53.58,53.58,0,0,1,64,126,6,6,0,0,0,70,120Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M244.8,150.4a8,8,0,0,1-11.2-1.6A51.6,51.6,0,0,0,192,128a8,8,0,0,1-7.37-4.89,8,8,0,0,1,0-6.22A8,8,0,0,1,192,112a24,24,0,1,0-23.24-30,8,8,0,1,1-15.5-4A40,40,0,1,1,219,117.51a67.94,67.94,0,0,1,27.43,21.68A8,8,0,0,1,244.8,150.4ZM190.92,212a8,8,0,1,1-13.84,8,57,57,0,0,0-98.16,0,8,8,0,1,1-13.84-8,72.06,72.06,0,0,1,33.74-29.92,48,48,0,1,1,58.36,0A72.06,72.06,0,0,1,190.92,212ZM128,176a32,32,0,1,0-32-32A32,32,0,0,0,128,176ZM72,120a8,8,0,0,0-8-8A24,24,0,1,1,87.24,82a8,8,0,1,0,15.5-4A40,40,0,1,0,37,117.51,67.94,67.94,0,0,0,9.6,139.19a8,8,0,1,0,12.8,9.61A51.6,51.6,0,0,1,64,128,8,8,0,0,0,72,120Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M237,147.44a4,4,0,0,1-5.48-1.4c-8.33-14-20.93-22-34.56-22a4,4,0,0,1-1.2-.2,36.76,36.76,0,0,1-3.8.2,4,4,0,0,1,0-8,28,28,0,1,0-27.12-35,4,4,0,0,1-7.75-2,36,36,0,1,1,54,39.48c10.81,3.85,20.51,12,27.31,23.48A4,4,0,0,1,237,147.44ZM187.46,214a4,4,0,0,1-1.46,5.46,3.93,3.93,0,0,1-2,.54,4,4,0,0,1-3.46-2,61,61,0,0,0-105.08,0,4,4,0,0,1-6.92-4,68.35,68.35,0,0,1,39.19-31,44,44,0,1,1,40.54,0A68.35,68.35,0,0,1,187.46,214ZM128,180a36,36,0,1,0-36-36A36,36,0,0,0,128,180ZM64,116A28,28,0,1,1,91.12,81a4,4,0,0,0,7.75-2A36,36,0,1,0,45.3,118.75,63.55,63.55,0,0,0,12.8,141.6a4,4,0,0,0,6.4,4.8A55.55,55.55,0,0,1,64,124a4,4,0,0,0,0-8Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M249.45,69.31a12,12,0,0,0-12.51,1L212,88.43V72a20,20,0,0,0-20-20H32A20,20,0,0,0,12,72V184a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V167.57l24.94,18.14A12,12,0,0,0,256,176V80A12,12,0,0,0,249.45,69.31ZM188,180H36V76H188Zm44-27.57-20-14.54V118.11l20-14.54Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M200,72V184a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V72a8,8,0,0,1,8-8H192A8,8,0,0,1,200,72Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M251.77,73a8,8,0,0,0-8.21.39L208,97.05V72a16,16,0,0,0-16-16H32A16,16,0,0,0,16,72V184a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V159l35.56,23.71A8,8,0,0,0,248,184a8,8,0,0,0,8-8V80A8,8,0,0,0,251.77,73ZM192,184H32V72H192V184Zm48-22.95-32-21.33V116.28L240,95Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M192,72V184a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V72A16,16,0,0,1,32,56H176A16,16,0,0,1,192,72Zm58,.25a8.23,8.23,0,0,0-6.63,1.22L209.78,95.86A4,4,0,0,0,208,99.19v57.62a4,4,0,0,0,1.78,3.33l33.78,22.52a8,8,0,0,0,8.58.19,8.33,8.33,0,0,0,3.86-7.17V80A8,8,0,0,0,250,72.25Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M250.83,74.71a6,6,0,0,0-6.16.3L206,100.79V72a14,14,0,0,0-14-14H32A14,14,0,0,0,18,72V184a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V155.21L244.67,181a6,6,0,0,0,9.33-5V80A6,6,0,0,0,250.83,74.71ZM194,184a2,2,0,0,1-2,2H32a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2H192a2,2,0,0,1,2,2Zm48-19.21-36-24V115.21l36-24Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M251.77,73a8,8,0,0,0-8.21.39L208,97.05V72a16,16,0,0,0-16-16H32A16,16,0,0,0,16,72V184a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V159l35.56,23.71A8,8,0,0,0,248,184a8,8,0,0,0,8-8V80A8,8,0,0,0,251.77,73ZM192,184H32V72H192V184Zm48-22.95-32-21.33V116.28L240,95Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M249.89,76.47a4,4,0,0,0-4.11.2L204,104.53V72a12,12,0,0,0-12-12H32A12,12,0,0,0,20,72V184a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V151.47l41.78,27.86A4,4,0,0,0,252,176V80A4,4,0,0,0,249.89,76.47ZM196,184a4,4,0,0,1-4,4H32a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4H192a4,4,0,0,1,4,4Zm48-15.47-40-26.67V114.14l40-26.67Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n  [\n    \"bold\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M249.45,69.31a12,12,0,0,0-12.51,1L212,88.43V72a20,20,0,0,0-20-20H123.88a12,12,0,0,0,0,24H188v68a12,12,0,0,0,4.46,9.33c.15.13.31.25.48.38l44,32A12,12,0,0,0,256,176V80A12,12,0,0,0,249.45,69.31ZM232,152.43l-20-14.54V118.11l20-14.54ZM56.88,31.93A12,12,0,1,0,39.12,48.07L42.69,52H32A20,20,0,0,0,12,72V184a20,20,0,0,0,20,20H180.87l18.25,20.07a12,12,0,0,0,17.76-16.14ZM36,180V76H64.51l94.55,104Z\" }))\n  ],\n  [\n    \"duotone\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n      \"path\",\n      {\n        d: \"M200,72V184a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V72a8,8,0,0,1,8-8H192A8,8,0,0,1,200,72Z\",\n        opacity: \"0.2\"\n      }\n    ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M251.77,73a8,8,0,0,0-8.21.39L208,97.05V72a16,16,0,0,0-16-16H113.06a8,8,0,0,0,0,16H192v87.63a8,8,0,0,0,16,0V159l35.56,23.71A8,8,0,0,0,248,184a8,8,0,0,0,8-8V80A8,8,0,0,0,251.77,73ZM240,161.05l-32-21.33V116.28L240,95ZM53.92,34.62A8,8,0,1,0,42.08,45.38L51.73,56H32A16,16,0,0,0,16,72V184a16,16,0,0,0,16,16H182.64l19.44,21.38a8,8,0,1,0,11.84-10.76ZM32,184V72H66.28L168.1,184Z\" }))\n  ],\n  [\n    \"fill\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M256,80.23v95.45a8.33,8.33,0,0,1-3.86,7.17,8,8,0,0,1-8.58-.19l-33.78-22.52a4,4,0,0,1-1.78-3.33V99.19a4,4,0,0,1,1.78-3.32l33.78-22.53a8,8,0,0,1,9.73.66A8.23,8.23,0,0,1,256,80.23ZM53.92,34.62A8,8,0,1,0,42.08,45.38L51.73,56H32A16,16,0,0,0,16,72V184a16,16,0,0,0,16,16H182.64l19.44,21.38a8,8,0,1,0,11.84-10.76ZM185,155.07a4,4,0,0,0,7-2.7V72a16,16,0,0,0-16-16H104a4,4,0,0,0-3,6.69Z\" }))\n  ],\n  [\n    \"light\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M250.83,74.71a6,6,0,0,0-6.16.3L206,100.79V72a14,14,0,0,0-14-14H113.06a6,6,0,0,0,0,12H192a2,2,0,0,1,2,2v87.63a6,6,0,0,0,12,0v-4.42L244.67,181a6,6,0,0,0,9.33-5V80A6,6,0,0,0,250.83,74.71ZM242,164.79l-36-24V115.21l36-24ZM52.44,36A6,6,0,0,0,43.56,44L56.25,58H32A14,14,0,0,0,18,72V184a14,14,0,0,0,14,14H183.53l20,22a6,6,0,0,0,8.88-8.08ZM32,186a2,2,0,0,1-2-2V72a2,2,0,0,1,2-2H67.16L172.62,186Z\" }))\n  ],\n  [\n    \"regular\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M251.77,73a8,8,0,0,0-8.21.39L208,97.05V72a16,16,0,0,0-16-16H113.06a8,8,0,0,0,0,16H192v87.63a8,8,0,0,0,16,0V159l35.56,23.71A8,8,0,0,0,248,184a8,8,0,0,0,8-8V80A8,8,0,0,0,251.77,73ZM240,161.05l-32-21.33V116.28L240,95ZM53.92,34.62A8,8,0,1,0,42.08,45.38L51.73,56H32A16,16,0,0,0,16,72V184a16,16,0,0,0,16,16H182.64l19.44,21.38a8,8,0,1,0,11.84-10.76ZM32,184V72H66.28L168.1,184Z\" }))\n  ],\n  [\n    \"thin\",\n    /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M249.89,76.47a4,4,0,0,0-4.11.2L204,104.53V72a12,12,0,0,0-12-12H113.06a4,4,0,0,0,0,8H192a4,4,0,0,1,4,4v87.63a4,4,0,0,0,8,0v-8.16l41.78,27.86A4,4,0,0,0,252,176V80A4,4,0,0,0,249.89,76.47ZM244,168.53l-40-26.67V114.14l40-26.67ZM51,37.31A4,4,0,0,0,45,42.69L60.78,60H32A12,12,0,0,0,20,72V184a12,12,0,0,0,12,12H184.41L205,218.69a4,4,0,1,0,5.92-5.38ZM32,188a4,4,0,0,1-4-4V72a4,4,0,0,1,4-4H68.05L177.14,188Z\" }))\n  ]\n]);\nexport {\n  e as default\n};\n","import * as e from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/ArrowBendUpLeft.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(n, { ref: t, ...r, weights: a }));\no.displayName = \"ArrowBendUpLeftIcon\";\nconst p = o;\nexport {\n  p as ArrowBendUpLeft,\n  o as ArrowBendUpLeftIcon\n};\n","import * as o from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/ArrowBendUpRight.es.js\";\nconst r = o.forwardRef((e, t) => /* @__PURE__ */ o.createElement(n, { ref: t, ...e, weights: a }));\nr.displayName = \"ArrowBendUpRightIcon\";\nconst p = r;\nexport {\n  p as ArrowBendUpRight,\n  r as ArrowBendUpRightIcon\n};\n","import * as o from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/ArrowDown.es.js\";\nconst r = o.forwardRef((e, t) => /* @__PURE__ */ o.createElement(n, { ref: t, ...e, weights: a }));\nr.displayName = \"ArrowDownIcon\";\nconst c = r;\nexport {\n  c as ArrowDown,\n  r as ArrowDownIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport f from \"../defs/ArrowLeft.es.js\";\nconst r = o.forwardRef((e, t) => /* @__PURE__ */ o.createElement(a, { ref: t, ...e, weights: f }));\nr.displayName = \"ArrowLeftIcon\";\nconst s = r;\nexport {\n  s as ArrowLeft,\n  r as ArrowLeftIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/ArrowRight.es.js\";\nconst r = o.forwardRef((t, e) => /* @__PURE__ */ o.createElement(a, { ref: e, ...t, weights: i }));\nr.displayName = \"ArrowRightIcon\";\nconst s = r;\nexport {\n  s as ArrowRight,\n  r as ArrowRightIcon\n};\n","import * as r from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/ArrowSquareOut.es.js\";\nconst o = r.forwardRef((e, t) => /* @__PURE__ */ r.createElement(a, { ref: t, ...e, weights: m }));\no.displayName = \"ArrowSquareOutIcon\";\nconst n = o;\nexport {\n  n as ArrowSquareOut,\n  o as ArrowSquareOutIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/ArrowUp.es.js\";\nconst r = o.forwardRef((e, t) => /* @__PURE__ */ o.createElement(a, { ref: t, ...e, weights: m }));\nr.displayName = \"ArrowUpIcon\";\nconst s = r;\nexport {\n  s as ArrowUp,\n  r as ArrowUpIcon\n};\n","import * as o from \"react\";\nimport c from \"../lib/IconBase.es.js\";\nimport t from \"../defs/ArrowsClockwise.es.js\";\nconst r = o.forwardRef((e, s) => /* @__PURE__ */ o.createElement(c, { ref: s, ...e, weights: t }));\nr.displayName = \"ArrowsClockwiseIcon\";\nconst m = r;\nexport {\n  m as ArrowsClockwise,\n  r as ArrowsClockwiseIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport n from \"../defs/ArrowsDownUp.es.js\";\nconst r = o.forwardRef((e, s) => /* @__PURE__ */ o.createElement(t, { ref: s, ...e, weights: n }));\nr.displayName = \"ArrowsDownUpIcon\";\nconst p = r;\nexport {\n  p as ArrowsDownUp,\n  r as ArrowsDownUpIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/At.es.js\";\nconst t = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(a, { ref: r, ...e, weights: m }));\nt.displayName = \"AtIcon\";\nconst n = t;\nexport {\n  n as At,\n  t as AtIcon\n};\n","import * as a from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport s from \"../defs/Basketball.es.js\";\nconst e = a.forwardRef((o, t) => /* @__PURE__ */ a.createElement(r, { ref: t, ...o, weights: s }));\ne.displayName = \"BasketballIcon\";\nconst c = e;\nexport {\n  c as Basketball,\n  e as BasketballIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport l from \"../defs/Bell.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: l }));\no.displayName = \"BellIcon\";\nconst s = o;\nexport {\n  s as Bell,\n  o as BellIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport t from \"../defs/BellRinging.es.js\";\nconst o = e.forwardRef((n, i) => /* @__PURE__ */ e.createElement(r, { ref: i, ...n, weights: t }));\no.displayName = \"BellRingingIcon\";\nconst m = o;\nexport {\n  m as BellRinging,\n  o as BellRingingIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport s from \"../defs/BellSlash.es.js\";\nconst o = e.forwardRef((a, l) => /* @__PURE__ */ e.createElement(r, { ref: l, ...a, weights: s }));\no.displayName = \"BellSlashIcon\";\nconst c = o;\nexport {\n  c as BellSlash,\n  o as BellSlashIcon\n};\n","import * as o from \"react\";\nimport e from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Bookmark.es.js\";\nconst r = o.forwardRef((a, m) => /* @__PURE__ */ o.createElement(e, { ref: m, ...a, weights: t }));\nr.displayName = \"BookmarkIcon\";\nconst k = r;\nexport {\n  k as Bookmark,\n  r as BookmarkIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport f from \"../defs/CaretLeft.es.js\";\nconst t = e.forwardRef((o, r) => /* @__PURE__ */ e.createElement(a, { ref: r, ...o, weights: f }));\nt.displayName = \"CaretLeftIcon\";\nconst s = t;\nexport {\n  s as CaretLeft,\n  t as CaretLeftIcon\n};\n","import * as t from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/CaretRight.es.js\";\nconst e = t.forwardRef((o, r) => /* @__PURE__ */ t.createElement(a, { ref: r, ...o, weights: i }));\ne.displayName = \"CaretRightIcon\";\nconst s = e;\nexport {\n  s as CaretRight,\n  e as CaretRightIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/CaretUp.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: m }));\no.displayName = \"CaretUpIcon\";\nconst s = o;\nexport {\n  s as CaretUp,\n  o as CaretUpIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport c from \"../defs/ChatCircle.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: c }));\no.displayName = \"ChatCircleIcon\";\nconst s = o;\nexport {\n  s as ChatCircle,\n  o as ChatCircleIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport c from \"../defs/ChatCircleDots.es.js\";\nconst t = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(a, { ref: r, ...e, weights: c }));\nt.displayName = \"ChatCircleDotsIcon\";\nconst m = t;\nexport {\n  m as ChatCircleDots,\n  t as ChatCircleDotsIcon\n};\n","import * as o from \"react\";\nimport e from \"../lib/IconBase.es.js\";\nimport s from \"../defs/ChatTeardropDots.es.js\";\nconst r = o.forwardRef((t, a) => /* @__PURE__ */ o.createElement(e, { ref: a, ...t, weights: s }));\nr.displayName = \"ChatTeardropDotsIcon\";\nconst c = r;\nexport {\n  c as ChatTeardropDots,\n  r as ChatTeardropDotsIcon\n};\n","import * as t from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport m from \"../defs/ChatText.es.js\";\nconst e = t.forwardRef((o, a) => /* @__PURE__ */ t.createElement(r, { ref: a, ...o, weights: m }));\ne.displayName = \"ChatTextIcon\";\nconst n = e;\nexport {\n  n as ChatText,\n  e as ChatTextIcon\n};\n","import * as o from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport s from \"../defs/Chats.es.js\";\nconst t = o.forwardRef((a, e) => /* @__PURE__ */ o.createElement(r, { ref: e, ...a, weights: s }));\nt.displayName = \"ChatsIcon\";\nconst n = t;\nexport {\n  n as Chats,\n  t as ChatsIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Check.es.js\";\nconst o = e.forwardRef((c, r) => /* @__PURE__ */ e.createElement(t, { ref: r, ...c, weights: a }));\no.displayName = \"CheckIcon\";\nconst n = o;\nexport {\n  n as Check,\n  o as CheckIcon\n};\n","import * as e from \"react\";\nimport c from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Checkerboard.es.js\";\nconst o = e.forwardRef((r, a) => /* @__PURE__ */ e.createElement(c, { ref: a, ...r, weights: t }));\no.displayName = \"CheckerboardIcon\";\nconst n = o;\nexport {\n  n as Checkerboard,\n  o as CheckerboardIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Checks.es.js\";\nconst o = e.forwardRef((c, r) => /* @__PURE__ */ e.createElement(s, { ref: r, ...c, weights: t }));\no.displayName = \"ChecksIcon\";\nconst n = o;\nexport {\n  n as Checks,\n  o as ChecksIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Clock.es.js\";\nconst c = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...e, weights: a }));\nc.displayName = \"ClockIcon\";\nconst n = c;\nexport {\n  n as Clock,\n  c as ClockIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport s from \"../defs/ClockCounterClockwise.es.js\";\nconst e = o.forwardRef((c, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...c, weights: s }));\ne.displayName = \"ClockCounterClockwiseIcon\";\nconst a = e;\nexport {\n  a as ClockCounterClockwise,\n  e as ClockCounterClockwiseIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/CodeBlock.es.js\";\nconst e = o.forwardRef((c, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...c, weights: a }));\ne.displayName = \"CodeBlockIcon\";\nconst n = e;\nexport {\n  n as CodeBlock,\n  e as CodeBlockIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Code.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(a, { ref: t, ...r, weights: m }));\ne.displayName = \"CodeIcon\";\nconst n = e;\nexport {\n  n as Code,\n  e as CodeIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Coffee.es.js\";\nconst o = e.forwardRef((f, r) => /* @__PURE__ */ e.createElement(t, { ref: r, ...f, weights: a }));\no.displayName = \"CoffeeIcon\";\nconst s = o;\nexport {\n  s as Coffee,\n  o as CoffeeIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Copy.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(a, { ref: t, ...r, weights: m }));\ne.displayName = \"CopyIcon\";\nconst s = e;\nexport {\n  s as Copy,\n  e as CopyIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Cross.es.js\";\nconst r = o.forwardRef((s, e) => /* @__PURE__ */ o.createElement(t, { ref: e, ...s, weights: a }));\nr.displayName = \"CrossIcon\";\nconst n = r;\nexport {\n  n as Cross,\n  r as CrossIcon\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Desktop.es.js\";\nconst e = o.forwardRef((t, r) => /* @__PURE__ */ o.createElement(s, { ref: r, ...t, weights: a }));\ne.displayName = \"DesktopIcon\";\nconst c = e;\nexport {\n  c as Desktop,\n  e as DesktopIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Devices.es.js\";\nconst o = e.forwardRef((c, r) => /* @__PURE__ */ e.createElement(s, { ref: r, ...c, weights: t }));\no.displayName = \"DevicesIcon\";\nconst m = o;\nexport {\n  m as Devices,\n  o as DevicesIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/DotsSixVertical.es.js\";\nconst t = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(a, { ref: r, ...e, weights: i }));\nt.displayName = \"DotsSixVerticalIcon\";\nconst m = t;\nexport {\n  m as DotsSixVertical,\n  t as DotsSixVerticalIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport a from \"../defs/DotsThree.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(s, { ref: t, ...r, weights: a }));\no.displayName = \"DotsThreeIcon\";\nconst n = o;\nexport {\n  n as DotsThree,\n  o as DotsThreeIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/DotsThreeOutlineVertical.es.js\";\nconst t = e.forwardRef((o, r) => /* @__PURE__ */ e.createElement(a, { ref: r, ...o, weights: i }));\nt.displayName = \"DotsThreeOutlineVerticalIcon\";\nconst n = t;\nexport {\n  n as DotsThreeOutlineVertical,\n  t as DotsThreeOutlineVerticalIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport n from \"../defs/Download.es.js\";\nconst a = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...e, weights: n }));\na.displayName = \"DownloadIcon\";\nconst s = a;\nexport {\n  s as Download,\n  a as DownloadIcon\n};\n","import * as o from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport t from \"../defs/DownloadSimple.es.js\";\nconst e = o.forwardRef((a, m) => /* @__PURE__ */ o.createElement(r, { ref: m, ...a, weights: t }));\ne.displayName = \"DownloadSimpleIcon\";\nconst l = e;\nexport {\n  l as DownloadSimple,\n  e as DownloadSimpleIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport t from \"../defs/EnvelopeSimple.es.js\";\nconst o = e.forwardRef((m, p) => /* @__PURE__ */ e.createElement(r, { ref: p, ...m, weights: t }));\no.displayName = \"EnvelopeSimpleIcon\";\nconst i = o;\nexport {\n  i as EnvelopeSimple,\n  o as EnvelopeSimpleIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/File.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: i }));\no.displayName = \"FileIcon\";\nconst s = o;\nexport {\n  s as File,\n  o as FileIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Flag.es.js\";\nconst a = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...e, weights: m }));\na.displayName = \"FlagIcon\";\nconst n = a;\nexport {\n  n as Flag,\n  a as FlagIcon\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Flask.es.js\";\nconst a = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(s, { ref: r, ...e, weights: t }));\na.displayName = \"FlaskIcon\";\nconst n = a;\nexport {\n  n as Flask,\n  a as FlaskIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Funnel.es.js\";\nconst o = e.forwardRef((n, r) => /* @__PURE__ */ e.createElement(t, { ref: r, ...n, weights: a }));\no.displayName = \"FunnelIcon\";\nconst s = o;\nexport {\n  s as Funnel,\n  o as FunnelIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport i from \"../defs/GearSix.es.js\";\nconst o = e.forwardRef((r, a) => /* @__PURE__ */ e.createElement(t, { ref: a, ...r, weights: i }));\no.displayName = \"GearSixIcon\";\nconst s = o;\nexport {\n  s as GearSix,\n  o as GearSixIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport f from \"../defs/Gif.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(a, { ref: t, ...r, weights: f }));\ne.displayName = \"GifIcon\";\nconst c = e;\nexport {\n  c as Gif,\n  e as GifIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Globe.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(a, { ref: t, ...r, weights: m }));\ne.displayName = \"GlobeIcon\";\nconst n = e;\nexport {\n  n as Globe,\n  e as GlobeIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/GridFour.es.js\";\nconst r = o.forwardRef((e, t) => /* @__PURE__ */ o.createElement(a, { ref: t, ...e, weights: i }));\nr.displayName = \"GridFourIcon\";\nconst s = r;\nexport {\n  s as GridFour,\n  r as GridFourIcon\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Hash.es.js\";\nconst a = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(s, { ref: r, ...e, weights: t }));\na.displayName = \"HashIcon\";\nconst n = a;\nexport {\n  n as Hash,\n  a as HashIcon\n};\n","import * as t from \"react\";\nimport e from \"../lib/IconBase.es.js\";\nimport s from \"../defs/HashStraight.es.js\";\nconst a = t.forwardRef((o, r) => /* @__PURE__ */ t.createElement(e, { ref: r, ...o, weights: s }));\na.displayName = \"HashStraightIcon\";\nconst c = a;\nexport {\n  c as HashStraight,\n  a as HashStraightIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Headphones.es.js\";\nconst o = e.forwardRef((a, r) => /* @__PURE__ */ e.createElement(s, { ref: r, ...a, weights: t }));\no.displayName = \"HeadphonesIcon\";\nconst p = o;\nexport {\n  p as Headphones,\n  o as HeadphonesIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Heart.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: m }));\no.displayName = \"HeartIcon\";\nconst n = o;\nexport {\n  n as Heart,\n  o as HeartIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/House.es.js\";\nconst e = o.forwardRef((r, s) => /* @__PURE__ */ o.createElement(t, { ref: s, ...r, weights: a }));\ne.displayName = \"HouseIcon\";\nconst n = e;\nexport {\n  n as House,\n  e as HouseIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Image.es.js\";\nconst o = e.forwardRef((a, m) => /* @__PURE__ */ e.createElement(r, { ref: m, ...a, weights: t }));\no.displayName = \"ImageIcon\";\nconst I = o;\nexport {\n  I as Image,\n  o as ImageIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport s from \"../defs/Images.es.js\";\nconst o = e.forwardRef((a, m) => /* @__PURE__ */ e.createElement(r, { ref: m, ...a, weights: s }));\no.displayName = \"ImagesIcon\";\nconst I = o;\nexport {\n  I as Images,\n  o as ImagesIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Keyboard.es.js\";\nconst e = o.forwardRef((r, a) => /* @__PURE__ */ o.createElement(t, { ref: a, ...r, weights: m }));\ne.displayName = \"KeyboardIcon\";\nconst n = e;\nexport {\n  n as Keyboard,\n  e as KeyboardIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport f from \"../defs/Leaf.es.js\";\nconst o = e.forwardRef((a, r) => /* @__PURE__ */ e.createElement(t, { ref: r, ...a, weights: f }));\no.displayName = \"LeafIcon\";\nconst s = o;\nexport {\n  s as Leaf,\n  o as LeafIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/Lightbulb.es.js\";\nconst t = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(a, { ref: r, ...e, weights: i }));\nt.displayName = \"LightbulbIcon\";\nconst s = t;\nexport {\n  s as Lightbulb,\n  t as LightbulbIcon\n};\n","import * as o from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Link.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(n, { ref: t, ...r, weights: a }));\ne.displayName = \"LinkIcon\";\nconst c = e;\nexport {\n  c as Link,\n  e as LinkIcon\n};\n","import * as t from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport a from \"../defs/ListBullets.es.js\";\nconst e = t.forwardRef((o, s) => /* @__PURE__ */ t.createElement(r, { ref: s, ...o, weights: a }));\ne.displayName = \"ListBulletsIcon\";\nconst m = e;\nexport {\n  m as ListBullets,\n  e as ListBulletsIcon\n};\n","import * as s from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport n from \"../defs/ListMagnifyingGlass.es.js\";\nconst a = s.forwardRef((i, o) => /* @__PURE__ */ s.createElement(t, { ref: o, ...i, weights: n }));\na.displayName = \"ListMagnifyingGlassIcon\";\nconst f = a;\nexport {\n  f as ListMagnifyingGlass,\n  a as ListMagnifyingGlassIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport m from \"../defs/ListNumbers.es.js\";\nconst o = e.forwardRef((r, s) => /* @__PURE__ */ e.createElement(t, { ref: s, ...r, weights: m }));\no.displayName = \"ListNumbersIcon\";\nconst c = o;\nexport {\n  c as ListNumbers,\n  o as ListNumbersIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Lock.es.js\";\nconst c = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...e, weights: a }));\nc.displayName = \"LockIcon\";\nconst n = c;\nexport {\n  n as Lock,\n  c as LockIcon\n};\n","import * as a from \"react\";\nimport i from \"../lib/IconBase.es.js\";\nimport e from \"../defs/MagnifyingGlass.es.js\";\nconst o = a.forwardRef((s, n) => /* @__PURE__ */ a.createElement(i, { ref: n, ...s, weights: e }));\no.displayName = \"MagnifyingGlassIcon\";\nconst f = o;\nexport {\n  f as MagnifyingGlass,\n  o as MagnifyingGlassIcon\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/MapPinPlus.es.js\";\nconst a = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(s, { ref: r, ...e, weights: t }));\na.displayName = \"MapPinPlusIcon\";\nconst m = a;\nexport {\n  m as MapPinPlus,\n  a as MapPinPlusIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport n from \"../defs/Microphone.es.js\";\nconst e = o.forwardRef((r, c) => /* @__PURE__ */ o.createElement(t, { ref: c, ...r, weights: n }));\ne.displayName = \"MicrophoneIcon\";\nconst m = e;\nexport {\n  m as Microphone,\n  e as MicrophoneIcon\n};\n","import * as o from \"react\";\nimport c from \"../lib/IconBase.es.js\";\nimport s from \"../defs/MicrophoneSlash.es.js\";\nconst e = o.forwardRef((r, a) => /* @__PURE__ */ o.createElement(c, { ref: a, ...r, weights: s }));\ne.displayName = \"MicrophoneSlashIcon\";\nconst i = e;\nexport {\n  i as MicrophoneSlash,\n  e as MicrophoneSlashIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport n from \"../defs/Minus.es.js\";\nconst e = o.forwardRef((r, s) => /* @__PURE__ */ o.createElement(t, { ref: s, ...r, weights: n }));\ne.displayName = \"MinusIcon\";\nconst m = e;\nexport {\n  m as Minus,\n  e as MinusIcon\n};\n","import * as o from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/MonitorArrowUp.es.js\";\nconst r = o.forwardRef((t, e) => /* @__PURE__ */ o.createElement(n, { ref: e, ...t, weights: a }));\nr.displayName = \"MonitorArrowUpIcon\";\nconst p = r;\nexport {\n  p as MonitorArrowUp,\n  r as MonitorArrowUpIcon\n};\n","import * as o from \"react\";\nimport e from \"../lib/IconBase.es.js\";\nimport s from \"../defs/PaintBrush.es.js\";\nconst r = o.forwardRef((t, a) => /* @__PURE__ */ o.createElement(e, { ref: a, ...t, weights: s }));\nr.displayName = \"PaintBrushIcon\";\nconst m = r;\nexport {\n  m as PaintBrush,\n  r as PaintBrushIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Palette.es.js\";\nconst t = e.forwardRef((o, a) => /* @__PURE__ */ e.createElement(r, { ref: a, ...o, weights: m }));\nt.displayName = \"PaletteIcon\";\nconst n = t;\nexport {\n  n as Palette,\n  t as PaletteIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport n from \"../defs/PaperPlaneTilt.es.js\";\nconst a = e.forwardRef((o, r) => /* @__PURE__ */ e.createElement(t, { ref: r, ...o, weights: n }));\na.displayName = \"PaperPlaneTiltIcon\";\nconst m = a;\nexport {\n  m as PaperPlaneTilt,\n  a as PaperPlaneTiltIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Pause.es.js\";\nconst o = e.forwardRef((a, r) => /* @__PURE__ */ e.createElement(s, { ref: r, ...a, weights: t }));\no.displayName = \"PauseIcon\";\nconst n = o;\nexport {\n  n as Pause,\n  o as PauseIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Peace.es.js\";\nconst o = e.forwardRef((a, c) => /* @__PURE__ */ e.createElement(r, { ref: c, ...a, weights: t }));\no.displayName = \"PeaceIcon\";\nconst n = o;\nexport {\n  n as Peace,\n  o as PeaceIcon\n};\n","import * as e from \"react\";\nimport c from \"../lib/IconBase.es.js\";\nimport r from \"../defs/PencilSimple.es.js\";\nconst o = e.forwardRef((i, m) => /* @__PURE__ */ e.createElement(c, { ref: m, ...i, weights: r }));\no.displayName = \"PencilSimpleIcon\";\nconst a = o;\nexport {\n  a as PencilSimple,\n  o as PencilSimpleIcon\n};\n","import * as e from \"react\";\nimport m from \"../lib/IconBase.es.js\";\nimport c from \"../defs/PersonSimpleCircle.es.js\";\nconst o = e.forwardRef((r, i) => /* @__PURE__ */ e.createElement(m, { ref: i, ...r, weights: c }));\no.displayName = \"PersonSimpleCircleIcon\";\nconst n = o;\nexport {\n  n as PersonSimpleCircle,\n  o as PersonSimpleCircleIcon\n};\n","import * as o from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Phone.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(n, { ref: t, ...r, weights: a }));\ne.displayName = \"PhoneIcon\";\nconst s = e;\nexport {\n  s as Phone,\n  e as PhoneIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport r from \"../defs/PhoneDisconnect.es.js\";\nconst e = o.forwardRef((n, c) => /* @__PURE__ */ o.createElement(t, { ref: c, ...n, weights: r }));\ne.displayName = \"PhoneDisconnectIcon\";\nconst i = e;\nexport {\n  i as PhoneDisconnect,\n  e as PhoneDisconnectIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Play.es.js\";\nconst a = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...e, weights: m }));\na.displayName = \"PlayIcon\";\nconst n = a;\nexport {\n  n as Play,\n  a as PlayIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Plus.es.js\";\nconst e = o.forwardRef((r, s) => /* @__PURE__ */ o.createElement(t, { ref: s, ...r, weights: a }));\ne.displayName = \"PlusIcon\";\nconst n = e;\nexport {\n  n as Plus,\n  e as PlusIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/PlusCircle.es.js\";\nconst o = e.forwardRef((r, c) => /* @__PURE__ */ e.createElement(s, { ref: c, ...r, weights: t }));\no.displayName = \"PlusCircleIcon\";\nconst l = o;\nexport {\n  l as PlusCircle,\n  o as PlusCircleIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport n from \"../defs/PushPin.es.js\";\nconst e = o.forwardRef((r, s) => /* @__PURE__ */ o.createElement(t, { ref: s, ...r, weights: n }));\ne.displayName = \"PushPinIcon\";\nconst m = e;\nexport {\n  m as PushPin,\n  e as PushPinIcon\n};\n","import * as o from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport t from \"../defs/PushPinSlash.es.js\";\nconst s = o.forwardRef((a, e) => /* @__PURE__ */ o.createElement(r, { ref: e, ...a, weights: t }));\ns.displayName = \"PushPinSlashIcon\";\nconst m = s;\nexport {\n  m as PushPinSlash,\n  s as PushPinSlashIcon\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Quotes.es.js\";\nconst e = o.forwardRef((t, r) => /* @__PURE__ */ o.createElement(s, { ref: r, ...t, weights: a }));\ne.displayName = \"QuotesIcon\";\nconst n = e;\nexport {\n  n as Quotes,\n  e as QuotesIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/ShareNetwork.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: m }));\no.displayName = \"ShareNetworkIcon\";\nconst n = o;\nexport {\n  n as ShareNetwork,\n  o as ShareNetworkIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/Shield.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: i }));\no.displayName = \"ShieldIcon\";\nconst s = o;\nexport {\n  s as Shield,\n  o as ShieldIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/ShieldWarning.es.js\";\nconst o = e.forwardRef((r, n) => /* @__PURE__ */ e.createElement(a, { ref: n, ...r, weights: i }));\no.displayName = \"ShieldWarningIcon\";\nconst c = o;\nexport {\n  c as ShieldWarning,\n  o as ShieldWarningIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/SignIn.es.js\";\nconst n = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...e, weights: a }));\nn.displayName = \"SignInIcon\";\nconst c = n;\nexport {\n  c as SignIn,\n  n as SignInIcon\n};\n","import * as o from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/SignOut.es.js\";\nconst t = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(n, { ref: r, ...e, weights: a }));\nt.displayName = \"SignOutIcon\";\nconst c = t;\nexport {\n  c as SignOut,\n  t as SignOutIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Smiley.es.js\";\nconst o = e.forwardRef((m, r) => /* @__PURE__ */ e.createElement(t, { ref: r, ...m, weights: a }));\no.displayName = \"SmileyIcon\";\nconst s = o;\nexport {\n  s as Smiley,\n  o as SmileyIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport t from \"../defs/SmileySad.es.js\";\nconst o = e.forwardRef((a, m) => /* @__PURE__ */ e.createElement(r, { ref: m, ...a, weights: t }));\no.displayName = \"SmileySadIcon\";\nconst s = o;\nexport {\n  s as SmileySad,\n  o as SmileySadIcon\n};\n","import * as o from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport c from \"../defs/SortAscending.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(n, { ref: t, ...r, weights: c }));\ne.displayName = \"SortAscendingIcon\";\nconst i = e;\nexport {\n  i as SortAscending,\n  e as SortAscendingIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport i from \"../defs/SpeakerHigh.es.js\";\nconst o = e.forwardRef((r, a) => /* @__PURE__ */ e.createElement(t, { ref: a, ...r, weights: i }));\no.displayName = \"SpeakerHighIcon\";\nconst c = o;\nexport {\n  c as SpeakerHigh,\n  o as SpeakerHighIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/SpeakerSlash.es.js\";\nconst a = e.forwardRef((o, r) => /* @__PURE__ */ e.createElement(s, { ref: r, ...o, weights: t }));\na.displayName = \"SpeakerSlashIcon\";\nconst c = a;\nexport {\n  c as SpeakerSlash,\n  a as SpeakerSlashIcon\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/SquaresFour.es.js\";\nconst r = o.forwardRef((e, a) => /* @__PURE__ */ o.createElement(s, { ref: a, ...e, weights: t }));\nr.displayName = \"SquaresFourIcon\";\nconst n = r;\nexport {\n  n as SquaresFour,\n  r as SquaresFourIcon\n};\n","import * as o from \"react\";\nimport e from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Star.es.js\";\nconst r = o.forwardRef((t, a) => /* @__PURE__ */ o.createElement(e, { ref: a, ...t, weights: m }));\nr.displayName = \"StarIcon\";\nconst n = r;\nexport {\n  n as Star,\n  r as StarIcon\n};\n","import * as e from \"react\";\nimport c from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Sticker.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(c, { ref: t, ...r, weights: a }));\no.displayName = \"StickerIcon\";\nconst s = o;\nexport {\n  s as Sticker,\n  o as StickerIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Stop.es.js\";\nconst t = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(a, { ref: r, ...e, weights: m }));\nt.displayName = \"StopIcon\";\nconst s = t;\nexport {\n  s as Stop,\n  t as StopIcon\n};\n","import * as o from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Sun.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(n, { ref: t, ...r, weights: a }));\ne.displayName = \"SunIcon\";\nconst s = e;\nexport {\n  s as Sun,\n  e as SunIcon\n};\n","import * as e from \"react\";\nimport m from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Terminal.es.js\";\nconst o = e.forwardRef((r, a) => /* @__PURE__ */ e.createElement(m, { ref: a, ...r, weights: t }));\no.displayName = \"TerminalIcon\";\nconst c = o;\nexport {\n  c as Terminal,\n  o as TerminalIcon\n};\n","import * as e from \"react\";\nimport r from \"../lib/IconBase.es.js\";\nimport m from \"../defs/TextAa.es.js\";\nconst o = e.forwardRef((t, a) => /* @__PURE__ */ e.createElement(r, { ref: a, ...t, weights: m }));\no.displayName = \"TextAaIcon\";\nconst n = o;\nexport {\n  n as TextAa,\n  o as TextAaIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport c from \"../defs/TextB.es.js\";\nconst o = e.forwardRef((t, r) => /* @__PURE__ */ e.createElement(a, { ref: r, ...t, weights: c }));\no.displayName = \"TextBIcon\";\nconst n = o;\nexport {\n  n as TextB,\n  o as TextBIcon,\n  o as TextBolderIcon\n};\n","import * as e from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/TextHOne.es.js\";\nconst o = e.forwardRef((t, r) => /* @__PURE__ */ e.createElement(n, { ref: r, ...t, weights: a }));\no.displayName = \"TextHOneIcon\";\nconst s = o;\nexport {\n  s as TextHOne,\n  o as TextHOneIcon\n};\n","import * as e from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/TextHThree.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(a, { ref: t, ...r, weights: m }));\no.displayName = \"TextHThreeIcon\";\nconst n = o;\nexport {\n  n as TextHThree,\n  o as TextHThreeIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/TextHTwo.es.js\";\nconst e = o.forwardRef((t, r) => /* @__PURE__ */ o.createElement(a, { ref: r, ...t, weights: m }));\ne.displayName = \"TextHTwoIcon\";\nconst n = e;\nexport {\n  n as TextHTwo,\n  e as TextHTwoIcon\n};\n","import * as t from \"react\";\nimport c from \"../lib/IconBase.es.js\";\nimport r from \"../defs/TextItalic.es.js\";\nconst e = t.forwardRef((o, a) => /* @__PURE__ */ t.createElement(c, { ref: a, ...o, weights: r }));\ne.displayName = \"TextItalicIcon\";\nconst s = e;\nexport {\n  s as TextItalic,\n  e as TextItalicIcon\n};\n","import * as t from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/TextStrikethrough.es.js\";\nconst e = t.forwardRef((o, r) => /* @__PURE__ */ t.createElement(a, { ref: r, ...o, weights: i }));\ne.displayName = \"TextStrikethroughIcon\";\nconst h = e;\nexport {\n  h as TextStrikethrough,\n  e as TextStrikethroughIcon\n};\n","import * as e from \"react\";\nimport n from \"../lib/IconBase.es.js\";\nimport a from \"../defs/TextUnderline.es.js\";\nconst o = e.forwardRef((r, t) => /* @__PURE__ */ e.createElement(n, { ref: t, ...r, weights: a }));\no.displayName = \"TextUnderlineIcon\";\nconst c = o;\nexport {\n  c as TextUnderline,\n  o as TextUnderlineIcon\n};\n","import * as o from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/Trash.es.js\";\nconst r = o.forwardRef((a, e) => /* @__PURE__ */ o.createElement(s, { ref: e, ...a, weights: t }));\nr.displayName = \"TrashIcon\";\nconst n = r;\nexport {\n  n as Trash,\n  r as TrashIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport m from \"../defs/Tray.es.js\";\nconst r = o.forwardRef((a, e) => /* @__PURE__ */ o.createElement(t, { ref: e, ...a, weights: m }));\nr.displayName = \"TrayIcon\";\nconst n = r;\nexport {\n  n as Tray,\n  r as TrayIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/UserCircle.es.js\";\nconst r = e.forwardRef((o, c) => /* @__PURE__ */ e.createElement(s, { ref: c, ...o, weights: t }));\nr.displayName = \"UserCircleIcon\";\nconst m = r;\nexport {\n  m as UserCircle,\n  r as UserCircleIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport n from \"../defs/UserMinus.es.js\";\nconst o = e.forwardRef((r, s) => /* @__PURE__ */ e.createElement(t, { ref: s, ...r, weights: n }));\no.displayName = \"UserMinusIcon\";\nconst m = o;\nexport {\n  m as UserMinus,\n  o as UserMinusIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/UserPlus.es.js\";\nconst o = e.forwardRef((r, s) => /* @__PURE__ */ e.createElement(t, { ref: s, ...r, weights: a }));\no.displayName = \"UserPlusIcon\";\nconst n = o;\nexport {\n  n as UserPlus,\n  o as UserPlusIcon\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/UsersThree.es.js\";\nconst r = e.forwardRef((o, s) => /* @__PURE__ */ e.createElement(t, { ref: s, ...o, weights: a }));\nr.displayName = \"UsersThreeIcon\";\nconst n = r;\nexport {\n  n as UsersThree,\n  r as UsersThreeIcon\n};\n","import * as e from \"react\";\nimport m from \"../lib/IconBase.es.js\";\nimport t from \"../defs/VideoCamera.es.js\";\nconst o = e.forwardRef((a, r) => /* @__PURE__ */ e.createElement(m, { ref: r, ...a, weights: t }));\no.displayName = \"VideoCameraIcon\";\nconst s = o;\nexport {\n  s as VideoCamera,\n  o as VideoCameraIcon\n};\n","import * as a from \"react\";\nimport m from \"../lib/IconBase.es.js\";\nimport s from \"../defs/VideoCameraSlash.es.js\";\nconst e = a.forwardRef((o, r) => /* @__PURE__ */ a.createElement(m, { ref: r, ...o, weights: s }));\ne.displayName = \"VideoCameraSlashIcon\";\nconst c = e;\nexport {\n  c as VideoCameraSlash,\n  e as VideoCameraSlashIcon\n};\n","export let MATRIX_TO_BASE = 'https://matrix.to/';\n\n/**\n * Override the default matrix.to base URL (configurable per deployment).\n * Must be called before any getMatrixTo* functions are used.\n */\nexport const setMatrixToBase = (baseUrl?: string): void => {\n  MATRIX_TO_BASE = baseUrl ? baseUrl.replace(/\\/?$/, '/') : 'https://matrix.to/';\n};\n\nexport const getMatrixToUser = (userId: string): string => `${MATRIX_TO_BASE}#/${userId}`;\n\nconst withViaServers = (fragment: string, viaServers: string[]): string =>\n  `${fragment}?${viaServers.map((server) => `via=${server}`).join('&')}`;\n\nexport const getMatrixToRoom = (roomIdOrAlias: string, viaServers?: string[]): string => {\n  let fragment = roomIdOrAlias;\n\n  if (Array.isArray(viaServers) && viaServers.length > 0) {\n    fragment = withViaServers(fragment, viaServers);\n  }\n\n  return `${MATRIX_TO_BASE}#/${fragment}`;\n};\n\nexport const getMatrixToRoomEvent = (\n  roomId: string,\n  eventId: string,\n  viaServers?: string[]\n): string => {\n  let fragment = `${roomId}/${eventId}`;\n\n  if (Array.isArray(viaServers) && viaServers.length > 0) {\n    fragment = withViaServers(fragment, viaServers);\n  }\n\n  return `${MATRIX_TO_BASE}#/${fragment}`;\n};\n\nexport type MatrixToRoom = {\n  roomIdOrAlias: string;\n  viaServers?: string[];\n};\n\nexport type MatrixToRoomEvent = MatrixToRoom & {\n  eventId: string;\n};\n\nconst escapeForRegex = (str: string): string => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n// Lazily cached regex set; rebuilt if MATRIX_TO_BASE changes.\nlet cachedRegexBase = '';\nlet cachedRegexes: {\n  any: RegExp;\n  user: RegExp;\n  room: RegExp;\n  event: RegExp;\n} | null = null;\n\n/**\n * Returns regexes that match BOTH https://matrix.to (for cross-client links\n * received from standard clients) and the configured custom base URL (if any).\n */\nconst getMatchRegexes = () => {\n  if (cachedRegexBase === MATRIX_TO_BASE && cachedRegexes) return cachedRegexes;\n  cachedRegexBase = MATRIX_TO_BASE;\n  // Use https? so both http:// and https://matrix.to are accepted (original behaviour).\n  const standard = `https?://${escapeForRegex('matrix.to/')}`;\n  const b =\n    MATRIX_TO_BASE !== 'https://matrix.to/'\n      ? `(?:${standard}|${escapeForRegex(MATRIX_TO_BASE)})`\n      : standard;\n  cachedRegexes = {\n    any: new RegExp(`^${b}\\\\S*$`),\n    user: new RegExp(`^${b}#/(@[^:\\\\s]+:[^?/\\\\s]+)\\\\/?$`),\n    room: new RegExp(`^${b}#/([#!][^?/\\\\s]+)\\\\/?(\\\\?[\\\\S]*)?$`),\n    event: new RegExp(`^${b}#/([#!][^?/\\\\s]+)/(\\\\$[^?/\\\\s]+)\\\\/?([?\\\\S]*)?$`),\n  };\n  return cachedRegexes;\n};\n\nexport const testMatrixTo = (href: string): boolean => getMatchRegexes().any.test(href);\n\n/** True when the URL is a matrix.to user, room, or event permalink (a mention), not an arbitrary link. */\nexport const isMatrixToMentionHref = (href: string): boolean => {\n  const trimmed = href.trim();\n  if (!testMatrixTo(trimmed)) return false;\n  return !!(\n    parseMatrixToUser(trimmed) ??\n    parseMatrixToRoom(trimmed) ??\n    parseMatrixToRoomEvent(trimmed)\n  );\n};\n\nexport const parseMatrixToUser = (href: string): string | undefined => {\n  const match = href.match(getMatchRegexes().user);\n  if (!match) return undefined;\n  return match[1];\n};\n\nexport const parseMatrixToRoom = (href: string): MatrixToRoom | undefined => {\n  const match = href.match(getMatchRegexes().room);\n  if (!match) return undefined;\n\n  const roomIdOrAlias = match[1];\n  const viaSearchStr = match[2];\n  if (!roomIdOrAlias) return undefined;\n  const viaServers = viaSearchStr ? new URLSearchParams(viaSearchStr).getAll('via') : [];\n\n  return {\n    roomIdOrAlias,\n    viaServers: viaServers.length === 0 ? undefined : viaServers,\n  };\n};\n\nexport const parseMatrixToRoomEvent = (href: string): MatrixToRoomEvent | undefined => {\n  const match = href.match(getMatchRegexes().event);\n  if (!match) return undefined;\n\n  const roomIdOrAlias = match[1];\n  const eventId = match[2];\n  const viaSearchStr = match[3];\n  if (!roomIdOrAlias || !eventId) return undefined;\n  const viaServers = viaSearchStr ? new URLSearchParams(viaSearchStr).getAll('via') : [];\n\n  return {\n    roomIdOrAlias,\n    eventId,\n    viaServers: viaServers.length === 0 ? undefined : viaServers,\n  };\n};\n\nconst tryDecodeUriComponent = (s: string): string => {\n  try {\n    return decodeURIComponent(s);\n  } catch {\n    return s;\n  }\n};\n\n/**\n * Normalized Matrix permalink fragment (path after `#/`, lowercased), for comparing href vs anchor text.\n */\nconst matrixPermalinkFragmentKey = (url: string): string | undefined => {\n  const trimmed = url.trim();\n  const decoded = tryDecodeUriComponent(trimmed);\n  const candidate = testMatrixTo(trimmed) ? trimmed : testMatrixTo(decoded) ? decoded : undefined;\n  if (!candidate) return undefined;\n  try {\n    const u = new URL(candidate);\n    const frag = u.hash.startsWith('#') ? u.hash.slice(1) : '';\n    const key = frag.replace(/^\\/+/u, '').replace(/\\/+$/u, '').toLowerCase();\n    return key || undefined;\n  } catch {\n    return undefined;\n  }\n};\n\n/**\n * True when anchor text is empty or only repeats the same permalink as `href` (e.g. pasted full URL).\n */\nexport const isRedundantMatrixToAnchorText = (\n  href: string,\n  anchorText: string | undefined\n): boolean => {\n  if (anchorText == null || anchorText.trim() === '') return true;\n  const keyHref = matrixPermalinkFragmentKey(href);\n  if (!keyHref) return false;\n  const t = anchorText.trim();\n  const keyText =\n    matrixPermalinkFragmentKey(t) ?? matrixPermalinkFragmentKey(tryDecodeUriComponent(t));\n  if (!keyText) return false;\n  return keyHref === keyText;\n};\n","import { atom } from 'jotai';\n\nexport const lastCompositionEndAtom = atom<number | undefined>(undefined);\n","import { useCallback, useEffect } from 'react';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { lastCompositionEndAtom } from '$state/lastCompositionEnd';\n\ninterface TimeStamped {\n  readonly timeStamp: number;\n}\n\nexport function useCompositionEndTracking(): void {\n  const setLastCompositionEnd = useSetAtom(lastCompositionEndAtom);\n\n  const recordCompositionEnd = useCallback(\n    (evt: TimeStamped) => {\n      setLastCompositionEnd(evt.timeStamp);\n    },\n    [setLastCompositionEnd]\n  );\n\n  useEffect(() => {\n    window.addEventListener('compositionend', recordCompositionEnd, { capture: true });\n    return () => {\n      window.removeEventListener('compositionend', recordCompositionEnd, { capture: true });\n    };\n  });\n}\n\ninterface IsComposingLike {\n  readonly timeStamp: number;\n  readonly keyCode: number;\n  readonly nativeEvent: {\n    readonly isComposing?: boolean;\n  };\n}\n\nexport function useComposingCheck({\n  compositionEndThreshold = 500,\n}: { compositionEndThreshold?: number } = {}): (evt: IsComposingLike) => boolean {\n  const compositionEnd = useAtomValue(lastCompositionEndAtom);\n  return useCallback(\n    (evt: IsComposingLike): boolean =>\n      evt.nativeEvent.isComposing ||\n      (evt.keyCode === 229 &&\n        typeof compositionEnd !== 'undefined' &&\n        evt.timeStamp - compositionEnd < compositionEndThreshold),\n    [compositionEndThreshold, compositionEnd]\n  );\n}\n","function createLazyMeasurementsView(count, flat, getItemKey) {\n  const cache = new Array(count);\n  return new Proxy(cache, {\n    get(target, prop, receiver) {\n      if (typeof prop === \"string\") {\n        const c = prop.charCodeAt(0);\n        if (c >= 48 && c <= 57) {\n          const i = +prop;\n          if (Number.isInteger(i) && i >= 0 && i < count) {\n            let v = target[i];\n            if (!v) {\n              const s = flat[i * 2];\n              v = target[i] = {\n                index: i,\n                key: getItemKey(i),\n                start: s,\n                size: flat[i * 2 + 1],\n                end: s + flat[i * 2 + 1],\n                lane: 0\n              };\n            }\n            return v;\n          }\n        }\n        if (prop === \"length\") return count;\n      }\n      return Reflect.get(target, prop, receiver);\n    }\n  });\n}\nexport {\n  createLazyMeasurementsView\n};\n//# sourceMappingURL=lazy-measurements.js.map\n","function memo(getDeps, fn, opts) {\n  let deps = opts.initialDeps ?? [];\n  let result;\n  let isInitial = true;\n  function memoizedFunction() {\n    var _a;\n    const debugEnabled = process.env.NODE_ENV !== \"production\" && !!opts.key && !!((_a = opts.debug) == null ? void 0 : _a.call(opts));\n    let depTime = 0;\n    if (debugEnabled) depTime = Date.now();\n    const newDeps = getDeps();\n    const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n    if (!depsChanged) {\n      return result;\n    }\n    deps = newDeps;\n    let resultTime = 0;\n    if (debugEnabled) resultTime = Date.now();\n    result = fn(...newDeps);\n    if (debugEnabled) {\n      const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n      const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n      const resultFpsPercentage = resultEndTime / 16;\n      const pad = (str, num) => {\n        str = String(str);\n        while (str.length < num) {\n          str = \" \" + str;\n        }\n        return str;\n      };\n      console.info(\n        `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n        `\n            font-size: .6rem;\n            font-weight: bold;\n            color: hsl(${Math.max(\n          0,\n          Math.min(120 - 120 * resultFpsPercentage, 120)\n        )}deg 100% 31%);`,\n        opts == null ? void 0 : opts.key\n      );\n    }\n    if ((opts == null ? void 0 : opts.onChange) && !(isInitial && opts.skipInitialOnChange)) {\n      opts.onChange(result);\n    }\n    isInitial = false;\n    return result;\n  }\n  memoizedFunction.updateDeps = (newDeps) => {\n    deps = newDeps;\n  };\n  return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n  if (value === void 0) {\n    throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n  } else {\n    return value;\n  }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n  let timeoutId;\n  return function(...args) {\n    targetWindow.clearTimeout(timeoutId);\n    timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n  };\n};\nexport {\n  approxEqual,\n  debounce,\n  memo,\n  notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { createLazyMeasurementsView } from \"./lazy-measurements.js\";\nimport { memo, notUndefined, approxEqual, debounce } from \"./utils.js\";\nlet _isIOSResult;\nconst isIOSWebKit = () => {\n  if (_isIOSResult !== void 0) return _isIOSResult;\n  if (typeof navigator === \"undefined\") return _isIOSResult = false;\n  if (/iP(hone|od|ad)/.test(navigator.userAgent)) return _isIOSResult = true;\n  const mtp = navigator.maxTouchPoints;\n  return _isIOSResult = navigator.platform === \"MacIntel\" && mtp !== void 0 && mtp > 0;\n};\nconst _resetIOSDetectionForTests = () => {\n  _isIOSResult = void 0;\n};\nconst getRect = (element) => {\n  const { offsetWidth, offsetHeight } = element;\n  return { width: offsetWidth, height: offsetHeight };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n  const start = Math.max(range.startIndex - range.overscan, 0);\n  const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n  const len = end - start + 1;\n  const arr = new Array(len);\n  for (let i = 0; i < len; i++) {\n    arr[i] = start + i;\n  }\n  return arr;\n};\nconst observeElementRect = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const targetWindow = instance.targetWindow;\n  if (!targetWindow) {\n    return;\n  }\n  const handler = (rect) => {\n    const { width, height } = rect;\n    cb({ width: Math.round(width), height: Math.round(height) });\n  };\n  handler(getRect(element));\n  if (!targetWindow.ResizeObserver) {\n    return () => {\n    };\n  }\n  const observer = new targetWindow.ResizeObserver((entries) => {\n    const run = () => {\n      const entry = entries[0];\n      if (entry == null ? void 0 : entry.borderBoxSize) {\n        const box = entry.borderBoxSize[0];\n        if (box) {\n          handler({ width: box.inlineSize, height: box.blockSize });\n          return;\n        }\n      }\n      handler(getRect(element));\n    };\n    instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n  });\n  observer.observe(element, { box: \"border-box\" });\n  return () => {\n    observer.unobserve(element);\n  };\n};\nconst addEventListenerOptions = {\n  passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const handler = () => {\n    cb({ width: element.innerWidth, height: element.innerHeight });\n  };\n  handler();\n  element.addEventListener(\"resize\", handler, addEventListenerOptions);\n  return () => {\n    element.removeEventListener(\"resize\", handler);\n  };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeOffset = (instance, cb, readOffset) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const targetWindow = instance.targetWindow;\n  if (!targetWindow) {\n    return;\n  }\n  const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n  let offset = 0;\n  const fallback = registerScrollendEvent ? null : debounce(\n    targetWindow,\n    () => cb(offset, false),\n    instance.options.isScrollingResetDelay\n  );\n  const createHandler = (isScrolling) => () => {\n    offset = readOffset(element);\n    fallback == null ? void 0 : fallback();\n    cb(offset, isScrolling);\n  };\n  const handler = createHandler(true);\n  const endHandler = createHandler(false);\n  element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n  if (registerScrollendEvent) {\n    element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n  }\n  return () => {\n    element.removeEventListener(\"scroll\", handler);\n    if (registerScrollendEvent) {\n      element.removeEventListener(\"scrollend\", endHandler);\n    }\n  };\n};\nconst observeElementOffset = (instance, cb) => observeOffset(instance, cb, (el) => {\n  const { horizontal, isRtl } = instance.options;\n  return horizontal ? el.scrollLeft * (isRtl && -1 || 1) : el.scrollTop;\n});\nconst observeWindowOffset = (instance, cb) => observeOffset(\n  instance,\n  cb,\n  (win) => instance.options.horizontal ? win.scrollX : win.scrollY\n);\nconst measureElement = (element, entry, instance) => {\n  if (instance.options.useCachedMeasurements) {\n    const index = instance.indexFromElement(element);\n    const key = instance.options.getItemKey(index);\n    return instance.itemSizeCache.get(key) ?? instance.options.estimateSize(index);\n  }\n  if (entry == null ? void 0 : entry.borderBoxSize) {\n    const box = entry.borderBoxSize[0];\n    if (box) {\n      const size = Math.round(\n        box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n      );\n      return size;\n    }\n  }\n  if (!entry) {\n    const index = instance.indexFromElement(element);\n    const key = instance.options.getItemKey(index);\n    const cachedSize = instance.itemSizeCache.get(key);\n    if (cachedSize !== void 0) {\n      return cachedSize;\n    }\n  }\n  return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst scrollWithAdjustments = (offset, {\n  adjustments = 0,\n  behavior\n}, instance) => {\n  var _a, _b;\n  (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n    [instance.options.horizontal ? \"left\" : \"top\"]: offset + adjustments,\n    behavior\n  });\n};\nconst windowScroll = scrollWithAdjustments;\nconst elementScroll = scrollWithAdjustments;\nclass Virtualizer {\n  constructor(opts) {\n    this.unsubs = [];\n    this.scrollElement = null;\n    this.targetWindow = null;\n    this.isScrolling = false;\n    this.scrollState = null;\n    this.measurementsCache = [];\n    this._flatMeasurements = null;\n    this.itemSizeCache = /* @__PURE__ */ new Map();\n    this.itemSizeCacheVersion = 0;\n    this.laneAssignments = /* @__PURE__ */ new Map();\n    this.pendingMin = null;\n    this.prevLanes = void 0;\n    this.lanesChangedFlag = false;\n    this.lanesSettling = false;\n    this.pendingScrollAnchor = null;\n    this.scrollRect = null;\n    this.scrollOffset = null;\n    this.scrollDirection = null;\n    this.scrollAdjustments = 0;\n    this._iosDeferredAdjustment = 0;\n    this._iosTouching = false;\n    this._iosJustTouchEnded = false;\n    this._iosTouchEndTimerId = null;\n    this._intendedScrollOffset = null;\n    this.elementsCache = /* @__PURE__ */ new Map();\n    this.now = () => {\n      var _a, _b, _c;\n      return ((_c = (_b = (_a = this.targetWindow) == null ? void 0 : _a.performance) == null ? void 0 : _b.now) == null ? void 0 : _c.call(_b)) ?? Date.now();\n    };\n    this.observer = /* @__PURE__ */ (() => {\n      let _ro = null;\n      const get = () => {\n        if (_ro) {\n          return _ro;\n        }\n        if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n          return null;\n        }\n        return _ro = new this.targetWindow.ResizeObserver((entries) => {\n          entries.forEach((entry) => {\n            const run = () => {\n              const node = entry.target;\n              const index = this.indexFromElement(node);\n              if (!node.isConnected) {\n                this.observer.unobserve(node);\n                for (const [cacheKey, cachedNode] of this.elementsCache) {\n                  if (cachedNode === node) {\n                    this.elementsCache.delete(cacheKey);\n                    break;\n                  }\n                }\n                return;\n              }\n              if (this.shouldMeasureDuringScroll(index)) {\n                this.resizeItem(\n                  index,\n                  this.options.measureElement(node, entry, this)\n                );\n              }\n            };\n            this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n          });\n        });\n      };\n      return {\n        disconnect: () => {\n          var _a;\n          (_a = get()) == null ? void 0 : _a.disconnect();\n          _ro = null;\n        },\n        observe: (target) => {\n          var _a;\n          return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n        },\n        unobserve: (target) => {\n          var _a;\n          return (_a = get()) == null ? void 0 : _a.unobserve(target);\n        }\n      };\n    })();\n    this.range = null;\n    this.setOptions = (opts2) => {\n      var _a, _b;\n      const merged = {\n        debug: false,\n        initialOffset: 0,\n        overscan: 1,\n        paddingStart: 0,\n        paddingEnd: 0,\n        scrollPaddingStart: 0,\n        scrollPaddingEnd: 0,\n        horizontal: false,\n        getItemKey: defaultKeyExtractor,\n        rangeExtractor: defaultRangeExtractor,\n        onChange: () => {\n        },\n        measureElement,\n        initialRect: { width: 0, height: 0 },\n        scrollMargin: 0,\n        gap: 0,\n        indexAttribute: \"data-index\",\n        initialMeasurementsCache: [],\n        lanes: 1,\n        anchorTo: \"start\",\n        followOnAppend: false,\n        scrollEndThreshold: 1,\n        isScrollingResetDelay: 150,\n        enabled: true,\n        isRtl: false,\n        useScrollendEvent: false,\n        useAnimationFrameWithResizeObserver: false,\n        laneAssignmentMode: \"estimate\",\n        useCachedMeasurements: false\n      };\n      for (const key in opts2) {\n        const v = opts2[key];\n        if (v !== void 0) merged[key] = v;\n      }\n      const prevOptions = this.options;\n      let anchor = null;\n      let followOnAppend = null;\n      let edgeKeysChanged = false;\n      if (prevOptions !== void 0 && prevOptions.enabled && merged.enabled && merged.anchorTo === \"end\" && this.scrollElement !== null) {\n        const prevCount = prevOptions.count;\n        const nextCount = merged.count;\n        const measurements = this.getMeasurements();\n        const prevFirstKey = prevCount > 0 ? ((_a = measurements[0]) == null ? void 0 : _a.key) ?? prevOptions.getItemKey(0) : null;\n        const prevLastKey = prevCount > 0 ? ((_b = measurements[prevCount - 1]) == null ? void 0 : _b.key) ?? prevOptions.getItemKey(prevCount - 1) : null;\n        const didCountChange = nextCount !== prevCount;\n        const didEdgeKeysChange = didCountChange || prevCount > 0 && nextCount > 0 && (merged.getItemKey(0) !== prevFirstKey || merged.getItemKey(nextCount - 1) !== prevLastKey);\n        if (didEdgeKeysChange) {\n          edgeKeysChanged = true;\n          const item = prevCount > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? measurements[0] : null;\n          if (item) {\n            anchor = [item.key, this.getScrollOffset() - item.start];\n          }\n          const behavior = merged.followOnAppend === true ? \"auto\" : merged.followOnAppend || null;\n          if (behavior && nextCount > prevCount && this.isAtEnd(prevOptions.scrollEndThreshold) && (prevCount === 0 || merged.getItemKey(nextCount - 1) !== prevLastKey)) {\n            followOnAppend = behavior;\n          }\n        }\n      }\n      this.options = merged;\n      if (edgeKeysChanged) {\n        this.pendingMin = 0;\n        this.itemSizeCacheVersion++;\n      }\n      let anchorResolved = false;\n      let anchorDelta = 0;\n      if (anchor && this.scrollOffset !== null) {\n        const [anchorKey, anchorOffset] = anchor;\n        const newMeasurements = this.getMeasurements();\n        const { count, getItemKey } = this.options;\n        let idx = 0;\n        while (idx < count && getItemKey(idx) !== anchorKey) {\n          idx++;\n        }\n        if (idx < count) {\n          const anchorItem = newMeasurements[idx];\n          if (anchorItem) {\n            const newOffset = Math.max(0, anchorItem.start + anchorOffset);\n            if (newOffset !== this.scrollOffset) {\n              anchorDelta = newOffset - this.scrollOffset;\n              this.scrollOffset = newOffset;\n              anchorResolved = true;\n            }\n          }\n        }\n      }\n      if (anchorResolved || followOnAppend) {\n        this.pendingScrollAnchor = [\n          anchorResolved ? anchor[0] : null,\n          anchorResolved ? anchor[1] : 0,\n          followOnAppend,\n          anchorDelta\n        ];\n      }\n    };\n    this.notify = (sync) => {\n      var _a, _b;\n      (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n    };\n    this.maybeNotify = memo(\n      () => {\n        this.calculateRange();\n        return [\n          this.isScrolling,\n          this.range ? this.range.startIndex : null,\n          this.range ? this.range.endIndex : null\n        ];\n      },\n      (isScrolling) => {\n        this.notify(isScrolling);\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n        debug: () => this.options.debug,\n        initialDeps: [\n          this.isScrolling,\n          this.range ? this.range.startIndex : null,\n          this.range ? this.range.endIndex : null\n        ]\n      }\n    );\n    this.cleanup = () => {\n      this.unsubs.filter(Boolean).forEach((d) => d());\n      this.unsubs = [];\n      this.observer.disconnect();\n      if (this.rafId != null && this.targetWindow) {\n        this.targetWindow.cancelAnimationFrame(this.rafId);\n        this.rafId = null;\n      }\n      this.scrollState = null;\n      this._iosDeferredAdjustment = 0;\n      this._iosTouching = false;\n      this._iosJustTouchEnded = false;\n      this.scrollElement = null;\n      this.targetWindow = null;\n    };\n    this._didMount = () => {\n      return () => {\n        this.cleanup();\n      };\n    };\n    this._willUpdate = () => {\n      var _a;\n      const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n      if (this.scrollElement !== scrollElement) {\n        this.cleanup();\n        if (!scrollElement) {\n          this.maybeNotify();\n          return;\n        }\n        this.scrollElement = scrollElement;\n        if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n          this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n        } else {\n          this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n        }\n        this.elementsCache.forEach((cached) => {\n          this.observer.observe(cached);\n        });\n        this.unsubs.push(\n          this.options.observeElementRect(this, (rect) => {\n            this.scrollRect = rect;\n            this.maybeNotify();\n          })\n        );\n        this.unsubs.push(\n          this.options.observeElementOffset(this, (offset, isScrolling) => {\n            if (isScrolling && this._intendedScrollOffset === null && offset === this.scrollOffset) {\n              return;\n            }\n            if (this._intendedScrollOffset !== null && Math.abs(offset - this._intendedScrollOffset) < 1.5) {\n              offset = this._intendedScrollOffset;\n            }\n            this._intendedScrollOffset = null;\n            this.scrollAdjustments = 0;\n            const prevOffset = this.getScrollOffset();\n            this.scrollDirection = isScrolling ? prevOffset === offset ? this.scrollDirection : prevOffset < offset ? \"forward\" : \"backward\" : null;\n            this.scrollOffset = offset;\n            this.isScrolling = isScrolling;\n            this._flushIosDeferredIfReady();\n            if (this.scrollState) {\n              this.scheduleScrollReconcile();\n            }\n            this.maybeNotify();\n          })\n        );\n        if (\"addEventListener\" in this.scrollElement) {\n          const scrollEl = this.scrollElement;\n          const onTouchStart = () => {\n            this._iosTouching = true;\n            this._iosJustTouchEnded = false;\n            if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n              this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n              this._iosTouchEndTimerId = null;\n            }\n          };\n          const onTouchEnd = () => {\n            this._iosTouching = false;\n            if (!isIOSWebKit() || this.targetWindow == null) {\n              return;\n            }\n            this._iosJustTouchEnded = true;\n            this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => {\n              this._iosJustTouchEnded = false;\n              this._iosTouchEndTimerId = null;\n              this._flushIosDeferredIfReady();\n            }, 150);\n          };\n          scrollEl.addEventListener(\n            \"touchstart\",\n            onTouchStart,\n            addEventListenerOptions\n          );\n          scrollEl.addEventListener(\n            \"touchend\",\n            onTouchEnd,\n            addEventListenerOptions\n          );\n          this.unsubs.push(() => {\n            scrollEl.removeEventListener(\"touchstart\", onTouchStart);\n            scrollEl.removeEventListener(\"touchend\", onTouchEnd);\n            if (this._iosTouchEndTimerId !== null && this.targetWindow != null) {\n              this.targetWindow.clearTimeout(this._iosTouchEndTimerId);\n              this._iosTouchEndTimerId = null;\n            }\n          });\n        }\n        this._scrollToOffset(this.getScrollOffset(), {\n          adjustments: void 0,\n          behavior: void 0\n        });\n      }\n      const anchor = this.pendingScrollAnchor;\n      this.pendingScrollAnchor = null;\n      if (anchor && this.scrollElement && this.options.enabled) {\n        const [key, _offset, followOnAppend, anchorDelta] = anchor;\n        if (key !== null && !followOnAppend) {\n          if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n            if (anchorDelta !== 0) {\n              this._iosDeferredAdjustment += anchorDelta;\n            }\n          } else {\n            this._scrollToOffset(this.getScrollOffset(), {\n              adjustments: void 0,\n              behavior: void 0\n            });\n          }\n        }\n        if (followOnAppend) {\n          this.scrollToEnd({ behavior: followOnAppend });\n        }\n      }\n    };\n    this._flushIosDeferredIfReady = () => {\n      if (this._iosDeferredAdjustment === 0) return;\n      if (this.isScrolling) return;\n      if (this._iosTouching) return;\n      if (this._iosJustTouchEnded) return;\n      const cur = this.getScrollOffset();\n      const max = this.getMaxScrollOffset();\n      if (cur < 0 || cur > max) return;\n      if (this._iosDeferredAdjustment < 0 && cur >= max - 1) {\n        this._iosDeferredAdjustment = 0;\n        return;\n      }\n      const delta = this._iosDeferredAdjustment;\n      this._iosDeferredAdjustment = 0;\n      this._scrollToOffset(cur, {\n        adjustments: this.scrollAdjustments += delta,\n        behavior: void 0\n      });\n    };\n    this.rafId = null;\n    this.getSize = () => {\n      if (!this.options.enabled) {\n        this.scrollRect = null;\n        return 0;\n      }\n      this.scrollRect = this.scrollRect ?? this.options.initialRect;\n      return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n    };\n    this.getScrollOffset = () => {\n      if (!this.options.enabled) {\n        this.scrollOffset = null;\n        return 0;\n      }\n      this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n      return this.scrollOffset;\n    };\n    this.getMeasurementOptions = memo(\n      () => [\n        this.options.count,\n        this.options.paddingStart,\n        this.options.scrollMargin,\n        this.options.getItemKey,\n        this.options.enabled,\n        this.options.lanes,\n        this.options.laneAssignmentMode,\n        this.options.gap\n      ],\n      (count, paddingStart, scrollMargin, getItemKey, enabled, lanes, laneAssignmentMode, gap) => {\n        const lanesChanged = this.prevLanes !== void 0 && this.prevLanes !== lanes;\n        if (lanesChanged) {\n          this.lanesChangedFlag = true;\n        }\n        this.prevLanes = lanes;\n        this.pendingMin = null;\n        return {\n          count,\n          paddingStart,\n          scrollMargin,\n          getItemKey,\n          enabled,\n          lanes,\n          laneAssignmentMode,\n          gap\n        };\n      },\n      {\n        key: false\n      }\n    );\n    this.getMeasurements = memo(\n      () => [this.getMeasurementOptions(), this.itemSizeCacheVersion],\n      ({\n        count,\n        paddingStart,\n        scrollMargin,\n        getItemKey,\n        enabled,\n        lanes,\n        laneAssignmentMode,\n        gap\n      }, _itemSizeCacheVersion) => {\n        const itemSizeCache = this.itemSizeCache;\n        if (!enabled) {\n          this.measurementsCache = [];\n          this.itemSizeCache.clear();\n          this.laneAssignments.clear();\n          return [];\n        }\n        if (this.laneAssignments.size > count) {\n          for (const index of this.laneAssignments.keys()) {\n            if (index >= count) {\n              this.laneAssignments.delete(index);\n            }\n          }\n        }\n        if (this.lanesChangedFlag) {\n          this.lanesChangedFlag = false;\n          this.lanesSettling = true;\n          this.measurementsCache = [];\n          this.itemSizeCache.clear();\n          this.laneAssignments.clear();\n          this.pendingMin = null;\n        }\n        if (this.measurementsCache.length === 0 && !this.lanesSettling) {\n          this.measurementsCache = this.options.initialMeasurementsCache;\n          this.measurementsCache.forEach((item) => {\n            this.itemSizeCache.set(item.key, item.size);\n          });\n        }\n        const min = this.lanesSettling ? 0 : this.pendingMin ?? 0;\n        this.pendingMin = null;\n        if (this.lanesSettling && this.measurementsCache.length === count) {\n          this.lanesSettling = false;\n        }\n        if (lanes === 1) {\n          const need = count * 2;\n          let flat = this._flatMeasurements;\n          if (!flat || flat.length < need) {\n            const next = new Float64Array(need);\n            if (flat && min > 0) next.set(flat.subarray(0, min * 2));\n            flat = next;\n            this._flatMeasurements = flat;\n          }\n          let runningStart;\n          if (min === 0) {\n            runningStart = paddingStart + scrollMargin;\n          } else {\n            const prevIdx = min - 1;\n            runningStart = flat[prevIdx * 2] + flat[prevIdx * 2 + 1] + gap;\n          }\n          for (let i = min; i < count; i++) {\n            const key = getItemKey(i);\n            const measuredSize = itemSizeCache.get(key);\n            const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n            flat[i * 2] = runningStart;\n            flat[i * 2 + 1] = size;\n            runningStart += size + gap;\n          }\n          const view = createLazyMeasurementsView(count, flat, getItemKey);\n          this.measurementsCache = view;\n          return view;\n        }\n        const measurements = this.measurementsCache.slice(0, min);\n        const laneLastIndex = new Array(lanes).fill(\n          void 0\n        );\n        const laneEnds = new Float64Array(lanes);\n        let filledLanes = 0;\n        for (let m = 0; m < min; m++) {\n          const item = measurements[m];\n          if (item) {\n            if (laneLastIndex[item.lane] === void 0) filledLanes++;\n            laneLastIndex[item.lane] = m;\n            laneEnds[item.lane] = item.end;\n          }\n        }\n        for (let i = min; i < count; i++) {\n          const key = getItemKey(i);\n          const cachedLane = this.laneAssignments.get(i);\n          let lane;\n          let start;\n          const shouldCacheLane = laneAssignmentMode === \"estimate\" || itemSizeCache.has(key);\n          if (cachedLane !== void 0 && this.options.lanes > 1) {\n            lane = cachedLane;\n            const prevIndex = laneLastIndex[lane];\n            const prevInLane = prevIndex !== void 0 ? measurements[prevIndex] : void 0;\n            start = prevInLane ? prevInLane.end + gap : paddingStart + scrollMargin;\n          } else if (filledLanes === lanes) {\n            let bestLane = 0;\n            let bestEnd = laneEnds[0];\n            let bestIdx = laneLastIndex[0];\n            for (let l = 1; l < lanes; l++) {\n              const e = laneEnds[l];\n              if (e < bestEnd || e === bestEnd && laneLastIndex[l] < bestIdx) {\n                bestLane = l;\n                bestEnd = e;\n                bestIdx = laneLastIndex[l];\n              }\n            }\n            lane = bestLane;\n            start = bestEnd + gap;\n            if (shouldCacheLane) {\n              this.laneAssignments.set(i, lane);\n            }\n          } else {\n            lane = i % this.options.lanes;\n            start = paddingStart + scrollMargin;\n            if (shouldCacheLane) {\n              this.laneAssignments.set(i, lane);\n            }\n          }\n          const measuredSize = itemSizeCache.get(key);\n          const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n          const end = start + size;\n          measurements[i] = {\n            index: i,\n            start,\n            size,\n            end,\n            key,\n            lane\n          };\n          if (laneLastIndex[lane] === void 0) filledLanes++;\n          laneLastIndex[lane] = i;\n          laneEnds[lane] = end;\n        }\n        this.measurementsCache = measurements;\n        return measurements;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n        debug: () => this.options.debug\n      }\n    );\n    this.calculateRange = memo(\n      () => [\n        this.getMeasurements(),\n        this.getSize(),\n        this.getScrollOffset(),\n        this.options.lanes\n      ],\n      (measurements, outerSize, scrollOffset, lanes) => {\n        if (measurements.length === 0 || outerSize === 0) {\n          this.range = null;\n          return null;\n        }\n        this.range = calculateRangeImpl(\n          measurements,\n          outerSize,\n          scrollOffset,\n          lanes,\n          // Pass the typed array so binary search + forward-walk can read\n          // start/end directly from Float64Array, skipping the Proxy traps.\n          lanes === 1 && this._flatMeasurements != null ? this._flatMeasurements : null\n        );\n        return this.range;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n        debug: () => this.options.debug\n      }\n    );\n    this.getVirtualIndexes = memo(\n      () => {\n        let startIndex = null;\n        let endIndex = null;\n        const range = this.calculateRange();\n        if (range) {\n          startIndex = range.startIndex;\n          endIndex = range.endIndex;\n        }\n        this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n        return [\n          this.options.rangeExtractor,\n          this.options.overscan,\n          this.options.count,\n          startIndex,\n          endIndex\n        ];\n      },\n      (rangeExtractor, overscan, count, startIndex, endIndex) => {\n        return startIndex === null || endIndex === null ? [] : rangeExtractor({\n          startIndex,\n          endIndex,\n          overscan,\n          count\n        });\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n        debug: () => this.options.debug\n      }\n    );\n    this.indexFromElement = (node) => {\n      const attributeName = this.options.indexAttribute;\n      const indexStr = node.getAttribute(attributeName);\n      if (!indexStr) {\n        console.warn(\n          `Missing attribute name '${attributeName}={index}' on measured element.`\n        );\n        return -1;\n      }\n      return parseInt(indexStr, 10);\n    };\n    this.shouldMeasureDuringScroll = (index) => {\n      var _a;\n      if (!this.scrollState || this.scrollState.behavior !== \"smooth\") {\n        return true;\n      }\n      const scrollIndex = this.scrollState.index ?? ((_a = this.getVirtualItemForOffset(this.scrollState.lastTargetOffset)) == null ? void 0 : _a.index);\n      if (scrollIndex !== void 0 && this.range) {\n        const bufferSize = Math.max(\n          this.options.overscan,\n          Math.ceil((this.range.endIndex - this.range.startIndex) / 2)\n        );\n        const minIndex = Math.max(0, scrollIndex - bufferSize);\n        const maxIndex = Math.min(\n          this.options.count - 1,\n          scrollIndex + bufferSize\n        );\n        return index >= minIndex && index <= maxIndex;\n      }\n      return true;\n    };\n    this.measureElement = (node) => {\n      if (!node) {\n        this.elementsCache.forEach((cached, key2) => {\n          if (!cached.isConnected) {\n            this.observer.unobserve(cached);\n            this.elementsCache.delete(key2);\n          }\n        });\n        return;\n      }\n      const index = this.indexFromElement(node);\n      const key = this.options.getItemKey(index);\n      const prevNode = this.elementsCache.get(key);\n      if (prevNode !== node) {\n        if (prevNode) {\n          this.observer.unobserve(prevNode);\n        }\n        this.observer.observe(node);\n        this.elementsCache.set(key, node);\n      }\n      if ((!this.isScrolling || this.scrollState) && this.shouldMeasureDuringScroll(index)) {\n        this.resizeItem(index, this.options.measureElement(node, void 0, this));\n      }\n    };\n    this.resizeItem = (index, size) => {\n      var _a, _b;\n      if (index < 0 || index >= this.options.count) return;\n      let cachedSize;\n      let itemStart;\n      let key;\n      const flat = this._flatMeasurements;\n      if (this.options.lanes === 1 && flat !== null) {\n        key = this.options.getItemKey(index);\n        itemStart = flat[index * 2];\n        cachedSize = flat[index * 2 + 1];\n      } else {\n        const item = this.measurementsCache[index];\n        if (!item) return;\n        key = item.key;\n        itemStart = item.start;\n        cachedSize = item.size;\n      }\n      const itemSize = this.itemSizeCache.get(key) ?? cachedSize;\n      const delta = size - itemSize;\n      if (delta !== 0) {\n        const wasAtEnd = this.options.anchorTo === \"end\" && ((_a = this.scrollState) == null ? void 0 : _a.behavior) !== \"smooth\" && this.getVirtualDistanceFromEnd() <= this.options.scrollEndThreshold;\n        const prevTotalSize = wasAtEnd ? this.getTotalSize() : 0;\n        const scrollOffsetWithAdj = this.getScrollOffset() + this.scrollAdjustments;\n        const isFirstMeasure = !this.itemSizeCache.has(key);\n        const defaultShouldAdjust = isFirstMeasure ? (\n          // First measurement: compensate any item whose top sits above the\n          // fold — the estimate→actual delta must be corrected regardless of\n          // scroll direction, since the whole estimated block was above it.\n          itemStart < scrollOffsetWithAdj\n        ) : (\n          // Re-measurement: only compensate an item that is ENTIRELY above the\n          // fold. An item that merely *spans* the fold (top above, bottom\n          // below — e.g. a streaming chat message growing at its bottom)\n          // changes size *below* the anchor point, so shifting scrollTop by the\n          // delta would drag the viewport downward on every growth (#1218).\n          // Also skip during backward scroll to avoid the \"items jump while\n          // scrolling up\" cascade.\n          itemStart + itemSize <= scrollOffsetWithAdj && this.scrollDirection !== \"backward\"\n        );\n        const shouldAdjustScroll = ((_b = this.scrollState) == null ? void 0 : _b.behavior) !== \"smooth\" && (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(\n          // The callback expects a VirtualItem; build one lazily only\n          // when the consumer actually supplied a custom predicate.\n          this.measurementsCache[index] ?? {\n            index,\n            key,\n            start: itemStart,\n            size: cachedSize,\n            end: itemStart + cachedSize,\n            lane: 0\n          },\n          delta,\n          this\n        ) : defaultShouldAdjust);\n        if (this.pendingMin === null || index < this.pendingMin) {\n          this.pendingMin = index;\n        }\n        this.itemSizeCache.set(key, size);\n        this.itemSizeCacheVersion++;\n        let adjustedSync = false;\n        if (wasAtEnd) {\n          adjustedSync = this.applyScrollAdjustment(\n            this.getTotalSize() - prevTotalSize\n          );\n        } else if (shouldAdjustScroll) {\n          adjustedSync = this.applyScrollAdjustment(delta);\n        }\n        this.notify(adjustedSync);\n      }\n    };\n    this.getVirtualItems = memo(\n      () => [this.getVirtualIndexes(), this.getMeasurements()],\n      (indexes, measurements) => {\n        const virtualItems = [];\n        for (let k = 0, len = indexes.length; k < len; k++) {\n          const i = indexes[k];\n          const measurement = measurements[i];\n          virtualItems.push(measurement);\n        }\n        return virtualItems;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n        debug: () => this.options.debug\n      }\n    );\n    this.getVirtualItemForOffset = (offset) => {\n      const measurements = this.getMeasurements();\n      if (measurements.length === 0) {\n        return void 0;\n      }\n      const flat = this._flatMeasurements;\n      const useFlat = this.options.lanes === 1 && flat != null;\n      const idx = findNearestBinarySearch(\n        0,\n        measurements.length - 1,\n        useFlat ? (i) => flat[i * 2] : (i) => notUndefined(measurements[i]).start,\n        offset\n      );\n      return notUndefined(measurements[idx]);\n    };\n    this.getMaxScrollOffset = () => {\n      if (!this.scrollElement) return 0;\n      if (\"scrollHeight\" in this.scrollElement) {\n        return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight;\n      } else {\n        const doc = this.scrollElement.document.documentElement;\n        return this.options.horizontal ? doc.scrollWidth - this.scrollElement.innerWidth : doc.scrollHeight - this.scrollElement.innerHeight;\n      }\n    };\n    this.getVirtualDistanceFromEnd = () => {\n      return Math.max(\n        this.getTotalSize() - this.getSize() - this.getScrollOffset(),\n        0\n      );\n    };\n    this.getDistanceFromEnd = () => {\n      return Math.max(this.getMaxScrollOffset() - this.getScrollOffset(), 0);\n    };\n    this.isAtEnd = (threshold = this.options.scrollEndThreshold) => {\n      return this.getDistanceFromEnd() <= threshold;\n    };\n    this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n      if (!this.scrollElement) return 0;\n      const size = this.getSize();\n      const scrollOffset = this.getScrollOffset();\n      if (align === \"auto\") {\n        align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n      }\n      if (align === \"center\") {\n        toOffset += (itemSize - size) / 2;\n      } else if (align === \"end\") {\n        toOffset -= size;\n      }\n      const maxOffset = this.getMaxScrollOffset();\n      return Math.max(Math.min(maxOffset, toOffset), 0);\n    };\n    this.getOffsetForIndex = (index, align = \"auto\") => {\n      index = Math.max(0, Math.min(index, this.options.count - 1));\n      const size = this.getSize();\n      const scrollOffset = this.getScrollOffset();\n      const item = this.measurementsCache[index];\n      if (!item) return;\n      if (align === \"auto\") {\n        if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n          align = \"end\";\n        } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n          align = \"start\";\n        } else {\n          return [scrollOffset, align];\n        }\n      }\n      if (align === \"end\" && index === this.options.count - 1) {\n        return [this.getMaxScrollOffset(), align];\n      }\n      const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n      return [\n        this.getOffsetForAlignment(toOffset, align, item.size),\n        align\n      ];\n    };\n    this.scrollToOffset = (toOffset, { align = \"start\", behavior = \"auto\" } = {}) => {\n      this._iosDeferredAdjustment = 0;\n      const offset = this.getOffsetForAlignment(toOffset, align);\n      const now = this.now();\n      this.scrollState = {\n        index: null,\n        align,\n        behavior,\n        startedAt: now,\n        lastTargetOffset: offset,\n        stableFrames: 0\n      };\n      this._scrollToOffset(offset, { adjustments: void 0, behavior });\n      this.scheduleScrollReconcile();\n    };\n    this.scrollToIndex = (index, {\n      align: initialAlign = \"auto\",\n      behavior = \"auto\"\n    } = {}) => {\n      this._iosDeferredAdjustment = 0;\n      index = Math.max(0, Math.min(index, this.options.count - 1));\n      const offsetInfo = this.getOffsetForIndex(index, initialAlign);\n      if (!offsetInfo) {\n        return;\n      }\n      const [offset, align] = offsetInfo;\n      const now = this.now();\n      this.scrollState = {\n        index,\n        align,\n        behavior,\n        startedAt: now,\n        lastTargetOffset: offset,\n        stableFrames: 0\n      };\n      this._scrollToOffset(offset, { adjustments: void 0, behavior });\n      this.scheduleScrollReconcile();\n    };\n    this.scrollBy = (delta, { behavior = \"auto\" } = {}) => {\n      const offset = this.getScrollOffset() + delta;\n      const now = this.now();\n      this.scrollState = {\n        index: null,\n        align: \"start\",\n        behavior,\n        startedAt: now,\n        lastTargetOffset: offset,\n        stableFrames: 0\n      };\n      this._scrollToOffset(offset, { adjustments: void 0, behavior });\n      this.scheduleScrollReconcile();\n    };\n    this.scrollToEnd = ({ behavior = \"auto\" } = {}) => {\n      if (this.options.count > 0) {\n        this.scrollToIndex(this.options.count - 1, {\n          align: \"end\",\n          behavior\n        });\n        return;\n      }\n      this.scrollToOffset(Math.max(this.getTotalSize() - this.getSize(), 0), {\n        behavior\n      });\n    };\n    this.getTotalSize = () => {\n      var _a;\n      const measurements = this.getMeasurements();\n      let end;\n      if (measurements.length === 0) {\n        end = this.options.paddingStart;\n      } else if (this.options.lanes === 1) {\n        const lastIdx = measurements.length - 1;\n        const flat = this._flatMeasurements;\n        if (flat != null) {\n          end = flat[lastIdx * 2] + flat[lastIdx * 2 + 1];\n        } else {\n          end = ((_a = measurements[lastIdx]) == null ? void 0 : _a.end) ?? 0;\n        }\n      } else {\n        const endByLane = Array(this.options.lanes).fill(null);\n        let endIndex = measurements.length - 1;\n        while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n          const item = measurements[endIndex];\n          if (endByLane[item.lane] === null) {\n            endByLane[item.lane] = item.end;\n          }\n          endIndex--;\n        }\n        end = Math.max(...endByLane.filter((val) => val !== null));\n      }\n      return Math.max(\n        end - this.options.scrollMargin + this.options.paddingEnd,\n        0\n      );\n    };\n    this.takeSnapshot = () => {\n      const snapshot = [];\n      if (this.itemSizeCache.size === 0) return snapshot;\n      const m = this.getMeasurements();\n      for (const item of m) {\n        if (item && this.itemSizeCache.has(item.key)) {\n          snapshot.push({\n            index: item.index,\n            key: item.key,\n            start: item.start,\n            size: item.size,\n            end: item.end,\n            lane: item.lane\n          });\n        }\n      }\n      return snapshot;\n    };\n    this._scrollToOffset = (offset, {\n      adjustments,\n      behavior\n    }) => {\n      this._intendedScrollOffset = offset + (adjustments ?? 0);\n      this.options.scrollToFn(offset, { behavior, adjustments }, this);\n    };\n    this.measure = () => {\n      this.pendingMin = null;\n      this.itemSizeCache.clear();\n      this.laneAssignments.clear();\n      this.itemSizeCacheVersion++;\n      this.notify(false);\n    };\n    this.setOptions(opts);\n  }\n  // Returns `true` when it performed a synchronous `scrollTop` write this\n  // tick, `false` when the delta was zero or the write was deferred (iOS).\n  // `resizeItem` uses that to decide whether the follow-up `notify` must be\n  // synchronous so the grown transforms commit in the same paint (#1227).\n  applyScrollAdjustment(delta, behavior) {\n    if (delta === 0) return false;\n    if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n      console.info(\"correction\", delta);\n    }\n    if (isIOSWebKit() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) {\n      this._iosDeferredAdjustment += delta;\n      return false;\n    } else {\n      this._scrollToOffset(this.getScrollOffset(), {\n        adjustments: this.scrollAdjustments += delta,\n        behavior\n      });\n      if (this.scrollOffset !== null) {\n        this.scrollOffset += this.scrollAdjustments;\n        if (this.scrollOffset < 0) this.scrollOffset = 0;\n        this.scrollAdjustments = 0;\n      }\n      return true;\n    }\n  }\n  scheduleScrollReconcile() {\n    if (!this.targetWindow) {\n      this.scrollState = null;\n      return;\n    }\n    if (this.rafId != null) return;\n    this.rafId = this.targetWindow.requestAnimationFrame(() => {\n      this.rafId = null;\n      this.reconcileScroll();\n    });\n  }\n  reconcileScroll() {\n    if (!this.scrollState) return;\n    const el = this.scrollElement;\n    if (!el) return;\n    const MAX_RECONCILE_MS = 5e3;\n    if (this.now() - this.scrollState.startedAt > MAX_RECONCILE_MS) {\n      this.scrollState = null;\n      return;\n    }\n    const offsetInfo = this.scrollState.index != null ? this.getOffsetForIndex(this.scrollState.index, this.scrollState.align) : void 0;\n    const targetOffset = offsetInfo ? offsetInfo[0] : this.scrollState.lastTargetOffset;\n    const STABLE_FRAMES = 1;\n    const targetChanged = targetOffset !== this.scrollState.lastTargetOffset;\n    if (!targetChanged && approxEqual(targetOffset, this.getScrollOffset())) {\n      this.scrollState.stableFrames++;\n      if (this.scrollState.stableFrames >= STABLE_FRAMES) {\n        if (this.getScrollOffset() !== targetOffset) {\n          this._scrollToOffset(targetOffset, {\n            adjustments: void 0,\n            behavior: \"auto\"\n          });\n        }\n        this.scrollState = null;\n        return;\n      }\n    } else {\n      this.scrollState.stableFrames = 0;\n      if (targetChanged) {\n        const viewport = this.getSize() || 600;\n        const distance = Math.abs(targetOffset - this.getScrollOffset());\n        const keepSmooth = this.scrollState.behavior === \"smooth\" && distance > viewport;\n        this.scrollState.lastTargetOffset = targetOffset;\n        if (!keepSmooth) {\n          this.scrollState.behavior = \"auto\";\n        }\n        this._scrollToOffset(targetOffset, {\n          adjustments: void 0,\n          behavior: keepSmooth ? \"smooth\" : \"auto\"\n        });\n      }\n    }\n    this.scheduleScrollReconcile();\n  }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n  while (low <= high) {\n    const middle = (low + high) / 2 | 0;\n    const currentValue = getCurrentValue(middle);\n    if (currentValue < value) {\n      low = middle + 1;\n    } else if (currentValue > value) {\n      high = middle - 1;\n    } else {\n      return middle;\n    }\n  }\n  if (low > 0) {\n    return low - 1;\n  } else {\n    return 0;\n  }\n};\nfunction findNearestBinarySearchFlat(flat, high, value) {\n  let low = 0;\n  while (low <= high) {\n    const middle = (low + high) / 2 | 0;\n    const currentValue = flat[middle * 2];\n    if (currentValue < value) {\n      low = middle + 1;\n    } else if (currentValue > value) {\n      high = middle - 1;\n    } else {\n      return middle;\n    }\n  }\n  return low > 0 ? low - 1 : 0;\n}\nfunction calculateRangeImpl(measurements, outerSize, scrollOffset, lanes, flat) {\n  const lastIndex = measurements.length - 1;\n  if (measurements.length <= lanes) {\n    return { startIndex: 0, endIndex: lastIndex };\n  }\n  if (lanes === 1 && flat !== null) {\n    const startIndex2 = findNearestBinarySearchFlat(\n      flat,\n      lastIndex,\n      scrollOffset\n    );\n    let endIndex2 = startIndex2;\n    const limit = scrollOffset + outerSize;\n    while (endIndex2 < lastIndex && flat[endIndex2 * 2] + flat[endIndex2 * 2 + 1] < limit) {\n      endIndex2++;\n    }\n    return { startIndex: startIndex2, endIndex: endIndex2 };\n  }\n  const getStart = (index) => measurements[index].start;\n  let startIndex = findNearestBinarySearch(0, lastIndex, getStart, scrollOffset);\n  let endIndex = startIndex;\n  if (lanes === 1) {\n    while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) {\n      endIndex++;\n    }\n  } else if (lanes > 1) {\n    const endPerLane = Array(lanes).fill(0);\n    while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n      const item = measurements[endIndex];\n      endPerLane[item.lane] = item.end;\n      endIndex++;\n    }\n    const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n    while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n      const item = measurements[startIndex];\n      startPerLane[item.lane] = item.start;\n      startIndex--;\n    }\n    startIndex = Math.max(0, startIndex - startIndex % lanes);\n    endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n  }\n  return { startIndex, endIndex };\n}\nexport {\n  Virtualizer,\n  _resetIOSDetectionForTests,\n  approxEqual,\n  debounce,\n  defaultKeyExtractor,\n  defaultRangeExtractor,\n  elementScroll,\n  measureElement,\n  memo,\n  notUndefined,\n  observeElementOffset,\n  observeElementRect,\n  observeWindowOffset,\n  observeWindowRect,\n  windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { Virtualizer, elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nconst useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase({\n  useFlushSync = true,\n  directDomUpdates = false,\n  directDomUpdatesMode = \"transform\",\n  ...options\n}) {\n  const rerender = React.useReducer((x) => x + 1, 0)[1];\n  const directRef = React.useRef({\n    enabled: directDomUpdates,\n    mode: directDomUpdatesMode,\n    container: null,\n    lastSize: null,\n    // Keyed by the element itself so a remounted node (same key, new DOM\n    // node — e.g. when `enabled` is toggled off then on) is treated as fresh\n    // and gets its style written.\n    lastPositions: /* @__PURE__ */ new WeakMap(),\n    prevRange: null\n  });\n  directRef.current.enabled = directDomUpdates;\n  directRef.current.mode = directDomUpdatesMode;\n  const applyContainerSize = (instance2) => {\n    const state = directRef.current;\n    if (!state.enabled || !state.container) return;\n    const totalSize = instance2.getTotalSize();\n    if (totalSize !== state.lastSize) {\n      state.lastSize = totalSize;\n      const sizeAxis = instance2.options.horizontal ? \"width\" : \"height\";\n      state.container.style[sizeAxis] = `${totalSize}px`;\n    }\n  };\n  const applyDirectStyles = (instance2) => {\n    const state = directRef.current;\n    if (!state.enabled || !state.container) return;\n    applyContainerSize(instance2);\n    const horizontal = !!instance2.options.horizontal;\n    const useTransform = state.mode === \"transform\";\n    const posAxis = horizontal ? \"left\" : \"top\";\n    const scrollMargin = instance2.options.scrollMargin;\n    const items = instance2.getVirtualItems();\n    for (const item of items) {\n      const next = item.start - scrollMargin;\n      const el = instance2.elementsCache.get(item.key);\n      if (!el) continue;\n      if (state.lastPositions.get(el) === next) continue;\n      state.lastPositions.set(el, next);\n      if (useTransform) {\n        el.style.transform = horizontal ? `translate3d(${next}px, 0, 0)` : `translate3d(0, ${next}px, 0)`;\n      } else {\n        el.style[posAxis] = `${next}px`;\n      }\n    }\n  };\n  const resolvedOptions = {\n    ...options,\n    onChange: (instance2, sync) => {\n      var _a;\n      const state = directRef.current;\n      let shouldRerender = true;\n      if (state.enabled) {\n        applyDirectStyles(instance2);\n        const range = instance2.range;\n        const prev = state.prevRange;\n        shouldRerender = !prev || prev.isScrolling !== instance2.isScrolling || prev.startIndex !== (range == null ? void 0 : range.startIndex) || prev.endIndex !== (range == null ? void 0 : range.endIndex);\n        if (shouldRerender) {\n          state.prevRange = range ? {\n            startIndex: range.startIndex,\n            endIndex: range.endIndex,\n            isScrolling: instance2.isScrolling\n          } : null;\n        }\n      }\n      if (shouldRerender) {\n        if (useFlushSync && sync) {\n          flushSync(rerender);\n        } else {\n          rerender();\n        }\n      }\n      (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);\n    }\n  };\n  const [instance] = React.useState(() => {\n    const v = new Virtualizer(resolvedOptions);\n    return Object.assign(v, {\n      containerRef: (node) => {\n        const state = directRef.current;\n        state.container = node;\n        state.lastSize = null;\n        if (node && state.enabled) {\n          const total = v.getTotalSize();\n          state.lastSize = total;\n          const axis = v.options.horizontal ? \"width\" : \"height\";\n          node.style[axis] = `${total}px`;\n        }\n      }\n    });\n  });\n  instance.setOptions(resolvedOptions);\n  useIsomorphicLayoutEffect(() => {\n    return instance._didMount();\n  }, []);\n  useIsomorphicLayoutEffect(() => {\n    applyContainerSize(instance);\n    return instance._willUpdate();\n  });\n  useIsomorphicLayoutEffect(() => {\n    applyDirectStyles(instance);\n  });\n  return instance;\n}\nfunction useVirtualizer(options) {\n  return useVirtualizerBase({\n    observeElementRect,\n    observeElementOffset,\n    scrollToFn: elementScroll,\n    ...options\n  });\n}\nfunction useWindowVirtualizer(options) {\n  return useVirtualizerBase({\n    getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n    observeElementRect: observeWindowRect,\n    observeElementOffset: observeWindowOffset,\n    scrollToFn: windowScroll,\n    initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n    ...options\n  });\n}\nexport {\n  useVirtualizer,\n  useWindowVirtualizer\n};\n//# sourceMappingURL=index.js.map\n","import type { Room } from '$types/matrix-sdk';\nimport { createContext, useContext } from 'react';\n\nconst SpaceContext = createContext<Room | null>(null);\n\nexport const SpaceProvider = SpaceContext.Provider;\n\nexport function useSpace(): Room {\n  const space = useContext(SpaceContext);\n  if (!space) throw new Error('Space not provided!');\n  return space;\n}\n\nexport function useSpaceOptionally(): Room | null {\n  const space = useContext(SpaceContext);\n  return space;\n}\n","// profile related unstable prefixes\n// don't import this file directly, import '$unstable/prefixes'\n\n/**\n * unstable prefix for profile pronouns\n */\nexport const MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME = 'io.fsky.nyx.pronouns';\n\n/**\n * unstable prefix for profile biography\n * defined in MSC4440 https://github.com/matrix-org/matrix-spec-proposals/pull/4440\n */\nexport const MATRIX_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME = 'gay.fomx.biography';\n\nexport const MATRIX_UNSTABLE_PROFILE_TIMEZONE_PROPERTY_NAME = 'us.cloke.msc4175.tz';\nexport const MATRIX_STABLE_PROFILE_TIMEZONE_PROPERTY_NAME = 'm.tz';\n\n/**\n * Unstable feature and query parameter names for MSC4466 profile change propagation.\n */\nexport const MATRIX_UNSTABLE_MSC4466_FEATURE = 'computer.gingershaped.msc4466';\nexport const MATRIX_UNSTABLE_MSC4466_PROPAGATE_TO = 'computer.gingershaped.msc4466.propagate_to';\n\n/**\n *  Unstable prefix for username colors. defined in https://github.com/matrix-org/matrix-spec-proposals/pull/4522\n */\nexport const MATRIX_UNSTABLE_COLORS = 'eu.she-a.color';\n\nexport const MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_SUFFIX_PROPERTY_NAME = 'net.f0rest.suffix';\nexport const MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_CIRCUMFIX_PROPERTY_NAME = 'net.f0rest.circumfix';\n\n/** Unstable prefix for pluralkit imports */\nexport const MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME = 'net.f0rest.pkimport';\n","// unstable prefixes NOT defined in MSCs but used for sable\n// don't import this file directly, import '$unstable/prefixes'\n\n/**\n * @deprecated in favor of MSC4440\n */\nexport const MATRIX_SABLE_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME = 'moe.sable.app.bio';\n\n/**\n * @deprecated in favor of MSC4522\n */\nexport const MATRIX_SABLE_UNSTABLE_NAME_COLOR_PROPERTY_NAME = 'moe.sable.app.name_color';\n\n/**\n * @deprecated in favor of MSC4522\n */\nexport const MATRIX_SABLE_UNSTABLE_NAME_COLOR_DARK_PROPERTY_NAME =\n  'moe.sable.app.name_color_dark_theme';\n\n/**\n * @deprecated in favor of MSC4522\n */\nexport const MATRIX_SABLE_UNSTABLE_NAME_COLOR_LIGHT_PROPERTY_NAME =\n  'moe.sable.app.name_color_light_theme';\nexport const MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_CAT_PROPERTY_NAME = 'kitty.meow.is_cat';\nexport const MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_CAT_PROPERTY_NAME = 'kitty.meow.has_cats';\n\nexport const MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_ANIMAL_PROPERTY_NAME = 'pet.plz.me';\nexport const MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_ANIMAL_PROPERTY_NAME = 'pet.plz.my';\nexport const MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_ANIMAL_NEED_PROPERTY_NAME = 'pet.plz.gib';\n","// event related unstable prefixes\n// don't import this file directly, import '$unstable/prefixes'\n\nexport const MATRIX_SABLE_UNSTABLE_MESSAGE_FORWARD_META_PROPERTY_NAME = 'moe.sable.message.forward';\n","import { atom } from 'jotai';\nimport {\n  atomWithLocalStorage,\n  getLocalStorageItem,\n  setLocalStorageItem,\n} from '$state/utils/atomWithLocalStorage';\n\nconst LAST_VISITED_ROOM_KEY = 'sable.lastVisitedRoom';\n\nconst lastVisitedRoomBaseAtom = atomWithLocalStorage<Record<string, string>>(\n  LAST_VISITED_ROOM_KEY,\n  (key) => getLocalStorageItem<Record<string, string>>(key, {}),\n  (key, value) => setLocalStorageItem(key, value)\n);\n\nexport const lastVisitedRoomAtom = lastVisitedRoomBaseAtom;\n\n/** Returns a read-only derived atom for a single section's last-visited room. */\nexport const lastVisitedRoomSectionAtom = (sectionKey: string) =>\n  atom((get) => get(lastVisitedRoomAtom)[sectionKey]);\n","import { useEffect, useState } from 'react';\n\nexport function usePrefersReducedMotion() {\n  const [prefersReducedMotion, setPrefersReducedMotion] = useState(\n    () => window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false\n  );\n\n  useEffect(() => {\n    const query = window.matchMedia?.('(prefers-reduced-motion: reduce)');\n    if (!query) return undefined;\n\n    const handleChange = () => setPrefersReducedMotion(query.matches);\n    query.addEventListener('change', handleChange);\n    return () => query.removeEventListener('change', handleChange);\n  }, []);\n\n  return prefersReducedMotion;\n}\n","/**\n * Persistent localStorage cache for image packs (emoji / stickers).\n *\n * Sliding Sync may not deliver `im.ponies.room_emotes` state events for rooms\n * that aren't actively subscribed, so previously-seen packs would silently\n * disappear on the next session.  This cache persists the serialised pack\n * content keyed by (userId, scope) so the UI can show stale-but-usable packs\n * while the live state catches up.\n *\n * Scopes\n *   'user'           – the user's own im.ponies.user_emotes account-data pack\n *   'global'         – all globally-enabled room packs via im.ponies.emote_rooms\n *   'room:<roomId>'  – packs local to a specific room\n */\n\nimport { PackAddress } from './PackAddress';\nimport { ImagePack } from './ImagePack';\nimport type { PackContent, PackImages } from './types';\n\n// --------------------------------------------------------------------------\n// Types stored in localStorage\n// --------------------------------------------------------------------------\n\ntype CachedAddress = { roomId: string; stateKey: string };\n\ntype CachedPackEntry = {\n  id: string;\n  content: PackContent;\n  address?: CachedAddress;\n};\n\n// --------------------------------------------------------------------------\n// Constants\n// --------------------------------------------------------------------------\n\nconst STORAGE_KEY_PREFIX = 'sable:imgpk:v1';\n\n// --------------------------------------------------------------------------\n// Helpers\n// --------------------------------------------------------------------------\n\nfunction storageKey(userId: string, scope: string): string {\n  return `${STORAGE_KEY_PREFIX}:${userId}:${scope}`;\n}\n\n/** Reconstruct a plain `PackContent` from a live `ImagePack` instance. */\nfunction toPackContent(pack: ImagePack): PackContent {\n  const rawImages: PackImages = {};\n  pack.images.collection.forEach((img, shortcode) => {\n    rawImages[shortcode] = img.content;\n  });\n  return {\n    pack: pack.meta.content,\n    images: rawImages,\n  };\n}\n\nfunction deserializePacks(entries: CachedPackEntry[]): ImagePack[] {\n  return entries.map(({ id, content, address }) => {\n    const addr = address ? new PackAddress(address.roomId, address.stateKey) : undefined;\n    return new ImagePack(id, content, addr);\n  });\n}\n\nfunction serializePacks(packs: ImagePack[]): CachedPackEntry[] {\n  return packs\n    .filter((pack) => !pack.deleted)\n    .map((pack) => ({\n      id: pack.id,\n      content: toPackContent(pack),\n      address: pack.address\n        ? { roomId: pack.address.roomId, stateKey: pack.address.stateKey }\n        : undefined,\n    }));\n}\n\n// --------------------------------------------------------------------------\n// Public API\n// --------------------------------------------------------------------------\n\n/** Read cached packs for the given scope. Returns an empty array on any error. */\nexport function readCachedPacks(userId: string, scope: string): ImagePack[] {\n  try {\n    const raw = localStorage.getItem(storageKey(userId, scope));\n    if (!raw) return [];\n    const entries = JSON.parse(raw);\n    if (!Array.isArray(entries)) return [];\n    return deserializePacks(entries as CachedPackEntry[]);\n  } catch {\n    return [];\n  }\n}\n\n/** Read a single cached pack for the given scope. Returns undefined on any error or miss. */\nexport function readCachedPack(userId: string, scope: string): ImagePack | undefined {\n  return readCachedPacks(userId, scope)[0];\n}\n\n/** Persist packs for the given scope. Silently ignores storage errors. */\nexport function writeCachedPacks(userId: string, scope: string, packs: ImagePack[]): void {\n  try {\n    const entries = serializePacks(packs);\n    if (entries.length === 0) {\n      localStorage.removeItem(storageKey(userId, scope));\n    } else {\n      localStorage.setItem(storageKey(userId, scope), JSON.stringify(entries));\n    }\n  } catch {\n    // private browsing / storage quota – silently ignore\n  }\n}\n\n/** Persist a single pack, or remove the entry when undefined. */\nexport function writeCachedPack(userId: string, scope: string, pack: ImagePack | undefined): void {\n  writeCachedPacks(userId, scope, pack ? [pack] : []);\n}\n\n/** Scope string for the user's own pack. */\nexport const userPackScope = () => 'user';\n\n/** Scope string for the global pack list. */\nexport const globalPacksScope = () => 'global';\n\n/** Scope string for a specific room's packs. */\nexport const roomPacksScope = (roomId: string) => `room:${roomId}`;\n","import { matchPath } from 'react-router';\nimport { isEventId, isRoomAlias, isRoomId } from '$utils/matrix';\nimport {\n  DIRECT_ROOM_FORUM_PATH,\n  DIRECT_ROOM_PATH,\n  HOME_ROOM_FORUM_PATH,\n  HOME_ROOM_PATH,\n  SPACE_ROOM_FORUM_PATH,\n  SPACE_ROOM_PATH,\n} from './paths';\n\nexport type RoomRouteMatch = {\n  roomIdOrAlias: string;\n  eventId?: string;\n};\n\nconst isForumRoute = (pathname: string): boolean =>\n  [HOME_ROOM_FORUM_PATH, DIRECT_ROOM_FORUM_PATH, SPACE_ROOM_FORUM_PATH].some(\n    (path) => matchPath({ path, end: false }, pathname) !== null\n  );\n\nexport const matchRoomRoute = (pathname: string): RoomRouteMatch | undefined => {\n  if (isForumRoute(pathname)) return undefined;\n\n  const match =\n    matchPath({ path: HOME_ROOM_PATH, end: false }, pathname) ??\n    matchPath({ path: DIRECT_ROOM_PATH, end: false }, pathname) ??\n    matchPath({ path: SPACE_ROOM_PATH, end: false }, pathname);\n  if (!match) return undefined;\n\n  const encodedId = match.params.roomIdOrAlias;\n  if (!encodedId) return undefined;\n  const roomIdOrAlias = decodeURIComponent(encodedId);\n  if (!isRoomId(roomIdOrAlias) && !isRoomAlias(roomIdOrAlias)) return undefined;\n\n  const encodedEvent = match.params.eventId;\n  const eventId = encodedEvent ? decodeURIComponent(encodedEvent) : undefined;\n\n  return {\n    roomIdOrAlias,\n    eventId: eventId && isEventId(eventId) ? eventId : undefined,\n  };\n};\n","import type { MatrixClient, MatrixEvent, RoomState } from '$types/matrix-sdk';\nimport { RoomStateEvent } from '$types/matrix-sdk';\nimport { useEffect } from 'react';\n\nexport type StateEventCallback = (\n  event: MatrixEvent,\n  state: RoomState,\n  lastStateEvent: MatrixEvent | null\n) => void;\n\nexport const useStateEventCallback = (mx: MatrixClient, onStateEvent: StateEventCallback) => {\n  useEffect(() => {\n    mx.on(RoomStateEvent.Events, onStateEvent);\n    return () => {\n      mx.removeListener(RoomStateEvent.Events, onStateEvent);\n    };\n  }, [mx, onStateEvent]);\n};\n","import { useReducer } from 'react';\n\nconst reducer = (prevCount: number): number => prevCount + 1;\n\nexport const useForceUpdate = (): [number, () => void] => {\n  const [state, dispatch] = useReducer(reducer, 0);\n\n  return [state, () => dispatch()];\n};\n","import type { Room, StateEvents } from '$types/matrix-sdk';\nimport { useCallback, useMemo } from 'react';\n\nimport { getStateEvent } from '$utils/room/hierarchy';\nimport { useStateEventCallback } from './useStateEventCallback';\nimport { useForceUpdate } from './useForceUpdate';\n\nexport const useStateEvent = (room: Room, eventType: keyof StateEvents, stateKey = '') => {\n  const [updateCount, forceUpdate] = useForceUpdate();\n\n  useStateEventCallback(\n    room.client,\n    useCallback(\n      (event) => {\n        if (\n          event.getRoomId() === room.roomId &&\n          event.getType() === (eventType as string) &&\n          event.getStateKey() === stateKey\n        ) {\n          forceUpdate();\n        }\n      },\n      [room, eventType, stateKey, forceUpdate]\n    )\n  );\n\n  return useMemo(() => {\n    void updateCount;\n    return getStateEvent(room, eventType, stateKey);\n  }, [room, eventType, stateKey, updateCount]);\n};\n","import { createContext, useContext } from 'react';\nimport type { MatrixClient } from '$types/matrix-sdk';\n\nconst MatrixClientContext = createContext<MatrixClient | null>(null);\n\nexport const MatrixClientProvider = MatrixClientContext.Provider;\n\nexport function useMatrixClient(): MatrixClient {\n  const mx = useContext(MatrixClientContext);\n  if (!mx) throw new Error('MatrixClient not initialized!');\n  return mx;\n}\n","import type { MatrixEvent, Room } from '$types/matrix-sdk';\nimport { createContext, useCallback, useContext, useMemo, useState } from 'react';\nimport { produce } from 'immer';\n\nimport { getStateEvent } from '$utils/room/hierarchy';\nimport { useStateEvent } from './useStateEvent';\nimport { useStateEventCallback } from './useStateEventCallback';\nimport { useMatrixClient } from './useMatrixClient';\nimport { EventType } from '$types/matrix-sdk';\n\nexport type PowerLevelActions = 'invite' | 'redact' | 'kick' | 'ban' | 'historical';\nexport type PowerLevelNotificationsAction = 'room';\n\nexport type IPowerLevels = {\n  users_default?: number;\n  state_default?: number;\n  events_default?: number;\n  historical?: number;\n  invite?: number;\n  redact?: number;\n  kick?: number;\n  ban?: number;\n\n  events?: Record<string, number>;\n  users?: Record<string, number>;\n  notifications?: Record<string, number>;\n};\n\nconst DEFAULT_POWER_LEVELS: Required<IPowerLevels> = {\n  users_default: 0,\n  state_default: 50,\n  events_default: 0,\n  invite: 0,\n  redact: 50,\n  kick: 50,\n  ban: 50,\n  historical: 0,\n  events: {},\n  users: {},\n  notifications: {\n    room: 50,\n  },\n};\n\nconst fillMissingPowers = (powerLevels: IPowerLevels): IPowerLevels =>\n  produce(powerLevels, (draftPl: IPowerLevels) => {\n    const keys = Object.keys(DEFAULT_POWER_LEVELS) as unknown as (keyof IPowerLevels)[];\n    keys.forEach((key) => {\n      if (draftPl[key] === undefined) {\n        (draftPl as Record<string, unknown>)[key] =\n          (DEFAULT_POWER_LEVELS as Record<string, unknown>)[key] ?? 0;\n      }\n    });\n    if (draftPl.notifications && typeof draftPl.notifications.room !== 'number') {\n      draftPl.notifications.room = DEFAULT_POWER_LEVELS.notifications.room as number;\n    }\n    return draftPl;\n  });\n\nconst getPowersLevelFromMatrixEvent = (mEvent?: MatrixEvent): IPowerLevels => {\n  const plContent = mEvent?.getContent<IPowerLevels>();\n\n  const powerLevels = !plContent ? DEFAULT_POWER_LEVELS : fillMissingPowers(plContent);\n\n  return powerLevels;\n};\n\nexport function usePowerLevels(room: Room): IPowerLevels {\n  const powerLevelsEvent = useStateEvent(room, EventType.RoomPowerLevels);\n  const powerLevels: IPowerLevels = useMemo(\n    () => getPowersLevelFromMatrixEvent(powerLevelsEvent),\n    [powerLevelsEvent]\n  );\n\n  return powerLevels;\n}\n\nconst PowerLevelsContext = createContext<IPowerLevels | null>(null);\n\nexport const PowerLevelsContextProvider = PowerLevelsContext.Provider;\n\nexport const usePowerLevelsContext = (): IPowerLevels => {\n  const pl = useContext(PowerLevelsContext);\n  if (!pl) throw new Error('PowerLevelContext is not initialized!');\n  return pl;\n};\n\nconst buildRoomsPowerLevels = (rooms: Room[]): Map<string, IPowerLevels> => {\n  const rToPl = new Map<string, IPowerLevels>();\n\n  rooms.forEach((room) => {\n    const mEvent = getStateEvent(room, EventType.RoomPowerLevels, '');\n    rToPl.set(room.roomId, getPowersLevelFromMatrixEvent(mEvent));\n  });\n\n  return rToPl;\n};\n\nexport const useRoomsPowerLevels = (rooms: Room[]): Map<string, IPowerLevels> => {\n  const mx = useMatrixClient();\n  const [roomToPowerLevels, setRoomToPowerLevels] = useState(() => buildRoomsPowerLevels(rooms));\n  const [derivedFrom, setDerivedFrom] = useState(rooms);\n\n  // Rooms arriving after mount — a space hierarchy resolving, or state loading\n  // lazily under sliding sync — must re-derive, or their permissions are stuck\n  // at the defaults until a reload.\n  if (derivedFrom !== rooms) {\n    setDerivedFrom(rooms);\n    setRoomToPowerLevels(buildRoomsPowerLevels(rooms));\n  }\n\n  useStateEventCallback(\n    mx,\n    useCallback(\n      (event) => {\n        const roomId = event.getRoomId();\n        if (\n          roomId &&\n          [EventType.RoomPowerLevels as string, EventType.RoomCreate as string].includes(\n            event.getType()\n          ) &&\n          event.getStateKey() === '' &&\n          rooms.some((r) => r.roomId === roomId)\n        ) {\n          setRoomToPowerLevels(buildRoomsPowerLevels(rooms));\n        }\n      },\n      [rooms]\n    )\n  );\n\n  return roomToPowerLevels;\n};\n\nexport type ReadPowerLevelAPI = {\n  user: (powerLevels: IPowerLevels, userId: string | undefined) => number;\n  event: (powerLevels: IPowerLevels, eventType: string | undefined) => number;\n  state: (powerLevels: IPowerLevels, eventType: string | undefined) => number;\n  action: (powerLevels: IPowerLevels, action: PowerLevelActions) => number;\n  notification: (powerLevels: IPowerLevels, action: PowerLevelNotificationsAction) => number;\n};\n\nexport const readPowerLevel: ReadPowerLevelAPI = {\n  user: (powerLevels, userId) => {\n    const { users_default: usersDefault, users } = powerLevels;\n\n    if (userId && users && typeof users[userId] === 'number') {\n      return users[userId];\n    }\n    return usersDefault ?? DEFAULT_POWER_LEVELS.users_default;\n  },\n  event: (powerLevels, eventType) => {\n    const { events, events_default: eventsDefault } = powerLevels;\n    if (events && eventType && typeof events[eventType] === 'number') {\n      return events[eventType];\n    }\n    return eventsDefault ?? DEFAULT_POWER_LEVELS.events_default;\n  },\n  state: (powerLevels, eventType) => {\n    const { events, state_default: stateDefault } = powerLevels;\n    if (events && eventType && typeof events[eventType] === 'number') {\n      return events[eventType];\n    }\n    return stateDefault ?? DEFAULT_POWER_LEVELS.state_default;\n  },\n  action: (powerLevels, action) => {\n    const powerLevel = powerLevels[action];\n    if (typeof powerLevel === 'number') {\n      return powerLevel;\n    }\n    return DEFAULT_POWER_LEVELS[action];\n  },\n  notification: (powerLevels, action) => {\n    const powerLevel = powerLevels.notifications?.[action];\n    if (typeof powerLevel === 'number') {\n      return powerLevel;\n    }\n    return DEFAULT_POWER_LEVELS.notifications[action] ?? 50;\n  },\n};\n\nexport const useGetMemberPowerLevel = (powerLevels: IPowerLevels) => {\n  const callback = useCallback(\n    (userId?: string): number => readPowerLevel.user(powerLevels, userId),\n    [powerLevels]\n  );\n\n  return callback;\n};\n\n/**\n * Permissions\n */\n\ntype DefaultPermissionLocation = {\n  user: true;\n  key?: string;\n};\n\ntype ActionPermissionLocation = {\n  action: true;\n  key: PowerLevelActions;\n};\n\ntype EventPermissionLocation = {\n  state?: true;\n  key?: string;\n};\n\ntype NotificationPermissionLocation = {\n  notification: true;\n  key: PowerLevelNotificationsAction;\n};\n\nexport type PermissionLocation =\n  | DefaultPermissionLocation\n  | ActionPermissionLocation\n  | EventPermissionLocation\n  | NotificationPermissionLocation;\n\nexport const getPermissionPower = (\n  powerLevels: IPowerLevels,\n  location: PermissionLocation | PermissionLocation[]\n): number => {\n  if (Array.isArray(location)) {\n    return Math.max(...location.map((loc) => getPermissionPower(powerLevels, loc)));\n  }\n\n  if ('user' in location) {\n    return readPowerLevel.user(powerLevels, location.key);\n  }\n  if ('action' in location) {\n    return readPowerLevel.action(powerLevels, location.key);\n  }\n  if ('notification' in location) {\n    return readPowerLevel.notification(powerLevels, location.key);\n  }\n  if ('state' in location) {\n    return readPowerLevel.state(powerLevels, location.key);\n  }\n\n  return readPowerLevel.event(powerLevels, location.key);\n};\n\nexport const applyPermissionPower = (\n  powerLevels: IPowerLevels,\n  location: PermissionLocation | PermissionLocation[],\n  power: number\n): IPowerLevels => {\n  if (Array.isArray(location)) {\n    let result = powerLevels;\n    location.forEach((loc) => {\n      result = applyPermissionPower(result, loc, power);\n    });\n    return result;\n  }\n\n  if ('user' in location) {\n    if (typeof location.key === 'string') {\n      const users = powerLevels.users ?? {};\n      users[location.key] = power;\n      powerLevels.users = users;\n      return powerLevels;\n    }\n    powerLevels.users_default = power;\n    return powerLevels;\n  }\n  if ('action' in location) {\n    powerLevels[location.key] = power;\n    return powerLevels;\n  }\n  if ('notification' in location) {\n    const notifications = powerLevels.notifications ?? {};\n    notifications[location.key] = power;\n    powerLevels.notifications = notifications;\n    return powerLevels;\n  }\n  if ('state' in location) {\n    if (typeof location.key === 'string') {\n      const events = powerLevels.events ?? {};\n      events[location.key] = power;\n      powerLevels.events = events;\n      return powerLevels;\n    }\n    powerLevels.state_default = power;\n    return powerLevels;\n  }\n\n  if (typeof location.key === 'string') {\n    const events = powerLevels.events ?? {};\n    events[location.key] = power;\n    powerLevels.events = events;\n    return powerLevels;\n  }\n  powerLevels.events_default = power;\n  return powerLevels;\n};\n","import type { Room } from '$types/matrix-sdk';\nimport { createContext, useContext } from 'react';\n\nconst RoomContext = createContext<Room | null>(null);\n\nexport const RoomProvider = RoomContext.Provider;\n\nexport function useRoom(): Room {\n  const room = useContext(RoomContext);\n  if (!room) throw new Error('Room not provided!');\n  return room;\n}\n\nexport function useRoomOptionally(): Room | null {\n  return useContext(RoomContext);\n}\n\nconst IsDirectRoomContext = createContext(false);\n\nexport const IsDirectRoomProvider = IsDirectRoomContext.Provider;\n\nexport const useIsDirectRoom = () => {\n  const direct = useContext(IsDirectRoomContext);\n\n  return direct;\n};\n\nconst DisplayedEventIdContext = createContext<string | undefined>(undefined);\n\nexport const DisplayedEventIdProvider = DisplayedEventIdContext.Provider;\n\nexport const useDisplayedEventId = () => useContext(DisplayedEventIdContext);\n\nconst IsInactivePanelContext = createContext(false);\n\nexport const IsInactivePanelProvider = IsInactivePanelContext.Provider;\n\n/** True when the room is mounted behind the list panel. Gates auto-mark-as-read and read receipts. */\nexport const useIsInactivePanel = () => useContext(IsInactivePanelContext);\n","import { useEffect } from 'react';\n\nexport const useKeyDown = (target: Window, callback: (evt: KeyboardEvent) => void) => {\n  useEffect(() => {\n    target.addEventListener('keydown', callback);\n    return () => {\n      target.removeEventListener('keydown', callback);\n    };\n  }, [target, callback]);\n};\n","import type { MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk';\nimport { NotificationCountType, ReceiptType } from '$types/matrix-sdk';\nimport { isTauri } from '@tauri-apps/api/core';\n\nconst latestReceiptTarget = (timeline: MatrixEvent[], readEventId: string | null) => {\n  for (let i = timeline.length - 1; i >= 0; i -= 1) {\n    const event = timeline[i];\n    if (!event) continue;\n    if (event.getId() === readEventId) return null;\n    if (!event.isSending()) return event;\n  }\n  return null;\n};\n\nconst markRoomTimelineAsRead = async (\n  mx: MatrixClient,\n  room: Room,\n  userId: string,\n  privateReceipt: boolean\n): Promise<boolean> => {\n  const target = latestReceiptTarget(\n    room.getLiveTimeline().getEvents(),\n    room.getEventReadUpTo(userId)\n  );\n  const targetId = target?.getId();\n  if (!target || !targetId) return false;\n\n  if (privateReceipt) {\n    await mx.setRoomReadMarkers(room.roomId, targetId, undefined, target);\n  } else {\n    await mx.setRoomReadMarkers(room.roomId, targetId, target);\n  }\n  room.setUnreadNotificationCount(NotificationCountType.Total, 0);\n  room.setUnreadNotificationCount(NotificationCountType.Highlight, 0);\n  return true;\n};\n\n// Thread replies never land in the live timeline, and the room badge sums the\n// per-thread counters, so the room receipt alone can never clear them.\nconst markThreadsAsRead = async (\n  mx: MatrixClient,\n  room: Room,\n  userId: string,\n  privateReceipt: boolean\n): Promise<boolean> => {\n  const receiptType = privateReceipt ? ReceiptType.ReadPrivate : ReceiptType.Read;\n\n  const cleared = await Promise.all(\n    room.getThreads().map(async (thread) => {\n      const hasUnread =\n        room.getThreadUnreadNotificationCount(thread.id, NotificationCountType.Total) > 0 ||\n        room.getThreadUnreadNotificationCount(thread.id, NotificationCountType.Highlight) > 0;\n      if (!hasUnread) return false;\n\n      const lastReply = thread.lastReply((event) => !event.isSending());\n      const lastReplyId = lastReply?.getId();\n      if (!lastReply || !lastReplyId) return false;\n\n      if (thread.getEventReadUpTo(userId) !== lastReplyId) {\n        try {\n          await mx.sendReadReceipt(lastReply, receiptType);\n        } catch {\n          return false;\n        }\n      }\n      room.setThreadUnreadNotificationCount(thread.id, NotificationCountType.Total, 0);\n      room.setThreadUnreadNotificationCount(thread.id, NotificationCountType.Highlight, 0);\n      return true;\n    })\n  );\n\n  return cleared.some(Boolean);\n};\n\n// includeThreads is for explicit \"mark as read\" actions only: reading the main\n// timeline must not wipe badges for threads the user has not opened.\nexport async function markAsRead(\n  mx: MatrixClient,\n  roomId: string,\n  privateReceipt: boolean,\n  includeThreads = false\n) {\n  const room = mx.getRoom(roomId);\n  const userId = mx.getUserId();\n  if (!room || !userId) return;\n\n  const roomCleared = await markRoomTimelineAsRead(mx, room, userId, privateReceipt);\n  const threadsCleared =\n    includeThreads && (await markThreadsAsRead(mx, room, userId, privateReceipt));\n  if (!roomCleared && !threadsCleared) return;\n\n  // On Android (Tauri), dismiss the room's OS notification immediately so\n  // it stays in sync with the read state instead of lingering until the\n  // next push payload with unread: 0 arrives.\n  if (isTauri()) {\n    try {\n      const { clearRoomNotification } =\n        await import('$features/settings/notifications/UnifiedPushNotifications');\n      await clearRoomNotification(userId, roomId);\n    } catch {\n      // Notification plugin not available (desktop, web) — ignore.\n    }\n  }\n}\n","import type { MatrixClient } from '$types/matrix-sdk';\nimport { EventType, KnownMembership, MatrixEvent } from '$types/matrix-sdk';\n\nconst inFlight = new WeakMap<MatrixClient, Map<string, Promise<void>>>();\n\n// Members whose state event could not be fetched (e.g. defunct bridge ghosts)\n// are skipped for a while so virtualized-timeline remounts don't refetch them.\nconst FAILURE_TTL_MS = 5 * 60_000;\nconst MAX_CONCURRENT_REQUESTS = 4;\nconst failedAt = new WeakMap<MatrixClient, Map<string, number>>();\nconst activeRequests = new WeakMap<MatrixClient, number>();\nconst requestQueues = new WeakMap<MatrixClient, Array<() => void>>();\n\nconst REFRESH_TTL_MS = 10 * 60_000;\nconst refreshedAt = new WeakMap<MatrixClient, Map<string, number>>();\n\nconst scheduleRequest = <T>(mx: MatrixClient, task: () => Promise<T>): Promise<T> =>\n  new Promise<T>((resolve, reject) => {\n    const run = () => {\n      activeRequests.set(mx, (activeRequests.get(mx) ?? 0) + 1);\n      void task()\n        .then(resolve, reject)\n        .finally(() => {\n          const active = Math.max(0, (activeRequests.get(mx) ?? 1) - 1);\n          activeRequests.set(mx, active);\n          const queue = requestQueues.get(mx);\n          if (active < MAX_CONCURRENT_REQUESTS) queue?.shift()?.();\n        });\n    };\n\n    if ((activeRequests.get(mx) ?? 0) < MAX_CONCURRENT_REQUESTS) {\n      run();\n      return;\n    }\n\n    const queue = requestQueues.get(mx) ?? [];\n    requestQueues.set(mx, queue);\n    queue.push(run);\n  });\n\nexport const hydrateRoomMember = (\n  mx: MatrixClient,\n  roomId: string,\n  userId: string,\n  force = false\n): Promise<void> => {\n  const room = mx.getRoom(roomId);\n  if (!room) return Promise.resolve();\n  if (!force && room.getMember(userId)) return Promise.resolve();\n\n  const key = `${roomId}\\u0000${userId}`;\n\n  if (force) {\n    const lastRefreshed = refreshedAt.get(mx)?.get(key);\n    if (lastRefreshed !== undefined && Date.now() - lastRefreshed < REFRESH_TTL_MS)\n      return Promise.resolve();\n  }\n\n  const failedTs = failedAt.get(mx)?.get(key);\n  if (failedTs !== undefined && Date.now() - failedTs < FAILURE_TTL_MS) return Promise.resolve();\n\n  const pending = inFlight.get(mx) ?? new Map<string, Promise<void>>();\n  inFlight.set(mx, pending);\n  const existing = pending.get(key);\n  if (existing) return existing;\n\n  const request = scheduleRequest(mx, async () => {\n    // A request may have waited in the queue while another event supplied the\n    // member state. Avoid issuing a redundant network request in that case.\n    const requestRoom = mx.getRoom(roomId);\n    if (!requestRoom) return;\n    if (!force && requestRoom.getMember(userId)) return;\n    const content = await mx.getStateEvent(roomId, EventType.RoomMember, userId);\n    const currentRoom = mx.getRoom(roomId);\n    if (!currentRoom) return;\n    if (!force && currentRoom.getMember(userId)) return;\n    currentRoom.currentState.setStateEvents([\n      new MatrixEvent({\n        type: EventType.RoomMember,\n        state_key: userId,\n        room_id: roomId,\n        sender: userId,\n        content,\n      }),\n    ]);\n  })\n    .then(() => {\n      failedAt.get(mx)?.delete(key);\n      if (force) {\n        const refreshMap = refreshedAt.get(mx) ?? new Map<string, number>();\n        refreshedAt.set(mx, refreshMap);\n        refreshMap.set(key, Date.now());\n      }\n    })\n    .catch(() => {\n      const failures = failedAt.get(mx) ?? new Map<string, number>();\n      failedAt.set(mx, failures);\n      failures.set(key, Date.now());\n    })\n    .finally(() => pending.delete(key));\n\n  pending.set(key, request);\n  return request;\n};\n\n// The SDK only fetches /members when the sync store holds no out-of-band member\n// set for the room. Sliding sync sends $LAZY members, so a room whose stored set\n// predates most joins keeps a short roster forever. Refill it from the server.\nconst BULK_TTL_MS = 5 * 60_000;\nconst bulkInFlight = new WeakMap<MatrixClient, Map<string, Promise<void>>>();\ntype BulkAttempt = { at: number; joinedCount: number };\nconst bulkAttempts = new WeakMap<MatrixClient, Map<string, BulkAttempt>>();\n\nexport const hydrateAllRoomMembers = (mx: MatrixClient, roomId: string): Promise<void> => {\n  const room = mx.getRoom(roomId);\n  if (!room) return Promise.resolve();\n  const joinedCount = room.getJoinedMemberCount();\n  if (room.getJoinedMembers().length >= joinedCount) return Promise.resolve();\n\n  // An attempt made against a smaller joined count must not silence the refill.\n  const attempt = bulkAttempts.get(mx)?.get(roomId);\n  if (attempt && Date.now() - attempt.at < BULK_TTL_MS && joinedCount <= attempt.joinedCount)\n    return Promise.resolve();\n\n  const pending = bulkInFlight.get(mx) ?? new Map<string, Promise<void>>();\n  bulkInFlight.set(mx, pending);\n  const existing = pending.get(roomId);\n  if (existing) return existing;\n\n  const attempts = bulkAttempts.get(mx) ?? new Map<string, BulkAttempt>();\n  bulkAttempts.set(mx, attempts);\n  attempts.set(roomId, { at: Date.now(), joinedCount });\n\n  const request = mx\n    .members(roomId, undefined, KnownMembership.Leave)\n    .then(({ chunk }) => {\n      const currentRoom = mx.getRoom(roomId);\n      if (!currentRoom || !chunk) return;\n      // The response is current state, which may be ahead of our sync position,\n      // so only fill in members we are missing rather than overwriting known ones.\n      const missing = chunk.filter(\n        (event) => event.state_key && !currentRoom.getMember(event.state_key)\n      );\n      if (missing.length === 0) return;\n      currentRoom.currentState.setStateEvents(missing.map((event) => new MatrixEvent(event)));\n    })\n    .catch(() => undefined)\n    .finally(() => pending.delete(roomId));\n\n  pending.set(roomId, request);\n  return request;\n};\n\nexport const hydrateRoomMembers = (\n  mx: MatrixClient,\n  roomId: string,\n  userIds: Iterable<string>\n): Promise<void[]> =>\n  Promise.all(\n    [...new Set(userIds)]\n      .filter((userId) => userId.startsWith('@'))\n      .map((userId) => hydrateRoomMember(mx, roomId, userId))\n  );\n","import type { MatrixClient, MatrixEvent, RoomMember } from '$types/matrix-sdk';\nimport { ClientEvent, RoomMemberEvent } from '$types/matrix-sdk';\nimport { useEffect, useState } from 'react';\nimport { hydrateAllRoomMembers } from '$client/roomMemberHydration';\n\nconst MAX_EAGER_MEMBER_COUNT = 1_000;\n\nconst sameRoster = (prev: RoomMember[], next: RoomMember[]): boolean =>\n  prev.length === next.length &&\n  prev.every((member, index) => {\n    const other = next[index];\n    return (\n      !!other &&\n      member.userId === other.userId &&\n      member.membership === other.membership &&\n      member.powerLevel === other.powerLevel\n    );\n  });\n\nexport const useRoomMembers = (mx: MatrixClient, roomId: string, enabled = true): RoomMember[] => {\n  const [members, setMembers] = useState<RoomMember[]>([]);\n\n  useEffect(() => {\n    if (!enabled) {\n      setMembers([]);\n      return undefined;\n    }\n\n    const room = mx.getRoom(roomId);\n    let disposed = false;\n    const canEagerlyLoadRoster = !!room && room.getJoinedMemberCount() <= MAX_EAGER_MEMBER_COUNT;\n\n    const updateMemberList = (event?: MatrixEvent) => {\n      if (!room || disposed || (event && event.getRoomId() !== roomId)) return;\n      const next = room.getMembers();\n      setMembers((prev) => (sameRoster(prev, next) ? prev : next));\n    };\n\n    // A failed SDK member load must not trigger the direct roster fallback:\n    // classic sync already owns retries.\n    let refillAllowed = false;\n    const refillRoster = () => {\n      if (\n        !room ||\n        disposed ||\n        !canEagerlyLoadRoster ||\n        room.getJoinedMemberCount() > MAX_EAGER_MEMBER_COUNT ||\n        !refillAllowed\n      )\n        return;\n      void hydrateAllRoomMembers(mx, roomId).then(() => updateMemberList());\n    };\n\n    if (room) {\n      setMembers(room.getMembers());\n      // Keep the lazy-loaded roster in large rooms: requesting all member state\n      // can make the client unresponsive before the virtualized drawer renders.\n      if (canEagerlyLoadRoster) {\n        // Sliding sync may retain an incomplete member set. Do not let its SDK\n        // request block incoming membership updates.\n        void room.loadMembersIfNeeded().then(\n          () => {\n            refillAllowed = true;\n            updateMemberList();\n            refillRoster();\n          },\n          () => updateMemberList()\n        );\n      }\n    }\n\n    mx.on(RoomMemberEvent.Membership, updateMemberList);\n    mx.on(RoomMemberEvent.PowerLevel, updateMemberList);\n    // joined_count can rise after mount and emits no event of its own.\n    mx.on(ClientEvent.Sync, refillRoster);\n    return () => {\n      disposed = true;\n      mx.removeListener(RoomMemberEvent.Membership, updateMemberList);\n      mx.removeListener(RoomMemberEvent.PowerLevel, updateMemberList);\n      mx.removeListener(ClientEvent.Sync, refillRoster);\n    };\n  }, [enabled, mx, roomId]);\n\n  return members;\n};\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WidgetApiDirection = void 0;\nexports.invertedDirection = invertedDirection;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar WidgetApiDirection = /*#__PURE__*/function (WidgetApiDirection) {\n  WidgetApiDirection[\"ToWidget\"] = \"toWidget\";\n  WidgetApiDirection[\"FromWidget\"] = \"fromWidget\";\n  return WidgetApiDirection;\n}({});\nexports.WidgetApiDirection = WidgetApiDirection;\nfunction invertedDirection(dir) {\n  if (dir === WidgetApiDirection.ToWidget) {\n    return WidgetApiDirection.FromWidget;\n  } else if (dir === WidgetApiDirection.FromWidget) {\n    return WidgetApiDirection.ToWidget;\n  } else {\n    throw new Error(\"Invalid direction\");\n  }\n}\n//# sourceMappingURL=WidgetApiDirection.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.UnstableApiVersion = exports.MatrixApiVersion = exports.CurrentApiVersions = void 0;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MatrixApiVersion = /*#__PURE__*/function (MatrixApiVersion) {\n  MatrixApiVersion[\"Prerelease1\"] = \"0.0.1\";\n  MatrixApiVersion[\"Prerelease2\"] = \"0.0.2\";\n  return MatrixApiVersion;\n}({}); //V010 = \"0.1.0\", // first release\nexports.MatrixApiVersion = MatrixApiVersion;\nvar UnstableApiVersion = /*#__PURE__*/function (UnstableApiVersion) {\n  UnstableApiVersion[\"MSC2762\"] = \"org.matrix.msc2762\";\n  UnstableApiVersion[\"MSC2762_UPDATE_STATE\"] = \"org.matrix.msc2762_update_state\";\n  UnstableApiVersion[\"MSC2871\"] = \"org.matrix.msc2871\";\n  UnstableApiVersion[\"MSC2873\"] = \"org.matrix.msc2873\";\n  UnstableApiVersion[\"MSC2931\"] = \"org.matrix.msc2931\";\n  UnstableApiVersion[\"MSC2974\"] = \"org.matrix.msc2974\";\n  UnstableApiVersion[\"MSC2876\"] = \"org.matrix.msc2876\";\n  UnstableApiVersion[\"MSC3819\"] = \"org.matrix.msc3819\";\n  UnstableApiVersion[\"MSC3846\"] = \"town.robin.msc3846\";\n  UnstableApiVersion[\"MSC3869\"] = \"org.matrix.msc3869\";\n  UnstableApiVersion[\"MSC3973\"] = \"org.matrix.msc3973\";\n  UnstableApiVersion[\"MSC4039\"] = \"org.matrix.msc4039\";\n  return UnstableApiVersion;\n}({});\nexports.UnstableApiVersion = UnstableApiVersion;\nvar CurrentApiVersions = [MatrixApiVersion.Prerelease1, MatrixApiVersion.Prerelease2,\n//MatrixApiVersion.V010,\nUnstableApiVersion.MSC2762, UnstableApiVersion.MSC2762_UPDATE_STATE, UnstableApiVersion.MSC2871, UnstableApiVersion.MSC2873, UnstableApiVersion.MSC2931, UnstableApiVersion.MSC2974, UnstableApiVersion.MSC2876, UnstableApiVersion.MSC3819, UnstableApiVersion.MSC3846, UnstableApiVersion.MSC3869, UnstableApiVersion.MSC3973, UnstableApiVersion.MSC4039];\nexports.CurrentApiVersions = CurrentApiVersions;\n//# sourceMappingURL=ApiVersion.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PostmessageTransport = void 0;\nvar _events = require(\"events\");\nvar _ = require(\"..\");\nvar _excluded = [\"message\"];\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); } /*\n                                                                                                                                                                                                                                                                                                                                                                                               * Copyright 2020 - 2024 The Matrix.org Foundation C.I.C.\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               * Licensed under the Apache License, Version 2.0 (the \"License\");\n                                                                                                                                                                                                                                                                                                                                                                                               * you may not use this file except in compliance with the License.\n                                                                                                                                                                                                                                                                                                                                                                                               * You may obtain a copy of the License at\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               *         http://www.apache.org/licenses/LICENSE-2.0\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               * Unless required by applicable law or agreed to in writing, software\n                                                                                                                                                                                                                                                                                                                                                                                               * distributed under the License is distributed on an \"AS IS\" BASIS,\n                                                                                                                                                                                                                                                                                                                                                                                               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                                                                                                                                                                                                                                                                                                                                                                                               * See the License for the specific language governing permissions and\n                                                                                                                                                                                                                                                                                                                                                                                               * limitations under the License.\n                                                                                                                                                                                                                                                                                                                                                                                               */\n/**\n * Transport for the Widget API over postMessage.\n */\nvar PostmessageTransport = /*#__PURE__*/function (_EventEmitter) {\n  _inherits(PostmessageTransport, _EventEmitter);\n  var _super = _createSuper(PostmessageTransport);\n  function PostmessageTransport(sendDirection, initialWidgetId, transportWindow, inboundWindow) {\n    var _this;\n    _classCallCheck(this, PostmessageTransport);\n    _this = _super.call(this);\n    _this.sendDirection = sendDirection;\n    _this.transportWindow = transportWindow;\n    _this.inboundWindow = inboundWindow;\n    _defineProperty(_assertThisInitialized(_this), \"strictOriginCheck\", false);\n    _defineProperty(_assertThisInitialized(_this), \"targetOrigin\", \"*\");\n    _defineProperty(_assertThisInitialized(_this), \"timeoutSeconds\", 10);\n    _defineProperty(_assertThisInitialized(_this), \"_ready\", false);\n    _defineProperty(_assertThisInitialized(_this), \"_widgetId\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"outboundRequests\", new Map());\n    _defineProperty(_assertThisInitialized(_this), \"stopController\", new AbortController());\n    _defineProperty(_assertThisInitialized(_this), \"handleMessage\", function (ev) {\n      if (_this.stopController.signal.aborted) return;\n      if (!ev.data) return; // invalid event\n\n      if (_this.strictOriginCheck && ev.origin !== globalThis.origin) return; // bad origin\n\n      // treat the message as a response first, then downgrade to a request\n      var response = ev.data;\n      if (!response.action || !response.requestId || !response.widgetId) return; // invalid request/response\n\n      if (response.response) {\n        if (response.api !== _this.sendDirection) return; // wrong direction\n        _this.handleResponse(response);\n      } else {\n        var request = response;\n        if (request.api !== (0, _.invertedDirection)(_this.sendDirection)) return; // wrong direction\n        _this.handleRequest(request);\n      }\n    });\n    _this._widgetId = initialWidgetId;\n    return _this;\n  }\n  _createClass(PostmessageTransport, [{\n    key: \"ready\",\n    get: function get() {\n      return this._ready;\n    }\n  }, {\n    key: \"widgetId\",\n    get: function get() {\n      return this._widgetId || null;\n    }\n  }, {\n    key: \"nextRequestId\",\n    get: function get() {\n      var idBase = \"widgetapi-\".concat(Date.now());\n      var index = 0;\n      var id = idBase;\n      while (this.outboundRequests.has(id)) {\n        id = \"\".concat(idBase, \"-\").concat(index++);\n      }\n\n      // reserve the ID\n      this.outboundRequests.set(id, null);\n      return id;\n    }\n  }, {\n    key: \"sendInternal\",\n    value: function sendInternal(message) {\n      console.log(\"[PostmessageTransport] Sending object to \".concat(this.targetOrigin, \": \"), message);\n      this.transportWindow.postMessage(message, this.targetOrigin);\n    }\n  }, {\n    key: \"reply\",\n    value: function reply(request, responseData) {\n      return this.sendInternal(_objectSpread(_objectSpread({}, request), {}, {\n        response: responseData\n      }));\n    }\n  }, {\n    key: \"send\",\n    value: function send(action, data) {\n      return this.sendComplete(action, data).then(function (r) {\n        return r.response;\n      });\n    }\n  }, {\n    key: \"sendComplete\",\n    value: function sendComplete(action, data) {\n      var _this2 = this;\n      if (!this.ready || !this.widgetId) {\n        return Promise.reject(new Error(\"Not ready or unknown widget ID\"));\n      }\n      var request = {\n        api: this.sendDirection,\n        widgetId: this.widgetId,\n        requestId: this.nextRequestId,\n        action: action,\n        data: data\n      };\n      if (action === _.WidgetApiToWidgetAction.UpdateVisibility) {\n        request[\"visible\"] = data[\"visible\"];\n      }\n      return new Promise(function (prResolve, prReject) {\n        var resolve = function resolve(response) {\n          cleanUp();\n          prResolve(response);\n        };\n        var reject = function reject(err) {\n          cleanUp();\n          prReject(err);\n        };\n        var timerId = setTimeout(function () {\n          return reject(new Error(\"Request timed out\"));\n        }, (_this2.timeoutSeconds || 1) * 1000);\n        var onStop = function onStop() {\n          return reject(new Error(\"Transport stopped\"));\n        };\n        _this2.stopController.signal.addEventListener(\"abort\", onStop);\n        var cleanUp = function cleanUp() {\n          _this2.outboundRequests[\"delete\"](request.requestId);\n          clearTimeout(timerId);\n          _this2.stopController.signal.removeEventListener(\"abort\", onStop);\n        };\n        _this2.outboundRequests.set(request.requestId, {\n          request: request,\n          resolve: resolve,\n          reject: reject\n        });\n        _this2.sendInternal(request);\n      });\n    }\n  }, {\n    key: \"start\",\n    value: function start() {\n      this.inboundWindow.addEventListener(\"message\", this.handleMessage);\n      this._ready = true;\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      this._ready = false;\n      this.stopController.abort();\n      this.inboundWindow.removeEventListener(\"message\", this.handleMessage);\n    }\n  }, {\n    key: \"handleRequest\",\n    value: function handleRequest(request) {\n      if (this.widgetId) {\n        if (this.widgetId !== request.widgetId) return; // wrong widget\n      } else {\n        this._widgetId = request.widgetId;\n      }\n      this.emit(\"message\", new CustomEvent(\"message\", {\n        detail: request\n      }));\n    }\n  }, {\n    key: \"handleResponse\",\n    value: function handleResponse(response) {\n      if (response.widgetId !== this.widgetId) return; // wrong widget\n\n      var req = this.outboundRequests.get(response.requestId);\n      if (!req) return; // response to an unknown request\n\n      if ((0, _.isErrorResponse)(response.response)) {\n        var _response$response$er = response.response.error,\n          message = _response$response$er.message,\n          data = _objectWithoutProperties(_response$response$er, _excluded);\n        req.reject(new _.WidgetApiResponseError(message, data));\n      } else {\n        req.resolve(response);\n      }\n    }\n  }]);\n  return PostmessageTransport;\n}(_events.EventEmitter);\nexports.PostmessageTransport = PostmessageTransport;\n//# sourceMappingURL=PostmessageTransport.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WidgetApiToWidgetAction = exports.WidgetApiFromWidgetAction = void 0;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar WidgetApiToWidgetAction = /*#__PURE__*/function (WidgetApiToWidgetAction) {\n  WidgetApiToWidgetAction[\"SupportedApiVersions\"] = \"supported_api_versions\";\n  WidgetApiToWidgetAction[\"Capabilities\"] = \"capabilities\";\n  WidgetApiToWidgetAction[\"NotifyCapabilities\"] = \"notify_capabilities\";\n  WidgetApiToWidgetAction[\"ThemeChange\"] = \"theme_change\";\n  WidgetApiToWidgetAction[\"LanguageChange\"] = \"language_change\";\n  WidgetApiToWidgetAction[\"TakeScreenshot\"] = \"screenshot\";\n  WidgetApiToWidgetAction[\"UpdateVisibility\"] = \"visibility\";\n  WidgetApiToWidgetAction[\"OpenIDCredentials\"] = \"openid_credentials\";\n  WidgetApiToWidgetAction[\"WidgetConfig\"] = \"widget_config\";\n  WidgetApiToWidgetAction[\"CloseModalWidget\"] = \"close_modal\";\n  WidgetApiToWidgetAction[\"ButtonClicked\"] = \"button_clicked\";\n  WidgetApiToWidgetAction[\"SendEvent\"] = \"send_event\";\n  WidgetApiToWidgetAction[\"SendToDevice\"] = \"send_to_device\";\n  WidgetApiToWidgetAction[\"UpdateState\"] = \"update_state\";\n  WidgetApiToWidgetAction[\"UpdateTurnServers\"] = \"update_turn_servers\";\n  return WidgetApiToWidgetAction;\n}({});\nexports.WidgetApiToWidgetAction = WidgetApiToWidgetAction;\nvar WidgetApiFromWidgetAction = /*#__PURE__*/function (WidgetApiFromWidgetAction) {\n  WidgetApiFromWidgetAction[\"SupportedApiVersions\"] = \"supported_api_versions\";\n  WidgetApiFromWidgetAction[\"ContentLoaded\"] = \"content_loaded\";\n  WidgetApiFromWidgetAction[\"SendSticker\"] = \"m.sticker\";\n  WidgetApiFromWidgetAction[\"UpdateAlwaysOnScreen\"] = \"set_always_on_screen\";\n  WidgetApiFromWidgetAction[\"GetOpenIDCredentials\"] = \"get_openid\";\n  WidgetApiFromWidgetAction[\"CloseModalWidget\"] = \"close_modal\";\n  WidgetApiFromWidgetAction[\"OpenModalWidget\"] = \"open_modal\";\n  WidgetApiFromWidgetAction[\"SetModalButtonEnabled\"] = \"set_button_enabled\";\n  WidgetApiFromWidgetAction[\"SendEvent\"] = \"send_event\";\n  WidgetApiFromWidgetAction[\"SendToDevice\"] = \"send_to_device\";\n  WidgetApiFromWidgetAction[\"WatchTurnServers\"] = \"watch_turn_servers\";\n  WidgetApiFromWidgetAction[\"UnwatchTurnServers\"] = \"unwatch_turn_servers\";\n  WidgetApiFromWidgetAction[\"BeeperReadRoomAccountData\"] = \"com.beeper.read_room_account_data\";\n  WidgetApiFromWidgetAction[\"MSC2876ReadEvents\"] = \"org.matrix.msc2876.read_events\";\n  WidgetApiFromWidgetAction[\"MSC2931Navigate\"] = \"org.matrix.msc2931.navigate\";\n  WidgetApiFromWidgetAction[\"MSC2974RenegotiateCapabilities\"] = \"org.matrix.msc2974.request_capabilities\";\n  WidgetApiFromWidgetAction[\"MSC3869ReadRelations\"] = \"org.matrix.msc3869.read_relations\";\n  WidgetApiFromWidgetAction[\"MSC3973UserDirectorySearch\"] = \"org.matrix.msc3973.user_directory_search\";\n  WidgetApiFromWidgetAction[\"MSC4039GetMediaConfigAction\"] = \"org.matrix.msc4039.get_media_config\";\n  WidgetApiFromWidgetAction[\"MSC4039UploadFileAction\"] = \"org.matrix.msc4039.upload_file\";\n  WidgetApiFromWidgetAction[\"MSC4039DownloadFileAction\"] = \"org.matrix.msc4039.download_file\";\n  WidgetApiFromWidgetAction[\"MSC4157UpdateDelayedEvent\"] = \"org.matrix.msc4157.update_delayed_event\";\n  return WidgetApiFromWidgetAction;\n}({});\nexports.WidgetApiFromWidgetAction = WidgetApiFromWidgetAction;\n//# sourceMappingURL=WidgetApiAction.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.OpenIDRequestState = void 0;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar OpenIDRequestState = /*#__PURE__*/function (OpenIDRequestState) {\n  OpenIDRequestState[\"Allowed\"] = \"allowed\";\n  OpenIDRequestState[\"Blocked\"] = \"blocked\";\n  OpenIDRequestState[\"PendingUserConfirmation\"] = \"request\";\n  return OpenIDRequestState;\n}({});\nexports.OpenIDRequestState = OpenIDRequestState;\n//# sourceMappingURL=GetOpenIDAction.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MatrixWidgetType = void 0;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MatrixWidgetType = /*#__PURE__*/function (MatrixWidgetType) {\n  MatrixWidgetType[\"Custom\"] = \"m.custom\";\n  MatrixWidgetType[\"JitsiMeet\"] = \"m.jitsi\";\n  MatrixWidgetType[\"Stickerpicker\"] = \"m.stickerpicker\";\n  return MatrixWidgetType;\n}({});\nexports.MatrixWidgetType = MatrixWidgetType;\n//# sourceMappingURL=WidgetType.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.BuiltInModalButtonID = void 0;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar BuiltInModalButtonID = /*#__PURE__*/function (BuiltInModalButtonID) {\n  BuiltInModalButtonID[\"Close\"] = \"m.close\";\n  return BuiltInModalButtonID;\n}({}); // Types for a normal modal requesting the opening a modal widget\n// Types for a modal widget receiving notifications that its buttons have been pressed\n// Types for a modal widget requesting close\n// Types for a normal widget being notified that the modal widget it opened has been closed\nexports.BuiltInModalButtonID = BuiltInModalButtonID;\n//# sourceMappingURL=ModalWidgetActions.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WidgetEventCapability = exports.EventKind = exports.EventDirection = void 0;\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar EventKind = /*#__PURE__*/function (EventKind) {\n  EventKind[\"Event\"] = \"event\";\n  EventKind[\"State\"] = \"state_event\";\n  EventKind[\"ToDevice\"] = \"to_device\";\n  EventKind[\"RoomAccount\"] = \"room_account\";\n  return EventKind;\n}({});\nexports.EventKind = EventKind;\nvar EventDirection = /*#__PURE__*/function (EventDirection) {\n  EventDirection[\"Send\"] = \"send\";\n  EventDirection[\"Receive\"] = \"receive\";\n  return EventDirection;\n}({});\nexports.EventDirection = EventDirection;\nvar WidgetEventCapability = /*#__PURE__*/function () {\n  function WidgetEventCapability(direction, eventType, kind, keyStr, raw) {\n    _classCallCheck(this, WidgetEventCapability);\n    this.direction = direction;\n    this.eventType = eventType;\n    this.kind = kind;\n    this.keyStr = keyStr;\n    this.raw = raw;\n  }\n  _createClass(WidgetEventCapability, [{\n    key: \"matchesAsStateEvent\",\n    value: function matchesAsStateEvent(direction, eventType, stateKey) {\n      if (this.kind !== EventKind.State) return false; // not a state event\n      if (this.direction !== direction) return false; // direction mismatch\n      if (this.eventType !== eventType) return false; // event type mismatch\n      if (this.keyStr === null) return true; // all state keys are allowed\n      if (this.keyStr === stateKey) return true; // this state key is allowed\n\n      // Default not allowed\n      return false;\n    }\n  }, {\n    key: \"matchesAsToDeviceEvent\",\n    value: function matchesAsToDeviceEvent(direction, eventType) {\n      if (this.kind !== EventKind.ToDevice) return false; // not a to-device event\n      if (this.direction !== direction) return false; // direction mismatch\n      if (this.eventType !== eventType) return false; // event type mismatch\n\n      // Checks passed, the event is allowed\n      return true;\n    }\n  }, {\n    key: \"matchesAsRoomEvent\",\n    value: function matchesAsRoomEvent(direction, eventType) {\n      var msgtype = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n      if (this.kind !== EventKind.Event) return false; // not a room event\n      if (this.direction !== direction) return false; // direction mismatch\n      if (this.eventType !== eventType) return false; // event type mismatch\n\n      if (this.eventType === \"m.room.message\") {\n        if (this.keyStr === null) return true; // all message types are allowed\n        if (this.keyStr === msgtype) return true; // this message type is allowed\n      } else {\n        return true; // already passed the check for if the event is allowed\n      }\n\n      // Default not allowed\n      return false;\n    }\n  }, {\n    key: \"matchesAsRoomAccountData\",\n    value: function matchesAsRoomAccountData(direction, eventType) {\n      if (this.kind !== EventKind.RoomAccount) return false; // not room account data\n      if (this.direction !== direction) return false; // direction mismatch\n      if (this.eventType !== eventType) return false; // event type mismatch\n\n      // Checks passed, the event is allowed\n      return true;\n    }\n  }], [{\n    key: \"forStateEvent\",\n    value: function forStateEvent(direction, eventType, stateKey) {\n      // TODO: Enable support for m.* namespace once the MSC lands.\n      // https://github.com/matrix-org/matrix-widget-api/issues/22\n      eventType = eventType.replace(/#/g, \"\\\\#\");\n      stateKey = stateKey !== null && stateKey !== undefined ? \"#\".concat(stateKey) : \"\";\n      var str = \"org.matrix.msc2762.\".concat(direction, \".state_event:\").concat(eventType).concat(stateKey);\n\n      // cheat by sending it through the processor\n      return WidgetEventCapability.findEventCapabilities([str])[0];\n    }\n  }, {\n    key: \"forToDeviceEvent\",\n    value: function forToDeviceEvent(direction, eventType) {\n      // TODO: Enable support for m.* namespace once the MSC lands.\n      // https://github.com/matrix-org/matrix-widget-api/issues/56\n      var str = \"org.matrix.msc3819.\".concat(direction, \".to_device:\").concat(eventType);\n\n      // cheat by sending it through the processor\n      return WidgetEventCapability.findEventCapabilities([str])[0];\n    }\n  }, {\n    key: \"forRoomEvent\",\n    value: function forRoomEvent(direction, eventType) {\n      // TODO: Enable support for m.* namespace once the MSC lands.\n      // https://github.com/matrix-org/matrix-widget-api/issues/22\n      var str = \"org.matrix.msc2762.\".concat(direction, \".event:\").concat(eventType);\n\n      // cheat by sending it through the processor\n      return WidgetEventCapability.findEventCapabilities([str])[0];\n    }\n  }, {\n    key: \"forRoomMessageEvent\",\n    value: function forRoomMessageEvent(direction, msgtype) {\n      // TODO: Enable support for m.* namespace once the MSC lands.\n      // https://github.com/matrix-org/matrix-widget-api/issues/22\n      msgtype = msgtype === null || msgtype === undefined ? \"\" : msgtype;\n      var str = \"org.matrix.msc2762.\".concat(direction, \".event:m.room.message#\").concat(msgtype);\n\n      // cheat by sending it through the processor\n      return WidgetEventCapability.findEventCapabilities([str])[0];\n    }\n  }, {\n    key: \"forRoomAccountData\",\n    value: function forRoomAccountData(direction, eventType) {\n      var str = \"com.beeper.capabilities.\".concat(direction, \".room_account_data:\").concat(eventType);\n      return WidgetEventCapability.findEventCapabilities([str])[0];\n    }\n\n    /**\n     * Parses a capabilities request to find all the event capability requests.\n     * @param {Iterable<Capability>} capabilities The capabilities requested/to parse.\n     * @returns {WidgetEventCapability[]} An array of event capability requests. May be empty, but never null.\n     */\n  }, {\n    key: \"findEventCapabilities\",\n    value: function findEventCapabilities(capabilities) {\n      var parsed = [];\n      var _iterator = _createForOfIteratorHelper(capabilities),\n        _step;\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var cap = _step.value;\n          var _direction = null;\n          var eventSegment = void 0;\n          var _kind = null;\n\n          // TODO: Enable support for m.* namespace once the MSCs land.\n          // https://github.com/matrix-org/matrix-widget-api/issues/22\n          // https://github.com/matrix-org/matrix-widget-api/issues/56\n\n          if (cap.startsWith(\"org.matrix.msc2762.send.event:\")) {\n            _direction = EventDirection.Send;\n            _kind = EventKind.Event;\n            eventSegment = cap.substring(\"org.matrix.msc2762.send.event:\".length);\n          } else if (cap.startsWith(\"org.matrix.msc2762.send.state_event:\")) {\n            _direction = EventDirection.Send;\n            _kind = EventKind.State;\n            eventSegment = cap.substring(\"org.matrix.msc2762.send.state_event:\".length);\n          } else if (cap.startsWith(\"org.matrix.msc3819.send.to_device:\")) {\n            _direction = EventDirection.Send;\n            _kind = EventKind.ToDevice;\n            eventSegment = cap.substring(\"org.matrix.msc3819.send.to_device:\".length);\n          } else if (cap.startsWith(\"org.matrix.msc2762.receive.event:\")) {\n            _direction = EventDirection.Receive;\n            _kind = EventKind.Event;\n            eventSegment = cap.substring(\"org.matrix.msc2762.receive.event:\".length);\n          } else if (cap.startsWith(\"org.matrix.msc2762.receive.state_event:\")) {\n            _direction = EventDirection.Receive;\n            _kind = EventKind.State;\n            eventSegment = cap.substring(\"org.matrix.msc2762.receive.state_event:\".length);\n          } else if (cap.startsWith(\"org.matrix.msc3819.receive.to_device:\")) {\n            _direction = EventDirection.Receive;\n            _kind = EventKind.ToDevice;\n            eventSegment = cap.substring(\"org.matrix.msc3819.receive.to_device:\".length);\n          } else if (cap.startsWith(\"com.beeper.capabilities.receive.room_account_data:\")) {\n            _direction = EventDirection.Receive;\n            _kind = EventKind.RoomAccount;\n            eventSegment = cap.substring(\"com.beeper.capabilities.receive.room_account_data:\".length);\n          }\n          if (_direction === null || _kind === null || eventSegment === undefined) continue;\n\n          // The capability uses `#` as a separator between event type and state key/msgtype,\n          // so we split on that. However, a # is also valid in either one of those so we\n          // join accordingly.\n          // Eg: `m.room.message##m.text` is \"m.room.message\" event with msgtype \"#m.text\".\n          var expectingKeyStr = eventSegment.startsWith(\"m.room.message#\") || _kind === EventKind.State;\n          var _keyStr = null;\n          if (eventSegment.includes(\"#\") && expectingKeyStr) {\n            // Dev note: regex is difficult to write, so instead the rules are manually written\n            // out. This is probably just as understandable as a boring regex though, so win-win?\n\n            // Test cases:\n            // str                      eventSegment        keyStr\n            // -------------------------------------------------------------\n            // m.room.message#          m.room.message      <empty string>\n            // m.room.message#test      m.room.message      test\n            // m.room.message\\#         m.room.message#     test\n            // m.room.message##test     m.room.message      #test\n            // m.room.message\\##test    m.room.message#     test\n            // m.room.message\\\\##test   m.room.message\\#    test\n            // m.room.message\\\\###test  m.room.message\\#    #test\n\n            // First step: explode the string\n            var parts = eventSegment.split(\"#\");\n\n            // To form the eventSegment, we'll keep finding parts of the exploded string until\n            // there's one that doesn't end with the escape character (\\). We'll then join those\n            // segments together with the exploding character. We have to remember to consume the\n            // escape character as well.\n            var idx = parts.findIndex(function (p) {\n              return !p.endsWith(\"\\\\\");\n            });\n            eventSegment = parts.slice(0, idx + 1).map(function (p) {\n              return p.endsWith(\"\\\\\") ? p.substring(0, p.length - 1) : p;\n            }).join(\"#\");\n\n            // The keyStr is whatever is left over.\n            _keyStr = parts.slice(idx + 1).join(\"#\");\n          }\n          parsed.push(new WidgetEventCapability(_direction, eventSegment, _kind, _keyStr, cap));\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n      return parsed;\n    }\n  }]);\n  return WidgetEventCapability;\n}();\nexports.WidgetEventCapability = WidgetEventCapability;\n//# sourceMappingURL=WidgetEventCapability.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Symbols = void 0;\n/*\n * Copyright 2021 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar Symbols = /*#__PURE__*/function (Symbols) {\n  Symbols[\"AnyRoom\"] = \"*\";\n  return Symbols;\n}({});\nexports.Symbols = Symbols;\n//# sourceMappingURL=Symbols.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.UpdateDelayedEventAction = void 0;\n/*\n * Copyright 2020 - 2024 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar UpdateDelayedEventAction = /*#__PURE__*/function (UpdateDelayedEventAction) {\n  UpdateDelayedEventAction[\"Cancel\"] = \"cancel\";\n  UpdateDelayedEventAction[\"Restart\"] = \"restart\";\n  UpdateDelayedEventAction[\"Send\"] = \"send\";\n  return UpdateDelayedEventAction;\n}({});\nexports.UpdateDelayedEventAction = UpdateDelayedEventAction;\n//# sourceMappingURL=UpdateDelayedEventAction.js.map","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WidgetApiResponseError = exports.WidgetApi = void 0;\nvar _events = require(\"events\");\nvar _WidgetApiDirection = require(\"./interfaces/WidgetApiDirection\");\nvar _ApiVersion = require(\"./interfaces/ApiVersion\");\nvar _PostmessageTransport = require(\"./transport/PostmessageTransport\");\nvar _WidgetApiAction = require(\"./interfaces/WidgetApiAction\");\nvar _GetOpenIDAction = require(\"./interfaces/GetOpenIDAction\");\nvar _WidgetType = require(\"./interfaces/WidgetType\");\nvar _ModalWidgetActions = require(\"./interfaces/ModalWidgetActions\");\nvar _WidgetEventCapability = require(\"./models/WidgetEventCapability\");\nvar _Symbols = require(\"./Symbols\");\nvar _UpdateDelayedEventAction = require(\"./interfaces/UpdateDelayedEventAction\");\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\nfunction _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct.bind(); } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _isNativeFunction(fn) { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _awaitAsyncGenerator(value) { return new _OverloadYield(value, 0); }\nfunction _wrapAsyncGenerator(fn) { return function () { return new _AsyncGenerator(fn.apply(this, arguments)); }; }\nfunction _AsyncGenerator(gen) { var front, back; function resume(key, arg) { try { var result = gen[key](arg), value = result.value, overloaded = value instanceof _OverloadYield; Promise.resolve(overloaded ? value.v : value).then(function (arg) { if (overloaded) { var nextKey = \"return\" === key ? \"return\" : \"next\"; if (!value.k || arg.done) return resume(nextKey, arg); arg = gen[nextKey](arg).value; } settle(result.done ? \"return\" : \"normal\", arg); }, function (err) { resume(\"throw\", err); }); } catch (err) { settle(\"throw\", err); } } function settle(type, value) { switch (type) { case \"return\": front.resolve({ value: value, done: !0 }); break; case \"throw\": front.reject(value); break; default: front.resolve({ value: value, done: !1 }); } (front = front.next) ? resume(front.key, front.arg) : back = null; } this._invoke = function (key, arg) { return new Promise(function (resolve, reject) { var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; back ? back = back.next = request : (front = back = request, resume(key, arg)); }); }, \"function\" != typeof gen[\"return\"] && (this[\"return\"] = void 0); }\n_AsyncGenerator.prototype[\"function\" == typeof Symbol && Symbol.asyncIterator || \"@@asyncIterator\"] = function () { return this; }, _AsyncGenerator.prototype.next = function (arg) { return this._invoke(\"next\", arg); }, _AsyncGenerator.prototype[\"throw\"] = function (arg) { return this._invoke(\"throw\", arg); }, _AsyncGenerator.prototype[\"return\"] = function (arg) { return this._invoke(\"return\", arg); };\nfunction _OverloadYield(value, kind) { this.v = value, this.k = kind; } /*\n                                                                         * Copyright 2020 - 2024 The Matrix.org Foundation C.I.C.\n                                                                         *\n                                                                         * Licensed under the Apache License, Version 2.0 (the \"License\");\n                                                                         * you may not use this file except in compliance with the License.\n                                                                         * You may obtain a copy of the License at\n                                                                         *\n                                                                         *         http://www.apache.org/licenses/LICENSE-2.0\n                                                                         *\n                                                                         * Unless required by applicable law or agreed to in writing, software\n                                                                         * distributed under the License is distributed on an \"AS IS\" BASIS,\n                                                                         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                                                                         * See the License for the specific language governing permissions and\n                                                                         * limitations under the License.\n                                                                         */\nvar WidgetApiResponseError = /*#__PURE__*/function (_Error) {\n  _inherits(WidgetApiResponseError, _Error);\n  var _super = _createSuper(WidgetApiResponseError);\n  function WidgetApiResponseError(message, data) {\n    var _this2;\n    _classCallCheck(this, WidgetApiResponseError);\n    _this2 = _super.call(this, message);\n    _this2.data = data;\n    return _this2;\n  }\n  return _createClass(WidgetApiResponseError);\n}( /*#__PURE__*/_wrapNativeSuper(Error));\n/**\n * API handler for widgets. This raises events for each action\n * received as `action:${action}` (eg: \"action:screenshot\").\n * Default handling can be prevented by using preventDefault()\n * on the raised event. The default handling varies for each\n * action: ones which the SDK can handle safely are acknowledged\n * appropriately and ones which are unhandled (custom or require\n * the widget to do something) are rejected with an error.\n *\n * Events which are preventDefault()ed must reply using the\n * transport. The events raised will have a detail of an\n * IWidgetApiRequest interface.\n *\n * When the WidgetApi is ready to start sending requests, it will\n * raise a \"ready\" CustomEvent. After the ready event fires, actions\n * can be sent and the transport will be ready.\n */\nexports.WidgetApiResponseError = WidgetApiResponseError;\nWidgetApiResponseError.prototype.name = WidgetApiResponseError.name;\nvar WidgetApi = /*#__PURE__*/function (_EventEmitter) {\n  _inherits(WidgetApi, _EventEmitter);\n  var _super2 = _createSuper(WidgetApi);\n  /**\n   * Creates a new API handler for the given widget.\n   * @param {string} widgetId The widget ID to listen for. If not supplied then\n   * the API will use the widget ID from the first valid request it receives.\n   * @param {string} clientOrigin The origin of the client, or null if not known.\n   */\n  function WidgetApi() {\n    var _this3;\n    var widgetId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    var clientOrigin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n    _classCallCheck(this, WidgetApi);\n    _this3 = _super2.call(this);\n    _defineProperty(_assertThisInitialized(_this3), \"transport\", void 0);\n    _defineProperty(_assertThisInitialized(_this3), \"capabilitiesFinished\", false);\n    _defineProperty(_assertThisInitialized(_this3), \"supportsMSC2974Renegotiate\", false);\n    _defineProperty(_assertThisInitialized(_this3), \"requestedCapabilities\", []);\n    _defineProperty(_assertThisInitialized(_this3), \"approvedCapabilities\", void 0);\n    _defineProperty(_assertThisInitialized(_this3), \"cachedClientVersions\", void 0);\n    _defineProperty(_assertThisInitialized(_this3), \"turnServerWatchers\", 0);\n    if (!globalThis.parent) {\n      throw new Error(\"No parent window. This widget doesn't appear to be embedded properly.\");\n    }\n    _this3.transport = new _PostmessageTransport.PostmessageTransport(_WidgetApiDirection.WidgetApiDirection.FromWidget, widgetId, globalThis.parent, globalThis);\n    _this3.transport.targetOrigin = clientOrigin;\n    _this3.transport.on(\"message\", _this3.handleMessage.bind(_assertThisInitialized(_this3)));\n    return _this3;\n  }\n\n  /**\n   * Determines if the widget was granted a particular capability. Note that on\n   * clients where the capabilities are not fed back to the widget this function\n   * will rely on requested capabilities instead.\n   * @param {Capability} capability The capability to check for approval of.\n   * @returns {boolean} True if the widget has approval for the given capability.\n   */\n  _createClass(WidgetApi, [{\n    key: \"hasCapability\",\n    value: function hasCapability(capability) {\n      if (Array.isArray(this.approvedCapabilities)) {\n        return this.approvedCapabilities.includes(capability);\n      }\n      return this.requestedCapabilities.includes(capability);\n    }\n\n    /**\n     * Request a capability from the client. It is not guaranteed to be allowed,\n     * but will be asked for.\n     * @param {Capability} capability The capability to request.\n     * @throws Throws if the capabilities negotiation has already started and the\n     * widget is unable to request additional capabilities.\n     */\n  }, {\n    key: \"requestCapability\",\n    value: function requestCapability(capability) {\n      if (this.capabilitiesFinished && !this.supportsMSC2974Renegotiate) {\n        throw new Error(\"Capabilities have already been negotiated\");\n      }\n      this.requestedCapabilities.push(capability);\n    }\n\n    /**\n     * Request capabilities from the client. They are not guaranteed to be allowed,\n     * but will be asked for if the negotiation has not already happened.\n     * @param {Capability[]} capabilities The capabilities to request.\n     * @throws Throws if the capabilities negotiation has already started.\n     */\n  }, {\n    key: \"requestCapabilities\",\n    value: function requestCapabilities(capabilities) {\n      var _iterator = _createForOfIteratorHelper(capabilities),\n        _step;\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var cap = _step.value;\n          this.requestCapability(cap);\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n    }\n\n    /**\n     * Requests the capability to interact with rooms other than the user's currently\n     * viewed room. Applies to event receiving and sending.\n     * @param {string | Symbols.AnyRoom} roomId The room ID, or `Symbols.AnyRoom` to\n     * denote all known rooms.\n     */\n  }, {\n    key: \"requestCapabilityForRoomTimeline\",\n    value: function requestCapabilityForRoomTimeline(roomId) {\n      this.requestCapability(\"org.matrix.msc2762.timeline:\".concat(roomId));\n    }\n\n    /**\n     * Requests the capability to send a given state event with optional explicit\n     * state key. It is not guaranteed to be allowed, but will be asked for if the\n     * negotiation has not already happened.\n     * @param {string} eventType The state event type to ask for.\n     * @param {string} stateKey If specified, the specific state key to request.\n     * Otherwise all state keys will be requested.\n     */\n  }, {\n    key: \"requestCapabilityToSendState\",\n    value: function requestCapabilityToSendState(eventType, stateKey) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forStateEvent(_WidgetEventCapability.EventDirection.Send, eventType, stateKey).raw);\n    }\n\n    /**\n     * Requests the capability to receive a given state event with optional explicit\n     * state key. It is not guaranteed to be allowed, but will be asked for if the\n     * negotiation has not already happened.\n     * @param {string} eventType The state event type to ask for.\n     * @param {string} stateKey If specified, the specific state key to request.\n     * Otherwise all state keys will be requested.\n     */\n  }, {\n    key: \"requestCapabilityToReceiveState\",\n    value: function requestCapabilityToReceiveState(eventType, stateKey) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forStateEvent(_WidgetEventCapability.EventDirection.Receive, eventType, stateKey).raw);\n    }\n\n    /**\n     * Requests the capability to send a given to-device event. It is not\n     * guaranteed to be allowed, but will be asked for if the negotiation has\n     * not already happened.\n     * @param {string} eventType The room event type to ask for.\n     */\n  }, {\n    key: \"requestCapabilityToSendToDevice\",\n    value: function requestCapabilityToSendToDevice(eventType) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forToDeviceEvent(_WidgetEventCapability.EventDirection.Send, eventType).raw);\n    }\n\n    /**\n     * Requests the capability to receive a given to-device event. It is not\n     * guaranteed to be allowed, but will be asked for if the negotiation has\n     * not already happened.\n     * @param {string} eventType The room event type to ask for.\n     */\n  }, {\n    key: \"requestCapabilityToReceiveToDevice\",\n    value: function requestCapabilityToReceiveToDevice(eventType) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forToDeviceEvent(_WidgetEventCapability.EventDirection.Receive, eventType).raw);\n    }\n\n    /**\n     * Requests the capability to send a given room event. It is not guaranteed to be\n     * allowed, but will be asked for if the negotiation has not already happened.\n     * @param {string} eventType The room event type to ask for.\n     */\n  }, {\n    key: \"requestCapabilityToSendEvent\",\n    value: function requestCapabilityToSendEvent(eventType) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forRoomEvent(_WidgetEventCapability.EventDirection.Send, eventType).raw);\n    }\n\n    /**\n     * Requests the capability to receive a given room event. It is not guaranteed to be\n     * allowed, but will be asked for if the negotiation has not already happened.\n     * @param {string} eventType The room event type to ask for.\n     */\n  }, {\n    key: \"requestCapabilityToReceiveEvent\",\n    value: function requestCapabilityToReceiveEvent(eventType) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forRoomEvent(_WidgetEventCapability.EventDirection.Receive, eventType).raw);\n    }\n\n    /**\n     * Requests the capability to send a given message event with optional explicit\n     * `msgtype`. It is not guaranteed to be allowed, but will be asked for if the\n     * negotiation has not already happened.\n     * @param {string} msgtype If specified, the specific msgtype to request.\n     * Otherwise all message types will be requested.\n     */\n  }, {\n    key: \"requestCapabilityToSendMessage\",\n    value: function requestCapabilityToSendMessage(msgtype) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forRoomMessageEvent(_WidgetEventCapability.EventDirection.Send, msgtype).raw);\n    }\n\n    /**\n     * Requests the capability to receive a given message event with optional explicit\n     * `msgtype`. It is not guaranteed to be allowed, but will be asked for if the\n     * negotiation has not already happened.\n     * @param {string} msgtype If specified, the specific msgtype to request.\n     * Otherwise all message types will be requested.\n     */\n  }, {\n    key: \"requestCapabilityToReceiveMessage\",\n    value: function requestCapabilityToReceiveMessage(msgtype) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forRoomMessageEvent(_WidgetEventCapability.EventDirection.Receive, msgtype).raw);\n    }\n\n    /**\n     * Requests the capability to receive a given item in room account data. It is not guaranteed to be\n     * allowed, but will be asked for if the negotiation has not already happened.\n     * @param {string} eventType The state event type to ask for.\n     */\n  }, {\n    key: \"requestCapabilityToReceiveRoomAccountData\",\n    value: function requestCapabilityToReceiveRoomAccountData(eventType) {\n      this.requestCapability(_WidgetEventCapability.WidgetEventCapability.forRoomAccountData(_WidgetEventCapability.EventDirection.Receive, eventType).raw);\n    }\n\n    /**\n     * Requests an OpenID Connect token from the client for the currently logged in\n     * user. This token can be validated server-side with the federation API. Note\n     * that the widget is responsible for validating the token and caching any results\n     * it needs.\n     * @returns {Promise<IOpenIDCredentials>} Resolves to a token for verification.\n     * @throws Throws if the user rejected the request or the request failed.\n     */\n  }, {\n    key: \"requestOpenIDConnectToken\",\n    value: function requestOpenIDConnectToken() {\n      var _this4 = this;\n      return new Promise(function (resolve, reject) {\n        _this4.transport.sendComplete(_WidgetApiAction.WidgetApiFromWidgetAction.GetOpenIDCredentials, {}).then(function (response) {\n          var rdata = response.response;\n          if (rdata.state === _GetOpenIDAction.OpenIDRequestState.Allowed) {\n            resolve(rdata);\n          } else if (rdata.state === _GetOpenIDAction.OpenIDRequestState.Blocked) {\n            reject(new Error(\"User declined to verify their identity\"));\n          } else if (rdata.state === _GetOpenIDAction.OpenIDRequestState.PendingUserConfirmation) {\n            var handlerFn = function handlerFn(ev) {\n              ev.preventDefault();\n              var request = ev.detail;\n              if (request.data.original_request_id !== response.requestId) return;\n              if (request.data.state === _GetOpenIDAction.OpenIDRequestState.Allowed) {\n                resolve(request.data);\n                _this4.transport.reply(request, {}); // ack\n              } else if (request.data.state === _GetOpenIDAction.OpenIDRequestState.Blocked) {\n                reject(new Error(\"User declined to verify their identity\"));\n                _this4.transport.reply(request, {}); // ack\n              } else {\n                reject(new Error(\"Invalid state on reply: \" + rdata.state));\n                _this4.transport.reply(request, {\n                  error: {\n                    message: \"Invalid state\"\n                  }\n                });\n              }\n              _this4.off(\"action:\".concat(_WidgetApiAction.WidgetApiToWidgetAction.OpenIDCredentials), handlerFn);\n            };\n            _this4.on(\"action:\".concat(_WidgetApiAction.WidgetApiToWidgetAction.OpenIDCredentials), handlerFn);\n          } else {\n            reject(new Error(\"Invalid state: \" + rdata.state));\n          }\n        })[\"catch\"](reject);\n      });\n    }\n\n    /**\n     * Asks the client for additional capabilities. Capabilities can be queued for this\n     * request with the requestCapability() functions.\n     * @returns {Promise<void>} Resolves when complete. Note that the promise resolves when\n     * the capabilities request has gone through, not when the capabilities are approved/denied.\n     * Use the WidgetApiToWidgetAction.NotifyCapabilities action to detect changes.\n     */\n  }, {\n    key: \"updateRequestedCapabilities\",\n    value: function updateRequestedCapabilities() {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC2974RenegotiateCapabilities, {\n        capabilities: this.requestedCapabilities\n      }).then();\n    }\n\n    /**\n     * Tell the client that the content has been loaded.\n     * @returns {Promise} Resolves when the client acknowledges the request.\n     */\n  }, {\n    key: \"sendContentLoaded\",\n    value: function sendContentLoaded() {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.ContentLoaded, {}).then();\n    }\n\n    /**\n     * Sends a sticker to the client.\n     * @param {IStickerActionRequestData} sticker The sticker to send.\n     * @returns {Promise} Resolves when the client acknowledges the request.\n     */\n  }, {\n    key: \"sendSticker\",\n    value: function sendSticker(sticker) {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.SendSticker, sticker).then();\n    }\n\n    /**\n     * Asks the client to set the always-on-screen status for this widget.\n     * @param {boolean} value The new state to request.\n     * @returns {Promise<boolean>} Resolve with true if the client was able to fulfill\n     * the request, resolves to false otherwise. Rejects if an error occurred.\n     */\n  }, {\n    key: \"setAlwaysOnScreen\",\n    value: function setAlwaysOnScreen(value) {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.UpdateAlwaysOnScreen, {\n        value: value\n      }).then(function (res) {\n        return res.success;\n      });\n    }\n\n    /**\n     * Opens a modal widget.\n     * @param {string} url The URL to the modal widget.\n     * @param {string} name The name of the widget.\n     * @param {IModalWidgetOpenRequestDataButton[]} buttons The buttons to have on the widget.\n     * @param {IModalWidgetCreateData} data Data to supply to the modal widget.\n     * @param {WidgetType} type The type of modal widget.\n     * @returns {Promise<void>} Resolves when the modal widget has been opened.\n     */\n  }, {\n    key: \"openModalWidget\",\n    value: function openModalWidget(url, name) {\n      var buttons = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n      var data = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n      var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _WidgetType.MatrixWidgetType.Custom;\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.OpenModalWidget, {\n        type: type,\n        url: url,\n        name: name,\n        buttons: buttons,\n        data: data\n      }).then();\n    }\n\n    /**\n     * Closes the modal widget. The widget's session will be terminated shortly after.\n     * @param {IModalWidgetReturnData} data Optional data to close the modal widget with.\n     * @returns {Promise<void>} Resolves when complete.\n     */\n  }, {\n    key: \"closeModalWidget\",\n    value: function closeModalWidget() {\n      var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.CloseModalWidget, data).then();\n    }\n  }, {\n    key: \"sendRoomEvent\",\n    value: function sendRoomEvent(eventType, content, roomId, delay, parentDelayId, stickyDurationMs) {\n      return this.sendEvent(eventType, undefined, content, roomId, delay, parentDelayId, stickyDurationMs);\n    }\n  }, {\n    key: \"sendStateEvent\",\n    value: function sendStateEvent(eventType, stateKey, content, roomId, delay, parentDelayId) {\n      return this.sendEvent(eventType, stateKey, content, roomId, delay, parentDelayId);\n    }\n  }, {\n    key: \"sendEvent\",\n    value: function sendEvent(eventType, stateKey, content, roomId, delay, parentDelayId, stickyDurationMs) {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.SendEvent, _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({\n        type: eventType,\n        content: content\n      }, stateKey !== undefined && {\n        state_key: stateKey\n      }), roomId !== undefined && {\n        room_id: roomId\n      }), delay !== undefined && {\n        delay: delay\n      }), parentDelayId !== undefined && {\n        parent_delay_id: parentDelayId\n      }), stickyDurationMs !== undefined && {\n        sticky_duration_ms: stickyDurationMs\n      }));\n    }\n\n    /**\n     * @experimental This currently relies on an unstable MSC (MSC4157).\n     */\n  }, {\n    key: \"cancelScheduledDelayedEvent\",\n    value: function cancelScheduledDelayedEvent(delayId) {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC4157UpdateDelayedEvent, {\n        delay_id: delayId,\n        action: _UpdateDelayedEventAction.UpdateDelayedEventAction.Cancel\n      });\n    }\n\n    /**\n     * @experimental This currently relies on an unstable MSC (MSC4157).\n     */\n  }, {\n    key: \"restartScheduledDelayedEvent\",\n    value: function restartScheduledDelayedEvent(delayId) {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC4157UpdateDelayedEvent, {\n        delay_id: delayId,\n        action: _UpdateDelayedEventAction.UpdateDelayedEventAction.Restart\n      });\n    }\n\n    /**\n     * @experimental This currently relies on an unstable MSC (MSC4157).\n     */\n  }, {\n    key: \"sendScheduledDelayedEvent\",\n    value: function sendScheduledDelayedEvent(delayId) {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC4157UpdateDelayedEvent, {\n        delay_id: delayId,\n        action: _UpdateDelayedEventAction.UpdateDelayedEventAction.Send\n      });\n    }\n\n    /**\n     * Sends a to-device event.\n     * @param {string} eventType The type of events being sent.\n     * @param {boolean} encrypted Whether to encrypt the message contents.\n     * @param {Object} contentMap A map from user IDs to device IDs to message contents.\n     * @returns {Promise<ISendToDeviceFromWidgetResponseData>} Resolves when complete.\n     */\n  }, {\n    key: \"sendToDevice\",\n    value: function sendToDevice(eventType, encrypted, contentMap) {\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.SendToDevice, {\n        type: eventType,\n        encrypted: encrypted,\n        messages: contentMap\n      });\n    }\n  }, {\n    key: \"readRoomAccountData\",\n    value: function readRoomAccountData(eventType, roomIds) {\n      var data = {\n        type: eventType\n      };\n      if (roomIds) {\n        if (roomIds.includes(_Symbols.Symbols.AnyRoom)) {\n          data.room_ids = _Symbols.Symbols.AnyRoom;\n        } else {\n          data.room_ids = roomIds;\n        }\n      }\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.BeeperReadRoomAccountData, data).then(function (r) {\n        return r.events;\n      });\n    }\n  }, {\n    key: \"readRoomEvents\",\n    value: function readRoomEvents(eventType, limit, msgtype, roomIds, since) {\n      var data = {\n        type: eventType,\n        msgtype: msgtype\n      };\n      if (limit !== undefined) {\n        data.limit = limit;\n      }\n      if (roomIds) {\n        if (roomIds.includes(_Symbols.Symbols.AnyRoom)) {\n          data.room_ids = _Symbols.Symbols.AnyRoom;\n        } else {\n          data.room_ids = roomIds;\n        }\n      }\n      if (since) {\n        data.since = since;\n      }\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC2876ReadEvents, data).then(function (r) {\n        return r.events;\n      });\n    }\n\n    /**\n     * Reads all related events given a known eventId.\n     * @param eventId The id of the parent event to be read.\n     * @param roomId The room to look within. When undefined, the user's currently\n     * viewed room.\n     * @param relationType The relationship type of child events to search for.\n     * When undefined, all relations are returned.\n     * @param eventType The event type of child events to search for. When undefined,\n     * all related events are returned.\n     * @param limit The maximum number of events to retrieve per room. If not\n     * supplied, the server will apply a default limit.\n     * @param from The pagination token to start returning results from, as\n     * received from a previous call. If not supplied, results start at the most\n     * recent topological event known to the server.\n     * @param to The pagination token to stop returning results at. If not\n     * supplied, results continue up to limit or until there are no more events.\n     * @param direction The direction to search for according to MSC3715.\n     * @returns Resolves to the room relations.\n     */\n  }, {\n    key: \"readEventRelations\",\n    value: function () {\n      var _readEventRelations = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(eventId, roomId, relationType, eventType, limit, from, to, direction) {\n        var versions, data;\n        return _regeneratorRuntime().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return this.getClientVersions();\n            case 2:\n              versions = _context.sent;\n              if (versions.includes(_ApiVersion.UnstableApiVersion.MSC3869)) {\n                _context.next = 5;\n                break;\n              }\n              throw new Error(\"The read_relations action is not supported by the client.\");\n            case 5:\n              data = {\n                event_id: eventId,\n                rel_type: relationType,\n                event_type: eventType,\n                room_id: roomId,\n                to: to,\n                from: from,\n                limit: limit,\n                direction: direction\n              };\n              return _context.abrupt(\"return\", this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC3869ReadRelations, data));\n            case 7:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee, this);\n      }));\n      function readEventRelations(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8) {\n        return _readEventRelations.apply(this, arguments);\n      }\n      return readEventRelations;\n    }()\n  }, {\n    key: \"readStateEvents\",\n    value: function readStateEvents(eventType, limit, stateKey, roomIds) {\n      var data = {\n        type: eventType,\n        state_key: stateKey === undefined ? true : stateKey\n      };\n      if (limit !== undefined) {\n        data.limit = limit;\n      }\n      if (roomIds) {\n        if (roomIds.includes(_Symbols.Symbols.AnyRoom)) {\n          data.room_ids = _Symbols.Symbols.AnyRoom;\n        } else {\n          data.room_ids = roomIds;\n        }\n      }\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC2876ReadEvents, data).then(function (r) {\n        return r.events;\n      });\n    }\n\n    /**\n     * Sets a button as disabled or enabled on the modal widget. Buttons are enabled by default.\n     * @param {ModalButtonID} buttonId The button ID to enable/disable.\n     * @param {boolean} isEnabled Whether or not the button is enabled.\n     * @returns {Promise<void>} Resolves when complete.\n     * @throws Throws if the button cannot be disabled, or the client refuses to disable the button.\n     */\n  }, {\n    key: \"setModalButtonEnabled\",\n    value: function setModalButtonEnabled(buttonId, isEnabled) {\n      if (buttonId === _ModalWidgetActions.BuiltInModalButtonID.Close) {\n        throw new Error(\"The close button cannot be disabled\");\n      }\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.SetModalButtonEnabled, {\n        button: buttonId,\n        enabled: isEnabled\n      }).then();\n    }\n\n    /**\n     * Attempts to navigate the client to the given URI. This can only be called with Matrix URIs\n     * (currently only matrix.to, but in future a Matrix URI scheme will be defined).\n     * @param {string} uri The URI to navigate to.\n     * @returns {Promise<void>} Resolves when complete.\n     * @throws Throws if the URI is invalid or cannot be processed.\n     * @experimental This currently relies on an unstable MSC (MSC2931).\n     */\n  }, {\n    key: \"navigateTo\",\n    value: function navigateTo(uri) {\n      if (!uri || !uri.startsWith(\"https://matrix.to/#\")) {\n        throw new Error(\"Invalid matrix.to URI\");\n      }\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC2931Navigate, {\n        uri: uri\n      }).then();\n    }\n\n    /**\n     * Starts watching for TURN servers, yielding an initial set of credentials as soon as possible,\n     * and thereafter yielding new credentials whenever the previous ones expire.\n     * @yields {ITurnServer} The TURN server URIs and credentials currently available to the widget.\n     */\n  }, {\n    key: \"getTurnServers\",\n    value: function getTurnServers() {\n      var _this = this;\n      return _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {\n        var setTurnServer, onUpdateTurnServers;\n        return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n          while (1) switch (_context3.prev = _context3.next) {\n            case 0:\n              onUpdateTurnServers = /*#__PURE__*/function () {\n                var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(ev) {\n                  return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n                    while (1) switch (_context2.prev = _context2.next) {\n                      case 0:\n                        ev.preventDefault();\n                        setTurnServer(ev.detail.data);\n                        _this.transport.reply(ev.detail, {});\n                      case 3:\n                      case \"end\":\n                        return _context2.stop();\n                    }\n                  }, _callee2);\n                }));\n                return function onUpdateTurnServers(_x9) {\n                  return _ref.apply(this, arguments);\n                };\n              }(); // Start listening for updates before we even start watching, to catch\n              // TURN data that is sent immediately\n              _this.on(\"action:\".concat(_WidgetApiAction.WidgetApiToWidgetAction.UpdateTurnServers), onUpdateTurnServers);\n\n              // Only send the 'watch' action if we aren't already watching\n              if (!(_this.turnServerWatchers === 0)) {\n                _context3.next = 12;\n                break;\n              }\n              _context3.prev = 3;\n              _context3.next = 6;\n              return _awaitAsyncGenerator(_this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.WatchTurnServers, {}));\n            case 6:\n              _context3.next = 12;\n              break;\n            case 8:\n              _context3.prev = 8;\n              _context3.t0 = _context3[\"catch\"](3);\n              _this.off(\"action:\".concat(_WidgetApiAction.WidgetApiToWidgetAction.UpdateTurnServers), onUpdateTurnServers);\n              throw _context3.t0;\n            case 12:\n              _this.turnServerWatchers++;\n              _context3.prev = 13;\n            case 14:\n              if (!true) {\n                _context3.next = 21;\n                break;\n              }\n              _context3.next = 17;\n              return _awaitAsyncGenerator(new Promise(function (resolve) {\n                return setTurnServer = resolve;\n              }));\n            case 17:\n              _context3.next = 19;\n              return _context3.sent;\n            case 19:\n              _context3.next = 14;\n              break;\n            case 21:\n              _context3.prev = 21;\n              // The loop was broken by the caller - clean up\n              _this.off(\"action:\".concat(_WidgetApiAction.WidgetApiToWidgetAction.UpdateTurnServers), onUpdateTurnServers);\n\n              // Since sending the 'unwatch' action will end updates for all other\n              // consumers, only send it if we're the only consumer remaining\n              _this.turnServerWatchers--;\n              if (!(_this.turnServerWatchers === 0)) {\n                _context3.next = 27;\n                break;\n              }\n              _context3.next = 27;\n              return _awaitAsyncGenerator(_this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.UnwatchTurnServers, {}));\n            case 27:\n              return _context3.finish(21);\n            case 28:\n            case \"end\":\n              return _context3.stop();\n          }\n        }, _callee3, null, [[3, 8], [13,, 21, 28]]);\n      }))();\n    }\n\n    /**\n     * Search for users in the user directory.\n     * @param searchTerm The term to search for.\n     * @param limit The maximum number of results to return. If not supplied, the\n     * @returns Resolves to the search results.\n     */\n  }, {\n    key: \"searchUserDirectory\",\n    value: function () {\n      var _searchUserDirectory = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(searchTerm, limit) {\n        var versions, data;\n        return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n          while (1) switch (_context4.prev = _context4.next) {\n            case 0:\n              _context4.next = 2;\n              return this.getClientVersions();\n            case 2:\n              versions = _context4.sent;\n              if (versions.includes(_ApiVersion.UnstableApiVersion.MSC3973)) {\n                _context4.next = 5;\n                break;\n              }\n              throw new Error(\"The user_directory_search action is not supported by the client.\");\n            case 5:\n              data = {\n                search_term: searchTerm,\n                limit: limit\n              };\n              return _context4.abrupt(\"return\", this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC3973UserDirectorySearch, data));\n            case 7:\n            case \"end\":\n              return _context4.stop();\n          }\n        }, _callee4, this);\n      }));\n      function searchUserDirectory(_x10, _x11) {\n        return _searchUserDirectory.apply(this, arguments);\n      }\n      return searchUserDirectory;\n    }()\n    /**\n     * Get the config for the media repository.\n     * @returns Promise which resolves with an object containing the config.\n     */\n  }, {\n    key: \"getMediaConfig\",\n    value: function () {\n      var _getMediaConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {\n        var versions, data;\n        return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n          while (1) switch (_context5.prev = _context5.next) {\n            case 0:\n              _context5.next = 2;\n              return this.getClientVersions();\n            case 2:\n              versions = _context5.sent;\n              if (versions.includes(_ApiVersion.UnstableApiVersion.MSC4039)) {\n                _context5.next = 5;\n                break;\n              }\n              throw new Error(\"The get_media_config action is not supported by the client.\");\n            case 5:\n              data = {};\n              return _context5.abrupt(\"return\", this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC4039GetMediaConfigAction, data));\n            case 7:\n            case \"end\":\n              return _context5.stop();\n          }\n        }, _callee5, this);\n      }));\n      function getMediaConfig() {\n        return _getMediaConfig.apply(this, arguments);\n      }\n      return getMediaConfig;\n    }()\n    /**\n     * Upload a file to the media repository on the homeserver.\n     * @param file - The object to upload. Something that can be sent to\n     *               XMLHttpRequest.send (typically a File).\n     * @returns Resolves to the location of the uploaded file.\n     */\n  }, {\n    key: \"uploadFile\",\n    value: function () {\n      var _uploadFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(file) {\n        var versions, data;\n        return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n          while (1) switch (_context6.prev = _context6.next) {\n            case 0:\n              _context6.next = 2;\n              return this.getClientVersions();\n            case 2:\n              versions = _context6.sent;\n              if (versions.includes(_ApiVersion.UnstableApiVersion.MSC4039)) {\n                _context6.next = 5;\n                break;\n              }\n              throw new Error(\"The upload_file action is not supported by the client.\");\n            case 5:\n              data = {\n                file: file\n              };\n              return _context6.abrupt(\"return\", this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC4039UploadFileAction, data));\n            case 7:\n            case \"end\":\n              return _context6.stop();\n          }\n        }, _callee6, this);\n      }));\n      function uploadFile(_x12) {\n        return _uploadFile.apply(this, arguments);\n      }\n      return uploadFile;\n    }()\n    /**\n     * Download a file from the media repository on the homeserver.\n     * @param contentUri - MXC URI of the file to download.\n     * @returns Resolves to the contents of the file.\n     */\n  }, {\n    key: \"downloadFile\",\n    value: function () {\n      var _downloadFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(contentUri) {\n        var versions, data;\n        return _regeneratorRuntime().wrap(function _callee7$(_context7) {\n          while (1) switch (_context7.prev = _context7.next) {\n            case 0:\n              _context7.next = 2;\n              return this.getClientVersions();\n            case 2:\n              versions = _context7.sent;\n              if (versions.includes(_ApiVersion.UnstableApiVersion.MSC4039)) {\n                _context7.next = 5;\n                break;\n              }\n              throw new Error(\"The download_file action is not supported by the client.\");\n            case 5:\n              data = {\n                content_uri: contentUri\n              };\n              return _context7.abrupt(\"return\", this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.MSC4039DownloadFileAction, data));\n            case 7:\n            case \"end\":\n              return _context7.stop();\n          }\n        }, _callee7, this);\n      }));\n      function downloadFile(_x13) {\n        return _downloadFile.apply(this, arguments);\n      }\n      return downloadFile;\n    }()\n    /**\n     * Starts the communication channel. This should be done early to ensure\n     * that messages are not missed. Communication can only be stopped by the client.\n     */\n  }, {\n    key: \"start\",\n    value: function start() {\n      var _this5 = this;\n      this.transport.start();\n      this.getClientVersions().then(function (v) {\n        if (v.includes(_ApiVersion.UnstableApiVersion.MSC2974)) {\n          _this5.supportsMSC2974Renegotiate = true;\n        }\n      });\n    }\n  }, {\n    key: \"handleMessage\",\n    value: function handleMessage(ev) {\n      var actionEv = new CustomEvent(\"action:\".concat(ev.detail.action), {\n        detail: ev.detail,\n        cancelable: true\n      });\n      this.emit(\"action:\".concat(ev.detail.action), actionEv);\n      if (!actionEv.defaultPrevented) {\n        switch (ev.detail.action) {\n          case _WidgetApiAction.WidgetApiToWidgetAction.SupportedApiVersions:\n            return this.replyVersions(ev.detail);\n          case _WidgetApiAction.WidgetApiToWidgetAction.Capabilities:\n            return this.handleCapabilities(ev.detail);\n          case _WidgetApiAction.WidgetApiToWidgetAction.UpdateVisibility:\n            return this.transport.reply(ev.detail, {});\n          // ack to avoid error spam\n          case _WidgetApiAction.WidgetApiToWidgetAction.NotifyCapabilities:\n            return this.transport.reply(ev.detail, {});\n          // ack to avoid error spam\n          default:\n            return this.transport.reply(ev.detail, {\n              error: {\n                message: \"Unknown or unsupported to-widget action: \" + ev.detail.action\n              }\n            });\n        }\n      }\n    }\n  }, {\n    key: \"replyVersions\",\n    value: function replyVersions(request) {\n      this.transport.reply(request, {\n        supported_versions: _ApiVersion.CurrentApiVersions\n      });\n    }\n  }, {\n    key: \"getClientVersions\",\n    value: function getClientVersions() {\n      var _this6 = this;\n      if (Array.isArray(this.cachedClientVersions)) {\n        return Promise.resolve(this.cachedClientVersions);\n      }\n      return this.transport.send(_WidgetApiAction.WidgetApiFromWidgetAction.SupportedApiVersions, {}).then(function (r) {\n        _this6.cachedClientVersions = r.supported_versions;\n        return r.supported_versions;\n      })[\"catch\"](function (e) {\n        console.warn(\"non-fatal error getting supported client versions: \", e);\n        return [];\n      });\n    }\n  }, {\n    key: \"handleCapabilities\",\n    value: function handleCapabilities(request) {\n      var _this7 = this;\n      if (this.capabilitiesFinished) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Capability negotiation already completed\"\n          }\n        });\n      }\n\n      // See if we can expect a capabilities notification or not\n      return this.getClientVersions().then(function (v) {\n        if (v.includes(_ApiVersion.UnstableApiVersion.MSC2871)) {\n          _this7.once(\"action:\".concat(_WidgetApiAction.WidgetApiToWidgetAction.NotifyCapabilities), function (ev) {\n            _this7.approvedCapabilities = ev.detail.data.approved;\n            _this7.emit(\"ready\");\n          });\n        } else {\n          // if we can't expect notification, we're as done as we can be\n          _this7.emit(\"ready\");\n        }\n\n        // in either case, reply to that capabilities request\n        _this7.capabilitiesFinished = true;\n        return _this7.transport.reply(request, {\n          capabilities: _this7.requestedCapabilities\n        });\n      });\n    }\n  }]);\n  return WidgetApi;\n}(_events.EventEmitter);\nexports.WidgetApi = WidgetApi;\n//# sourceMappingURL=WidgetApi.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.VideoConferenceCapabilities = exports.StickerpickerCapabilities = exports.MatrixCapabilities = void 0;\nexports.getTimelineRoomIDFromCapability = getTimelineRoomIDFromCapability;\nexports.isTimelineCapability = isTimelineCapability;\nexports.isTimelineCapabilityFor = isTimelineCapabilityFor;\n/*\n * Copyright 2020 - 2021 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar MatrixCapabilities = /*#__PURE__*/function (MatrixCapabilities) {\n  MatrixCapabilities[\"Screenshots\"] = \"m.capability.screenshot\";\n  MatrixCapabilities[\"StickerSending\"] = \"m.sticker\";\n  MatrixCapabilities[\"AlwaysOnScreen\"] = \"m.always_on_screen\";\n  MatrixCapabilities[\"RequiresClient\"] = \"io.element.requires_client\";\n  MatrixCapabilities[\"MSC2931Navigate\"] = \"org.matrix.msc2931.navigate\";\n  MatrixCapabilities[\"MSC3846TurnServers\"] = \"town.robin.msc3846.turn_servers\";\n  MatrixCapabilities[\"MSC3973UserDirectorySearch\"] = \"org.matrix.msc3973.user_directory_search\";\n  MatrixCapabilities[\"MSC4039UploadFile\"] = \"org.matrix.msc4039.upload_file\";\n  MatrixCapabilities[\"MSC4039DownloadFile\"] = \"org.matrix.msc4039.download_file\";\n  MatrixCapabilities[\"MSC4157SendDelayedEvent\"] = \"org.matrix.msc4157.send.delayed_event\";\n  MatrixCapabilities[\"MSC4157UpdateDelayedEvent\"] = \"org.matrix.msc4157.update_delayed_event\";\n  MatrixCapabilities[\"MSC4407SendStickyEvent\"] = \"org.matrix.msc4407.send.sticky_event\";\n  MatrixCapabilities[\"MSC4407ReceiveStickyEvent\"] = \"org.matrix.msc4407.receive.sticky_event\";\n  return MatrixCapabilities;\n}({});\nexports.MatrixCapabilities = MatrixCapabilities;\nvar StickerpickerCapabilities = [MatrixCapabilities.StickerSending];\nexports.StickerpickerCapabilities = StickerpickerCapabilities;\nvar VideoConferenceCapabilities = [MatrixCapabilities.AlwaysOnScreen];\n\n/**\n * Determines if a capability is a capability for a timeline.\n * @param {Capability} capability The capability to test.\n * @returns {boolean} True if a timeline capability, false otherwise.\n */\nexports.VideoConferenceCapabilities = VideoConferenceCapabilities;\nfunction isTimelineCapability(capability) {\n  // TODO: Change when MSC2762 becomes stable.\n  return capability === null || capability === void 0 ? void 0 : capability.startsWith(\"org.matrix.msc2762.timeline:\");\n}\n\n/**\n * Determines if a capability is a timeline capability for the given room.\n * @param {Capability} capability The capability to test.\n * @param {string | Symbols.AnyRoom} roomId The room ID, or `Symbols.AnyRoom` for that designation.\n * @returns {boolean} True if a matching capability, false otherwise.\n */\nfunction isTimelineCapabilityFor(capability, roomId) {\n  return capability === \"org.matrix.msc2762.timeline:\".concat(roomId);\n}\n\n/**\n * Gets the room ID described by a timeline capability.\n * @param {string} capability The capability to parse.\n * @returns {string} The room ID.\n */\nfunction getTimelineRoomIDFromCapability(capability) {\n  return capability.substring(capability.indexOf(\":\") + 1);\n}\n//# sourceMappingURL=Capabilities.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SimpleObservable = void 0;\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar SimpleObservable = /*#__PURE__*/function () {\n  function SimpleObservable(initialFn) {\n    _classCallCheck(this, SimpleObservable);\n    _defineProperty(this, \"listeners\", []);\n    if (initialFn) this.listeners.push(initialFn);\n  }\n  _createClass(SimpleObservable, [{\n    key: \"onUpdate\",\n    value: function onUpdate(fn) {\n      this.listeners.push(fn);\n    }\n  }, {\n    key: \"update\",\n    value: function update(val) {\n      var _iterator = _createForOfIteratorHelper(this.listeners),\n        _step;\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var listener = _step.value;\n          listener(val);\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n    }\n  }, {\n    key: \"close\",\n    value: function close() {\n      this.listeners = []; // reset\n    }\n  }]);\n  return SimpleObservable;\n}();\nexports.SimpleObservable = SimpleObservable;\n//# sourceMappingURL=SimpleObservable.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ClientWidgetApi = void 0;\nvar _events = require(\"events\");\nvar _PostmessageTransport = require(\"./transport/PostmessageTransport\");\nvar _WidgetApiDirection = require(\"./interfaces/WidgetApiDirection\");\nvar _WidgetApiAction = require(\"./interfaces/WidgetApiAction\");\nvar _Capabilities = require(\"./interfaces/Capabilities\");\nvar _ApiVersion = require(\"./interfaces/ApiVersion\");\nvar _WidgetEventCapability = require(\"./models/WidgetEventCapability\");\nvar _GetOpenIDAction = require(\"./interfaces/GetOpenIDAction\");\nvar _SimpleObservable = require(\"./util/SimpleObservable\");\nvar _Symbols = require(\"./Symbols\");\nvar _UpdateDelayedEventAction = require(\"./interfaces/UpdateDelayedEventAction\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, \"\"); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, \"_invoke\", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: \"normal\", arg: fn.call(obj, arg) }; } catch (err) { return { type: \"throw\", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { [\"next\", \"throw\", \"return\"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if (\"throw\" !== record.type) { var result = record.arg, value = result.value; return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke(\"next\", value, resolve, reject); }, function (err) { invoke(\"throw\", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke(\"throw\", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, \"_invoke\", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = \"suspendedStart\"; return function (method, arg) { if (\"executing\" === state) throw new Error(\"Generator is already running\"); if (\"completed\" === state) { if (\"throw\" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) { if (\"suspendedStart\" === state) throw state = \"completed\", context.arg; context.dispatchException(context.arg); } else \"return\" === context.method && context.abrupt(\"return\", context.arg); state = \"executing\"; var record = tryCatch(innerFn, self, context); if (\"normal\" === record.type) { if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = \"normal\", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: \"root\" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if (\"function\" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) { var ctor = \"function\" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, \"toString\", function () { return \"[object Generator]\"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if (\"throw\" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if (\"root\" === entry.tryLoc) return handle(\"end\"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error(\"try statement without catch or finally\"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if (\"throw\" === record.type) throw record.arg; return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, \"catch\": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if (\"throw\" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _asyncIterator(iterable) { var method, async, sync, retry = 2; for (\"undefined\" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) { if (async && null != (method = iterable[async])) return method.call(iterable); if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable)); async = \"@@asyncIterator\", sync = \"@@iterator\"; } throw new TypeError(\"Object is not async iterable\"); }\nfunction AsyncFromSyncIterator(s) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + \" is not an object.\")); var done = r.done; return Promise.resolve(r.value).then(function (value) { return { value: value, done: done }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) { this.s = s, this.n = s.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, \"return\": function _return(value) { var ret = this.s[\"return\"]; return void 0 === ret ? Promise.resolve({ value: value, done: !0 }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments)); }, \"throw\": function _throw(value) { var thr = this.s[\"return\"]; return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(s); } /*\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * Copyright 2020 - 2024 The Matrix.org Foundation C.I.C.\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             *\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * Licensed under the Apache License, Version 2.0 (the \"License\");\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * you may not use this file except in compliance with the License.\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * You may obtain a copy of the License at\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             *\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             *         http://www.apache.org/licenses/LICENSE-2.0\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             *\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * Unless required by applicable law or agreed to in writing, software\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * distributed under the License is distributed on an \"AS IS\" BASIS,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * See the License for the specific language governing permissions and\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * limitations under the License.\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             */\n/**\n * API handler for the client side of widgets. This raises events\n * for each action received as `action:${action}` (eg: \"action:screenshot\").\n * Default handling can be prevented by using preventDefault() on the\n * raised event. The default handling varies for each action: ones\n * which the SDK can handle safely are acknowledged appropriately and\n * ones which are unhandled (custom or require the client to do something)\n * are rejected with an error.\n *\n * Events which are preventDefault()ed must reply using the transport.\n * The events raised will have a default of an IWidgetApiRequest\n * interface.\n *\n * When the ClientWidgetApi is ready to start sending requests, it will\n * raise a \"ready\" CustomEvent. After the ready event fires, actions can\n * be sent and the transport will be ready.\n *\n * When the widget has indicated it has loaded, this class raises a\n * \"preparing\" CustomEvent. The preparing event does not indicate that\n * the widget is ready to receive communications - that is signified by\n * the ready event exclusively.\n *\n * This class only handles one widget at a time.\n */\nvar ClientWidgetApi = /*#__PURE__*/function (_EventEmitter) {\n  _inherits(ClientWidgetApi, _EventEmitter);\n  var _super = _createSuper(ClientWidgetApi);\n  /**\n   * Creates a new client widget API. This will instantiate the transport\n   * and start everything. When the iframe is loaded under the widget's\n   * conditions, a \"ready\" event will be raised.\n   * @param {Widget} widget The widget to communicate with.\n   * @param {HTMLIFrameElement} iframe The iframe the widget is in.\n   * @param {WidgetDriver} driver The driver for this widget/client.\n   */\n  function ClientWidgetApi(widget, iframe, driver) {\n    var _this;\n    _classCallCheck(this, ClientWidgetApi);\n    _this = _super.call(this);\n    _this.widget = widget;\n    _this.driver = driver;\n    _defineProperty(_assertThisInitialized(_this), \"transport\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"cachedWidgetVersions\", null);\n    // contentLoadedActionSent is used to check that only one ContentLoaded request is send.\n    _defineProperty(_assertThisInitialized(_this), \"contentLoadedActionSent\", false);\n    _defineProperty(_assertThisInitialized(_this), \"allowedCapabilities\", new Set());\n    _defineProperty(_assertThisInitialized(_this), \"allowedEvents\", []);\n    _defineProperty(_assertThisInitialized(_this), \"isStopped\", false);\n    _defineProperty(_assertThisInitialized(_this), \"turnServers\", null);\n    _defineProperty(_assertThisInitialized(_this), \"contentLoadedWaitTimer\", void 0);\n    // Stores pending requests to push a room's state to the widget\n    _defineProperty(_assertThisInitialized(_this), \"pushRoomStateTasks\", new Set());\n    // Room ID → event type → state key → events to be pushed\n    _defineProperty(_assertThisInitialized(_this), \"pushRoomStateResult\", new Map());\n    _defineProperty(_assertThisInitialized(_this), \"flushRoomStateTask\", null);\n    _defineProperty(_assertThisInitialized(_this), \"viewedRoomId\", null);\n    if (!(iframe !== null && iframe !== void 0 && iframe.contentWindow)) {\n      throw new Error(\"No iframe supplied\");\n    }\n    if (!widget) {\n      throw new Error(\"Invalid widget\");\n    }\n    if (!driver) {\n      throw new Error(\"Invalid driver\");\n    }\n    _this.transport = new _PostmessageTransport.PostmessageTransport(_WidgetApiDirection.WidgetApiDirection.ToWidget, widget.id, iframe.contentWindow, globalThis);\n    _this.transport.targetOrigin = widget.origin;\n    _this.transport.on(\"message\", _this.handleMessage.bind(_assertThisInitialized(_this)));\n    iframe.addEventListener(\"load\", _this.onIframeLoad.bind(_assertThisInitialized(_this)));\n    _this.transport.start();\n    return _this;\n  }\n  _createClass(ClientWidgetApi, [{\n    key: \"hasCapability\",\n    value: function hasCapability(capability) {\n      return this.allowedCapabilities.has(capability);\n    }\n  }, {\n    key: \"canUseRoomTimeline\",\n    value: function canUseRoomTimeline(roomId) {\n      return this.hasCapability(\"org.matrix.msc2762.timeline:\".concat(_Symbols.Symbols.AnyRoom)) || this.hasCapability(\"org.matrix.msc2762.timeline:\".concat(roomId));\n    }\n  }, {\n    key: \"canSendRoomEvent\",\n    value: function canSendRoomEvent(eventType) {\n      var msgtype = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n      return this.allowedEvents.some(function (e) {\n        return e.matchesAsRoomEvent(_WidgetEventCapability.EventDirection.Send, eventType, msgtype);\n      });\n    }\n  }, {\n    key: \"canSendStateEvent\",\n    value: function canSendStateEvent(eventType, stateKey) {\n      return this.allowedEvents.some(function (e) {\n        return e.matchesAsStateEvent(_WidgetEventCapability.EventDirection.Send, eventType, stateKey);\n      });\n    }\n  }, {\n    key: \"canSendToDeviceEvent\",\n    value: function canSendToDeviceEvent(eventType) {\n      return this.allowedEvents.some(function (e) {\n        return e.matchesAsToDeviceEvent(_WidgetEventCapability.EventDirection.Send, eventType);\n      });\n    }\n  }, {\n    key: \"canReceiveRoomEvent\",\n    value: function canReceiveRoomEvent(eventType) {\n      var msgtype = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n      return this.allowedEvents.some(function (e) {\n        return e.matchesAsRoomEvent(_WidgetEventCapability.EventDirection.Receive, eventType, msgtype);\n      });\n    }\n  }, {\n    key: \"canReceiveStateEvent\",\n    value: function canReceiveStateEvent(eventType, stateKey) {\n      return this.allowedEvents.some(function (e) {\n        return e.matchesAsStateEvent(_WidgetEventCapability.EventDirection.Receive, eventType, stateKey);\n      });\n    }\n  }, {\n    key: \"canReceiveToDeviceEvent\",\n    value: function canReceiveToDeviceEvent(eventType) {\n      return this.allowedEvents.some(function (e) {\n        return e.matchesAsToDeviceEvent(_WidgetEventCapability.EventDirection.Receive, eventType);\n      });\n    }\n  }, {\n    key: \"canReceiveRoomAccountData\",\n    value: function canReceiveRoomAccountData(eventType) {\n      return this.allowedEvents.some(function (e) {\n        return e.matchesAsRoomAccountData(_WidgetEventCapability.EventDirection.Receive, eventType);\n      });\n    }\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      this.isStopped = true;\n      this.transport.stop();\n    }\n  }, {\n    key: \"getWidgetVersions\",\n    value: function () {\n      var _getWidgetVersions = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {\n        var r;\n        return _regeneratorRuntime().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              if (!Array.isArray(this.cachedWidgetVersions)) {\n                _context.next = 2;\n                break;\n              }\n              return _context.abrupt(\"return\", this.cachedWidgetVersions);\n            case 2:\n              _context.prev = 2;\n              _context.next = 5;\n              return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.SupportedApiVersions, {});\n            case 5:\n              r = _context.sent;\n              this.cachedWidgetVersions = r.supported_versions;\n              return _context.abrupt(\"return\", r.supported_versions);\n            case 10:\n              _context.prev = 10;\n              _context.t0 = _context[\"catch\"](2);\n              console.warn(\"non-fatal error getting supported widget versions: \", _context.t0);\n              return _context.abrupt(\"return\", []);\n            case 14:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee, this, [[2, 10]]);\n      }));\n      function getWidgetVersions() {\n        return _getWidgetVersions.apply(this, arguments);\n      }\n      return getWidgetVersions;\n    }()\n  }, {\n    key: \"beginCapabilities\",\n    value: function beginCapabilities() {\n      var _this2 = this;\n      // widget has loaded - tell all the listeners that\n      this.emit(\"preparing\");\n      var requestedCaps;\n      this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.Capabilities, {}).then(function (caps) {\n        requestedCaps = caps.capabilities;\n        return _this2.driver.validateCapabilities(new Set(caps.capabilities));\n      }).then(function (allowedCaps) {\n        _this2.allowCapabilities(_toConsumableArray(allowedCaps), requestedCaps);\n        _this2.emit(\"ready\");\n      })[\"catch\"](function (e) {\n        _this2.emit(\"error:preparing\", e);\n      });\n    }\n  }, {\n    key: \"allowCapabilities\",\n    value: function allowCapabilities(allowed, requested) {\n      var _this$allowedEvents,\n        _this3 = this;\n      console.log(\"Widget \".concat(this.widget.id, \" is allowed capabilities:\"), allowed);\n      var _iterator2 = _createForOfIteratorHelper(allowed),\n        _step2;\n      try {\n        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n          var c = _step2.value;\n          this.allowedCapabilities.add(c);\n        }\n      } catch (err) {\n        _iterator2.e(err);\n      } finally {\n        _iterator2.f();\n      }\n      var allowedEvents = _WidgetEventCapability.WidgetEventCapability.findEventCapabilities(allowed);\n      (_this$allowedEvents = this.allowedEvents).push.apply(_this$allowedEvents, _toConsumableArray(allowedEvents));\n      this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.NotifyCapabilities, {\n        requested: requested,\n        approved: Array.from(this.allowedCapabilities)\n      })[\"catch\"](function (e) {\n        console.warn(\"non-fatal error notifying widget of approved capabilities:\", e);\n      }).then(function () {\n        _this3.emit(\"capabilitiesNotified\");\n      });\n\n      // Push the initial room state for all rooms with a timeline capability\n      var _iterator3 = _createForOfIteratorHelper(allowed),\n        _step3;\n      try {\n        for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n          var _c = _step3.value;\n          if ((0, _Capabilities.isTimelineCapability)(_c)) {\n            var roomId = (0, _Capabilities.getTimelineRoomIDFromCapability)(_c);\n            if (roomId === _Symbols.Symbols.AnyRoom) {\n              var _iterator5 = _createForOfIteratorHelper(this.driver.getKnownRooms()),\n                _step5;\n              try {\n                for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n                  var _roomId = _step5.value;\n                  this.pushRoomState(_roomId);\n                }\n              } catch (err) {\n                _iterator5.e(err);\n              } finally {\n                _iterator5.f();\n              }\n            } else {\n              this.pushRoomState(roomId);\n            }\n          }\n        }\n      } catch (err) {\n        _iterator3.e(err);\n      } finally {\n        _iterator3.f();\n      }\n      if (allowed.includes(_Capabilities.MatrixCapabilities.MSC4407ReceiveStickyEvent)) {\n        console.debug(\"Widget \".concat(this.widget.id, \" is allowed to receive sticky events, check current sticky state.\"));\n        // If the widget can receive sticky events, push all sticky events in known rooms now.\n        // Sticky events are like a state, and passed history is needed to get the full state.\n        var roomIds = allowed.filter(function (capability) {\n          return (0, _Capabilities.isTimelineCapability)(capability);\n        }).map(function (timelineCapability) {\n          return (0, _Capabilities.getTimelineRoomIDFromCapability)(timelineCapability);\n        }).flatMap(function (roomIdOrWildcard) {\n          if (roomIdOrWildcard === _Symbols.Symbols.AnyRoom) {\n            // Do we support getting sticky state for any room?\n            return _this3.driver.getKnownRooms();\n          } else {\n            return roomIdOrWildcard;\n          }\n        });\n        console.debug(\"Widget \".concat(this.widget.id, \" is allowed to receive sticky events in rooms:\"), roomIds);\n        var _iterator4 = _createForOfIteratorHelper(roomIds),\n          _step4;\n        try {\n          var _loop = function _loop() {\n            var roomId = _step4.value;\n            _this3.pushStickyState(roomId)[\"catch\"](function (err) {\n              console.error(\"Failed to push sticky events to widget \".concat(_this3.widget.id, \" for room \").concat(roomId, \":\"), err);\n            });\n          };\n          for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n            _loop();\n          }\n        } catch (err) {\n          _iterator4.e(err);\n        } finally {\n          _iterator4.f();\n        }\n      }\n\n      // If new events are allowed and the currently viewed room isn't covered\n      // by a timeline capability, then we know that there could be some state\n      // in the viewed room that the widget hasn't learned about yet- push it.\n      if (allowedEvents.length > 0 && this.viewedRoomId !== null && !this.canUseRoomTimeline(this.viewedRoomId)) {\n        this.pushRoomState(this.viewedRoomId);\n      }\n    }\n  }, {\n    key: \"onIframeLoad\",\n    value: function onIframeLoad(ev) {\n      if (this.widget.waitForIframeLoad) {\n        // If the widget is set to waitForIframeLoad the capabilities immediately get setup after load.\n        // The client does not wait for the ContentLoaded action.\n        this.beginCapabilities();\n      } else {\n        // Reaching this means, that the Iframe got reloaded/loaded and\n        // the clientApi is awaiting the FIRST ContentLoaded action.\n        console.log(\"waitForIframeLoad is false: waiting for widget to send contentLoaded\");\n        this.contentLoadedWaitTimer = setTimeout(function () {\n          console.error(\"Widget specified waitForIframeLoad=false but timed out waiting for contentLoaded event!\");\n        }, 10000);\n        this.contentLoadedActionSent = false;\n      }\n    }\n  }, {\n    key: \"handleContentLoadedAction\",\n    value: function handleContentLoadedAction(action) {\n      if (this.contentLoadedWaitTimer !== undefined) {\n        clearTimeout(this.contentLoadedWaitTimer);\n        this.contentLoadedWaitTimer = undefined;\n      }\n      if (this.contentLoadedActionSent) {\n        throw new Error(\"Improper sequence: ContentLoaded Action can only be sent once after the widget loaded \" + \"and should only be used if waitForIframeLoad is false (default=true)\");\n      }\n      if (this.widget.waitForIframeLoad) {\n        this.transport.reply(action, {\n          error: {\n            message: \"Improper sequence: not expecting ContentLoaded event if \" + \"waitForIframeLoad is true (default=true)\"\n          }\n        });\n      } else {\n        this.transport.reply(action, {});\n        this.beginCapabilities();\n      }\n      this.contentLoadedActionSent = true;\n    }\n  }, {\n    key: \"replyVersions\",\n    value: function replyVersions(request) {\n      this.transport.reply(request, {\n        supported_versions: _ApiVersion.CurrentApiVersions\n      });\n    }\n  }, {\n    key: \"supportsUpdateState\",\n    value: function () {\n      var _supportsUpdateState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {\n        return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n          while (1) switch (_context2.prev = _context2.next) {\n            case 0:\n              _context2.next = 2;\n              return this.getWidgetVersions();\n            case 2:\n              return _context2.abrupt(\"return\", _context2.sent.includes(_ApiVersion.UnstableApiVersion.MSC2762_UPDATE_STATE));\n            case 3:\n            case \"end\":\n              return _context2.stop();\n          }\n        }, _callee2, this);\n      }));\n      function supportsUpdateState() {\n        return _supportsUpdateState.apply(this, arguments);\n      }\n      return supportsUpdateState;\n    }()\n  }, {\n    key: \"handleCapabilitiesRenegotiate\",\n    value: function handleCapabilitiesRenegotiate(request) {\n      var _request$data,\n        _this4 = this;\n      // acknowledge first\n      this.transport.reply(request, {});\n      var requested = ((_request$data = request.data) === null || _request$data === void 0 ? void 0 : _request$data.capabilities) || [];\n      var newlyRequested = new Set(requested.filter(function (r) {\n        return !_this4.hasCapability(r);\n      }));\n      if (newlyRequested.size === 0) {\n        // Nothing to do - skip validation\n        this.allowCapabilities([], []);\n      }\n      this.driver.validateCapabilities(newlyRequested).then(function (allowed) {\n        return _this4.allowCapabilities(_toConsumableArray(allowed), _toConsumableArray(newlyRequested));\n      });\n    }\n  }, {\n    key: \"handleNavigate\",\n    value: function handleNavigate(request) {\n      var _request$data2,\n        _this5 = this;\n      if (!this.hasCapability(_Capabilities.MatrixCapabilities.MSC2931Navigate)) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Missing capability\"\n          }\n        });\n      }\n      if (!((_request$data2 = request.data) !== null && _request$data2 !== void 0 && _request$data2.uri.startsWith(\"https://matrix.to/#\"))) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Invalid matrix.to URI\"\n          }\n        });\n      }\n      var onErr = function onErr(e) {\n        console.error(\"[ClientWidgetApi] Failed to handle navigation: \", e);\n        _this5.handleDriverError(e, request, \"Error handling navigation\");\n      };\n      try {\n        this.driver.navigate(request.data.uri.toString())[\"catch\"](function (e) {\n          return onErr(e);\n        }).then(function () {\n          return _this5.transport.reply(request, {});\n        });\n      } catch (e) {\n        return onErr(e);\n      }\n    }\n  }, {\n    key: \"handleOIDC\",\n    value: function handleOIDC(request) {\n      var _this6 = this;\n      var phase = 1; // 1 = initial request, 2 = after user manual confirmation\n\n      var replyState = function replyState(state, credential) {\n        credential = credential || {};\n        if (phase > 1) {\n          return _this6.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.OpenIDCredentials, _objectSpread({\n            state: state,\n            original_request_id: request.requestId\n          }, credential));\n        } else {\n          return _this6.transport.reply(request, _objectSpread({\n            state: state\n          }, credential));\n        }\n      };\n      var replyError = function replyError(msg) {\n        console.error(\"[ClientWidgetApi] Failed to handle OIDC: \", msg);\n        if (phase > 1) {\n          // We don't have a way to indicate that a random error happened in this flow, so\n          // just block the attempt.\n          return replyState(_GetOpenIDAction.OpenIDRequestState.Blocked);\n        } else {\n          return _this6.transport.reply(request, {\n            error: {\n              message: msg\n            }\n          });\n        }\n      };\n      var observer = new _SimpleObservable.SimpleObservable(function (update) {\n        if (update.state === _GetOpenIDAction.OpenIDRequestState.PendingUserConfirmation && phase > 1) {\n          observer.close();\n          return replyError(\"client provided out-of-phase response to OIDC flow\");\n        }\n        if (update.state === _GetOpenIDAction.OpenIDRequestState.PendingUserConfirmation) {\n          replyState(update.state);\n          phase++;\n          return;\n        }\n        if (update.state === _GetOpenIDAction.OpenIDRequestState.Allowed && !update.token) {\n          return replyError(\"client provided invalid OIDC token for an allowed request\");\n        }\n        if (update.state === _GetOpenIDAction.OpenIDRequestState.Blocked) {\n          update.token = undefined; // just in case the client did something weird\n        }\n\n        observer.close();\n        return replyState(update.state, update.token);\n      });\n      this.driver.askOpenID(observer);\n    }\n  }, {\n    key: \"handleReadRoomAccountData\",\n    value: function handleReadRoomAccountData(request) {\n      var _this7 = this;\n      var events = this.driver.readRoomAccountData(request.data.type);\n      if (!this.canReceiveRoomAccountData(request.data.type)) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Cannot read room account data of this type\"\n          }\n        });\n      }\n      return events.then(function (evs) {\n        _this7.transport.reply(request, {\n          events: evs\n        });\n      });\n    }\n  }, {\n    key: \"handleReadEvents\",\n    value: function () {\n      var _handleReadEvents = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(request) {\n        var _this8 = this;\n        var askRoomIds, _iterator6, _step6, roomId, limit, since, stateKey, msgtype, _stateKey, events;\n        return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n          while (1) switch (_context3.prev = _context3.next) {\n            case 0:\n              if (request.data.type) {\n                _context3.next = 2;\n                break;\n              }\n              return _context3.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - missing event type\"\n                }\n              }));\n            case 2:\n              if (!(request.data.limit !== undefined && (!request.data.limit || request.data.limit < 0))) {\n                _context3.next = 4;\n                break;\n              }\n              return _context3.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - limit out of range\"\n                }\n              }));\n            case 4:\n              if (!(request.data.room_ids === undefined)) {\n                _context3.next = 8;\n                break;\n              }\n              askRoomIds = this.viewedRoomId === null ? [] : [this.viewedRoomId];\n              _context3.next = 30;\n              break;\n            case 8:\n              if (!(request.data.room_ids === _Symbols.Symbols.AnyRoom)) {\n                _context3.next = 12;\n                break;\n              }\n              askRoomIds = this.driver.getKnownRooms().filter(function (roomId) {\n                return _this8.canUseRoomTimeline(roomId);\n              });\n              _context3.next = 30;\n              break;\n            case 12:\n              askRoomIds = request.data.room_ids;\n              _iterator6 = _createForOfIteratorHelper(askRoomIds);\n              _context3.prev = 14;\n              _iterator6.s();\n            case 16:\n              if ((_step6 = _iterator6.n()).done) {\n                _context3.next = 22;\n                break;\n              }\n              roomId = _step6.value;\n              if (this.canUseRoomTimeline(roomId)) {\n                _context3.next = 20;\n                break;\n              }\n              return _context3.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Unable to access room timeline: \".concat(roomId)\n                }\n              }));\n            case 20:\n              _context3.next = 16;\n              break;\n            case 22:\n              _context3.next = 27;\n              break;\n            case 24:\n              _context3.prev = 24;\n              _context3.t0 = _context3[\"catch\"](14);\n              _iterator6.e(_context3.t0);\n            case 27:\n              _context3.prev = 27;\n              _iterator6.f();\n              return _context3.finish(27);\n            case 30:\n              limit = request.data.limit || 0;\n              since = request.data.since;\n              stateKey = undefined;\n              msgtype = undefined;\n              if (!(request.data.state_key !== undefined)) {\n                _context3.next = 40;\n                break;\n              }\n              stateKey = request.data.state_key === true ? undefined : request.data.state_key.toString();\n              if (this.canReceiveStateEvent(request.data.type, (_stateKey = stateKey) !== null && _stateKey !== void 0 ? _stateKey : null)) {\n                _context3.next = 38;\n                break;\n              }\n              return _context3.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Cannot read state events of this type\"\n                }\n              }));\n            case 38:\n              _context3.next = 43;\n              break;\n            case 40:\n              msgtype = request.data.msgtype;\n              if (this.canReceiveRoomEvent(request.data.type, msgtype)) {\n                _context3.next = 43;\n                break;\n              }\n              return _context3.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Cannot read room events of this type\"\n                }\n              }));\n            case 43:\n              if (!(request.data.room_ids === undefined && askRoomIds.length === 0)) {\n                _context3.next = 50;\n                break;\n              }\n              // For backwards compatibility we still call the deprecated\n              // readRoomEvents and readStateEvents methods in case the client isn't\n              // letting us know the currently viewed room via setViewedRoomId\n              //\n              // This can be considered as a deprecated implementation.\n              // A driver should call `setViewedRoomId` on the widget messaging and implement the new readRoomState and readRoomTimeline\n              // Methods.\n              // This block makes sure that it is also possible to not use setViewedRoomId.\n              // readRoomTimeline and readRoomState are required however! Otherwise widget requests that include\n              // `room_ids` will fail.\n              console.warn(\"The widgetDriver uses deprecated behaviour:\\n It does not set the viewedRoomId using `setViewedRoomId`\");\n              _context3.next = 47;\n              return (\n                // This returns [] with the current driver of Element Web.\n                // Add default implementations of the `readRoomEvents` and `readStateEvents`\n                // methods to use `readRoomTimeline` and `readRoomState` if they are not overwritten.\n                request.data.state_key === undefined ? this.driver.readRoomEvents(request.data.type, msgtype, limit, null, since) : this.driver.readStateEvents(request.data.type, stateKey, limit, null)\n              );\n            case 47:\n              events = _context3.sent;\n              _context3.next = 68;\n              break;\n            case 50:\n              _context3.next = 52;\n              return this.supportsUpdateState();\n            case 52:\n              if (!_context3.sent) {\n                _context3.next = 58;\n                break;\n              }\n              _context3.next = 55;\n              return Promise.all(askRoomIds.map(function (roomId) {\n                return _this8.driver.readRoomTimeline(roomId, request.data.type, msgtype, stateKey, limit, since);\n              }));\n            case 55:\n              events = _context3.sent.flat(1);\n              _context3.next = 68;\n              break;\n            case 58:\n              if (!(request.data.state_key === undefined)) {\n                _context3.next = 64;\n                break;\n              }\n              _context3.next = 61;\n              return Promise.all(askRoomIds.map(function (roomId) {\n                return _this8.driver.readRoomTimeline(roomId, request.data.type, msgtype, stateKey, limit, since);\n              }));\n            case 61:\n              _context3.t1 = _context3.sent;\n              _context3.next = 67;\n              break;\n            case 64:\n              _context3.next = 66;\n              return Promise.all(askRoomIds.map(function (roomId) {\n                return _this8.driver.readRoomState(roomId, request.data.type, stateKey);\n              }));\n            case 66:\n              _context3.t1 = _context3.sent;\n            case 67:\n              events = _context3.t1.flat(1);\n            case 68:\n              this.transport.reply(request, {\n                events: events\n              });\n            case 69:\n            case \"end\":\n              return _context3.stop();\n          }\n        }, _callee3, this, [[14, 24, 27, 30]]);\n      }));\n      function handleReadEvents(_x) {\n        return _handleReadEvents.apply(this, arguments);\n      }\n      return handleReadEvents;\n    }()\n  }, {\n    key: \"handleSendEvent\",\n    value: function handleSendEvent(request) {\n      var _this9 = this;\n      if (!request.data.type) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Invalid request - missing event type\"\n          }\n        });\n      }\n      if (!!request.data.room_id && !this.canUseRoomTimeline(request.data.room_id)) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Unable to access room timeline: \".concat(request.data.room_id)\n          }\n        });\n      }\n      var isDelayedEvent = request.data.delay !== undefined || request.data.parent_delay_id !== undefined;\n      if (isDelayedEvent && !this.hasCapability(_Capabilities.MatrixCapabilities.MSC4157SendDelayedEvent)) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Missing capability for \".concat(_Capabilities.MatrixCapabilities.MSC4157SendDelayedEvent)\n          }\n        });\n      }\n      var isStickyEvent = request.data.sticky_duration_ms !== undefined;\n      if (isStickyEvent && !this.hasCapability(_Capabilities.MatrixCapabilities.MSC4407SendStickyEvent)) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Missing capability for \".concat(_Capabilities.MatrixCapabilities.MSC4407SendStickyEvent)\n          }\n        });\n      }\n      var sendEventPromise;\n      if (request.data.state_key !== undefined) {\n        if (!this.canSendStateEvent(request.data.type, request.data.state_key)) {\n          return this.transport.reply(request, {\n            error: {\n              message: \"Cannot send state events of this type\"\n            }\n          });\n        }\n        if (isStickyEvent) {\n          return this.transport.reply(request, {\n            error: {\n              message: \"Cannot send a state event with a sticky duration\"\n            }\n          });\n        }\n        if (isDelayedEvent) {\n          var _request$data$delay, _request$data$parent_;\n          sendEventPromise = this.driver.sendDelayedEvent((_request$data$delay = request.data.delay) !== null && _request$data$delay !== void 0 ? _request$data$delay : null, (_request$data$parent_ = request.data.parent_delay_id) !== null && _request$data$parent_ !== void 0 ? _request$data$parent_ : null, request.data.type, request.data.content || {}, request.data.state_key, request.data.room_id);\n        } else {\n          sendEventPromise = this.driver.sendEvent(request.data.type, request.data.content || {}, request.data.state_key, request.data.room_id);\n        }\n      } else {\n        var content = request.data.content || {};\n        var msgtype = content[\"msgtype\"];\n        if (!this.canSendRoomEvent(request.data.type, msgtype)) {\n          return this.transport.reply(request, {\n            error: {\n              message: \"Cannot send room events of this type\"\n            }\n          });\n        }\n\n        // Events can be sticky, delayed, both, or neither. The following\n        // section of code takes the common parameters and uses the correct\n        // function depending on the request type.\n\n        var params = [request.data.type, content, null,\n        // not sending a state event\n        request.data.room_id];\n        if (isDelayedEvent && request.data.sticky_duration_ms) {\n          var _request$data$delay2, _request$data$parent_2;\n          sendEventPromise = this.driver.sendDelayedStickyEvent((_request$data$delay2 = request.data.delay) !== null && _request$data$delay2 !== void 0 ? _request$data$delay2 : null, (_request$data$parent_2 = request.data.parent_delay_id) !== null && _request$data$parent_2 !== void 0 ? _request$data$parent_2 : null, request.data.sticky_duration_ms, request.data.type, content, request.data.room_id);\n        } else if (isDelayedEvent) {\n          var _this$driver, _request$data$delay3, _request$data$parent_3;\n          sendEventPromise = (_this$driver = this.driver).sendDelayedEvent.apply(_this$driver, [(_request$data$delay3 = request.data.delay) !== null && _request$data$delay3 !== void 0 ? _request$data$delay3 : null, (_request$data$parent_3 = request.data.parent_delay_id) !== null && _request$data$parent_3 !== void 0 ? _request$data$parent_3 : null].concat(params));\n        } else if (request.data.sticky_duration_ms) {\n          sendEventPromise = this.driver.sendStickyEvent(request.data.sticky_duration_ms, request.data.type, content, request.data.room_id);\n        } else {\n          var _this$driver2;\n          sendEventPromise = (_this$driver2 = this.driver).sendEvent.apply(_this$driver2, params);\n        }\n      }\n      sendEventPromise.then(function (sentEvent) {\n        return _this9.transport.reply(request, _objectSpread({\n          room_id: sentEvent.roomId\n        }, \"eventId\" in sentEvent ? {\n          event_id: sentEvent.eventId\n        } : {\n          delay_id: sentEvent.delayId\n        }));\n      })[\"catch\"](function (e) {\n        console.error(\"error sending event: \", e);\n        _this9.handleDriverError(e, request, \"Error sending event\");\n      });\n    }\n  }, {\n    key: \"handleUpdateDelayedEvent\",\n    value: function handleUpdateDelayedEvent(request) {\n      var _this10 = this;\n      if (!request.data.delay_id) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Invalid request - missing delay_id\"\n          }\n        });\n      }\n      if (!this.hasCapability(_Capabilities.MatrixCapabilities.MSC4157UpdateDelayedEvent)) {\n        return this.transport.reply(request, {\n          error: {\n            message: \"Missing capability\"\n          }\n        });\n      }\n      var updateDelayedEvent;\n      switch (request.data.action) {\n        case _UpdateDelayedEventAction.UpdateDelayedEventAction.Cancel:\n          updateDelayedEvent = this.driver.cancelScheduledDelayedEvent;\n          break;\n        case _UpdateDelayedEventAction.UpdateDelayedEventAction.Restart:\n          updateDelayedEvent = this.driver.restartScheduledDelayedEvent;\n          break;\n        case _UpdateDelayedEventAction.UpdateDelayedEventAction.Send:\n          updateDelayedEvent = this.driver.sendScheduledDelayedEvent;\n          break;\n        default:\n          return this.transport.reply(request, {\n            error: {\n              message: \"Invalid request - unsupported action\"\n            }\n          });\n      }\n      updateDelayedEvent.call(this.driver, request.data.delay_id).then(function () {\n        return _this10.transport.reply(request, {});\n      })[\"catch\"](function (e) {\n        console.error(\"error updating delayed event: \", e);\n        _this10.handleDriverError(e, request, \"Error updating delayed event\");\n      });\n    }\n  }, {\n    key: \"handleSendToDevice\",\n    value: function () {\n      var _handleSendToDevice = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(request) {\n        return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n          while (1) switch (_context4.prev = _context4.next) {\n            case 0:\n              if (request.data.type) {\n                _context4.next = 4;\n                break;\n              }\n              this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - missing event type\"\n                }\n              });\n              _context4.next = 26;\n              break;\n            case 4:\n              if (request.data.messages) {\n                _context4.next = 8;\n                break;\n              }\n              this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - missing event contents\"\n                }\n              });\n              _context4.next = 26;\n              break;\n            case 8:\n              if (!(typeof request.data.encrypted !== \"boolean\")) {\n                _context4.next = 12;\n                break;\n              }\n              this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - missing encryption flag\"\n                }\n              });\n              _context4.next = 26;\n              break;\n            case 12:\n              if (this.canSendToDeviceEvent(request.data.type)) {\n                _context4.next = 16;\n                break;\n              }\n              this.transport.reply(request, {\n                error: {\n                  message: \"Cannot send to-device events of this type\"\n                }\n              });\n              _context4.next = 26;\n              break;\n            case 16:\n              _context4.prev = 16;\n              _context4.next = 19;\n              return this.driver.sendToDevice(request.data.type, request.data.encrypted, request.data.messages);\n            case 19:\n              this.transport.reply(request, {});\n              _context4.next = 26;\n              break;\n            case 22:\n              _context4.prev = 22;\n              _context4.t0 = _context4[\"catch\"](16);\n              console.error(\"error sending to-device event\", _context4.t0);\n              this.handleDriverError(_context4.t0, request, \"Error sending event\");\n            case 26:\n            case \"end\":\n              return _context4.stop();\n          }\n        }, _callee4, this, [[16, 22]]);\n      }));\n      function handleSendToDevice(_x2) {\n        return _handleSendToDevice.apply(this, arguments);\n      }\n      return handleSendToDevice;\n    }()\n  }, {\n    key: \"pollTurnServers\",\n    value: function () {\n      var _pollTurnServers = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(turnServers, initialServer) {\n        var _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, server;\n        return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n          while (1) switch (_context5.prev = _context5.next) {\n            case 0:\n              _context5.prev = 0;\n              _context5.next = 3;\n              return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateTurnServers, initialServer // it's compatible, but missing the index signature\n              );\n            case 3:\n              // Pick the generator up where we left off\n              _iteratorAbruptCompletion = false;\n              _didIteratorError = false;\n              _context5.prev = 5;\n              _iterator = _asyncIterator(turnServers);\n            case 7:\n              _context5.next = 9;\n              return _iterator.next();\n            case 9:\n              if (!(_iteratorAbruptCompletion = !(_step = _context5.sent).done)) {\n                _context5.next = 16;\n                break;\n              }\n              server = _step.value;\n              _context5.next = 13;\n              return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateTurnServers, server // it's compatible, but missing the index signature\n              );\n            case 13:\n              _iteratorAbruptCompletion = false;\n              _context5.next = 7;\n              break;\n            case 16:\n              _context5.next = 22;\n              break;\n            case 18:\n              _context5.prev = 18;\n              _context5.t0 = _context5[\"catch\"](5);\n              _didIteratorError = true;\n              _iteratorError = _context5.t0;\n            case 22:\n              _context5.prev = 22;\n              _context5.prev = 23;\n              if (!(_iteratorAbruptCompletion && _iterator[\"return\"] != null)) {\n                _context5.next = 27;\n                break;\n              }\n              _context5.next = 27;\n              return _iterator[\"return\"]();\n            case 27:\n              _context5.prev = 27;\n              if (!_didIteratorError) {\n                _context5.next = 30;\n                break;\n              }\n              throw _iteratorError;\n            case 30:\n              return _context5.finish(27);\n            case 31:\n              return _context5.finish(22);\n            case 32:\n              _context5.next = 37;\n              break;\n            case 34:\n              _context5.prev = 34;\n              _context5.t1 = _context5[\"catch\"](0);\n              console.error(\"error polling for TURN servers\", _context5.t1);\n            case 37:\n            case \"end\":\n              return _context5.stop();\n          }\n        }, _callee5, this, [[0, 34], [5, 18, 22, 32], [23,, 27, 31]]);\n      }));\n      function pollTurnServers(_x3, _x4) {\n        return _pollTurnServers.apply(this, arguments);\n      }\n      return pollTurnServers;\n    }()\n  }, {\n    key: \"handleWatchTurnServers\",\n    value: function () {\n      var _handleWatchTurnServers = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(request) {\n        var turnServers, _yield$turnServers$ne, done, value;\n        return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n          while (1) switch (_context6.prev = _context6.next) {\n            case 0:\n              if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC3846TurnServers)) {\n                _context6.next = 4;\n                break;\n              }\n              this.transport.reply(request, {\n                error: {\n                  message: \"Missing capability\"\n                }\n              });\n              _context6.next = 26;\n              break;\n            case 4:\n              if (!this.turnServers) {\n                _context6.next = 8;\n                break;\n              }\n              // We're already polling, so this is a no-op\n              this.transport.reply(request, {});\n              _context6.next = 26;\n              break;\n            case 8:\n              _context6.prev = 8;\n              turnServers = this.driver.getTurnServers(); // Peek at the first result, so we can at least verify that the\n              // client isn't banned from getting TURN servers entirely\n              _context6.next = 12;\n              return turnServers.next();\n            case 12:\n              _yield$turnServers$ne = _context6.sent;\n              done = _yield$turnServers$ne.done;\n              value = _yield$turnServers$ne.value;\n              if (!done) {\n                _context6.next = 17;\n                break;\n              }\n              throw new Error(\"Client refuses to provide any TURN servers\");\n            case 17:\n              this.transport.reply(request, {});\n\n              // Start the poll loop, sending the widget the initial result\n              this.pollTurnServers(turnServers, value);\n              this.turnServers = turnServers;\n              _context6.next = 26;\n              break;\n            case 22:\n              _context6.prev = 22;\n              _context6.t0 = _context6[\"catch\"](8);\n              console.error(\"error getting first TURN server results\", _context6.t0);\n              this.transport.reply(request, {\n                error: {\n                  message: \"TURN servers not available\"\n                }\n              });\n            case 26:\n            case \"end\":\n              return _context6.stop();\n          }\n        }, _callee6, this, [[8, 22]]);\n      }));\n      function handleWatchTurnServers(_x5) {\n        return _handleWatchTurnServers.apply(this, arguments);\n      }\n      return handleWatchTurnServers;\n    }()\n  }, {\n    key: \"handleUnwatchTurnServers\",\n    value: function () {\n      var _handleUnwatchTurnServers = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(request) {\n        return _regeneratorRuntime().wrap(function _callee7$(_context7) {\n          while (1) switch (_context7.prev = _context7.next) {\n            case 0:\n              if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC3846TurnServers)) {\n                _context7.next = 4;\n                break;\n              }\n              this.transport.reply(request, {\n                error: {\n                  message: \"Missing capability\"\n                }\n              });\n              _context7.next = 12;\n              break;\n            case 4:\n              if (this.turnServers) {\n                _context7.next = 8;\n                break;\n              }\n              // We weren't polling anyways, so this is a no-op\n              this.transport.reply(request, {});\n              _context7.next = 12;\n              break;\n            case 8:\n              _context7.next = 10;\n              return this.turnServers[\"return\"](undefined);\n            case 10:\n              this.turnServers = null;\n              this.transport.reply(request, {});\n            case 12:\n            case \"end\":\n              return _context7.stop();\n          }\n        }, _callee7, this);\n      }));\n      function handleUnwatchTurnServers(_x6) {\n        return _handleUnwatchTurnServers.apply(this, arguments);\n      }\n      return handleUnwatchTurnServers;\n    }()\n  }, {\n    key: \"handleReadRelations\",\n    value: function () {\n      var _handleReadRelations = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(request) {\n        var _this11 = this;\n        var result, chunk;\n        return _regeneratorRuntime().wrap(function _callee8$(_context8) {\n          while (1) switch (_context8.prev = _context8.next) {\n            case 0:\n              if (request.data.event_id) {\n                _context8.next = 2;\n                break;\n              }\n              return _context8.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - missing event ID\"\n                }\n              }));\n            case 2:\n              if (!(request.data.limit !== undefined && request.data.limit < 0)) {\n                _context8.next = 4;\n                break;\n              }\n              return _context8.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - limit out of range\"\n                }\n              }));\n            case 4:\n              if (!(request.data.room_id !== undefined && !this.canUseRoomTimeline(request.data.room_id))) {\n                _context8.next = 6;\n                break;\n              }\n              return _context8.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Unable to access room timeline: \".concat(request.data.room_id)\n                }\n              }));\n            case 6:\n              _context8.prev = 6;\n              _context8.next = 9;\n              return this.driver.readEventRelations(request.data.event_id, request.data.room_id, request.data.rel_type, request.data.event_type, request.data.from, request.data.to, request.data.limit, request.data.direction);\n            case 9:\n              result = _context8.sent;\n              // only return events that the user has the permission to receive\n              chunk = result.chunk.filter(function (e) {\n                if (e.state_key !== undefined) {\n                  return _this11.canReceiveStateEvent(e.type, e.state_key);\n                } else {\n                  return _this11.canReceiveRoomEvent(e.type, e.content[\"msgtype\"]);\n                }\n              });\n              return _context8.abrupt(\"return\", this.transport.reply(request, {\n                chunk: chunk,\n                prev_batch: result.prevBatch,\n                next_batch: result.nextBatch\n              }));\n            case 14:\n              _context8.prev = 14;\n              _context8.t0 = _context8[\"catch\"](6);\n              console.error(\"error getting the relations\", _context8.t0);\n              this.handleDriverError(_context8.t0, request, \"Unexpected error while reading relations\");\n            case 18:\n            case \"end\":\n              return _context8.stop();\n          }\n        }, _callee8, this, [[6, 14]]);\n      }));\n      function handleReadRelations(_x7) {\n        return _handleReadRelations.apply(this, arguments);\n      }\n      return handleReadRelations;\n    }()\n  }, {\n    key: \"handleUserDirectorySearch\",\n    value: function () {\n      var _handleUserDirectorySearch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(request) {\n        var result;\n        return _regeneratorRuntime().wrap(function _callee9$(_context9) {\n          while (1) switch (_context9.prev = _context9.next) {\n            case 0:\n              if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC3973UserDirectorySearch)) {\n                _context9.next = 2;\n                break;\n              }\n              return _context9.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Missing capability\"\n                }\n              }));\n            case 2:\n              if (!(typeof request.data.search_term !== \"string\")) {\n                _context9.next = 4;\n                break;\n              }\n              return _context9.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - missing search term\"\n                }\n              }));\n            case 4:\n              if (!(request.data.limit !== undefined && request.data.limit < 0)) {\n                _context9.next = 6;\n                break;\n              }\n              return _context9.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Invalid request - limit out of range\"\n                }\n              }));\n            case 6:\n              _context9.prev = 6;\n              _context9.next = 9;\n              return this.driver.searchUserDirectory(request.data.search_term, request.data.limit);\n            case 9:\n              result = _context9.sent;\n              return _context9.abrupt(\"return\", this.transport.reply(request, {\n                limited: result.limited,\n                results: result.results.map(function (r) {\n                  return {\n                    user_id: r.userId,\n                    display_name: r.displayName,\n                    avatar_url: r.avatarUrl\n                  };\n                })\n              }));\n            case 13:\n              _context9.prev = 13;\n              _context9.t0 = _context9[\"catch\"](6);\n              console.error(\"error searching in the user directory\", _context9.t0);\n              this.handleDriverError(_context9.t0, request, \"Unexpected error while searching in the user directory\");\n            case 17:\n            case \"end\":\n              return _context9.stop();\n          }\n        }, _callee9, this, [[6, 13]]);\n      }));\n      function handleUserDirectorySearch(_x8) {\n        return _handleUserDirectorySearch.apply(this, arguments);\n      }\n      return handleUserDirectorySearch;\n    }()\n  }, {\n    key: \"handleGetMediaConfig\",\n    value: function () {\n      var _handleGetMediaConfig = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(request) {\n        var result;\n        return _regeneratorRuntime().wrap(function _callee10$(_context10) {\n          while (1) switch (_context10.prev = _context10.next) {\n            case 0:\n              if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4039UploadFile)) {\n                _context10.next = 2;\n                break;\n              }\n              return _context10.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Missing capability\"\n                }\n              }));\n            case 2:\n              _context10.prev = 2;\n              _context10.next = 5;\n              return this.driver.getMediaConfig();\n            case 5:\n              result = _context10.sent;\n              return _context10.abrupt(\"return\", this.transport.reply(request, result));\n            case 9:\n              _context10.prev = 9;\n              _context10.t0 = _context10[\"catch\"](2);\n              console.error(\"error while getting the media configuration\", _context10.t0);\n              this.handleDriverError(_context10.t0, request, \"Unexpected error while getting the media configuration\");\n            case 13:\n            case \"end\":\n              return _context10.stop();\n          }\n        }, _callee10, this, [[2, 9]]);\n      }));\n      function handleGetMediaConfig(_x9) {\n        return _handleGetMediaConfig.apply(this, arguments);\n      }\n      return handleGetMediaConfig;\n    }()\n  }, {\n    key: \"handleUploadFile\",\n    value: function () {\n      var _handleUploadFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(request) {\n        var result;\n        return _regeneratorRuntime().wrap(function _callee11$(_context11) {\n          while (1) switch (_context11.prev = _context11.next) {\n            case 0:\n              if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4039UploadFile)) {\n                _context11.next = 2;\n                break;\n              }\n              return _context11.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Missing capability\"\n                }\n              }));\n            case 2:\n              _context11.prev = 2;\n              _context11.next = 5;\n              return this.driver.uploadFile(request.data.file);\n            case 5:\n              result = _context11.sent;\n              return _context11.abrupt(\"return\", this.transport.reply(request, {\n                content_uri: result.contentUri\n              }));\n            case 9:\n              _context11.prev = 9;\n              _context11.t0 = _context11[\"catch\"](2);\n              console.error(\"error while uploading a file\", _context11.t0);\n              this.handleDriverError(_context11.t0, request, \"Unexpected error while uploading a file\");\n            case 13:\n            case \"end\":\n              return _context11.stop();\n          }\n        }, _callee11, this, [[2, 9]]);\n      }));\n      function handleUploadFile(_x10) {\n        return _handleUploadFile.apply(this, arguments);\n      }\n      return handleUploadFile;\n    }()\n  }, {\n    key: \"handleDownloadFile\",\n    value: function () {\n      var _handleDownloadFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12(request) {\n        var result;\n        return _regeneratorRuntime().wrap(function _callee12$(_context12) {\n          while (1) switch (_context12.prev = _context12.next) {\n            case 0:\n              if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4039DownloadFile)) {\n                _context12.next = 2;\n                break;\n              }\n              return _context12.abrupt(\"return\", this.transport.reply(request, {\n                error: {\n                  message: \"Missing capability\"\n                }\n              }));\n            case 2:\n              _context12.prev = 2;\n              _context12.next = 5;\n              return this.driver.downloadFile(request.data.content_uri);\n            case 5:\n              result = _context12.sent;\n              return _context12.abrupt(\"return\", this.transport.reply(request, {\n                file: result.file\n              }));\n            case 9:\n              _context12.prev = 9;\n              _context12.t0 = _context12[\"catch\"](2);\n              console.error(\"error while downloading a file\", _context12.t0);\n              this.handleDriverError(_context12.t0, request, \"Unexpected error while downloading a file\");\n            case 13:\n            case \"end\":\n              return _context12.stop();\n          }\n        }, _callee12, this, [[2, 9]]);\n      }));\n      function handleDownloadFile(_x11) {\n        return _handleDownloadFile.apply(this, arguments);\n      }\n      return handleDownloadFile;\n    }()\n  }, {\n    key: \"handleDriverError\",\n    value: function handleDriverError(e, request, message) {\n      var data = this.driver.processError(e);\n      this.transport.reply(request, {\n        error: _objectSpread({\n          message: message\n        }, data)\n      });\n    }\n  }, {\n    key: \"handleMessage\",\n    value: function handleMessage(ev) {\n      if (this.isStopped) return;\n      var actionEv = new CustomEvent(\"action:\".concat(ev.detail.action), {\n        detail: ev.detail,\n        cancelable: true\n      });\n      this.emit(\"action:\".concat(ev.detail.action), actionEv);\n      if (!actionEv.defaultPrevented) {\n        switch (ev.detail.action) {\n          case _WidgetApiAction.WidgetApiFromWidgetAction.ContentLoaded:\n            return this.handleContentLoadedAction(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.SupportedApiVersions:\n            return this.replyVersions(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.SendEvent:\n            return this.handleSendEvent(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.SendToDevice:\n            return this.handleSendToDevice(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.GetOpenIDCredentials:\n            return this.handleOIDC(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC2931Navigate:\n            return this.handleNavigate(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC2974RenegotiateCapabilities:\n            return this.handleCapabilitiesRenegotiate(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC2876ReadEvents:\n            return this.handleReadEvents(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.WatchTurnServers:\n            return this.handleWatchTurnServers(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.UnwatchTurnServers:\n            return this.handleUnwatchTurnServers(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC3869ReadRelations:\n            return this.handleReadRelations(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC3973UserDirectorySearch:\n            return this.handleUserDirectorySearch(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.BeeperReadRoomAccountData:\n            return this.handleReadRoomAccountData(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4039GetMediaConfigAction:\n            return this.handleGetMediaConfig(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4039UploadFileAction:\n            return this.handleUploadFile(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4039DownloadFileAction:\n            return this.handleDownloadFile(ev.detail);\n          case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4157UpdateDelayedEvent:\n            return this.handleUpdateDelayedEvent(ev.detail);\n          default:\n            return this.transport.reply(ev.detail, {\n              error: {\n                message: \"Unknown or unsupported from-widget action: \" + ev.detail.action\n              }\n            });\n        }\n      }\n    }\n\n    /**\n     * Informs the widget that the client's theme has changed.\n     * @param theme The theme data, as an object with arbitrary contents.\n     */\n  }, {\n    key: \"updateTheme\",\n    value: function updateTheme(theme) {\n      return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.ThemeChange, theme);\n    }\n\n    /**\n     * Informs the widget that the client's language has changed.\n     * @param lang The BCP 47 identifier representing the client's current language.\n     */\n  }, {\n    key: \"updateLanguage\",\n    value: function updateLanguage(lang) {\n      return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.LanguageChange, {\n        lang: lang\n      });\n    }\n\n    /**\n     * Takes a screenshot of the widget.\n     * @returns Resolves to the widget's screenshot.\n     * @throws Throws if there is a problem.\n     */\n  }, {\n    key: \"takeScreenshot\",\n    value: function takeScreenshot() {\n      return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.TakeScreenshot, {});\n    }\n\n    /**\n     * Alerts the widget to whether or not it is currently visible.\n     * @param {boolean} isVisible Whether the widget is visible or not.\n     * @returns {Promise<IWidgetApiResponseData>} Resolves when the widget acknowledges the update.\n     */\n  }, {\n    key: \"updateVisibility\",\n    value: function updateVisibility(isVisible) {\n      return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateVisibility, {\n        visible: isVisible\n      });\n    }\n  }, {\n    key: \"sendWidgetConfig\",\n    value: function sendWidgetConfig(data) {\n      return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.WidgetConfig, data).then();\n    }\n  }, {\n    key: \"notifyModalWidgetButtonClicked\",\n    value: function notifyModalWidgetButtonClicked(id) {\n      return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.ButtonClicked, {\n        id: id\n      }).then();\n    }\n  }, {\n    key: \"notifyModalWidgetClose\",\n    value: function notifyModalWidgetClose(data) {\n      return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.CloseModalWidget, data).then();\n    }\n\n    /**\n     * Feeds an event to the widget. As a client you are expected to call this\n     * for every new event in every room to which you are joined or invited.\n     * @param {IRoomEvent} rawEvent The event to (try to) send to the widget.\n     * @param {string} currentViewedRoomId The room ID the user is currently\n     *   interacting with. Not the room ID of the event.\n     * @returns {Promise<void>} Resolves when delivered or if the widget is not\n     *   able to read the event due to permissions, rejects if the widget failed\n     *   to handle the event.\n     * @deprecated It is recommended to communicate the viewed room ID by calling\n     *   {@link ClientWidgetApi.setViewedRoomId} rather than passing it to this\n     *   method.\n     */\n  }, {\n    key: \"feedEvent\",\n    value: function () {\n      var _feedEvent = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13(rawEvent, currentViewedRoomId) {\n        var _rawEvent$content;\n        return _regeneratorRuntime().wrap(function _callee13$(_context13) {\n          while (1) switch (_context13.prev = _context13.next) {\n            case 0:\n              if (currentViewedRoomId !== undefined) this.setViewedRoomId(currentViewedRoomId);\n              if (!(rawEvent.room_id !== this.viewedRoomId && !this.canUseRoomTimeline(rawEvent.room_id))) {\n                _context13.next = 3;\n                break;\n              }\n              return _context13.abrupt(\"return\");\n            case 3:\n              if (!(rawEvent.state_key !== undefined && rawEvent.state_key !== null)) {\n                _context13.next = 8;\n                break;\n              }\n              if (this.canReceiveStateEvent(rawEvent.type, rawEvent.state_key)) {\n                _context13.next = 6;\n                break;\n              }\n              return _context13.abrupt(\"return\");\n            case 6:\n              _context13.next = 10;\n              break;\n            case 8:\n              if (this.canReceiveRoomEvent(rawEvent.type, (_rawEvent$content = rawEvent.content) === null || _rawEvent$content === void 0 ? void 0 : _rawEvent$content[\"msgtype\"])) {\n                _context13.next = 10;\n                break;\n              }\n              return _context13.abrupt(\"return\");\n            case 10:\n              _context13.next = 12;\n              return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.SendEvent,\n              // it's compatible, but missing the index signature\n              rawEvent);\n            case 12:\n            case \"end\":\n              return _context13.stop();\n          }\n        }, _callee13, this);\n      }));\n      function feedEvent(_x12, _x13) {\n        return _feedEvent.apply(this, arguments);\n      }\n      return feedEvent;\n    }()\n    /**\n     * Feeds a to-device event to the widget. As a client you are expected to\n     * call this for every to-device event you receive.\n     * @param {IRoomEvent} rawEvent The event to (try to) send to the widget.\n     * @param {boolean} encrypted Whether the event contents were encrypted.\n     * @returns {Promise<void>} Resolves when delivered or if the widget is not\n     *   able to receive the event due to permissions, rejects if the widget\n     *   failed to handle the event.\n     */\n  }, {\n    key: \"feedToDevice\",\n    value: function () {\n      var _feedToDevice = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(message, encrypted) {\n        return _regeneratorRuntime().wrap(function _callee14$(_context14) {\n          while (1) switch (_context14.prev = _context14.next) {\n            case 0:\n              if (!this.canReceiveToDeviceEvent(message.type)) {\n                _context14.next = 3;\n                break;\n              }\n              _context14.next = 3;\n              return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.SendToDevice, _objectSpread(_objectSpread({}, message), {}, {\n                encrypted: encrypted\n              }));\n            case 3:\n            case \"end\":\n              return _context14.stop();\n          }\n        }, _callee14, this);\n      }));\n      function feedToDevice(_x14, _x15) {\n        return _feedToDevice.apply(this, arguments);\n      }\n      return feedToDevice;\n    }()\n  }, {\n    key: \"setViewedRoomId\",\n    value:\n    /**\n     * Indicate that a room is being viewed (making it possible for the widget\n     * to interact with it).\n     */\n    function setViewedRoomId(roomId) {\n      this.viewedRoomId = roomId;\n      // If the widget doesn't have timeline permissions for the room then\n      // this is its opportunity to learn the room state. We push the entire\n      // room state, which could be redundant if this room had been viewed\n      // once before, but it's easier than selectively pushing just the bits\n      // of state that changed while the room was in the background.\n      if (roomId !== null && !this.canUseRoomTimeline(roomId)) this.pushRoomState(roomId);\n    }\n  }, {\n    key: \"flushRoomState\",\n    value: function () {\n      var _flushRoomState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15() {\n        var events, _iterator7, _step7, eventTypeMap, _iterator8, _step8, stateKeyMap;\n        return _regeneratorRuntime().wrap(function _callee15$(_context15) {\n          while (1) switch (_context15.prev = _context15.next) {\n            case 0:\n              _context15.prev = 0;\n            case 1:\n              _context15.next = 3;\n              return Promise.all(this.pushRoomStateTasks);\n            case 3:\n              if (this.pushRoomStateTasks.size > 0) {\n                _context15.next = 1;\n                break;\n              }\n            case 4:\n              events = [];\n              _iterator7 = _createForOfIteratorHelper(this.pushRoomStateResult.values());\n              try {\n                for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n                  eventTypeMap = _step7.value;\n                  _iterator8 = _createForOfIteratorHelper(eventTypeMap.values());\n                  try {\n                    for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n                      stateKeyMap = _step8.value;\n                      events.push.apply(events, _toConsumableArray(stateKeyMap.values()));\n                    }\n                  } catch (err) {\n                    _iterator8.e(err);\n                  } finally {\n                    _iterator8.f();\n                  }\n                }\n              } catch (err) {\n                _iterator7.e(err);\n              } finally {\n                _iterator7.f();\n              }\n              _context15.next = 9;\n              return this.getWidgetVersions();\n            case 9:\n              if (!_context15.sent.includes(_ApiVersion.UnstableApiVersion.MSC2762_UPDATE_STATE)) {\n                _context15.next = 12;\n                break;\n              }\n              _context15.next = 12;\n              return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateState, {\n                state: events\n              });\n            case 12:\n              _context15.prev = 12;\n              this.flushRoomStateTask = null;\n              return _context15.finish(12);\n            case 15:\n            case \"end\":\n              return _context15.stop();\n          }\n        }, _callee15, this, [[0,, 12, 15]]);\n      }));\n      function flushRoomState() {\n        return _flushRoomState.apply(this, arguments);\n      }\n      return flushRoomState;\n    }()\n    /**\n     * Reads the current sticky state of the room and pushes it to the widget.\n     *\n     * It will only push events that the widget is allowed to receive.\n     * @param roomId\n     * @private\n     */\n  }, {\n    key: \"pushStickyState\",\n    value: function () {\n      var _pushStickyState = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17(roomId) {\n        var _this12 = this;\n        return _regeneratorRuntime().wrap(function _callee17$(_context17) {\n          while (1) switch (_context17.prev = _context17.next) {\n            case 0:\n              console.debug(\"Pushing sticky state to widget for room\", roomId);\n              return _context17.abrupt(\"return\", this.driver.readStickyEvents(roomId).then(function (events) {\n                // filter to the allowed sticky events\n                var filtered = events.filter(function (e) {\n                  var _e$content;\n                  return _this12.canReceiveRoomEvent(e.type, typeof ((_e$content = e.content) === null || _e$content === void 0 ? void 0 : _e$content.msgtype) === \"string\" ? e.content.msgtype : null);\n                });\n                return {\n                  roomId: roomId,\n                  stickyEvents: filtered\n                };\n              }).then( /*#__PURE__*/function () {\n                var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16(_ref) {\n                  var roomId, stickyEvents, promises;\n                  return _regeneratorRuntime().wrap(function _callee16$(_context16) {\n                    while (1) switch (_context16.prev = _context16.next) {\n                      case 0:\n                        roomId = _ref.roomId, stickyEvents = _ref.stickyEvents;\n                        console.debug(\"Pushing\", stickyEvents.length, \"sticky events to widget for room\", roomId);\n                        promises = stickyEvents.map(function (rawEvent) {\n                          return _this12.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.SendEvent,\n                          // copied from feedEvent; it's compatible, but missing the index signature\n                          rawEvent);\n                        });\n                        _context16.next = 5;\n                        return Promise.all(promises);\n                      case 5:\n                      case \"end\":\n                        return _context16.stop();\n                    }\n                  }, _callee16);\n                }));\n                return function (_x17) {\n                  return _ref2.apply(this, arguments);\n                };\n              }()));\n            case 2:\n            case \"end\":\n              return _context17.stop();\n          }\n        }, _callee17, this);\n      }));\n      function pushStickyState(_x16) {\n        return _pushStickyState.apply(this, arguments);\n      }\n      return pushStickyState;\n    }()\n    /**\n     * Read the room's state and push all entries that the widget is allowed to\n     * read through to the widget.\n     */\n  }, {\n    key: \"pushRoomState\",\n    value: function pushRoomState(roomId) {\n      var _this13 = this;\n      var _iterator9 = _createForOfIteratorHelper(this.allowedEvents),\n        _step9;\n      try {\n        var _loop2 = function _loop2() {\n          var cap = _step9.value;\n          if (cap.kind === _WidgetEventCapability.EventKind.State && cap.direction === _WidgetEventCapability.EventDirection.Receive) {\n            var _cap$keyStr, _this13$flushRoomStat;\n            // Initiate the task\n            var events = _this13.driver.readRoomState(roomId, cap.eventType, (_cap$keyStr = cap.keyStr) !== null && _cap$keyStr !== void 0 ? _cap$keyStr : undefined);\n            var task = events.then(function (events) {\n              // When complete, queue the resulting events to be\n              // pushed to the widget\n              var _iterator10 = _createForOfIteratorHelper(events),\n                _step10;\n              try {\n                for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n                  var event = _step10.value;\n                  var eventTypeMap = _this13.pushRoomStateResult.get(roomId);\n                  if (eventTypeMap === undefined) {\n                    eventTypeMap = new Map();\n                    _this13.pushRoomStateResult.set(roomId, eventTypeMap);\n                  }\n                  var stateKeyMap = eventTypeMap.get(cap.eventType);\n                  if (stateKeyMap === undefined) {\n                    stateKeyMap = new Map();\n                    eventTypeMap.set(cap.eventType, stateKeyMap);\n                  }\n                  if (!stateKeyMap.has(event.state_key)) stateKeyMap.set(event.state_key, event);\n                }\n              } catch (err) {\n                _iterator10.e(err);\n              } finally {\n                _iterator10.f();\n              }\n            }, function (e) {\n              return console.error(\"Failed to read room state for \".concat(roomId, \" (\").concat(cap.eventType, \", \").concat(cap.keyStr, \")\"), e);\n            }).then(function () {\n              // Mark request as no longer pending\n              _this13.pushRoomStateTasks[\"delete\"](task);\n            });\n\n            // Mark task as pending\n            _this13.pushRoomStateTasks.add(task);\n            // Assuming no other tasks are already happening concurrently,\n            // schedule the widget action that actually pushes the events\n            (_this13$flushRoomStat = _this13.flushRoomStateTask) !== null && _this13$flushRoomStat !== void 0 ? _this13$flushRoomStat : _this13.flushRoomStateTask = _this13.flushRoomState();\n            _this13.flushRoomStateTask[\"catch\"](function (e) {\n              return console.error(\"Failed to push room state\", e);\n            });\n          }\n        };\n        for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n          _loop2();\n        }\n      } catch (err) {\n        _iterator9.e(err);\n      } finally {\n        _iterator9.f();\n      }\n    }\n\n    /**\n     * Feeds a room state update to the widget. As a client you are expected to\n     * call this for every state update in every room to which you are joined or\n     * invited.\n     * @param {IRoomEvent} rawEvent The state event corresponding to the updated\n     *   room state entry.\n     * @returns {Promise<void>} Resolves when delivered or if the widget is not\n     *   able to receive the room state due to permissions, rejects if the\n     *   widget failed to handle the update.\n     */\n  }, {\n    key: \"feedStateUpdate\",\n    value: function () {\n      var _feedStateUpdate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18(rawEvent) {\n        var eventTypeMap, stateKeyMap;\n        return _regeneratorRuntime().wrap(function _callee18$(_context18) {\n          while (1) switch (_context18.prev = _context18.next) {\n            case 0:\n              if (!(rawEvent.state_key === undefined)) {\n                _context18.next = 2;\n                break;\n              }\n              throw new Error(\"Not a state event\");\n            case 2:\n              if (!((rawEvent.room_id === this.viewedRoomId || this.canUseRoomTimeline(rawEvent.room_id)) && this.canReceiveStateEvent(rawEvent.type, rawEvent.state_key))) {\n                _context18.next = 21;\n                break;\n              }\n              if (!(this.pushRoomStateTasks.size === 0)) {\n                _context18.next = 11;\n                break;\n              }\n              _context18.next = 6;\n              return this.getWidgetVersions();\n            case 6:\n              if (!_context18.sent.includes(_ApiVersion.UnstableApiVersion.MSC2762_UPDATE_STATE)) {\n                _context18.next = 9;\n                break;\n              }\n              _context18.next = 9;\n              return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateState, {\n                state: [rawEvent]\n              });\n            case 9:\n              _context18.next = 21;\n              break;\n            case 11:\n              // Lump the update in with whatever data will be sent in the\n              // initial push later. Even if we set it to an \"outdated\" entry\n              // here, we can count on any newer entries being passed to this\n              // same method eventually; this won't cause stuck state.\n              eventTypeMap = this.pushRoomStateResult.get(rawEvent.room_id);\n              if (eventTypeMap === undefined) {\n                eventTypeMap = new Map();\n                this.pushRoomStateResult.set(rawEvent.room_id, eventTypeMap);\n              }\n              stateKeyMap = eventTypeMap.get(rawEvent.type);\n              if (stateKeyMap === undefined) {\n                stateKeyMap = new Map();\n                eventTypeMap.set(rawEvent.type, stateKeyMap);\n              }\n              if (!stateKeyMap.has(rawEvent.type)) stateKeyMap.set(rawEvent.state_key, rawEvent);\n            case 16:\n              _context18.next = 18;\n              return Promise.all(this.pushRoomStateTasks);\n            case 18:\n              if (this.pushRoomStateTasks.size > 0) {\n                _context18.next = 16;\n                break;\n              }\n            case 19:\n              _context18.next = 21;\n              return this.flushRoomStateTask;\n            case 21:\n            case \"end\":\n              return _context18.stop();\n          }\n        }, _callee18, this);\n      }));\n      function feedStateUpdate(_x18) {\n        return _feedStateUpdate.apply(this, arguments);\n      }\n      return feedStateUpdate;\n    }()\n  }]);\n  return ClientWidgetApi;\n}(_events.EventEmitter);\nexports.ClientWidgetApi = ClientWidgetApi;\n//# sourceMappingURL=ClientWidgetApi.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isErrorResponse = isErrorResponse;\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n/*\n * Copyright 2020 - 2024 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The format of errors returned by Matrix API requests\n * made by a WidgetDriver.\n */\n\nfunction isErrorResponse(responseData) {\n  var error = responseData.error;\n  return _typeof(error) === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\";\n}\n//# sourceMappingURL=IWidgetApiErrorResponse.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WidgetKind = void 0;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar WidgetKind = /*#__PURE__*/function (WidgetKind) {\n  WidgetKind[\"Room\"] = \"room\";\n  WidgetKind[\"Account\"] = \"account\";\n  WidgetKind[\"Modal\"] = \"modal\";\n  return WidgetKind;\n}({});\nexports.WidgetKind = WidgetKind;\n//# sourceMappingURL=WidgetKind.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ModalButtonKind = void 0;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar ModalButtonKind = /*#__PURE__*/function (ModalButtonKind) {\n  ModalButtonKind[\"Primary\"] = \"m.primary\";\n  ModalButtonKind[\"Secondary\"] = \"m.secondary\";\n  ModalButtonKind[\"Warning\"] = \"m.warning\";\n  ModalButtonKind[\"Danger\"] = \"m.danger\";\n  ModalButtonKind[\"Link\"] = \"m.link\";\n  return ModalButtonKind;\n}({});\nexports.ModalButtonKind = ModalButtonKind;\n//# sourceMappingURL=ModalButtonKind.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isValidUrl = isValidUrl;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction isValidUrl(val) {\n  if (!val) return false; // easy: not valid if not present\n\n  try {\n    var parsed = new URL(val);\n    if (parsed.protocol !== \"http\" && parsed.protocol !== \"https\") {\n      return false;\n    }\n    return true;\n  } catch (e) {\n    if (e instanceof TypeError) {\n      return false;\n    }\n    throw e;\n  }\n}\n//# sourceMappingURL=url.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.assertPresent = assertPresent;\n/*\n * Copyright 2020 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction assertPresent(obj, key) {\n  if (!obj[key]) {\n    throw new Error(\"\".concat(String(key), \" is required\"));\n  }\n}\n//# sourceMappingURL=utils.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Widget = void 0;\nvar _ = require(\"..\");\nvar _utils = require(\"./validation/utils\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); } /*\n                                                                                                                                                                                                                                                                                                                                                                                               * Copyright 2020 The Matrix.org Foundation C.I.C.\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               * Licensed under the Apache License, Version 2.0 (the \"License\");\n                                                                                                                                                                                                                                                                                                                                                                                               * you may not use this file except in compliance with the License.\n                                                                                                                                                                                                                                                                                                                                                                                               * You may obtain a copy of the License at\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               *         http://www.apache.org/licenses/LICENSE-2.0\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               * Unless required by applicable law or agreed to in writing, software\n                                                                                                                                                                                                                                                                                                                                                                                               * distributed under the License is distributed on an \"AS IS\" BASIS,\n                                                                                                                                                                                                                                                                                                                                                                                               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                                                                                                                                                                                                                                                                                                                                                                                               * See the License for the specific language governing permissions and\n                                                                                                                                                                                                                                                                                                                                                                                               * limitations under the License.\n                                                                                                                                                                                                                                                                                                                                                                                               */\n/**\n * Represents the barest form of widget.\n */\nvar Widget = /*#__PURE__*/function () {\n  function Widget(definition) {\n    _classCallCheck(this, Widget);\n    this.definition = definition;\n    if (!this.definition) throw new Error(\"Definition is required\");\n    (0, _utils.assertPresent)(definition, \"id\");\n    (0, _utils.assertPresent)(definition, \"creatorUserId\");\n    (0, _utils.assertPresent)(definition, \"type\");\n    (0, _utils.assertPresent)(definition, \"url\");\n  }\n\n  /**\n   * The user ID who created the widget.\n   */\n  _createClass(Widget, [{\n    key: \"creatorUserId\",\n    get: function get() {\n      return this.definition.creatorUserId;\n    }\n\n    /**\n     * The type of widget.\n     */\n  }, {\n    key: \"type\",\n    get: function get() {\n      return this.definition.type;\n    }\n\n    /**\n     * The ID of the widget.\n     */\n  }, {\n    key: \"id\",\n    get: function get() {\n      return this.definition.id;\n    }\n\n    /**\n     * The name of the widget, or null if not set.\n     */\n  }, {\n    key: \"name\",\n    get: function get() {\n      return this.definition.name || null;\n    }\n\n    /**\n     * The title for the widget, or null if not set.\n     */\n  }, {\n    key: \"title\",\n    get: function get() {\n      return this.rawData.title || null;\n    }\n\n    /**\n     * The templated URL for the widget.\n     */\n  }, {\n    key: \"templateUrl\",\n    get: function get() {\n      return this.definition.url;\n    }\n\n    /**\n     * The origin for this widget.\n     */\n  }, {\n    key: \"origin\",\n    get: function get() {\n      return new URL(this.templateUrl).origin;\n    }\n\n    /**\n     * Whether or not the client should wait for the iframe to load. Defaults\n     * to true.\n     */\n  }, {\n    key: \"waitForIframeLoad\",\n    get: function get() {\n      if (this.definition.waitForIframeLoad === false) return false;\n      if (this.definition.waitForIframeLoad === true) return true;\n      return true; // default true\n    }\n\n    /**\n     * The raw data for the widget. This will always be defined, though\n     * may be empty.\n     */\n  }, {\n    key: \"rawData\",\n    get: function get() {\n      return this.definition.data || {};\n    }\n\n    /**\n     * Gets a complete widget URL for the client to render.\n     * @param {ITemplateParams} params The template parameters.\n     * @returns {string} A templated URL.\n     */\n  }, {\n    key: \"getCompleteUrl\",\n    value: function getCompleteUrl(params) {\n      return (0, _.runTemplate)(this.templateUrl, this.definition, params);\n    }\n  }]);\n  return Widget;\n}();\nexports.Widget = Widget;\n//# sourceMappingURL=Widget.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WidgetParser = void 0;\nvar _Widget = require(\"./Widget\");\nvar _url = require(\"./validation/url\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); } /*\n                                                                                                                                                                                                                                                                                                                                                                                               * Copyright 2020 The Matrix.org Foundation C.I.C.\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               * Licensed under the Apache License, Version 2.0 (the \"License\");\n                                                                                                                                                                                                                                                                                                                                                                                               * you may not use this file except in compliance with the License.\n                                                                                                                                                                                                                                                                                                                                                                                               * You may obtain a copy of the License at\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               *         http://www.apache.org/licenses/LICENSE-2.0\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               * Unless required by applicable law or agreed to in writing, software\n                                                                                                                                                                                                                                                                                                                                                                                               * distributed under the License is distributed on an \"AS IS\" BASIS,\n                                                                                                                                                                                                                                                                                                                                                                                               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                                                                                                                                                                                                                                                                                                                                                                                               * See the License for the specific language governing permissions and\n                                                                                                                                                                                                                                                                                                                                                                                               * limitations under the License.\n                                                                                                                                                                                                                                                                                                                                                                                               */\nvar WidgetParser = /*#__PURE__*/function () {\n  function WidgetParser() {\n    _classCallCheck(this, WidgetParser);\n  } // private constructor because this is a util class\n\n  /**\n   * Parses widgets from the \"m.widgets\" account data event. This will always\n   * return an array, though may be empty if no valid widgets were found.\n   * @param {IAccountDataWidgets} content The content of the \"m.widgets\" account data.\n   * @returns {Widget[]} The widgets in account data, or an empty array.\n   */\n  _createClass(WidgetParser, null, [{\n    key: \"parseAccountData\",\n    value: function parseAccountData(content) {\n      if (!content) return [];\n      var result = [];\n      for (var _i = 0, _Object$keys = Object.keys(content); _i < _Object$keys.length; _i++) {\n        var _widgetId = _Object$keys[_i];\n        var roughWidget = content[_widgetId];\n        if (!roughWidget) continue;\n        if (roughWidget.type !== \"m.widget\" && roughWidget.type !== \"im.vector.modular.widgets\") continue;\n        if (!roughWidget.sender) continue;\n        var probableWidgetId = roughWidget.state_key || roughWidget.id;\n        if (probableWidgetId !== _widgetId) continue;\n        var asStateEvent = {\n          content: roughWidget.content,\n          sender: roughWidget.sender,\n          type: \"m.widget\",\n          state_key: _widgetId,\n          event_id: \"$example\",\n          room_id: \"!example\",\n          origin_server_ts: 1\n        };\n        var widget = WidgetParser.parseRoomWidget(asStateEvent);\n        if (widget) result.push(widget);\n      }\n      return result;\n    }\n\n    /**\n     * Parses all the widgets possible in the given array. This will always return\n     * an array, though may be empty if no widgets could be parsed.\n     * @param {IStateEvent[]} currentState The room state to parse.\n     * @returns {Widget[]} The widgets in the state, or an empty array.\n     */\n  }, {\n    key: \"parseWidgetsFromRoomState\",\n    value: function parseWidgetsFromRoomState(currentState) {\n      if (!currentState) return [];\n      var result = [];\n      var _iterator = _createForOfIteratorHelper(currentState),\n        _step;\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var state = _step.value;\n          var widget = WidgetParser.parseRoomWidget(state);\n          if (widget) result.push(widget);\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n      return result;\n    }\n\n    /**\n     * Parses a state event into a widget. If the state event does not represent\n     * a widget (wrong event type, invalid widget, etc) then null is returned.\n     * @param {IStateEvent} stateEvent The state event.\n     * @returns {Widget|null} The widget, or null if invalid\n     */\n  }, {\n    key: \"parseRoomWidget\",\n    value: function parseRoomWidget(stateEvent) {\n      if (!stateEvent) return null;\n\n      // TODO: [Legacy] Remove legacy support\n      if (stateEvent.type !== \"m.widget\" && stateEvent.type !== \"im.vector.modular.widgets\") {\n        return null;\n      }\n\n      // Dev note: Throughout this function we have null safety to ensure that\n      // if the caller did not supply something useful that we don't error. This\n      // is done against the requirements of the interface because not everyone\n      // will have an interface to validate against.\n\n      var content = stateEvent.content || {};\n\n      // Form our best approximation of a widget with the information we have\n      var estimatedWidget = {\n        id: stateEvent.state_key,\n        creatorUserId: content[\"creatorUserId\"] || stateEvent.sender,\n        name: content[\"name\"],\n        type: content[\"type\"],\n        url: content[\"url\"],\n        waitForIframeLoad: content[\"waitForIframeLoad\"],\n        data: content[\"data\"]\n      };\n\n      // Finally, process that widget\n      return WidgetParser.processEstimatedWidget(estimatedWidget);\n    }\n  }, {\n    key: \"processEstimatedWidget\",\n    value: function processEstimatedWidget(widget) {\n      // Validate that the widget has the best chance of passing as a widget\n      if (!widget.id || !widget.creatorUserId || !widget.type) {\n        return null;\n      }\n      if (!(0, _url.isValidUrl)(widget.url)) {\n        return null;\n      }\n      // TODO: Validate data for known widget types\n      return new _Widget.Widget(widget);\n    }\n  }]);\n  return WidgetParser;\n}();\nexports.WidgetParser = WidgetParser;\n//# sourceMappingURL=WidgetParser.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.runTemplate = runTemplate;\nexports.toString = toString;\n/*\n * Copyright 2020, 2021 The Matrix.org Foundation C.I.C.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *         http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction runTemplate(url, widget, params) {\n  // Always apply the supplied params over top of data to ensure the data can't lie about them.\n  var variables = Object.assign({}, widget.data, {\n    \"matrix_room_id\": params.widgetRoomId || \"\",\n    \"matrix_user_id\": params.currentUserId,\n    \"matrix_display_name\": params.userDisplayName || params.currentUserId,\n    \"matrix_avatar_url\": params.userHttpAvatarUrl || \"\",\n    \"matrix_widget_id\": widget.id,\n    // TODO: Convert to stable (https://github.com/matrix-org/matrix-doc/pull/2873)\n    \"org.matrix.msc2873.client_id\": params.clientId || \"\",\n    \"org.matrix.msc2873.client_theme\": params.clientTheme || \"\",\n    \"org.matrix.msc2873.client_language\": params.clientLanguage || \"\",\n    // TODO: Convert to stable (https://github.com/matrix-org/matrix-spec-proposals/pull/3819)\n    \"org.matrix.msc3819.matrix_device_id\": params.deviceId || \"\",\n    // TODO: Convert to stable (https://github.com/matrix-org/matrix-spec-proposals/pull/4039)\n    \"org.matrix.msc4039.matrix_base_url\": params.baseUrl || \"\"\n  });\n  var result = url;\n  for (var _i = 0, _Object$keys = Object.keys(variables); _i < _Object$keys.length; _i++) {\n    var key = _Object$keys[_i];\n    // Regex escape from https://stackoverflow.com/a/6969486/7037379\n    var pattern = \"$\".concat(key).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\n    var rexp = new RegExp(pattern, \"g\");\n\n    // This is technically not what we're supposed to do for a couple of reasons:\n    // 1. We are assuming that there won't later be a $key match after we replace a variable.\n    // 2. We are assuming that the variable is in a place where it can be escaped (eg: path or query string).\n    result = result.replace(rexp, encodeURIComponent(toString(variables[key])));\n  }\n  return result;\n}\nfunction toString(a) {\n  if (a === null || a === undefined) {\n    return \"\".concat(a);\n  }\n  // eslint-disable-next-line @typescript-eslint/no-base-to-string\n  return String(a);\n}\n//# sourceMappingURL=url-template.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WidgetDriver = void 0;\nvar _ = require(\"..\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); } /*\n                                                                                                                                                                                                                                                                                                                                                                                               * Copyright 2020 - 2024 The Matrix.org Foundation C.I.C.\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               * Licensed under the Apache License, Version 2.0 (the \"License\");\n                                                                                                                                                                                                                                                                                                                                                                                               * you may not use this file except in compliance with the License.\n                                                                                                                                                                                                                                                                                                                                                                                               * You may obtain a copy of the License at\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               *         http://www.apache.org/licenses/LICENSE-2.0\n                                                                                                                                                                                                                                                                                                                                                                                               *\n                                                                                                                                                                                                                                                                                                                                                                                               * Unless required by applicable law or agreed to in writing, software\n                                                                                                                                                                                                                                                                                                                                                                                               * distributed under the License is distributed on an \"AS IS\" BASIS,\n                                                                                                                                                                                                                                                                                                                                                                                               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n                                                                                                                                                                                                                                                                                                                                                                                               * See the License for the specific language governing permissions and\n                                                                                                                                                                                                                                                                                                                                                                                               * limitations under the License.\n                                                                                                                                                                                                                                                                                                                                                                                               */\n/**\n * Represents the functions and behaviour the widget-api is unable to\n * do, such as prompting the user for information or interacting with\n * the UI. Clients are expected to implement this class and override\n * any functions they need/want to support.\n *\n * This class assumes the client will have a context of a Widget\n * instance already.\n */\nvar WidgetDriver = /*#__PURE__*/function () {\n  function WidgetDriver() {\n    _classCallCheck(this, WidgetDriver);\n  }\n  _createClass(WidgetDriver, [{\n    key: \"validateCapabilities\",\n    value:\n    /**\n     * Verifies the widget's requested capabilities, returning the ones\n     * it is approved to use. Mutating the requested capabilities will\n     * have no effect.\n     *\n     * This SHOULD result in the user being prompted to approve/deny\n     * capabilities.\n     *\n     * By default this rejects all capabilities (returns an empty set).\n     * @param {Set<Capability>} requested The set of requested capabilities.\n     * @returns {Promise<Set<Capability>>} Resolves to the allowed capabilities.\n     */\n    function validateCapabilities(requested) {\n      return Promise.resolve(new Set());\n    }\n\n    /**\n     * Sends an event into a room. If `roomId` is falsy, the client should send the event\n     * into the room the user is currently looking at. The widget API will have already\n     * verified that the widget is capable of sending the event to that room.\n     * @param {string} eventType The event type to be sent.\n     * @param {*} content The content for the event.\n     * @param {string|null} stateKey The state key if this is a state event, otherwise null.\n     * May be an empty string.\n     * @param {string|null} roomId The room ID to send the event to. If falsy, the room the\n     * user is currently looking at.\n     * @returns {Promise<ISendEventDetails>} Resolves when the event has been sent with\n     * details of that event.\n     * @throws Rejected when the event could not be sent.\n     */\n  }, {\n    key: \"sendEvent\",\n    value: function sendEvent(eventType, content) {\n      var stateKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n      var roomId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n      return Promise.reject(new Error(\"Failed to override function\"));\n    }\n\n    /**\n     * @experimental Part of MSC4407\n     * Sends a sticky event into a room. If `roomId` is falsy, the client should send the event\n     * into the room the user is currently looking at. The widget API will have already\n     * verified that the widget is capable of sending the event to that room.\n     * @param {number} stickyDurationMs The length of time a sticky event may remain sticky, in milliseconds.\n     * @param {string} eventType The event type to be sent.\n     * @param {*} content The content for the event.\n     * @param {string|null} roomId The room ID to send the event to. If falsy, the room the\n     * user is currently looking at.\n     * @returns {Promise<ISendEventDetails>} Resolves when the event has been sent with\n     * details of that event.\n     * @throws Rejected when the event could not be sent.\n     */\n  }, {\n    key: \"sendStickyEvent\",\n    value: function sendStickyEvent(stickyDurationMs, eventType, content) {\n      var roomId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n      throw new Error(\"Method not implemented.\");\n    }\n\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     * Sends a delayed event into a room. If `roomId` is falsy, the client should send it\n     * into the room the user is currently looking at. The widget API will have already\n     * verified that the widget is capable of sending the event to that room.\n     * @param {number|null} delay How much later to send the event, or null to not send the\n     * event automatically. May not be null if {@link parentDelayId} is null.\n     * @param {string|null} parentDelayId The ID of the delayed event this one is grouped with,\n     * or null if it will be put in a new group. May not be null if {@link delay} is null.\n     * @param {string} eventType The event type of the event to be sent.\n     * @param {*} content The content for the event to be sent.\n     * @param {string|null} stateKey The state key if the event to be sent a state event,\n     * otherwise null. May be an empty string.\n     * @param {string|null} roomId The room ID to send the event to. If falsy, the room the\n     * user is currently looking at.\n     * @returns {Promise<ISendDelayedEventDetails>} Resolves when the delayed event has been\n     * prepared with details of how to refer to it for updating/sending/canceling it later.\n     * @throws Rejected when the delayed event could not be sent.\n     */\n  }, {\n    key: \"sendDelayedEvent\",\n    value: function sendDelayedEvent(delay, parentDelayId, eventType, content) {\n      var stateKey = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n      var roomId = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n      return Promise.reject(new Error(\"Failed to override function\"));\n    }\n\n    /**\n     * @experimental Part of MSC4140, MSC4157 and MSC4407\n     * Sends a delayed sticky event into a room. If `roomId` is falsy, the client should send the event\n     * into the room the user is currently looking at. The widget API will have already\n     * verified that the widget is capable of sending the event to that room.\n     * @param {number} stickyDurationMs The length of time a sticky event may remain sticky, in milliseconds.\n     * @param {number|null} delay How much later to send the event, or null to not send the\n     * event automatically. May not be null if {@link parentDelayId} is null.\n     * @param {string|null} parentDelayId The ID of the delayed event this one is grouped with,\n     * or null if it will be put in a new group. May not be null if {@link delay} is null.\n     * @param {string} eventType The event type to be sent.\n     * @param {*} content The content for the event.\n     * @param {string|null} roomId The room ID to send the event to. If falsy, the room the\n     * user is currently looking at.\n     * @returns {Promise<ISendDelayedEventDetails>} Resolves when the event has been sent with\n     * details of that event.\n     * @throws Rejected when the event could not be sent.\n     */\n  }, {\n    key: \"sendDelayedStickyEvent\",\n    value: function sendDelayedStickyEvent(delay, parentDelayId, stickyDurationMs, eventType, content) {\n      var roomId = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n      throw new Error(\"Method not implemented.\");\n    }\n\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     * Cancel the scheduled delivery of the delayed event matching the provided {@link delayId}.\n     * @throws Rejected when there is no matching delayed event,\n     * or when the delayed event failed to be cancelled.\n     */\n  }, {\n    key: \"cancelScheduledDelayedEvent\",\n    value: function cancelScheduledDelayedEvent(delayId) {\n      return Promise.reject(new Error(\"Failed to override function\"));\n    }\n\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     * Restart the scheduled delivery of the delayed event matching the provided {@link delayId}.\n     * @throws Rejected when there is no matching delayed event,\n     * or when the delayed event failed to be restarted.\n     */\n  }, {\n    key: \"restartScheduledDelayedEvent\",\n    value: function restartScheduledDelayedEvent(delayId) {\n      return Promise.reject(new Error(\"Failed to override function\"));\n    }\n\n    /**\n     * @experimental Part of MSC4140 & MSC4157\n     * Immediately send the delayed event matching the provided {@link delayId},\n     * instead of waiting for its scheduled delivery.\n     * @throws Rejected when there is no matching delayed event,\n     * or when the delayed event failed to be sent.\n     */\n  }, {\n    key: \"sendScheduledDelayedEvent\",\n    value: function sendScheduledDelayedEvent(delayId) {\n      return Promise.reject(new Error(\"Failed to override function\"));\n    }\n\n    /**\n     * Sends a to-device event. The widget API will have already verified that the widget\n     * is capable of sending the event.\n     * @param {string} eventType The event type to be sent.\n     * @param {boolean} encrypted Whether to encrypt the message contents.\n     * @param {Object} contentMap A map from user ID and device ID to event content.\n     * @returns {Promise<void>} Resolves when the event has been sent.\n     * @throws Rejected when the event could not be sent.\n     */\n  }, {\n    key: \"sendToDevice\",\n    value: function sendToDevice(eventType, encrypted, contentMap) {\n      return Promise.reject(new Error(\"Failed to override function\"));\n    }\n\n    /**\n     * Reads an element of room account data. The widget API will have already verified that the widget is\n     * capable of receiving the `eventType` of the requested information. If `roomIds` is supplied, it may\n     * contain `Symbols.AnyRoom` to denote that the piece of room account data in each of the client's known\n     * rooms should be returned. When `null`, only the room the user is currently looking at should be considered.\n     * @param eventType The event type to be read.\n     * @param roomIds When null, the user's currently viewed room. Otherwise, the list of room IDs\n     * to look within, possibly containing Symbols.AnyRoom to denote all known rooms.\n     * @returns {Promise<IRoomAccountData[]>} Resolves to the element of room account data, or an empty array.\n     */\n  }, {\n    key: \"readRoomAccountData\",\n    value: function readRoomAccountData(eventType) {\n      var roomIds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n      return Promise.resolve([]);\n    }\n\n    /**\n     * Reads all events of the given type, and optionally `msgtype` (if applicable/defined),\n     * the user has access to. The widget API will have already verified that the widget is\n     * capable of receiving the events. Less events than the limit are allowed to be returned,\n     * but not more. If `roomIds` is supplied, it may contain `Symbols.AnyRoom` to denote that\n     * `limit` in each of the client's known rooms should be returned. When `null`, only the\n     * room the user is currently looking at should be considered. If `since` is specified but\n     * the event ID isn't present in the number of events fetched by the client due to `limit`,\n     * the client will return all the events.\n     * @param eventType The event type to be read.\n     * @param msgtype The msgtype of the events to be read, if applicable/defined.\n     * @param stateKey The state key of the events to be read, if applicable/defined.\n     * @param limit The maximum number of events to retrieve per room. Will be zero to denote \"as many\n     * as possible\".\n     * @param roomIds When null, the user's currently viewed room. Otherwise, the list of room IDs\n     * to look within, possibly containing Symbols.AnyRoom to denote all known rooms.\n     * @param since When null, retrieves the number of events specified by the \"limit\" parameter.\n     * Otherwise, the event ID at which only subsequent events will be returned, as many as specified\n     * in \"limit\".\n     * @returns {Promise<IRoomEvent[]>} Resolves to the room events, or an empty array.\n     * @deprecated Clients are advised to implement {@link WidgetDriver.readRoomTimeline} instead.\n     */\n  }, {\n    key: \"readRoomEvents\",\n    value: function readRoomEvents(eventType, msgtype, limit) {\n      var roomIds = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n      var since = arguments.length > 4 ? arguments[4] : undefined;\n      return Promise.resolve([]);\n    }\n\n    /**\n     * Reads all events of the given type, and optionally state key (if applicable/defined),\n     * the user has access to. The widget API will have already verified that the widget is\n     * capable of receiving the events. Less events than the limit are allowed to be returned,\n     * but not more. If `roomIds` is supplied, it may contain `Symbols.AnyRoom` to denote that\n     * `limit` in each of the client's known rooms should be returned. When `null`, only the\n     * room the user is currently looking at should be considered.\n     * @param eventType The event type to be read.\n     * @param stateKey The state key of the events to be read, if applicable/defined.\n     * @param limit The maximum number of events to retrieve. Will be zero to denote \"as many\n     * as possible\".\n     * @param roomIds When null, the user's currently viewed room. Otherwise, the list of room IDs\n     * to look within, possibly containing Symbols.AnyRoom to denote all known rooms.\n     * @returns {Promise<IRoomEvent[]>} Resolves to the state events, or an empty array.\n     * @deprecated Clients are advised to implement {@link WidgetDriver.readRoomTimeline} instead.\n     */\n  }, {\n    key: \"readStateEvents\",\n    value: function readStateEvents(eventType, stateKey, limit) {\n      var roomIds = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n      return Promise.resolve([]);\n    }\n\n    /**\n     * Gets all sticky events of the given type the user has access to.\n     * The widget API will have already verified that the widget is capable of receiving the events.\n     *\n     * This is needed because widgets will get only live messages as they appear in the timeline.\n     * However, sticky events act like a state, and the current state is made by events that may have been\n     * sent before the widget was loaded.\n     * Events are sticky for 1h maximum, so the widget has access to the past hour of sticky events maximum.\n     *\n     * @experimental Part of MSC4407 - Sticky Events (Widget API)\n     * @param roomId - The ID of the room.\n     */\n  }, {\n    key: \"readStickyEvents\",\n    value: function readStickyEvents(roomId) {\n      throw new Error(\"readStickyEvents is not implemented\");\n    }\n\n    /**\n     * Reads all events of the given type, and optionally `msgtype` (if applicable/defined),\n     * the user has access to. The widget API will have already verified that the widget is\n     * capable of receiving the events. Less events than the limit are allowed to be returned,\n     * but not more.\n     * @param roomId The ID of the room to look within.\n     * @param eventType The event type to be read.\n     * @param msgtype The msgtype of the events to be read, if applicable/defined.\n     * @param stateKey The state key of the events to be read, if applicable/defined.\n     * @param limit The maximum number of events to retrieve. Will be zero to denote \"as many as\n     * possible\".\n     * @param since When null, retrieves the number of events specified by the \"limit\" parameter.\n     * Otherwise, the event ID at which only subsequent events will be returned, as many as specified\n     * in \"limit\".\n     * @returns {Promise<IRoomEvent[]>} Resolves to the room events, or an empty array.\n     */\n  }, {\n    key: \"readRoomTimeline\",\n    value: function readRoomTimeline(roomId, eventType, msgtype, stateKey, limit, since) {\n      // For backward compatibility we try the deprecated methods, in case\n      // they're implemented\n      if (stateKey === undefined) return this.readRoomEvents(eventType, msgtype, limit, [roomId], since);else return this.readStateEvents(eventType, stateKey, limit, [roomId]);\n    }\n\n    /**\n     * Reads the current values of all matching room state entries.\n     * @param roomId The ID of the room.\n     * @param eventType The event type of the entries to be read.\n     * @param stateKey The state key of the entry to be read. If undefined,\n     * all room state entries with a matching event type should be returned.\n     * @returns {Promise<IRoomEvent[]>} Resolves to the events representing the\n     * current values of the room state entries.\n     */\n  }, {\n    key: \"readRoomState\",\n    value: function readRoomState(roomId, eventType, stateKey) {\n      return this.readStateEvents(eventType, stateKey, Number.MAX_SAFE_INTEGER, [roomId]);\n    }\n\n    /**\n     * Reads all events that are related to a given event. The widget API will\n     * have already verified that the widget is capable of receiving the event,\n     * or will make sure to reject access to events which are returned from this\n     * function, but are not capable of receiving. If `relationType` or `eventType`\n     * are set, the returned events should already be filtered. Less events than\n     * the limit are allowed to be returned, but not more.\n     * @param eventId The id of the parent event to be read.\n     * @param roomId The room to look within. When undefined, the user's\n     * currently viewed room.\n     * @param relationType The relationship type of child events to search for.\n     * When undefined, all relations are returned.\n     * @param eventType The event type of child events to search for. When undefined,\n     * all related events are returned.\n     * @param from The pagination token to start returning results from, as\n     * received from a previous call. If not supplied, results start at the most\n     * recent topological event known to the server.\n     * @param to The pagination token to stop returning results at. If not\n     * supplied, results continue up to limit or until there are no more events.\n     * @param limit The maximum number of events to retrieve per room. If not\n     * supplied, the server will apply a default limit.\n     * @param direction The direction to search for according to MSC3715\n     * @returns Resolves to the room relations.\n     */\n  }, {\n    key: \"readEventRelations\",\n    value: function readEventRelations(eventId, roomId, relationType, eventType, from, to, limit, direction) {\n      return Promise.resolve({\n        chunk: []\n      });\n    }\n\n    /**\n     * Asks the user for permission to validate their identity through OpenID Connect. The\n     * interface for this function is an observable which accepts the state machine of the\n     * OIDC exchange flow. For example, if the client/user blocks the request then it would\n     * feed back a `{state: Blocked}` into the observable. Similarly, if the user already\n     * approved the widget then a `{state: Allowed}` would be fed into the observable alongside\n     * the token itself. If the client is asking for permission, it should feed in a\n     * `{state: PendingUserConfirmation}` followed by the relevant Allowed or Blocked state.\n     *\n     * The widget API will reject the widget's request with an error if this contract is not\n     * met properly. By default, the widget driver will block all OIDC requests.\n     * @param {SimpleObservable<IOpenIDUpdate>} observer The observable to feed updates into.\n     */\n  }, {\n    key: \"askOpenID\",\n    value: function askOpenID(observer) {\n      observer.update({\n        state: _.OpenIDRequestState.Blocked\n      });\n    }\n\n    /**\n     * Navigates the client with a matrix.to URI. In future this function will also be provided\n     * with the Matrix URIs once matrix.to is replaced. The given URI will have already been\n     * lightly checked to ensure it looks like a valid URI, though the implementation is recommended\n     * to do further checks on the URI.\n     * @param {string} uri The URI to navigate to.\n     * @returns {Promise<void>} Resolves when complete.\n     * @throws Throws if there's a problem with the navigation, such as invalid format.\n     */\n  }, {\n    key: \"navigate\",\n    value: function navigate(uri) {\n      throw new Error(\"Navigation is not implemented\");\n    }\n\n    /**\n     * Polls for TURN server data, yielding an initial set of credentials as soon as possible, and\n     * thereafter yielding new credentials whenever the previous ones expire. The widget API will\n     * have already verified that the widget has permission to access TURN servers.\n     * @yields {ITurnServer} The TURN server URIs and credentials currently available to the client.\n     */\n  }, {\n    key: \"getTurnServers\",\n    value: function getTurnServers() {\n      throw new Error(\"TURN server support is not implemented\");\n    }\n\n    /**\n     * Search for users in the user directory.\n     * @param searchTerm The term to search for.\n     * @param limit The maximum number of results to return. If not supplied, the\n     * @returns Resolves to the search results.\n     */\n  }, {\n    key: \"searchUserDirectory\",\n    value: function searchUserDirectory(searchTerm, limit) {\n      return Promise.resolve({\n        limited: false,\n        results: []\n      });\n    }\n\n    /**\n     * Get the config for the media repository.\n     * @returns Promise which resolves with an object containing the config.\n     */\n  }, {\n    key: \"getMediaConfig\",\n    value: function getMediaConfig() {\n      throw new Error(\"Get media config is not implemented\");\n    }\n\n    /**\n     * Upload a file to the media repository on the homeserver.\n     * @param file - The object to upload. Something that can be sent to\n     *               XMLHttpRequest.send (typically a File).\n     * @returns Resolves to the location of the uploaded file.\n     */\n  }, {\n    key: \"uploadFile\",\n    value: function uploadFile(file) {\n      throw new Error(\"Upload file is not implemented\");\n    }\n\n    /**\n     * Download a file from the media repository on the homeserver.\n     * @param contentUri - MXC URI of the file to download.\n     * @returns Resolves to the contents of the file.\n     */\n  }, {\n    key: \"downloadFile\",\n    value: function downloadFile(contentUri) {\n      throw new Error(\"Download file is not implemented\");\n    }\n\n    /**\n     * Gets the IDs of all joined or invited rooms currently known to the\n     * client.\n     * @returns The room IDs.\n     */\n  }, {\n    key: \"getKnownRooms\",\n    value: function getKnownRooms() {\n      throw new Error(\"Querying known rooms is not implemented\");\n    }\n\n    /**\n     * Expresses an error thrown by this driver in a format compatible with the Widget API.\n     * @param error The error to handle.\n     * @returns The error expressed as a {@link IWidgetApiErrorResponseDataDetails},\n     * or undefined if it cannot be expressed as one.\n     */\n  }, {\n    key: \"processError\",\n    value: function processError(error) {\n      return undefined;\n    }\n  }]);\n  return WidgetDriver;\n}();\nexports.WidgetDriver = WidgetDriver;\n//# sourceMappingURL=WidgetDriver.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar _WidgetApi = require(\"./WidgetApi\");\nObject.keys(_WidgetApi).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _WidgetApi[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _WidgetApi[key];\n    }\n  });\n});\nvar _ClientWidgetApi = require(\"./ClientWidgetApi\");\nObject.keys(_ClientWidgetApi).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _ClientWidgetApi[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _ClientWidgetApi[key];\n    }\n  });\n});\nvar _Symbols = require(\"./Symbols\");\nObject.keys(_Symbols).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _Symbols[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _Symbols[key];\n    }\n  });\n});\nvar _PostmessageTransport = require(\"./transport/PostmessageTransport\");\nObject.keys(_PostmessageTransport).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _PostmessageTransport[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _PostmessageTransport[key];\n    }\n  });\n});\nvar _WidgetType = require(\"./interfaces/WidgetType\");\nObject.keys(_WidgetType).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _WidgetType[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _WidgetType[key];\n    }\n  });\n});\nvar _IWidgetApiErrorResponse = require(\"./interfaces/IWidgetApiErrorResponse\");\nObject.keys(_IWidgetApiErrorResponse).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _IWidgetApiErrorResponse[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _IWidgetApiErrorResponse[key];\n    }\n  });\n});\nvar _WidgetApiAction = require(\"./interfaces/WidgetApiAction\");\nObject.keys(_WidgetApiAction).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _WidgetApiAction[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _WidgetApiAction[key];\n    }\n  });\n});\nvar _WidgetApiDirection = require(\"./interfaces/WidgetApiDirection\");\nObject.keys(_WidgetApiDirection).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _WidgetApiDirection[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _WidgetApiDirection[key];\n    }\n  });\n});\nvar _ApiVersion = require(\"./interfaces/ApiVersion\");\nObject.keys(_ApiVersion).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _ApiVersion[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _ApiVersion[key];\n    }\n  });\n});\nvar _Capabilities = require(\"./interfaces/Capabilities\");\nObject.keys(_Capabilities).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _Capabilities[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _Capabilities[key];\n    }\n  });\n});\nvar _GetOpenIDAction = require(\"./interfaces/GetOpenIDAction\");\nObject.keys(_GetOpenIDAction).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _GetOpenIDAction[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _GetOpenIDAction[key];\n    }\n  });\n});\nvar _WidgetKind = require(\"./interfaces/WidgetKind\");\nObject.keys(_WidgetKind).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _WidgetKind[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _WidgetKind[key];\n    }\n  });\n});\nvar _ModalButtonKind = require(\"./interfaces/ModalButtonKind\");\nObject.keys(_ModalButtonKind).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _ModalButtonKind[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _ModalButtonKind[key];\n    }\n  });\n});\nvar _ModalWidgetActions = require(\"./interfaces/ModalWidgetActions\");\nObject.keys(_ModalWidgetActions).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _ModalWidgetActions[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _ModalWidgetActions[key];\n    }\n  });\n});\nvar _UpdateDelayedEventAction = require(\"./interfaces/UpdateDelayedEventAction\");\nObject.keys(_UpdateDelayedEventAction).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _UpdateDelayedEventAction[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _UpdateDelayedEventAction[key];\n    }\n  });\n});\nvar _WidgetEventCapability = require(\"./models/WidgetEventCapability\");\nObject.keys(_WidgetEventCapability).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _WidgetEventCapability[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _WidgetEventCapability[key];\n    }\n  });\n});\nvar _url = require(\"./models/validation/url\");\nObject.keys(_url).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _url[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _url[key];\n    }\n  });\n});\nvar _utils = require(\"./models/validation/utils\");\nObject.keys(_utils).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _utils[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _utils[key];\n    }\n  });\n});\nvar _Widget = require(\"./models/Widget\");\nObject.keys(_Widget).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _Widget[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _Widget[key];\n    }\n  });\n});\nvar _WidgetParser = require(\"./models/WidgetParser\");\nObject.keys(_WidgetParser).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _WidgetParser[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _WidgetParser[key];\n    }\n  });\n});\nvar _urlTemplate = require(\"./templating/url-template\");\nObject.keys(_urlTemplate).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _urlTemplate[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _urlTemplate[key];\n    }\n  });\n});\nvar _SimpleObservable = require(\"./util/SimpleObservable\");\nObject.keys(_SimpleObservable).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _SimpleObservable[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _SimpleObservable[key];\n    }\n  });\n});\nvar _WidgetDriver = require(\"./driver/WidgetDriver\");\nObject.keys(_WidgetDriver).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (key in exports && exports[key] === _WidgetDriver[key]) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function get() {\n      return _WidgetDriver[key];\n    }\n  });\n});\n//# sourceMappingURL=index.js.map","import {\n  type Capability,\n  EventDirection,\n  MatrixCapabilities,\n  WidgetEventCapability,\n} from 'matrix-widget-api';\nimport { EventType } from '$types/matrix-sdk';\n\nexport function getCallCapabilities(\n  roomId: string,\n  userId: string,\n  deviceId: string\n): Set<Capability> {\n  const capabilities: Set<Capability> = new Set();\n\n  capabilities.add(MatrixCapabilities.Screenshots);\n  capabilities.add(MatrixCapabilities.AlwaysOnScreen);\n  capabilities.add(MatrixCapabilities.MSC3846TurnServers);\n  capabilities.add(MatrixCapabilities.MSC4039UploadFile);\n  capabilities.add(MatrixCapabilities.MSC4039DownloadFile);\n  capabilities.add(MatrixCapabilities.MSC4157SendDelayedEvent);\n  capabilities.add(MatrixCapabilities.MSC4157UpdateDelayedEvent);\n  capabilities.add('moe.sable.thumbnails');\n  capabilities.add('moe.sable.media_proxy');\n  capabilities.add(`org.matrix.msc2762.timeline:${roomId}`);\n  capabilities.add(`org.matrix.msc2762.state:${roomId}`);\n\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomMember).raw\n  );\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(EventDirection.Receive, 'org.matrix.msc3401.call').raw\n  );\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomEncryption).raw\n  );\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomName).raw\n  );\n\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(\n      EventDirection.Send,\n      'org.matrix.msc3401.call.member',\n      userId\n    ).raw\n  );\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(\n      EventDirection.Send,\n      'org.matrix.msc3401.call.member',\n      `_${userId}_${deviceId}_m.call`\n    ).raw\n  );\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(\n      EventDirection.Send,\n      'org.matrix.msc3401.call.member',\n      `${userId}_${deviceId}_m.call`\n    ).raw\n  );\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(\n      EventDirection.Send,\n      'org.matrix.msc3401.call.member',\n      `_${userId}_${deviceId}`\n    ).raw\n  );\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(\n      EventDirection.Send,\n      'org.matrix.msc3401.call.member',\n      `${userId}_${deviceId}`\n    ).raw\n  );\n\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(EventDirection.Receive, 'org.matrix.msc3401.call.member')\n      .raw\n  );\n  capabilities.add(\n    WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomCreate).raw\n  );\n\n  [\n    'io.element.call.encryption_keys',\n    'org.matrix.rageshake_request',\n    EventType.Reaction,\n    EventType.RoomRedaction,\n    'io.element.call.reaction',\n    'org.matrix.msc4310.rtc.decline',\n    'org.matrix.msc4075.call.notify',\n    'org.matrix.msc4075.rtc.notification',\n    'org.matrix.msc4143.rtc.member',\n  ].forEach((type) => {\n    capabilities.add(WidgetEventCapability.forRoomEvent(EventDirection.Send, type).raw);\n    capabilities.add(WidgetEventCapability.forRoomEvent(EventDirection.Receive, type).raw);\n  });\n\n  [\n    EventType.CallInvite,\n    EventType.CallCandidates,\n    EventType.CallAnswer,\n    EventType.CallHangup,\n    EventType.CallReject,\n    EventType.CallSelectAnswer,\n    EventType.CallNegotiate,\n    EventType.CallSDPStreamMetadataChanged,\n    EventType.CallSDPStreamMetadataChangedPrefix,\n    EventType.CallReplaces,\n    EventType.CallEncryptionKeysPrefix,\n  ].forEach((type) => {\n    capabilities.add(WidgetEventCapability.forToDeviceEvent(EventDirection.Send, type).raw);\n    capabilities.add(WidgetEventCapability.forToDeviceEvent(EventDirection.Receive, type).raw);\n  });\n\n  return capabilities;\n}\n","import type { SimpleObservable, IOpenIDUpdate } from 'matrix-widget-api';\nimport {\n  type Capability,\n  type ISendDelayedEventDetails,\n  type ISendEventDetails,\n  type IReadEventRelationsResult,\n  type IRoomEvent,\n  WidgetDriver,\n  type IWidgetApiErrorResponseDataDetails,\n  type ISearchUserDirectoryResult,\n  type IGetMediaConfigResult,\n  UpdateDelayedEventAction,\n  OpenIDRequestState,\n} from 'matrix-widget-api';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport {\n  EventType,\n  type IContent,\n  KnownMembership,\n  MatrixError,\n  type MatrixEvent,\n  type Room,\n  Direction,\n  type SendDelayedEventResponse,\n  type StateEvents,\n  type TimelineEvents,\n} from '$types/matrix-sdk';\nimport { getCallCapabilities } from './utils';\nimport { downloadMedia, mxcUrlToHttp, uploadContentToServer } from '../../utils/matrix';\nimport { createDebugLogger } from '../../utils/debugLogger';\n\nconst debugLog = createDebugLogger('CallWidgetDriver');\n\nexport const hydrateWidgetRoster = async (room: Room): Promise<void> => {\n  try {\n    await room.loadMembersIfNeeded();\n  } catch (error) {\n    // A partial roster still beats failing the read and stalling state sync.\n    debugLog.warn('call', 'Failed to load room members for the call widget', {\n      roomId: room.roomId,\n      error: error instanceof Error ? error.message : String(error),\n    });\n    return;\n  }\n\n  const joinedInState = room.getMembersWithMembership(KnownMembership.Join).length;\n  const joinedCount = room.getJoinedMemberCount();\n  if (joinedInState < joinedCount) {\n    debugLog.warn('call', 'Call widget roster is short of the joined member count', {\n      roomId: room.roomId,\n      joinedInState,\n      joinedCount,\n    });\n  }\n};\n\nexport class CallWidgetDriver extends WidgetDriver {\n  private allowedCapabilities: Set<Capability>;\n\n  private readonly mx: MatrixClient;\n\n  public constructor(\n    mx: MatrixClient,\n    private inRoomId: string\n  ) {\n    super();\n    this.mx = mx;\n\n    const deviceId = mx.getDeviceId();\n    if (!deviceId) {\n      debugLog.error('call', 'Failed to initialize CallWidgetDriver - no device ID');\n      throw new Error('Failed to initialize CallWidgetDriver! Device ID not found.');\n    }\n\n    debugLog.info('call', 'Initializing CallWidgetDriver', { roomId: inRoomId, deviceId });\n    this.allowedCapabilities = getCallCapabilities(inRoomId, mx.getSafeUserId(), deviceId);\n  }\n\n  public async validateCapabilities(requested: Set<Capability>): Promise<Set<Capability>> {\n    const requestedArray = Array.from(requested);\n    const allow = requestedArray.filter((cap) => this.allowedCapabilities.has(cap));\n    const denied = requestedArray.filter((cap) => !this.allowedCapabilities.has(cap));\n\n    if (denied.length > 0) {\n      debugLog.warn('call', 'Call widget requested unsupported capabilities', {\n        roomId: this.inRoomId,\n        deniedCapabilities: denied,\n      });\n    }\n\n    return new Set(allow);\n  }\n\n  public async sendEvent(\n    eventType: string,\n    content: IContent,\n    stateKey: string | null = null,\n    targetRoomId: string | null = null\n  ): Promise<ISendEventDetails> {\n    const client = this.mx;\n    const roomId = targetRoomId || this.inRoomId;\n\n    if (!client || !roomId) {\n      debugLog.error('call', 'Cannot send event - no client or room', { eventType, roomId });\n      throw new Error('Not in a room or not attached to a client');\n    }\n\n    debugLog.info('call', 'Sending call event', {\n      eventType,\n      roomId,\n      hasStateKey: stateKey !== null,\n    });\n\n    let r: { event_id: string } | null;\n    if (typeof stateKey === 'string') {\n      r = await client.sendStateEvent(\n        roomId,\n        eventType as keyof StateEvents,\n        content as StateEvents[keyof StateEvents],\n        stateKey\n      );\n    } else if (eventType === (EventType.RoomRedaction as string)) {\n      // special case: extract the `redacts` property and call redact\n      r = await client.redactEvent(roomId, content.redacts);\n    } else {\n      r = await client.sendEvent(\n        roomId,\n        eventType as keyof TimelineEvents,\n        content as TimelineEvents[keyof TimelineEvents]\n      );\n    }\n\n    debugLog.info('call', 'Call event sent successfully', { eventId: r.event_id, eventType });\n    return { roomId, eventId: r.event_id };\n  }\n\n  public async sendDelayedEvent(\n    delay: number | null,\n    parentDelayId: string | null,\n    eventType: string,\n    content: IContent,\n    stateKey: string | null = null,\n    targetRoomId: string | null = null\n  ): Promise<ISendDelayedEventDetails> {\n    const client = this.mx;\n    const roomId = targetRoomId || this.inRoomId;\n\n    if (!client || !roomId) throw new Error('Not in a room or not attached to a client');\n\n    let delayOpts;\n    if (delay !== null) {\n      delayOpts = {\n        delay,\n        ...(parentDelayId !== null && { parent_delay_id: parentDelayId }),\n      };\n    } else if (parentDelayId !== null) {\n      delayOpts = {\n        parent_delay_id: parentDelayId,\n      };\n    } else {\n      throw new Error('Must provide at least one of delay or parentDelayId');\n    }\n\n    let r: SendDelayedEventResponse | null;\n    if (stateKey !== null) {\n      // state event\n      r = await client._unstable_sendDelayedStateEvent(\n        roomId,\n        delayOpts,\n        eventType as keyof StateEvents,\n        content as StateEvents[keyof StateEvents],\n        stateKey\n      );\n    } else {\n      // message event\n      r = await client._unstable_sendDelayedEvent(\n        roomId,\n        delayOpts,\n        null,\n        eventType as keyof TimelineEvents,\n        content as TimelineEvents[keyof TimelineEvents]\n      );\n    }\n\n    return {\n      roomId,\n      delayId: r.delay_id,\n    };\n  }\n\n  public async updateDelayedEvent(\n    delayId: string,\n    action: UpdateDelayedEventAction\n  ): Promise<void> {\n    const client = this.mx;\n\n    if (!client) throw new Error('Not in a room or not attached to a client');\n\n    await client._unstable_updateDelayedEvent(delayId, action);\n  }\n\n  public async cancelScheduledDelayedEvent(delayId: string): Promise<void> {\n    await this.updateDelayedEvent(delayId, UpdateDelayedEventAction.Cancel);\n  }\n\n  public async restartScheduledDelayedEvent(delayId: string): Promise<void> {\n    await this.updateDelayedEvent(delayId, UpdateDelayedEventAction.Restart);\n  }\n\n  public async sendScheduledDelayedEvent(delayId: string): Promise<void> {\n    await this.updateDelayedEvent(delayId, UpdateDelayedEventAction.Send);\n  }\n\n  public async sendToDevice(\n    eventType: string,\n    encrypted: boolean,\n    contentMap: Record<string, Record<string, object>>\n  ): Promise<void> {\n    const client = this.mx;\n\n    if (encrypted) {\n      const crypto = client.getCrypto();\n      if (!crypto) throw new Error('E2EE not enabled');\n\n      // attempt to re-batch these up into a single request\n      const invertedContentMap: Record<string, { userId: string; deviceId: string }[]> = {};\n\n      for (const userId of Object.keys(contentMap)) {\n        const userContentMap = contentMap[userId];\n        if (!userContentMap) continue;\n\n        for (const deviceId of Object.keys(userContentMap)) {\n          const content = userContentMap[deviceId];\n          const stringifiedContent = JSON.stringify(content);\n          invertedContentMap[stringifiedContent] = invertedContentMap[stringifiedContent] || [];\n          invertedContentMap[stringifiedContent].push({ userId, deviceId });\n        }\n      }\n\n      await Promise.all(\n        Object.entries(invertedContentMap).map(async ([stringifiedContent, recipients]) => {\n          const batch = await crypto.encryptToDeviceMessages(\n            eventType,\n            recipients,\n            JSON.parse(stringifiedContent)\n          );\n\n          await client.queueToDevice(batch);\n        })\n      );\n    } else {\n      await client.queueToDevice({\n        eventType,\n        batch: Object.entries(contentMap).flatMap(([userId, userContentMap]) =>\n          Object.entries(userContentMap).map(([deviceId, content]) => ({\n            userId,\n            deviceId,\n            payload: content,\n          }))\n        ),\n      });\n    }\n  }\n\n  public async readRoomTimeline(\n    roomId: string,\n    eventType: string,\n    msgtype: string | undefined,\n    stateKey: string | undefined,\n    limit: number,\n    since: string | undefined\n  ): Promise<IRoomEvent[]> {\n    if (stateKey !== undefined) {\n      return this.readRoomState(roomId, eventType, stateKey);\n    }\n\n    const stateEvents = await this.readRoomState(roomId, eventType, undefined);\n    if (stateEvents.length > 0) return stateEvents;\n\n    const safeLimit =\n      limit > 0 ? Math.min(limit, Number.MAX_SAFE_INTEGER) : Number.MAX_SAFE_INTEGER; // relatively arbitrary\n\n    const room = this.mx.getRoom(roomId);\n    if (room === null) return [];\n    const results: MatrixEvent[] = [];\n    const events = room.getLiveTimeline().getEvents();\n\n    for (let i = events.length - 1; i >= 0; i -= 1) {\n      const ev = events[i];\n      if (!ev) continue;\n      if (results.length >= safeLimit) break;\n      if (since !== undefined && ev.getId() === since) break;\n\n      if (\n        ev.getType() === eventType &&\n        !ev.isState() &&\n        (eventType !== (EventType.RoomMessage as string) ||\n          !msgtype ||\n          msgtype === ev.getContent().msgtype) &&\n        (ev.getStateKey() === undefined || stateKey === undefined || ev.getStateKey() === stateKey)\n      ) {\n        results.push(ev);\n      }\n    }\n\n    return results.map((e) => e.getEffectiveEvent() as IRoomEvent);\n  }\n\n  public async askOpenID(observer: SimpleObservable<IOpenIDUpdate>): Promise<void> {\n    return observer.update({\n      state: OpenIDRequestState.Allowed,\n      token: await this.mx.getOpenIdToken(),\n    });\n  }\n\n  public async readRoomState(\n    roomId: string,\n    eventType: string,\n    stateKey: string | undefined\n  ): Promise<IRoomEvent[]> {\n    const room = this.mx.getRoom(roomId);\n    if (room === null) return [];\n\n    if (eventType === (EventType.RoomMember as string)) await hydrateWidgetRoster(room);\n\n    const state = room.getLiveTimeline().getState(Direction.Forward);\n    if (state === undefined) return [];\n\n    if (stateKey === undefined)\n      return state.getStateEvents(eventType).map((e) => e.getEffectiveEvent() as IRoomEvent);\n    const event = state.getStateEvents(eventType, stateKey);\n    return event === null ? [] : [event.getEffectiveEvent() as IRoomEvent];\n  }\n\n  public async readEventRelations(\n    eventId: string,\n    roomId?: string,\n    relationType?: string,\n    eventType?: string,\n    from?: string,\n    to?: string,\n    limit?: number,\n    direction?: 'f' | 'b'\n  ): Promise<IReadEventRelationsResult> {\n    const client = this.mx;\n    const dir = direction as Direction;\n    const targetRoomId = roomId ?? this.inRoomId ?? undefined;\n\n    if (typeof targetRoomId !== 'string') {\n      throw new Error('Error while reading the current room');\n    }\n\n    const { events, nextBatch, prevBatch } = await client.relations(\n      targetRoomId,\n      eventId,\n      relationType ?? null,\n      eventType ?? null,\n      { from, to, limit, dir }\n    );\n\n    return {\n      chunk: events.map((e) => e.getEffectiveEvent() as IRoomEvent),\n      nextBatch: nextBatch ?? undefined,\n      prevBatch: prevBatch ?? undefined,\n    };\n  }\n\n  public async searchUserDirectory(\n    searchTerm: string,\n    limit?: number\n  ): Promise<ISearchUserDirectoryResult> {\n    const client = this.mx;\n\n    const { limited, results } = await client.searchUserDirectory({ term: searchTerm, limit });\n\n    return {\n      limited,\n      results: results.map((r) => ({\n        userId: r.user_id,\n        displayName: r.display_name,\n        avatarUrl: r.avatar_url,\n      })),\n    };\n  }\n\n  public async getMediaConfig(): Promise<IGetMediaConfigResult> {\n    const client = this.mx;\n\n    return client.getMediaConfig();\n  }\n\n  public async uploadFile(file: XMLHttpRequestBodyInit): Promise<{ contentUri: string }> {\n    const client = this.mx;\n\n    const uploadResult = await uploadContentToServer(client, file);\n\n    return { contentUri: uploadResult.content_uri };\n  }\n\n  public async downloadFile(contentUri: string): Promise<{ file: XMLHttpRequestBodyInit }> {\n    const httpUrl = mxcUrlToHttp(this.mx, contentUri, true);\n    if (!httpUrl) {\n      throw new Error('Call widget failed to download file! No http url!');\n    }\n    const blob = await downloadMedia(httpUrl, {\n      getAccessToken: () => this.mx.getAccessToken(),\n      sessionScope: this.mx.getUserId() ?? undefined,\n    });\n    return { file: blob };\n  }\n\n  public getKnownRooms(): string[] {\n    return this.mx.getVisibleRooms().map((r) => r.roomId);\n  }\n\n  public processError(error: unknown): IWidgetApiErrorResponseDataDetails | undefined {\n    return error instanceof MatrixError\n      ? { matrix_api_error: error.asWidgetApiErrorData() }\n      : undefined;\n  }\n}\n","export enum ElementCallIntent {\n  StartCall = 'start_call',\n  JoinExisting = 'join_existing',\n  StartCallVoice = 'start_call_voice',\n  JoinExistingVoice = 'join_existing_voice',\n  StartCallDM = 'start_call_dm',\n  JoinExistingDM = 'join_existing_dm',\n  StartCallDMVoice = 'start_call_dm_voice',\n  JoinExistingDMVoice = 'join_existing_dm_voice',\n}\n\nexport type ElementCallThemeKind = 'light' | 'dark';\n\nexport type ElementMediaStatePayload = {\n  audio_enabled?: boolean;\n  video_enabled?: boolean;\n  audio_output_enabled?: boolean;\n};\nexport type ElementMediaStateDetail = {\n  data?: ElementMediaStatePayload;\n};\n\nexport enum ElementWidgetActions {\n  JoinCall = 'io.element.join',\n  HangupCall = 'im.vector.hangup',\n  Close = 'io.element.close',\n  DeviceMute = 'io.element.device_mute',\n}\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","export class CallControlState {\n  public readonly microphone: boolean;\n\n  public readonly video: boolean;\n\n  public readonly sound: boolean;\n\n  public readonly screenshare: boolean;\n\n  constructor(microphone: boolean, video: boolean, sound: boolean, screenshare = false) {\n    this.microphone = microphone;\n    this.video = video;\n    this.sound = sound;\n    this.screenshare = screenshare;\n  }\n}\n","import { createDebugLogger } from '$utils/debugLogger';\n\nconst debugLog = createDebugLogger('ElementCallDomAdapter');\n\nconst missingSelectorWarnings = new Set<string>();\n\ntype SelectorQueryOptions = {\n  key: string;\n  selectors: string[];\n};\n\nconst queryFirst = (doc: Document | undefined, { key, selectors }: SelectorQueryOptions) => {\n  if (!doc) return undefined;\n\n  for (const selector of selectors) {\n    const element = doc.querySelector(selector) as HTMLElement | null;\n    if (element) return element;\n  }\n\n  if (!missingSelectorWarnings.has(key)) {\n    missingSelectorWarnings.add(key);\n    debugLog.warn('call', 'Element Call selector(s) not found', { key, selectors });\n  }\n\n  return undefined;\n};\n\nexport const getScreenshareButton = (doc: Document | undefined): HTMLElement | undefined =>\n  queryFirst(doc, {\n    key: 'screenshare_button',\n    selectors: ['[data-testid=\"incall_screenshare\"]', 'button[aria-label*=\"screen\" i]'],\n  });\n\nexport const isElementToggledOn = (element: HTMLElement | undefined): boolean => {\n  if (!element) return false;\n  if ('checked' in element && typeof (element as HTMLInputElement).checked === 'boolean') {\n    return (element as HTMLInputElement).checked;\n  }\n\n  const ariaPressed = element.getAttribute('aria-pressed');\n  if (ariaPressed !== null) return ariaPressed === 'true';\n\n  const ariaChecked = element.getAttribute('aria-checked');\n  if (ariaChecked !== null) return ariaChecked === 'true';\n\n  const dataKind = element.getAttribute('data-kind');\n  if (dataKind !== null) return dataKind === 'primary';\n\n  return false;\n};\n","import type { ClientWidgetApi } from 'matrix-widget-api';\nimport EventEmitter from 'eventemitter3';\nimport { CallControlState } from './CallControlState';\nimport type { ElementMediaStateDetail, ElementMediaStatePayload } from './types';\nimport { ElementWidgetActions } from './types';\nimport { getScreenshareButton, isElementToggledOn } from './elementCallDomAdapter';\n\nexport enum CallControlEvent {\n  StateUpdate = 'state_update',\n}\n\nexport class CallControl extends EventEmitter implements CallControlState {\n  private state: CallControlState;\n\n  private call: ClientWidgetApi;\n\n  private iframe: HTMLIFrameElement;\n\n  private controlMutationObserver: MutationObserver;\n\n  private get document(): Document | undefined {\n    return this.iframe.contentDocument ?? this.iframe.contentWindow?.document;\n  }\n\n  private get screenshareButton(): HTMLElement | undefined {\n    return getScreenshareButton(this.document);\n  }\n\n  constructor(state: CallControlState, call: ClientWidgetApi, iframe: HTMLIFrameElement) {\n    super();\n\n    this.state = state;\n    this.call = call;\n    this.iframe = iframe;\n\n    this.controlMutationObserver = new MutationObserver(this.onControlMutation.bind(this));\n  }\n\n  public getState(): CallControlState {\n    return this.state;\n  }\n\n  public get microphone(): boolean {\n    return this.state.microphone;\n  }\n\n  public get video(): boolean {\n    return this.state.video;\n  }\n\n  public get sound(): boolean {\n    return this.state.sound;\n  }\n\n  public get screenshare(): boolean {\n    return this.state.screenshare;\n  }\n\n  public async applyState() {\n    await this.setMediaState({\n      audio_enabled: this.microphone,\n      video_enabled: this.video,\n      audio_output_enabled: this.sound,\n    });\n    this.emitStateUpdate();\n  }\n\n  public startObserving() {\n    this.controlMutationObserver.disconnect();\n\n    const screenshareBtn = this.screenshareButton;\n    if (screenshareBtn) {\n      this.controlMutationObserver.observe(screenshareBtn, {\n        attributes: true,\n        attributeFilter: ['data-kind', 'aria-pressed', 'aria-checked', 'class'],\n      });\n    }\n\n    this.onControlMutation();\n  }\n\n  public applySound() {\n    this.setSound(this.sound);\n  }\n\n  private setMediaState(state: ElementMediaStatePayload) {\n    return this.call.transport.send(ElementWidgetActions.DeviceMute, state);\n  }\n\n  private setSound(sound: boolean): void {\n    this.setMediaState({\n      audio_output_enabled: sound,\n    });\n  }\n\n  public onMediaState(evt: CustomEvent<ElementMediaStateDetail>) {\n    const { data } = evt.detail;\n    if (!data) return;\n\n    const micTurnedOn = data.audio_enabled === true && !this.microphone;\n    const soundTurnedOff = data.audio_output_enabled === false && this.sound;\n\n    const state = new CallControlState(\n      data.audio_enabled ?? this.microphone,\n      data.video_enabled ?? this.video,\n      data.audio_output_enabled ?? this.sound,\n      this.screenshare\n    );\n\n    this.state = state;\n    this.emitStateUpdate();\n\n    if (micTurnedOn && !this.sound) {\n      this.toggleSound();\n    } else if (soundTurnedOff && this.microphone) {\n      this.toggleMicrophone();\n    }\n  }\n\n  public onControlMutation() {\n    const screenshare: boolean = isElementToggledOn(this.screenshareButton);\n\n    this.state = new CallControlState(this.microphone, this.video, this.sound, screenshare);\n    this.emitStateUpdate();\n  }\n\n  public toggleMicrophone() {\n    const payload: ElementMediaStatePayload = {\n      audio_enabled: !this.microphone,\n      video_enabled: this.video,\n    };\n    return this.setMediaState(payload);\n  }\n\n  public toggleVideo() {\n    const payload: ElementMediaStatePayload = {\n      audio_enabled: this.microphone,\n      video_enabled: !this.video,\n    };\n    return this.setMediaState(payload);\n  }\n\n  public toggleSound() {\n    const sound = !this.sound;\n\n    this.setSound(sound);\n\n    const state = new CallControlState(this.microphone, this.video, sound, this.screenshare);\n    this.state = state;\n    this.emitStateUpdate();\n\n    if (!this.sound && this.microphone) {\n      this.toggleMicrophone();\n    }\n  }\n\n  public toggleScreenshare() {\n    this.screenshareButton?.click();\n  }\n\n  public dispose() {\n    this.controlMutationObserver.disconnect();\n  }\n\n  private emitStateUpdate() {\n    this.emit(CallControlEvent.StateUpdate);\n  }\n}\n","import type { MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk';\nimport {\n  ClientEvent,\n  EventType,\n  KnownMembership,\n  MatrixEventEvent,\n  RoomStateEvent,\n} from '$types/matrix-sdk';\nimport { invoke } from '@tauri-apps/api/core';\nimport type { IRoomEvent, IWidget, WidgetDriver } from 'matrix-widget-api';\nimport {\n  ClientWidgetApi,\n  type IWidgetApiRequest,\n  Widget,\n  WidgetApiFromWidgetAction,\n  WidgetApiToWidgetAction,\n} from 'matrix-widget-api';\nimport { CallWidgetDriver } from './CallWidgetDriver';\nimport { trimTrailingSlash } from '../../utils/common';\nimport { getWindowOrigin, iosApp, isAndroidTauri } from '../../utils/platform';\nimport type { ElementCallThemeKind, ElementMediaStateDetail } from './types';\nimport { color, config } from 'folds';\nimport { ElementCallIntent, ElementWidgetActions } from './types';\nimport { CallControl } from './CallControl';\nimport { CallControlState } from './CallControlState';\nimport { createDebugLogger } from '../../utils/debugLogger';\nimport { getSlidingSyncManager } from '$client/initMatrix';\n\nconst debugLog = createDebugLogger('CallEmbed');\n\nconst resolveCssVar = (variable: string): string => {\n  const match = variable.match(/var\\((--[^,)]+)/);\n  if (match && match[1]) {\n    const bodyVal = window.getComputedStyle(document.body).getPropertyValue(match[1]).trim();\n    if (bodyVal) return bodyVal;\n    const docElVal = window\n      .getComputedStyle(document.documentElement)\n      .getPropertyValue(match[1])\n      .trim();\n    if (docElVal) return docElVal;\n  }\n  return variable;\n};\n\nexport class CallEmbed {\n  private mx: MatrixClient;\n\n  public readonly call: ClientWidgetApi;\n\n  public readonly iframe: HTMLIFrameElement;\n\n  public readonly room: Room;\n\n  public joined = false;\n\n  private initialMediaStateReceived = false;\n\n  private nativeCallRuntimeActive = false;\n\n  public readonly control: CallControl;\n\n  private readonly container: HTMLElement;\n\n  private readUpToMap: Record<string, string> = {}; // room ID to event ID\n\n  private eventsToFeed = new WeakSet<MatrixEvent>();\n\n  private readonly disposables: Array<() => void> = [];\n\n  static getIntent(dm: boolean, ongoing: boolean, video: boolean | undefined): ElementCallIntent {\n    if (ongoing) {\n      if (dm) {\n        return video ? ElementCallIntent.JoinExistingDM : ElementCallIntent.JoinExistingDMVoice;\n      }\n      return video ? ElementCallIntent.JoinExisting : ElementCallIntent.JoinExistingVoice;\n    }\n\n    if (dm) {\n      return video ? ElementCallIntent.StartCallDM : ElementCallIntent.StartCallDMVoice;\n    }\n\n    return video ? ElementCallIntent.StartCall : ElementCallIntent.StartCallVoice;\n  }\n\n  static dmCall(intent: ElementCallIntent): boolean {\n    return (\n      intent === ElementCallIntent.JoinExistingDM ||\n      intent === ElementCallIntent.JoinExistingDMVoice ||\n      intent === ElementCallIntent.StartCallDM ||\n      intent === ElementCallIntent.StartCallDMVoice\n    );\n  }\n\n  static startingCall(intent: ElementCallIntent): boolean {\n    return (\n      intent === ElementCallIntent.StartCallDM ||\n      intent === ElementCallIntent.StartCallDMVoice ||\n      intent === ElementCallIntent.StartCall ||\n      intent === ElementCallIntent.StartCallVoice\n    );\n  }\n\n  // Widget-mode discovery can't reach a transport (no access token, iframe\n  // fetch restrictions), so forward the ongoing call's own transport.\n  private static getOngoingCallLivekitServiceUrl(mx: MatrixClient, room: Room): string | undefined {\n    const session = mx.matrixRTC.getRoomSession(room);\n    const oldest = session.getOldestMembership();\n    if (!oldest) return undefined;\n    const transport = session.memberships.map((m) => m.getTransport(oldest)).find(Boolean);\n    return transport?.type === 'livekit'\n      ? (transport as { livekit_service_url?: string }).livekit_service_url\n      : undefined;\n  }\n\n  static getWidget(\n    mx: MatrixClient,\n    room: Room,\n    intent: ElementCallIntent,\n    themeKind: ElementCallThemeKind,\n    elementCallUrl?: string\n  ): Widget {\n    const userId = mx.getSafeUserId();\n    const deviceId = mx.getDeviceId() ?? '';\n    const clientOrigin = getWindowOrigin();\n    const widgetId = 'call-embed';\n\n    const params = new URLSearchParams({\n      widgetId,\n      parentUrl: clientOrigin,\n      baseUrl: mx.baseUrl,\n      roomId: room.roomId,\n      userId,\n      deviceId,\n      intent,\n\n      skipLobby: 'true',\n      confineToRoom: 'true',\n      appPrompt: 'false',\n      perParticipantE2EE: room.hasEncryptionStateEvent().toString(),\n      lang: 'en-EN',\n      theme: themeKind,\n      background: 'solid',\n      header: 'none',\n    });\n\n    const ongoingLivekitServiceUrl = CallEmbed.getOngoingCallLivekitServiceUrl(mx, room);\n    if (ongoingLivekitServiceUrl) {\n      params.append('livekitServiceUrl', ongoingLivekitServiceUrl);\n    }\n\n    if (!room.isCallRoom() && CallEmbed.startingCall(intent)) {\n      params.append('sendNotificationType', CallEmbed.dmCall(intent) ? 'ring' : 'notification');\n      params.append('waitForCallPickup', CallEmbed.dmCall(intent) ? 'true' : 'false');\n    }\n\n    let widgetUrl: URL;\n    if (elementCallUrl && elementCallUrl.trim()) {\n      try {\n        widgetUrl = new URL(elementCallUrl, clientOrigin);\n      } catch (error) {\n        debugLog.warn(\n          'call',\n          'Invalid elementCallUrl in client config, falling back to bundled call app',\n          {\n            elementCallUrl,\n            error: error instanceof Error ? error.message : String(error),\n          }\n        );\n        widgetUrl = new URL(\n          `${trimTrailingSlash(import.meta.env.BASE_URL)}/public/element-call/index.html`,\n          clientOrigin\n        );\n      }\n    } else {\n      widgetUrl = new URL(\n        `${trimTrailingSlash(import.meta.env.BASE_URL)}/public/element-call/index.html`,\n        clientOrigin\n      );\n    }\n    widgetUrl.search = params.toString();\n\n    const options: IWidget = {\n      id: widgetId,\n      creatorUserId: userId,\n      name: 'Call',\n      type: 'm.call',\n      url: widgetUrl.href,\n      waitForIframeLoad: false,\n      data: {},\n    };\n\n    const widget: Widget = new Widget(options);\n\n    return widget;\n  }\n\n  static getIframe(): HTMLIFrameElement {\n    const iframe = document.createElement('iframe');\n\n    iframe.title = 'Call Embed';\n    iframe.sandbox =\n      'allow-forms allow-scripts allow-same-origin allow-popups allow-modals allow-downloads';\n    iframe.allow =\n      'microphone; camera; display-capture; autoplay; clipboard-write; local-network-access;';\n\n    iframe.style.width = '100%';\n    iframe.style.height = '100%';\n    iframe.style.border = 'none';\n\n    return iframe;\n  }\n\n  constructor(\n    mx: MatrixClient,\n    room: Room,\n    widget: Widget,\n    container: HTMLElement,\n    initialControlState?: CallControlState\n  ) {\n    debugLog.info('call', 'Initializing call embed', { roomId: room.roomId });\n\n    const iframe = CallEmbed.getIframe();\n    container.append(iframe);\n\n    const callWidgetDriver: WidgetDriver = new CallWidgetDriver(mx, room.roomId);\n    const call: ClientWidgetApi = new ClientWidgetApi(widget, iframe, callWidgetDriver);\n\n    // Load after the transport is listening, or a fast iframe's contentLoaded is missed.\n    iframe.src = widget.getCompleteUrl({ currentUserId: mx.getSafeUserId() });\n\n    this.mx = mx;\n    this.call = call;\n    this.room = room;\n    this.iframe = iframe;\n    this.container = container;\n\n    const controlState = initialControlState ?? new CallControlState(true, false, true);\n    this.control = new CallControl(controlState, call, iframe);\n\n    // MatrixRTC ignores a call membership when the member's m.room.member\n    // event is absent from the local roster (sliding sync only ships $ME/$LAZY\n    // here). Subscribe the room with a full member wildcard so the host SDK\n    // accepts the other participants' memberships for the embed's lifetime.\n    const callRoomSubscription = getSlidingSyncManager(mx)?.subscribeToCallRoom(room.roomId);\n    if (callRoomSubscription) this.disposables.push(callRoomSubscription);\n\n    this.disposables.push(\n      this.listenAction(WidgetApiFromWidgetAction.UpdateAlwaysOnScreen, (evt) => {\n        evt.preventDefault();\n        this.call.transport.reply(evt.detail as IWidgetApiRequest, {\n          success: true,\n        });\n      })\n    );\n    this.disposables.push(\n      this.listenAction(ElementWidgetActions.Close, (evt) => {\n        evt.preventDefault();\n        this.call.transport.reply(evt.detail as IWidgetApiRequest, {});\n      })\n    );\n\n    let initialMediaEvent = true;\n    this.disposables.push(\n      this.listenAction(ElementWidgetActions.DeviceMute, (evt) => {\n        evt.preventDefault();\n        this.call.transport.reply(evt.detail as IWidgetApiRequest, {});\n        if (initialMediaEvent) {\n          initialMediaEvent = false;\n          this.initialMediaStateReceived = true;\n          this.control.applyState();\n          this.startNativeCallRuntime();\n          return;\n        }\n        this.control.onMediaState(evt as CustomEvent<ElementMediaStateDetail>);\n      })\n    );\n\n    this.start();\n  }\n\n  get roomId(): string {\n    return this.room.roomId;\n  }\n\n  get document(): Document | undefined {\n    return this.iframe.contentDocument ?? this.iframe.contentWindow?.document;\n  }\n\n  public setTheme(theme: ElementCallThemeKind) {\n    return this.call.transport.send(WidgetApiToWidgetAction.ThemeChange, {\n      name: theme,\n    });\n  }\n\n  public hangup() {\n    debugLog.info('call', 'Hanging up call', { roomId: this.roomId });\n    return this.call.transport.send(ElementWidgetActions.HangupCall, {});\n  }\n\n  public onPreparing(callback: () => void) {\n    return this.listenEvent('preparing', callback);\n  }\n\n  public onPreparingError(callback: (error: unknown) => void) {\n    return this.listenEvent('error:preparing', callback);\n  }\n\n  public onReady(callback: () => void) {\n    return this.listenEvent('ready', callback);\n  }\n\n  public onCapabilitiesNotified(callback: () => void) {\n    return this.listenEvent('capabilitiesNotified', callback);\n  }\n\n  private start() {\n    debugLog.info('call', 'Starting call widget', { roomId: this.roomId });\n    // Room widgets get locked to the room they were added in\n    this.call.setViewedRoomId(this.roomId);\n    this.disposables.push(\n      this.listenAction(ElementWidgetActions.JoinCall, this.onCallJoined.bind(this))\n    );\n\n    // Populate the map of \"read up to\" events for this widget with the current event in every room.\n    // This is a bit inefficient, but should be okay. We do this for all rooms in case the widget\n    // requests timeline capabilities in other rooms down the road. It's just easier to manage here.\n    this.mx.getRooms().forEach((room) => {\n      // Timelines are most recent last\n      const events = room.getLiveTimeline()?.getEvents() || [];\n      const roomEvent = events[events.length - 1];\n      if (!roomEvent) return; // force later code to think the room is fresh\n      this.readUpToMap[room.roomId] = roomEvent.getId()!;\n    });\n\n    // Feed the room's state to the widget after capabilities are negotiated;\n    // feedStateUpdate silently drops events before the widget is ready.\n    const feedInitialState = () => {\n      const myUserId = this.mx.getSafeUserId();\n      this.room.currentState.events.forEach((stateKeyMap) => {\n        stateKeyMap.forEach((ev) => {\n          const raw = ev.getEffectiveEvent() as IRoomEvent | undefined;\n          if (raw === undefined) return;\n          this.call.feedStateUpdate(raw).catch((e) => {\n            console.error('Error feeding initial state to widget: ', e);\n          });\n        });\n      });\n\n      // Sliding sync may not have delivered m.room.member yet.\n      if (!this.room.currentState.getStateEvents(EventType.RoomMember, myUserId)) {\n        const membership = this.room.getMyMembership();\n        if (membership) {\n          const memberRaw = {\n            type: EventType.RoomMember,\n            state_key: myUserId,\n            room_id: this.roomId,\n            sender: myUserId,\n            content: { membership },\n            event_id: `$sable:${Date.now()}`,\n            origin_server_ts: Date.now(),\n            unsigned: {},\n          } as unknown as IRoomEvent;\n          this.call.feedStateUpdate(memberRaw).catch((e) => {\n            console.error('Error feeding member state to widget: ', e);\n          });\n        }\n      }\n    };\n\n    this.disposables.push(this.onCapabilitiesNotified(feedInitialState));\n\n    // Bind handlers once and route removal through `disposables` so listeners can be\n    // cleanly torn down when the embed is recreated.\n    const boundOnEvent = this.onEvent.bind(this);\n    const boundOnEventDecrypted = this.onEventDecrypted.bind(this);\n    const boundOnStateUpdate = this.onStateUpdate.bind(this);\n    const boundOnToDeviceEvent = this.onToDeviceEvent.bind(this);\n    this.mx.on(ClientEvent.Event, boundOnEvent);\n    this.mx.on(MatrixEventEvent.Decrypted, boundOnEventDecrypted);\n    this.mx.on(RoomStateEvent.Events, boundOnStateUpdate);\n    this.mx.on(ClientEvent.ToDeviceEvent, boundOnToDeviceEvent);\n    this.disposables.push(() => {\n      this.mx.off(ClientEvent.Event, boundOnEvent);\n      this.mx.off(MatrixEventEvent.Decrypted, boundOnEventDecrypted);\n      this.mx.off(RoomStateEvent.Events, boundOnStateUpdate);\n      this.mx.off(ClientEvent.ToDeviceEvent, boundOnToDeviceEvent);\n    });\n  }\n\n  /**\n   * Stops the widget messaging for if it is started. Skips stopping if it is an active\n   * widget.\n   * @param opts\n   */\n  public dispose(): void {\n    debugLog.info('call', 'Disposing call widget', { roomId: this.roomId });\n    if (this.nativeCallRuntimeActive && isAndroidTauri()) {\n      void invoke('stop_call_foreground_service').catch((error) => {\n        debugLog.error('call', 'Failed to stop call foreground service', {\n          roomId: this.roomId,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      });\n    } else if (this.nativeCallRuntimeActive && iosApp()) {\n      void invoke('deactivate_call_audio_session').catch((error) => {\n        debugLog.error('call', 'Failed to deactivate call audio session', {\n          roomId: this.roomId,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      });\n    }\n    this.nativeCallRuntimeActive = false;\n    this.disposables.forEach((disposable) => {\n      disposable();\n    });\n    this.call.stop();\n    this.container.removeChild(this.iframe);\n    this.control.dispose();\n\n    // Listener removal is handled by the disposables pushed in start().\n    // Clear internal state\n    this.readUpToMap = {};\n    this.eventsToFeed = new WeakSet<MatrixEvent>();\n  }\n\n  private onCallJoined(evt: CustomEvent): void {\n    evt.preventDefault();\n    this.call.transport.reply(evt.detail as IWidgetApiRequest, {});\n    debugLog.info('call', 'Call joined', { roomId: this.roomId });\n    this.joined = true;\n    this.startNativeCallRuntime();\n    this.applyStyles();\n    this.control.startObserving();\n  }\n\n  private startNativeCallRuntime(): void {\n    if (!this.joined || !this.initialMediaStateReceived || this.nativeCallRuntimeActive) return;\n\n    if (isAndroidTauri()) {\n      this.nativeCallRuntimeActive = true;\n      void invoke('start_call_foreground_service').catch((error) => {\n        this.nativeCallRuntimeActive = false;\n        debugLog.error('call', 'Failed to start call foreground service', {\n          roomId: this.roomId,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      });\n    } else if (iosApp()) {\n      this.nativeCallRuntimeActive = true;\n      void invoke('activate_call_audio_session').catch((error) => {\n        this.nativeCallRuntimeActive = false;\n        debugLog.error('call', 'Failed to activate call audio session', {\n          roomId: this.roomId,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      });\n    }\n  }\n\n  private applyStyles(): void {\n    const doc = this.document;\n    if (!doc) return;\n\n    doc.documentElement.style.setProperty('background', 'none', 'important');\n    doc.body.style.setProperty('background', 'none', 'important');\n\n    // Copy stylesheets from parent just in case\n    const syncStyles = () => {\n      Array.from(document.styleSheets).forEach((sheet) => {\n        try {\n          if (!sheet.href) {\n            const rules = Array.from(sheet.cssRules)\n              .map((r) => r.cssText)\n              .join('\\n');\n            if (rules && !doc.head.innerHTML.includes(rules.substring(0, 50))) {\n              const styleEl = doc.createElement('style');\n              styleEl.textContent = rules;\n              doc.head.append(styleEl);\n            }\n          } else {\n            const link = doc.createElement('link');\n            link.rel = 'stylesheet';\n            link.href = sheet.href;\n            doc.head.append(link);\n          }\n        } catch {\n          // Ignore CORS errors\n        }\n      });\n    };\n    syncStyles();\n\n    const updateInjectedCSS = () => {\n      const styleId = 'sable-call-embed-styles';\n      let styleEl = doc.getElementById(styleId);\n      if (!styleEl) {\n        styleEl = doc.createElement('style');\n        styleEl.id = styleId;\n        doc.head.append(styleEl);\n      }\n\n      const appFontFamily = window.getComputedStyle(document.body).fontFamily;\n\n      styleEl.textContent = `\n        :root {\n          /* Backgrounds */\n          --cpd-color-bg-canvas-default: ${resolveCssVar(color.Background.Container)} !important;\n          --cpd-color-bg-canvas-solid: ${resolveCssVar(color.Background.Container)} !important;\n          --cpd-color-bg-surface-default: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n          --cpd-color-bg-surface-solid: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n          --cpd-color-bg-surface-raised: ${resolveCssVar(color.Surface.Container)} !important;\n          \n          /* Soft Fills for normal buttons */\n          --cpd-color-bg-subtle-primary: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n          --cpd-color-bg-subtle-secondary: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n          --cpd-color-bg-action-secondary-rest: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n          --cpd-color-bg-action-secondary-hovered: ${resolveCssVar(color.SurfaceVariant.ContainerHover)} !important;\n          --cpd-color-bg-action-secondary-pressed: ${resolveCssVar(color.SurfaceVariant.ContainerActive)} !important;\n\n          --cpd-color-bg-action-tertiary-rest: transparent !important;\n          --cpd-color-bg-action-tertiary-hovered: ${resolveCssVar(color.SurfaceVariant.ContainerHover)} !important;\n          --cpd-color-bg-action-tertiary-pressed: ${resolveCssVar(color.SurfaceVariant.ContainerActive)} !important;\n          \n          /* Soft Fills for primary/active buttons */\n          --cpd-color-bg-action-primary-rest: ${resolveCssVar(color.Primary.Container)} !important;\n          --cpd-color-bg-action-primary-hovered: ${resolveCssVar(color.Primary.ContainerHover)} !important;\n          --cpd-color-bg-action-primary-pressed: ${resolveCssVar(color.Primary.ContainerActive)} !important;\n          \n          /* Soft Fills for critical buttons (Hangup) */\n          --cpd-color-bg-critical-primary: ${resolveCssVar(color.Critical.Main)} !important;\n          --cpd-color-bg-action-critical-rest: ${resolveCssVar(color.Critical.Main)} !important;\n          --cpd-color-bg-action-critical-hovered: ${resolveCssVar(color.Critical.MainHover)} !important;\n          --cpd-color-bg-action-critical-pressed: ${resolveCssVar(color.Critical.MainActive)} !important;\n          \n          /* Borders */\n          --cpd-color-border-interactive-primary: ${resolveCssVar(color.Primary.Main)} !important;\n          --cpd-color-border-interactive-secondary: ${resolveCssVar(color.Surface.ContainerLine)} !important;\n          --cpd-color-border-focused: ${resolveCssVar(color.Primary.Main)} !important;\n\n          /* Typography and Icons */\n          --cpd-font-family-sans: ${appFontFamily} !important;\n          --cpd-color-text-primary: ${resolveCssVar(color.Background.OnContainer)} !important;\n          --cpd-color-text-secondary: ${resolveCssVar(color.Surface.OnContainer)} !important;\n          --cpd-color-icon-primary: ${resolveCssVar(color.Background.OnContainer)} !important;\n          --cpd-color-icon-secondary: ${resolveCssVar(color.Surface.OnContainer)} !important;\n          --cpd-color-icon-tertiary: ${resolveCssVar(color.SurfaceVariant.OnContainer)} !important;\n          \n          /* Icons/Text on Soft Fill Backgrounds */\n          --cpd-color-icon-on-solid-primary: ${resolveCssVar(color.Primary.OnContainer)} !important;\n          --cpd-color-text-on-solid-primary: ${resolveCssVar(color.Primary.OnContainer)} !important;\n          --cpd-color-icon-critical-primary: ${resolveCssVar(color.Critical.OnMain)} !important;\n          --cpd-color-text-critical-primary: ${resolveCssVar(color.Critical.OnMain)} !important;\n          \n          /* Accent/Primary Colors for Checkboxes/Switches */\n          --cpd-color-text-action-accent: ${resolveCssVar(color.Primary.Main)} !important;\n          --stopgap-color-on-solid-accent: ${resolveCssVar(color.Primary.OnMain)} !important;\n        }\n\n        /* Enforce rounded rectangles instead of circles */\n        [class*=\"button_\"], [class*=\"Button_\"], button {\n          border-radius: ${resolveCssVar(config.radii.R400)} !important;\n        }\n\n        /* Make the main room background transparent to inherit CallView's background */\n        [class*=\"_inRoom_\"] {\n          background: transparent !important;\n        }\n        \n        /* Completely dismantle Element Call's grouping pills to match Sable's discrete buttons */\n        [data-testid=\"footer-container\"] [class*=\"_container_\"] {\n          background-color: transparent !important;\n          border: none !important;\n          gap: ${resolveCssVar(config.space.S100)} !important;\n        }\n        \n        /* Explicitly style normal primary (muted) buttons to use Sable's colors and disable Compound's overlays */\n        [class*=\"button_\"][data-kind=\"primary\"]:not([class*=\"_destructive_\"]), button[data-kind=\"primary\"]:not([class*=\"_destructive_\"]) {\n          background-color: ${resolveCssVar(color.Primary.Container)} !important;\n          border: 1px solid ${resolveCssVar(color.Primary.ContainerLine)} !important;\n          color: ${resolveCssVar(color.Primary.OnContainer)} !important;\n          box-sizing: border-box !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"]:not([class*=\"_destructive_\"]) svg,\n        [class*=\"button_\"][data-kind=\"primary\"]:not([class*=\"_destructive_\"]) *,\n        button[data-kind=\"primary\"]:not([class*=\"_destructive_\"]) svg,\n        button[data-kind=\"primary\"]:not([class*=\"_destructive_\"]) * {\n          color: ${resolveCssVar(color.Primary.OnContainer)} !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"]:not([class*=\"_destructive_\"])::before,\n        [class*=\"button_\"][data-kind=\"primary\"]:not([class*=\"_destructive_\"])::after,\n        button[data-kind=\"primary\"]:not([class*=\"_destructive_\"])::before,\n        button[data-kind=\"primary\"]:not([class*=\"_destructive_\"])::after {\n          background-color: transparent !important;\n          border: none !important;\n          box-sizing: border-box !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"]:not([class*=\"_destructive_\"]):hover,\n        button[data-kind=\"primary\"]:not([class*=\"_destructive_\"]):hover {\n          background-color: ${resolveCssVar(color.Primary.ContainerHover)} !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"]:not([class*=\"_destructive_\"]):active,\n        button[data-kind=\"primary\"]:not([class*=\"_destructive_\"]):active {\n          background-color: ${resolveCssVar(color.Primary.ContainerActive)} !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"][class*=\"_destructive_\"] {\n          background-color: ${resolveCssVar(color.Critical.Main)} !important;\n          border: 1px solid ${resolveCssVar(color.Critical.MainLine)} !important;\n          color: ${resolveCssVar(color.Critical.OnMain)} !important;\n          box-sizing: border-box !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"][class*=\"_destructive_\"] svg,\n        [class*=\"button_\"][data-kind=\"primary\"][class*=\"_destructive_\"] * {\n          color: ${resolveCssVar(color.Critical.OnMain)} !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"][class*=\"_destructive_\"]::before,\n        [class*=\"button_\"][data-kind=\"primary\"][class*=\"_destructive_\"]::after {\n          background-color: transparent !important;\n          border: 1px solid ${resolveCssVar(color.Critical.MainLine)} !important;\n          box-sizing: border-box !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"][class*=\"_destructive_\"]:hover {\n          background-color: ${resolveCssVar(color.Critical.MainHover)} !important;\n        }\n        [class*=\"button_\"][data-kind=\"primary\"][class*=\"_destructive_\"]:active {\n          background-color: ${resolveCssVar(color.Critical.MainActive)} !important;\n        }\n        \n        /* Fix secondary buttons inside the footer to have Sable's exact container styling */\n        [data-testid=\"footer-container\"] button[data-kind=\"secondary\"],\n        [data-testid=\"footer-container\"] button[aria-haspopup=\"menu\"] {\n          background: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n          border: 1px solid ${resolveCssVar(color.Surface.ContainerLine)} !important;\n          color: var(--cpd-color-icon-secondary) !important;\n        }\n        \n        /* Disable Compound's hover backgrounds on the pseudo-elements for these buttons so our background shows through */\n        [data-testid=\"footer-container\"] button[data-kind=\"secondary\"]::before,\n        [data-testid=\"footer-container\"] button[aria-haspopup=\"menu\"]::before {\n          background: none !important;\n        }\n\n        [data-testid=\"footer-container\"] button[data-kind=\"secondary\"]:hover,\n        [data-testid=\"footer-container\"] button[aria-haspopup=\"menu\"]:hover {\n          background: ${resolveCssVar(color.SurfaceVariant.ContainerHover)} !important;\n        }\n        \n        [class*=\"button_\"]::before, [class*=\"Button_\"]::before, button::before,\n        [class*=\"button_\"]::after, [class*=\"Button_\"]::after, button::after,\n        [data-testid=\"footer-container\"] [class*=\"_container_\"]::before,\n        [data-testid=\"footer-container\"] [class*=\"_container_\"]::after {\n          border-radius: inherit !important;\n        }\n        \n        /* Tile styling */\n        [class*=\"_tile_\"] {\n          border-radius: ${resolveCssVar(config.radii.R500)} !important;\n        }\n\n        [class*=\"_tile_\"][class*=\"_speaking_\"]::before {\n          background: ${resolveCssVar(color.Primary.Main)} !important;\n          opacity: 0.8 !important;\n        }\n\n        /* Avatar background */\n        [class*=\"_tile_\"] > [class*=\"_bg_\"] {\n          background-color: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n        }\n        \n        /* Remove the dark gradient overlay from the tile foreground */\n        [class*=\"_fg_\"] {\n          background: none !important;\n        }\n        \n        /* Ensure the options button in the tile remains visible without the gradient */\n        [class*=\"_fg_\"] button {\n          background-color: ${resolveCssVar(color.Surface.Container)} !important;\n          border: 1px solid ${resolveCssVar(color.Surface.ContainerLine)} !important;\n          color: ${resolveCssVar(color.Surface.OnContainer)} !important;\n        }\n        [class*=\"_fg_\"] button:hover {\n          background-color: ${resolveCssVar(color.Surface.ContainerHover)} !important;\n        }\n\n        /* Nametag styling */\n        [class*=\"_nameTag_\"] {\n          background-color: ${resolveCssVar(color.Surface.Container)} !important;\n          border: 1px solid ${resolveCssVar(color.Surface.ContainerLine)} !important;\n          color: ${resolveCssVar(color.Surface.OnContainer)} !important;\n          border-radius: ${resolveCssVar(config.radii.R300)} !important;\n        }\n\n        /* Settings 3-dots button overrides */\n        [data-testid=\"settings-bottom-left\"] {\n          --cpd-icon-button-size: 48px !important;\n          background-color: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n          border-radius: ${resolveCssVar(config.radii.R400)} !important;\n        }\n\n        /* Layout switcher overrides */\n        fieldset[class*=\"_toggle_\"] {\n          background-color: ${resolveCssVar(color.SurfaceVariant.Container)} !important;\n          border: 1px solid ${resolveCssVar(color.Surface.ContainerLine)} !important;\n          border-radius: ${resolveCssVar(config.radii.R400)} !important;\n        }\n        fieldset[class*=\"_toggle_\"] input:checked + svg {\n          background-color: ${resolveCssVar(color.Primary.Container)} !important;\n          color: ${resolveCssVar(color.Primary.OnContainer)} !important;\n          border-radius: ${resolveCssVar(config.radii.R300)} !important;\n        }\n\n        /* Overlay styling */\n        [class*=\"_overlay_\"] {\n          background-color: var(--cpd-color-bg-canvas-default) !important;\n        }\n\n        /* Slider overrides */\n        [role=\"slider\"], [class*=\"handle\"] {\n          background-color: ${resolveCssVar(color.Primary.Main)} !important;\n          box-shadow: 0 0 0 2px ${resolveCssVar(color.Surface.Container)} !important;\n        }\n        [class*=\"highlight\"] {\n          background-color: ${resolveCssVar(color.Primary.Main)} !important;\n        }\n        [class*=\"track\"] {\n          background-color: ${resolveCssVar(color.Surface.ContainerLine)} !important;\n          outline: none !important;\n        }\n\n        /* Scrollbars */\n        ::-webkit-scrollbar {\n          width: 16px;\n          height: 16px;\n        }\n        ::-webkit-scrollbar-track,\n        ::-webkit-scrollbar-thumb {\n          background-color: transparent;\n          border-radius: ${resolveCssVar(config.radii.Pill)} !important;\n          border: 4px solid transparent;\n          background-clip: padding-box;\n        }\n        ::-webkit-scrollbar-thumb {\n          min-height: 35px;\n        }\n        :hover::-webkit-scrollbar-thumb, :has(*:hover)::-webkit-scrollbar-thumb {\n          background-color: ${resolveCssVar(color.SurfaceVariant.ContainerLine)} !important;\n        }\n        :hover::-webkit-scrollbar-track, :has(*:hover)::-webkit-scrollbar-track {\n          background-color: ${resolveCssVar(color.SurfaceVariant.ContainerActive)} !important;\n        }\n\n        /* Modal Dialog overrides */\n        [role=\"dialog\"] {\n          border-radius: ${resolveCssVar(config.radii.R400)} !important;\n        }\n\n        /* Tooltips and Menus */\n        [role=\"tooltip\"], .cpd-tooltip, [data-radix-popper-content-wrapper] > div, div[class*=\"_tooltip_\"] {\n          background-color: ${resolveCssVar(color.Surface.Container)} !important;\n          color: ${resolveCssVar(color.Surface.OnContainer)} !important;\n          border: 1px solid ${resolveCssVar(color.Surface.ContainerLine)} !important;\n          border-radius: ${resolveCssVar(config.radii.R400)} !important;\n          padding: ${resolveCssVar(config.space.S200)} ${resolveCssVar(config.space.S300)} !important;\n          font-size: ${resolveCssVar(config.fontSize.B300)} !important;\n          box-shadow: 0 4px 6px ${resolveCssVar(color.Other.Shadow)} !important;\n        }\n        \n        /* Ensure tooltip text inside wrapper inherits correctly */\n        [role=\"tooltip\"] *, .cpd-tooltip *, [data-radix-popper-content-wrapper] * {\n          color: inherit !important;\n        }\n        /* Use parent app's font for emojis/reactions */\n        [class*=\"reaction\" i], [class*=\"emoji\" i], [class*=\"reaction\" i] * {\n          font-family: ${appFontFamily} !important;\n        }\n      `;\n      if (doc.head.lastChild !== styleEl) doc.head.appendChild(styleEl);\n    };\n\n    // Sync theme classes from parent html/body\n    const syncThemeClasses = () => {\n      doc.documentElement.className = document.documentElement.className;\n      doc.body.className = document.body.className;\n\n      const theme = document.documentElement.getAttribute('data-theme');\n      if (theme) doc.documentElement.setAttribute('data-theme', theme);\n\n      // Re-evaluate vars and update CSS on theme change\n      updateInjectedCSS();\n    };\n\n    // Initial injection\n    syncThemeClasses();\n\n    const observer = new MutationObserver(syncThemeClasses);\n    observer.observe(document.documentElement, {\n      attributes: true,\n      attributeFilter: ['class', 'data-theme', 'style'],\n    });\n    observer.observe(document.body, {\n      attributes: true,\n      attributeFilter: ['class', 'data-theme', 'style'],\n    });\n    observer.observe(document.head, { childList: true, subtree: true });\n    this.disposables.push(() => observer.disconnect());\n\n    const iframeHeadObserver = new MutationObserver(syncThemeClasses);\n    iframeHeadObserver.observe(doc.head, { childList: true });\n    this.disposables.push(() => iframeHeadObserver.disconnect());\n  }\n\n  private onEvent(ev: MatrixEvent): void {\n    this.mx.decryptEventIfNeeded(ev);\n    this.feedEvent(ev);\n  }\n\n  private onEventDecrypted(ev: MatrixEvent): void {\n    this.feedEvent(ev);\n  }\n\n  private onStateUpdate(ev: MatrixEvent): void {\n    if (this.call === null) return;\n    const raw = ev.getEffectiveEvent();\n    this.call.feedStateUpdate(raw as IRoomEvent).catch((e) => {\n      console.error('Error sending state update to widget: ', e);\n    });\n  }\n\n  private feedStateUpdateForTimelineEvent(ev: MatrixEvent): void {\n    if (this.call === null) return;\n    if (!ev.isState()) return;\n    const raw = ev.getEffectiveEvent() as IRoomEvent | undefined;\n    if (raw === undefined) return;\n    this.call.feedStateUpdate(raw).catch((e) => {\n      console.error('Error sending state update to widget: ', e);\n    });\n  }\n\n  private async onToDeviceEvent(ev: MatrixEvent): Promise<void> {\n    await this.mx.decryptEventIfNeeded(ev);\n    if (ev.isDecryptionFailure()) return;\n    await this.call?.feedToDevice(ev.getEffectiveEvent() as IRoomEvent, ev.isEncrypted());\n  }\n\n  /**\n   * Determines whether the event has a relation to an unknown parent.\n   */\n  private relatesToUnknown(ev: MatrixEvent): boolean {\n    // Replies to unknown events don't count\n    if (!ev.relationEventId || ev.replyEventId) return false;\n    const room = this.mx.getRoom(ev.getRoomId());\n    return room === null || !room.findEventById(ev.relationEventId);\n  }\n\n  /**\n   * Advances the \"read up to\" marker for a room to a certain event. No-ops if\n   * the event is before the marker.\n   * @returns Whether the \"read up to\" marker was advanced.\n   */\n  private advanceReadUpToMarker(ev: MatrixEvent): boolean {\n    const evId = ev.getId();\n    if (evId === undefined) return false;\n    const roomId = ev.getRoomId();\n    if (roomId === undefined) return false;\n    const room = this.mx.getRoom(roomId);\n    if (room === null) return false;\n\n    const upToEventId = this.readUpToMap[ev.getRoomId()!];\n    if (!upToEventId) {\n      // There's no marker yet; start it at this event\n      this.readUpToMap[roomId] = evId;\n      return true;\n    }\n\n    // Small optimization for exact match (skip the search)\n    if (upToEventId === evId) return false;\n\n    // Timelines are most recent last, so reverse the order and limit ourselves to 100 events\n    // to avoid overusing the CPU.\n    const timeline = room.getLiveTimeline();\n    const events = [...timeline.getEvents()].toReversed().slice(0, 100);\n    function isRelevantTimelineEvent(timelineEvent: MatrixEvent): boolean {\n      return timelineEvent.getId() === upToEventId || timelineEvent.getId() === ev.getId();\n    }\n    const possibleMarkerEv = events.find(isRelevantTimelineEvent);\n    if (possibleMarkerEv?.getId() === upToEventId) {\n      // The event must be somewhere before the \"read up to\" marker\n      return false;\n    }\n    if (possibleMarkerEv?.getId() === ev.getId()) {\n      // The event is after the marker; advance it\n      this.readUpToMap[roomId] = evId;\n      return true;\n    }\n\n    // We can't say for sure whether the widget has seen the event\n    // just assume that it has\n    return false;\n  }\n\n  /**\n   * Determines whether the event comes from a room that we've been invited to\n   * (in which case we likely don't have the full timeline).\n   */\n  private isFromInvite(ev: MatrixEvent): boolean {\n    const room = this.mx.getRoom(ev.getRoomId());\n    return room?.getMyMembership() === KnownMembership.Invite;\n  }\n\n  private feedEvent(ev: MatrixEvent): void {\n    if (this.call === null) return;\n    if (\n      // If we had decided earlier to feed this event to the widget, but\n      // it just wasn't ready, give it another try\n      this.eventsToFeed.delete(ev) ||\n      // Skip marker timeline check for events with relations to unknown parent because these\n      // events are not added to the timeline here and will be ignored otherwise:\n      // https://github.com/matrix-org/matrix-js-sdk/blob/d3dfcd924201d71b434af3d77343b5229b6ed75e/src/models/room.ts#L2207-L2213\n      this.relatesToUnknown(ev) ||\n      // Skip marker timeline check for rooms where membership is\n      // 'invite', otherwise the membership event from the invitation room\n      // will advance the marker and new state events will not be\n      // forwarded to the widget.\n      this.isFromInvite(ev) ||\n      // Check whether this event would be before or after our \"read up to\" marker. If it's\n      // before, or we can't decide, then we assume the widget will have already seen the event.\n      // If the event is after, or we don't have a marker for the room,\n      // then the marker will advance and we'll send it through.\n      // This approach of \"read up to\" prevents widgets receiving decryption spam from startup or\n      // receiving ancient events from backfill and such.\n      this.advanceReadUpToMarker(ev)\n    ) {\n      // If the event is still being decrypted, remember that we want to\n      // feed it to the widget (even if not strictly in the order given by\n      // the timeline) and get back to it later\n      if (ev.isBeingDecrypted() || ev.isDecryptionFailure()) {\n        this.eventsToFeed.add(ev);\n      } else {\n        const raw = ev.getEffectiveEvent();\n        this.call.feedEvent(raw as IRoomEvent).catch((e) => {\n          console.error('Error sending event to widget: ', e);\n        });\n        this.feedStateUpdateForTimelineEvent(ev);\n      }\n    } else if (ev.isState()) {\n      this.feedStateUpdateForTimelineEvent(ev);\n    }\n  }\n\n  public listenAction(type: string, callback: (event: CustomEvent<unknown>) => void) {\n    return this.listenEvent(`action:${type}`, callback as (event: unknown) => void);\n  }\n\n  public listenEvent(type: string, callback: (event: unknown) => void) {\n    this.call.on(type, callback);\n    return () => {\n      this.call.off(type, callback);\n    };\n  }\n}\n","import type { ClientWidgetApi } from 'matrix-widget-api';\nimport { useEffect, useState } from 'react';\nimport type { CallControl } from './CallControl';\nimport { CallControlEvent } from './CallControl';\nimport type { CallControlState } from './CallControlState';\n\nexport const useClientWidgetApiEvent = <T>(\n  api: ClientWidgetApi | undefined,\n  type: string,\n  callback: (event: CustomEvent<T>) => void\n) => {\n  useEffect(() => {\n    api?.on(`action:${type}`, callback);\n    return () => {\n      api?.off(`action:${type}`, callback);\n    };\n  }, [api, type, callback]);\n};\n\nexport const useCallControlState = (control: CallControl): CallControlState => {\n  const [state, setState] = useState(control.getState());\n\n  useEffect(() => {\n    const handleUpdate = () => {\n      setState(control.getState());\n    };\n    control.on(CallControlEvent.StateUpdate, handleUpdate);\n    return () => {\n      control.off(CallControlEvent.StateUpdate, handleUpdate);\n    };\n  }, [control]);\n\n  return state;\n};\n","import { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { isLocalImportThemeUrl } from '../theme/localImportUrls';\nimport { onDarkFontWeight, onLightFontWeight } from '../../config.css';\nimport { darkTheme, lightTheme } from '../../colors.css';\n\nexport enum ThemeKind {\n  Light = 'light',\n  Dark = 'dark',\n}\n\nexport type Theme = {\n  id: string;\n  kind: ThemeKind;\n  classNames: string[];\n  remoteFullUrl?: string;\n};\n\nexport const REMOTE_THEME_ID = 'sable-remote-theme';\n\nconst isRemoteLoadedThemeUrl = (u: string | undefined): u is string => {\n  if (!u) return false;\n  const t = u.trim();\n  return /^https:\\/\\//i.test(t) || isLocalImportThemeUrl(t);\n};\n\nfunction parseRemoteKind(value: 'light' | 'dark' | undefined, fallback: ThemeKind): ThemeKind {\n  if (value === 'dark') return ThemeKind.Dark;\n  if (value === 'light') return ThemeKind.Light;\n  return fallback;\n}\n\nfunction makeRemoteTheme(url: string, kind: ThemeKind): Theme {\n  const fw = kind === ThemeKind.Dark ? onDarkFontWeight : onLightFontWeight;\n  const kindClass = kind === ThemeKind.Dark ? 'sable-remote-kind-dark' : 'sable-remote-kind-light';\n  const legacyCssTheme = kind === ThemeKind.Dark ? 'dark-theme' : 'light-theme';\n  const veTheme = kind === ThemeKind.Dark ? darkTheme : lightTheme;\n  return {\n    id: REMOTE_THEME_ID,\n    kind,\n    classNames: ['sable-remote-theme', kindClass, legacyCssTheme, veTheme, fw],\n    remoteFullUrl: url.trim(),\n  };\n}\n\nexport const LightTheme: Theme = {\n  id: 'light-theme',\n  kind: ThemeKind.Light,\n  classNames: ['sable-remote-theme', 'light-theme', lightTheme, onLightFontWeight],\n};\n\nexport const DarkTheme: Theme = {\n  id: 'dark-theme',\n  kind: ThemeKind.Dark,\n  classNames: ['sable-remote-theme', 'dark-theme', darkTheme, onDarkFontWeight],\n};\n\nexport const useThemes = (): Theme[] => {\n  const themes: Theme[] = useMemo(() => [LightTheme, DarkTheme], []);\n\n  return themes;\n};\n\nexport const useThemeNames = (): Record<string, string> =>\n  useMemo(\n    () => ({\n      [LightTheme.id]: 'Light',\n      [DarkTheme.id]: 'Dark',\n    }),\n    []\n  );\n\nexport const useSystemThemeKind = (): ThemeKind => {\n  const darkModeQueryList = useMemo(() => window.matchMedia('(prefers-color-scheme: dark)'), []);\n  const [themeKind, setThemeKind] = useState(\n    darkModeQueryList.matches ? ThemeKind.Dark : ThemeKind.Light\n  );\n\n  useEffect(() => {\n    const handleMediaQueryChange = () => {\n      setThemeKind(darkModeQueryList.matches ? ThemeKind.Dark : ThemeKind.Light);\n    };\n\n    darkModeQueryList.addEventListener('change', handleMediaQueryChange);\n    return () => {\n      darkModeQueryList.removeEventListener('change', handleMediaQueryChange);\n    };\n  }, [darkModeQueryList, setThemeKind]);\n\n  return themeKind;\n};\n\nexport const useActiveTheme = (): Theme => {\n  const systemThemeKind = useSystemThemeKind();\n  const themes = useThemes();\n  const [systemTheme] = useSetting(settingsAtom, 'useSystemTheme');\n  const [themeId] = useSetting(settingsAtom, 'themeId');\n  const [lightThemeId] = useSetting(settingsAtom, 'lightThemeId');\n  const [darkThemeId] = useSetting(settingsAtom, 'darkThemeId');\n  const [manualRemoteUrl] = useSetting(settingsAtom, 'themeRemoteManualFullUrl');\n  const [lightRemoteUrl] = useSetting(settingsAtom, 'themeRemoteLightFullUrl');\n  const [darkRemoteUrl] = useSetting(settingsAtom, 'themeRemoteDarkFullUrl');\n  const [manualRemoteKind] = useSetting(settingsAtom, 'themeRemoteManualKind');\n  const [lightRemoteKind] = useSetting(settingsAtom, 'themeRemoteLightKind');\n  const [darkRemoteKind] = useSetting(settingsAtom, 'themeRemoteDarkKind');\n\n  if (!systemTheme) {\n    if (isRemoteLoadedThemeUrl(manualRemoteUrl)) {\n      const inferred = themeId === 'dark-theme' ? ThemeKind.Dark : ThemeKind.Light;\n      return makeRemoteTheme(manualRemoteUrl, parseRemoteKind(manualRemoteKind, inferred));\n    }\n    return themes.find((theme) => theme.id === themeId) ?? LightTheme;\n  }\n\n  const isDark = systemThemeKind === ThemeKind.Dark;\n  const slotRemoteUrl = isDark ? darkRemoteUrl : lightRemoteUrl;\n  if (isRemoteLoadedThemeUrl(slotRemoteUrl)) {\n    const defaultSlotKind = isDark ? ThemeKind.Dark : ThemeKind.Light;\n    const slotKind = isDark ? darkRemoteKind : lightRemoteKind;\n    return makeRemoteTheme(slotRemoteUrl, parseRemoteKind(slotKind, defaultSlotKind));\n  }\n\n  return isDark\n    ? (themes.find((theme) => theme.id === darkThemeId) ?? DarkTheme)\n    : (themes.find((theme) => theme.id === lightThemeId) ?? LightTheme);\n};\n\nconst ThemeContext = createContext<Theme | null>(null);\nexport const ThemeContextProvider = ThemeContext.Provider;\n\nexport const useTheme = (): Theme => {\n  const theme = useContext(ThemeContext);\n  if (!theme) {\n    throw new Error('No theme provided!');\n  }\n\n  return theme;\n};\n","export type CallOwnerKind = 'element' | 'livekit-js' | 'livekit-mobile';\n\nexport type CallOwnerLease = {\n  kind: CallOwnerKind;\n  roomId: string;\n  release: () => void;\n};\n\nlet activeOwner: CallOwnerLease | undefined;\n\nexport const acquireCallOwner = (\n  kind: CallOwnerKind,\n  roomId: string\n): CallOwnerLease | undefined => {\n  if (activeOwner) return undefined;\n\n  let released = false;\n  const lease: CallOwnerLease = {\n    kind,\n    roomId,\n    release: () => {\n      if (released || activeOwner !== lease) return;\n      released = true;\n      activeOwner = undefined;\n    },\n  };\n  activeOwner = lease;\n  return lease;\n};\n\nexport const getActiveCallOwner = (): Pick<CallOwnerLease, 'kind' | 'roomId'> | undefined =>\n  activeOwner;\n\nexport const releaseCallOwner = (kind: CallOwnerKind, roomId: string): void => {\n  if (activeOwner?.kind === kind && activeOwner.roomId === roomId) activeOwner.release();\n};\n\nexport const resetCallOwnerForTests = (): void => {\n  activeOwner = undefined;\n};\n","import { atom } from 'jotai';\nimport * as Sentry from '@sentry/react';\nimport type { CallEmbed } from '../plugins/call';\nimport type { CallEmbedStartError } from '$plugins/call/callEmbedError';\nimport { releaseCallOwner } from './callOwner';\n\nconst baseCallEmbedAtom = atom<CallEmbed | undefined>(undefined);\nconst baseCallEmbedStartErrorAtom = atom<CallEmbedStartError | null>(null);\n\n// Tracks when the active call embed was created, for lifetime measurement.\nlet embedCreatedAt: number | null = null;\n\nexport const callEmbedAtom = atom<CallEmbed | undefined, [CallEmbed | undefined], void>(\n  (get) => get(baseCallEmbedAtom),\n  (get, set, callEmbed) => {\n    const prevCallEmbed = get(baseCallEmbedAtom);\n    if (callEmbed === prevCallEmbed) return;\n\n    if (prevCallEmbed) {\n      if (embedCreatedAt !== null) {\n        Sentry.metrics.distribution(\n          'sable.call.embed_lifetime_ms',\n          performance.now() - embedCreatedAt,\n          { attributes: { reason: callEmbed === undefined ? 'disposed' : 'replaced' } }\n        );\n        embedCreatedAt = null;\n      }\n      prevCallEmbed.dispose();\n      releaseCallOwner('element', prevCallEmbed.roomId);\n    }\n\n    if (callEmbed !== undefined) {\n      embedCreatedAt = performance.now();\n    }\n\n    if (callEmbed === undefined) {\n      set(baseCallEmbedStartErrorAtom, null);\n    }\n\n    set(baseCallEmbedAtom, callEmbed);\n  }\n);\n\nexport const callEmbedStartErrorAtom = atom<\n  CallEmbedStartError | null,\n  [CallEmbedStartError | null],\n  void\n>(\n  (get) => get(baseCallEmbedStartErrorAtom),\n  (_get, set, nextError) => {\n    set(baseCallEmbedStartErrorAtom, nextError);\n  }\n);\n\nexport const callChatAtom = atom(false);\n\nexport type IncomingCallNotificationType = 'ring' | 'notification';\nexport type IncomingCallIntentKind = 'audio' | 'video';\n\nexport type IncomingCall = {\n  roomId: string;\n  notificationEventId: string;\n  refEventId: string;\n  senderId: string;\n  senderTs: number;\n  expiresAt: number;\n  notificationType: IncomingCallNotificationType;\n  intentKind: IncomingCallIntentKind;\n  intentRaw?: string;\n  isDirect: boolean;\n};\n\ntype AutoJoinCallIntent = {\n  roomId: string;\n  video: boolean;\n};\n\nexport const incomingCallAtom = atom<IncomingCall | null>(null);\nexport const autoJoinCallIntentAtom = atom<AutoJoinCallIntent | null>(null);\nexport const mutedCallRoomIdAtom = atom<string | null>(null);\nexport const callSoundBlockedAtom = atom(false);\n","import type { ReactElement, ReactNode } from 'react';\nimport { createContext, useContext, useEffect, useState } from 'react';\nimport { MatrixRTCSessionManagerEvents } from '$types/matrix-sdk';\nimport { useMatrixClient } from './useMatrixClient';\n\n/**\n * The set of room IDs that currently have an active MatrixRTC session.\n * Updated by a single global subscription to `mx.matrixRTC`, so N consumers\n * share one listener pair instead of each adding their own (which exceeded\n * Node's default EventEmitter limit of 10 when 11+ rooms were visible).\n */\ntype ActiveRTCSessionIds = ReadonlySet<string>;\n\nconst MatrixRTCSessionContext = createContext<ActiveRTCSessionIds>(new Set());\n\nexport function MatrixRTCSessionProvider({ children }: { children: ReactNode }): ReactElement {\n  const mx = useMatrixClient();\n  const [activeRoomIds, setActiveRoomIds] = useState<ActiveRTCSessionIds>(new Set());\n\n  useEffect(() => {\n    const handleStart = (roomId: string) => {\n      setActiveRoomIds((prev) => {\n        if (prev.has(roomId)) return prev;\n        const next = new Set(prev);\n        next.add(roomId);\n        return next;\n      });\n    };\n    const handleEnd = (roomId: string) => {\n      setActiveRoomIds((prev) => {\n        if (!prev.has(roomId)) return prev;\n        const next = new Set(prev);\n        next.delete(roomId);\n        return next;\n      });\n    };\n\n    mx.matrixRTC.on(MatrixRTCSessionManagerEvents.SessionStarted, handleStart);\n    mx.matrixRTC.on(MatrixRTCSessionManagerEvents.SessionEnded, handleEnd);\n\n    return () => {\n      mx.matrixRTC.off(MatrixRTCSessionManagerEvents.SessionStarted, handleStart);\n      mx.matrixRTC.off(MatrixRTCSessionManagerEvents.SessionEnded, handleEnd);\n    };\n  }, [mx]);\n\n  return (\n    <MatrixRTCSessionContext.Provider value={activeRoomIds}>\n      {children}\n    </MatrixRTCSessionContext.Provider>\n  );\n}\n\n/**\n * Returns the set of room IDs that currently have an active MatrixRTC session.\n * Backed by a single global subscription (see MatrixRTCSessionProvider).\n */\nexport function useActiveRTCSessionIds(): ActiveRTCSessionIds {\n  return useContext(MatrixRTCSessionContext);\n}\n","import type { Room } from '$types/matrix-sdk';\nimport { MatrixRTCSession, MatrixRTCSessionEvent } from '$types/matrix-sdk';\nimport type { CallMembership } from '$types/matrix-sdk';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useActiveRTCSessionIds } from './useMatrixRTCSession';\n\nexport const useCallSession = (room: Room): MatrixRTCSession => {\n  const mx = useMatrixClient();\n  const activeRoomIds = useActiveRTCSessionIds();\n  // Re-derive the session whenever the active-session set changes. The returned\n  // session object is stable across renders unless the set changes.\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  return useMemo(() => mx.matrixRTC.getRoomSession(room), [mx, room, activeRoomIds]);\n};\n\nexport const useCallMembers = (room: Room, session: MatrixRTCSession): CallMembership[] => {\n  const [memberships, setMemberships] = useState<CallMembership[]>([]);\n\n  useEffect(() => {\n    const updateMemberships = () => {\n      MatrixRTCSession.sessionMembershipsForSlot(room, session.slotDescription).then(\n        setMemberships\n      );\n    };\n\n    updateMemberships();\n\n    session.on(MatrixRTCSessionEvent.MembershipsChanged, updateMemberships);\n    return () => {\n      session.removeListener(MatrixRTCSessionEvent.MembershipsChanged, updateMemberships);\n    };\n  }, [session, room]);\n\n  return memberships;\n};\n\nexport const useCallMembersChange = (session: MatrixRTCSession, callback: () => void): void => {\n  useEffect(() => {\n    session.on(MatrixRTCSessionEvent.MembershipsChanged, callback);\n    return () => {\n      session.removeListener(MatrixRTCSessionEvent.MembershipsChanged, callback);\n    };\n  }, [session, callback]);\n};\n","import { Track, type LocalParticipant, type TrackPublishOptions } from 'livekit-client';\n\ntype CameraEnabledOptions = {\n  deviceId?: string;\n  resolution?: { width: number; height: number; frameRate?: number };\n};\n\ntype SetCameraEnabled = (\n  enabled: boolean,\n  options?: CameraEnabledOptions,\n  publishOptions?: TrackPublishOptions\n) => Promise<unknown>;\n\nexport type WebKitCameraOverride = SetCameraEnabled & { dispose: () => void };\n\nconst canvasWidth = 960;\nconst canvasHeight = 540;\nconst captureFps = 15;\n\n/**\n * WebKitGTK's GStreamer WebRTC backend sends black video when the camera\n * only exposes image/jpeg (MJPEG): the capture pipeline picks the encoded\n * format and the outgoing VP8 encoder never receives decodable frames\n * (WebKit PR #9883 is still unmerged). Local preview is fine because it\n * uses a different render path.\n *\n * Workaround: capture the camera with getUserMedia, draw it to a 2D canvas\n * and publish `canvas.captureStream()` instead. WebKitGTK 2.52.5 supports\n * canvas captureStream natively; the resulting track is raw BGRA, which\n * the VP8 encoder path handles correctly.\n */\nexport function wrapWebKitCamera(localParticipant: LocalParticipant): WebKitCameraOverride {\n  let canvas: HTMLCanvasElement | undefined;\n  let drawLoop: number | undefined;\n  let sourceStream: MediaStream | undefined;\n  let sourceVideo: HTMLVideoElement | undefined;\n\n  const stopDrawing = () => {\n    if (drawLoop !== undefined) {\n      cancelAnimationFrame(drawLoop);\n      drawLoop = undefined;\n    }\n    sourceVideo?.remove();\n    sourceVideo = undefined;\n    sourceStream?.getTracks().forEach((t) => t.stop());\n    sourceStream = undefined;\n    canvas?.remove();\n    canvas = undefined;\n  };\n\n  const draw = () => {\n    const ctx = canvas?.getContext('2d');\n    if (canvas && ctx && sourceVideo) {\n      const { videoWidth, videoHeight } = sourceVideo;\n      if (videoWidth > 0 && videoHeight > 0) {\n        const scale = Math.min(canvas.width / videoWidth, canvas.height / videoHeight);\n        const width = videoWidth * scale;\n        const height = videoHeight * scale;\n        ctx.drawImage(\n          sourceVideo,\n          (canvas.width - width) / 2,\n          (canvas.height - height) / 2,\n          width,\n          height\n        );\n      }\n    }\n    drawLoop = requestAnimationFrame(draw);\n  };\n\n  const setCameraEnabled: SetCameraEnabled = async (enabled, options, publishOptions) => {\n    if (!enabled) {\n      stopDrawing();\n      const pub = localParticipant.getTrackPublication(Track.Source.Camera);\n      if (pub?.track) {\n        pub.track.stop();\n        await localParticipant.unpublishTrack(pub.track, true);\n      }\n      return undefined;\n    }\n\n    const existing = localParticipant.getTrackPublication(Track.Source.Camera);\n    if (existing?.track && canvas) {\n      await existing.unmute();\n      return existing;\n    }\n\n    // Create the real camera track (permission prompt happens here).\n    let localTracks: Awaited<ReturnType<LocalParticipant['createTracks']>>;\n    try {\n      localTracks = await localParticipant.createTracks({\n        video: options ?? true,\n      });\n    } catch (e) {\n      return Promise.reject(e);\n    }\n    const rawTrack = localTracks.find((t) => t.kind === 'video');\n    if (!rawTrack) {\n      return Promise.reject(new Error('No video track produced'));\n    }\n\n    canvas = document.createElement('canvas');\n    canvas.width = canvasWidth;\n    canvas.height = canvasHeight;\n    canvas.setAttribute('data-sable-camera', '1');\n    canvas.style.cssText =\n      'position:absolute;left:-10000px;top:0;width:960px;height:540px;pointer-events:none;';\n    document.body.appendChild(canvas);\n\n    sourceStream = new MediaStream([rawTrack.mediaStreamTrack]);\n    sourceVideo = document.createElement('video');\n    sourceVideo.muted = true;\n    sourceVideo.playsInline = true;\n    sourceVideo.srcObject = sourceStream;\n    // Do not await play(); some WebKit builds never resolve it. Draw on a\n    // timer regardless — drawImage of a not-yet-ready video is a no-op.\n    void sourceVideo.play().catch(() => {});\n    draw();\n\n    const canvasStream = canvas.captureStream(captureFps);\n    const canvasTrack = canvasStream.getVideoTracks()[0];\n    if (!canvasTrack) {\n      stopDrawing();\n      return Promise.reject(new Error('captureStream returned no track'));\n    }\n\n    return localParticipant.publishTrack(canvasTrack, {\n      ...publishOptions,\n      source: Track.Source.Camera,\n      videoCodec: 'vp8',\n      simulcast: false,\n      videoEncoding: { maxBitrate: 900_000, maxFramerate: captureFps },\n      name: 'camera-canvas',\n    });\n  };\n\n  return Object.assign(setCameraEnabled, { dispose: stopDrawing });\n}\n","import { atom } from 'jotai';\nimport type {\n  LivekitJsControllerFailure,\n  LivekitJsControllerLifecycle,\n} from '@sableclient/matrixrtc';\nimport type { Room as LivekitRoom } from 'livekit-client';\n\nexport type LivekitJsCallMedia = {\n  microphone: boolean;\n  camera: boolean;\n  sound: boolean;\n  audioDeviceId?: string;\n  videoDeviceId?: string;\n};\n\nexport type LivekitJsCallSession = {\n  roomId: string;\n  /** What the user chose on the prescreen; applied once media is ready. */\n  initialMedia: LivekitJsCallMedia;\n  lifecycle: LivekitJsControllerLifecycle;\n  failure: LivekitJsControllerFailure | null;\n  room?: LivekitRoom;\n  /** Immediate for an unencrypted room, after the Matrix key for an encrypted one. */\n  mediaReady: boolean;\n  hangup: () => Promise<void>;\n};\n\nexport const livekitJsCallAtom = atom<LivekitJsCallSession | undefined>(undefined);\n\nexport const livekitJsCallSoundAtom = atom(true);\n\n/**\n * Whether `initialMedia` has been published for the current call. The surface\n * unmounts when the user navigates out of the room while the call keeps\n * running, so this has to outlive it or coming back re-applies the prescreen\n * choice and undoes anything toggled from the call bar.\n */\nexport const livekitJsCallInitialMediaAppliedAtom = atom(false);\n\nexport const isLivekitJsCallActive = (session: LivekitJsCallSession | undefined): boolean =>\n  session?.lifecycle !== undefined &&\n  session.lifecycle !== 'idle' &&\n  session.lifecycle !== 'failed';\n\nexport const selectActiveCallSession = <Element>(\n  elementCall: Element | undefined,\n  livekitJsCall: LivekitJsCallSession | undefined\n): Element | LivekitJsCallSession | undefined => {\n  if (elementCall) return elementCall;\n  if (isLivekitJsCallActive(livekitJsCall)) return livekitJsCall;\n  return undefined;\n};\n","import { atom } from 'jotai';\nimport type { NativeCallAudioRoute } from '@sableclient/tauri-plugin-livekit-mobile';\nimport type { CallParticipant } from '@sableclient/matrixrtc';\nimport {\n  isLivekitJsCallActive,\n  livekitJsCallAtom,\n  selectActiveCallSession,\n  type LivekitJsCallSession,\n} from './livekitJsCall';\nimport { callEmbedAtom } from './callEmbed';\n\nexport type NativeCallBackend = 'livekit-mobile';\n\nexport type NativeCallLifecycle =\n  | 'starting'\n  | 'connecting'\n  | 'connected'\n  | 'reconnecting'\n  | 'error';\n\nexport type NativeCallCapabilities = {\n  camera: boolean;\n  screenShare: boolean;\n  pictureInPicture: boolean;\n  audioRoutes: boolean;\n};\n\nexport type NativeCallSession = {\n  backend: NativeCallBackend;\n  roomId: string;\n  callId: string;\n  lifecycle: NativeCallLifecycle;\n  error?: string;\n  /** Remote peers only, as the transport reports them. */\n  participants: CallParticipant[];\n  microphoneEnabled: boolean;\n  cameraEnabled: boolean;\n  screenShareEnabled: boolean;\n  capabilities?: NativeCallCapabilities;\n  /** Absent where the platform cannot publish a screen share. */\n  setScreenShareEnabled?: (enabled: boolean) => Promise<void>;\n  setMicrophoneEnabled: (enabled: boolean) => Promise<void>;\n  setCameraEnabled: (enabled: boolean) => Promise<void>;\n  switchCamera: () => Promise<void>;\n  listAudioRoutes: () => Promise<NativeCallAudioRoute[]>;\n  selectAudioRoute: (routeId: string) => Promise<void>;\n  hangup: () => Promise<void>;\n};\n\nexport const nativeCallAtom = atom<NativeCallSession | undefined>(undefined);\n\nexport const isNativeCallActive = (session: NativeCallSession | undefined): boolean =>\n  session?.lifecycle !== undefined && session.lifecycle !== 'error';\n\n/**\n * Whether any engine already owns a call. Only one may run at a time: a second\n * start would lose the call-owner lease and publish a failure of its own while\n * the first call carries on.\n */\nexport const callInProgressAtom = atom(\n  (get) =>\n    get(callEmbedAtom) !== undefined ||\n    isLivekitJsCallActive(get(livekitJsCallAtom)) ||\n    isNativeCallActive(get(nativeCallAtom))\n);\n\nexport const selectActiveCallSessionIncludingNative = <Element>(\n  elementCall: Element | undefined,\n  livekitJsCall: LivekitJsCallSession | undefined,\n  nativeCall: NativeCallSession | undefined\n): Element | LivekitJsCallSession | NativeCallSession | undefined => {\n  const selected = selectActiveCallSession(elementCall, livekitJsCall);\n  if (selected) return selected;\n  return isNativeCallActive(nativeCall) ? nativeCall : undefined;\n};\n","import { createLivekitJsController, isCallOngoing } from '@sableclient/matrixrtc';\nimport { Room as LivekitRoom, RoomEvent, type RoomOptions } from 'livekit-client';\nimport type { ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef } from 'react';\nimport { useStore } from 'jotai';\nimport type { Room } from '$types/matrix-sdk';\nimport { wrapWebKitCamera } from './canvasCamera';\nimport { isWebKitGtk } from '$utils/platform';\nimport {\n  livekitJsCallAtom,\n  livekitJsCallInitialMediaAppliedAtom,\n  livekitJsCallSoundAtom,\n  type LivekitJsCallMedia,\n} from '$state/livekitJsCall';\nimport { callInProgressAtom } from '$state/nativeCall';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { acquireCallOwner } from '$state/callOwner';\nimport { getSlidingSyncManager } from '$client/initMatrix';\nimport { fetch as appFetch } from '$utils/fetch';\n\nexport type LivekitJsCallStartOptions = {\n  room: Room;\n  dm?: boolean;\n  video?: boolean;\n  microphone?: boolean;\n  sound?: boolean;\n  audioDeviceId?: string;\n  videoDeviceId?: string;\n};\n\nexport type LivekitJsCallManager = {\n  start: (options: LivekitJsCallStartOptions) => void;\n};\n\nconst LivekitJsCallManagerContext = createContext<LivekitJsCallManager | undefined>(undefined);\n\nexport const useLivekitJsCallManager = (): LivekitJsCallManager | undefined =>\n  useContext(LivekitJsCallManagerContext);\n\ntype LivekitJsController = ReturnType<typeof createLivekitJsController>;\n\nconst webKitGtkRoomOptions = (): Partial<RoomOptions> => {\n  if (!isWebKitGtk()) return {};\n  return {\n    // WebKitGTK's gstwebrtcbin cannot handle LiveKit's v1\n    // single-peer-connection path: it crashes on offer-with-join\n    // (data channel + recvonly transceivers) and on mid reuse during\n    // republish after full restart. The v0 dual-PC path keeps a\n    // dedicated publisher and subscriber PC, which works.\n    singlePeerConnection: false,\n    // WebKit's GStreamer WebRTC crashes on RTCPeerConnection's audio\n    // enhancement lookup when the gstreamer plugin tree is not fully\n    // registered at startup.\n    audioCaptureDefaults: {\n      noiseSuppression: false,\n      echoCancellation: false,\n      autoGainControl: false,\n      voiceIsolation: false,\n    },\n    // Force a resolution the camera supports in raw YUY2 (640x480@30).\n    // At 720p+ the \"USB3.0 Capture\" HDMI card only outputs image/jpeg,\n    // and WebKitGTK's webrtcbin outgoing pipeline doesn't insert\n    // jpegdec before the VP8 encoder — producing black video.\n    // At 640x480 the camera supports video/x-raw,YUY2 natively.\n    videoCaptureDefaults: {\n      resolution: { width: 640, height: 480, frameRate: 30 },\n    },\n    // Force VP8 — gstwebrtcbin's H264 encoder (openh264) produces\n    // incompatible output with most SFUs; VP8 from gst-plugins-good\n    // is the reliable path (same choice Element Call makes).\n    publishDefaults: {\n      videoCodec: 'vp8',\n      simulcast: false,\n    },\n  };\n};\n\ntype LivekitJsCallManagerProviderProps = {\n  children?: ReactNode;\n};\n\n/**\n * Provider-level owner of the single LiveKit JS call controller. Mounted with\n * CallEmbedProvider so transient consumers (prescreen, room header, auto-join)\n * never own or disconnect the controller themselves. Owns: creation,\n * subscription -> livekitJsCallAtom, and provider-unmount disconnect.\n */\nexport function LivekitJsCallManagerProvider({ children }: LivekitJsCallManagerProviderProps) {\n  const mx = useMatrixClient();\n  const discovery = useAutoDiscoveryInfo();\n  const store = useStore();\n  const roomIdRef = useRef<string | undefined>(undefined);\n  const initialMediaRef = useRef<LivekitJsCallMedia>({\n    microphone: true,\n    camera: false,\n    sound: true,\n  });\n  const controllerRef = useRef<LivekitJsController | undefined>(undefined);\n  const generationRef = useRef(0);\n\n  // Create and expose the controller synchronously during render so child\n  // passive effects (e.g. AutoJoinManager calling start()) always see the\n  // current controller before the provider's own subscription effect runs.\n  const controller = useMemo(() => {\n    generationRef.current += 1;\n    return createLivekitJsController({\n      acquireOwner: (kind, roomId) =>\n        kind === 'livekit-js' ? acquireCallOwner(kind, roomId) : undefined,\n      request: appFetch,\n      subscribeToCallRoom: (roomId) => getSlidingSyncManager(mx)?.subscribeToCallRoom(roomId),\n      createRoom: (options) => {\n        const room = new LivekitRoom({ ...options, ...webKitGtkRoomOptions() });\n        if (!isWebKitGtk()) return room;\n\n        const connect = room.connect.bind(room);\n        room.connect = (url, token, opts) =>\n          connect(url, token, {\n            ...opts,\n            rtcConfig: { ...opts?.rtcConfig, bundlePolicy: 'max-bundle' },\n          });\n        // WebKitGTK MJPEG-only cameras produce black outbound video through\n        // gstwebrtcbin; re-publish the camera as a raw canvas.captureStream()\n        // track instead. Audio is unaffected.\n        const lp = room.localParticipant;\n        if (typeof document !== 'undefined' && lp && typeof lp.setCameraEnabled === 'function') {\n          const override = wrapWebKitCamera(lp);\n          lp.setCameraEnabled = override as typeof lp.setCameraEnabled;\n          room.on(RoomEvent.Disconnected, override.dispose);\n        }\n        return room;\n      },\n    });\n  }, [mx]);\n  const generation = generationRef.current;\n  if (controllerRef.current !== controller) controllerRef.current = controller;\n\n  useEffect(() => {\n    controllerRef.current = controller;\n    const unsubscribe = controller.subscribe((controllerState) => {\n      const roomId = roomIdRef.current;\n      if (!roomId) return;\n      if (controllerState.lifecycle === 'idle') {\n        store.set(livekitJsCallAtom, undefined);\n        return;\n      }\n      store.set(livekitJsCallAtom, {\n        roomId,\n        initialMedia: initialMediaRef.current,\n        lifecycle: controllerState.lifecycle,\n        failure: controllerState.failure,\n        room: controllerState.lifecycle === 'active' ? controllerState.room : undefined,\n        mediaReady: controllerState.mediaReady,\n        hangup: () => controller.disconnect(),\n      });\n    });\n    return () => {\n      unsubscribe();\n      roomIdRef.current = undefined;\n      if (controllerRef.current === controller) controllerRef.current = undefined;\n      void controller.disconnect().finally(() => {\n        // A stale disconnect completing after a deliberate replacement must\n        // not clear the newer controller's session from the atom.\n        if (generationRef.current === generation) {\n          store.set(livekitJsCallAtom, undefined);\n        }\n      });\n    };\n  }, [controller, generation, store]);\n\n  const start = useCallback(\n    ({\n      room,\n      dm,\n      video,\n      microphone,\n      sound,\n      audioDeviceId,\n      videoDeviceId,\n    }: LivekitJsCallStartOptions) => {\n      if (store.get(callInProgressAtom)) return;\n      const activeController = controllerRef.current;\n      if (!activeController) return;\n      roomIdRef.current = room.roomId;\n      initialMediaRef.current = {\n        microphone: microphone ?? true,\n        camera: video ?? false,\n        sound: sound ?? true,\n        audioDeviceId,\n        videoDeviceId,\n      };\n      store.set(livekitJsCallSoundAtom, sound ?? true);\n      store.set(livekitJsCallInitialMediaAppliedAtom, false);\n      void activeController\n        .connect({\n          mx,\n          room,\n          discovery,\n          callIntent: video ? 'video' : 'audio',\n          dm,\n          ongoing: isCallOngoing(mx, room),\n        })\n        .catch(() => undefined);\n    },\n    [mx, discovery, store]\n  );\n\n  const manager = useMemo<LivekitJsCallManager>(() => ({ start }), [start]);\n\n  return (\n    <LivekitJsCallManagerContext.Provider value={manager}>\n      {children}\n    </LivekitJsCallManagerContext.Provider>\n  );\n}\n","import { invoke, addPluginListener } from '@tauri-apps/api/core';\nimport { listen } from '@tauri-apps/api/event';\n\nconst NATIVE_CALL_EVENT = 'plugin:livekit-mobile://native-call-event';\nconst getNativeCallCapabilities = () => invoke('plugin:livekit-mobile|get_native_call_capabilities');\nconst connectNativeCall = (request) => invoke('plugin:livekit-mobile|connect_native_call', { payload: request });\nconst disconnectNativeCall = (request) => invoke('plugin:livekit-mobile|disconnect_native_call', { payload: request });\nconst setNativeCallMicrophoneEnabled = (request) => invoke('plugin:livekit-mobile|set_native_call_microphone_enabled', {\n    payload: request,\n});\nconst setNativeCallCameraEnabled = (request) => invoke('plugin:livekit-mobile|set_native_call_camera_enabled', {\n    payload: request,\n});\nconst setNativeCallScreenShareEnabled = (request) => invoke('plugin:livekit-mobile|set_native_call_screen_share_enabled', {\n    payload: request,\n});\nconst setNativeCallPiPEnabled = (request) => invoke('plugin:livekit-mobile|set_native_call_pip_enabled', {\n    payload: request,\n});\nconst switchNativeCallCamera = (request) => invoke('plugin:livekit-mobile|switch_native_call_camera', {\n    payload: request,\n});\nconst setNativeCallEncryptionKey = (request) => invoke('plugin:livekit-mobile|set_native_call_encryption_key', {\n    payload: request,\n});\nconst setNativeCallRemoteVideoOverlay = (request) => invoke('plugin:livekit-mobile|set_native_call_remote_video_overlay', {\n    payload: request,\n});\nconst clearNativeCallRemoteVideoOverlay = (request) => invoke('plugin:livekit-mobile|clear_native_call_remote_video_overlay', {\n    payload: request,\n});\nconst setNativeCallLocalVideoOverlay = (request) => invoke('plugin:livekit-mobile|set_native_call_local_video_overlay', {\n    payload: request,\n});\nconst clearNativeCallLocalVideoOverlay = (request) => invoke('plugin:livekit-mobile|clear_native_call_local_video_overlay', {\n    payload: request,\n});\nconst getNativeCallState = () => invoke('plugin:livekit-mobile|get_native_call_state');\nconst listenNativeCallSnapshot = (handler) => listen(NATIVE_CALL_EVENT, ({ payload }) => handler(payload));\nconst startSystemCall = (request) => invoke('plugin:livekit-mobile|start_system_call', { payload: request });\nconst endSystemCall = (request) => invoke('plugin:livekit-mobile|end_system_call', { payload: request });\nconst setSystemCallMuted = (request) => invoke('plugin:livekit-mobile|set_system_call_muted', { payload: request });\nconst drainPendingSystemCallActions = () => invoke('plugin:livekit-mobile|drain_pending_system_call_actions');\nconst fulfillAnswerCall = (uuid) => invoke('plugin:livekit-mobile|fulfill_answer_call', { payload: { uuid } });\nconst fulfillEndCall = (uuid) => invoke('plugin:livekit-mobile|fulfill_end_call', { payload: { uuid } });\nconst reportSystemCallConnected = (uuid) => invoke('plugin:livekit-mobile|report_system_call_connected', { payload: { uuid } });\nconst getAudioRoutes = (request) => invoke('plugin:livekit-mobile|get_audio_routes', { payload: request });\nconst setAudioRoute = (request) => invoke('plugin:livekit-mobile|set_audio_route', { payload: request });\nconst updateCallDisplay = (request) => invoke('plugin:livekit-mobile|update_call_display', { payload: request });\nconst onSystemCallAction = (handler) => addPluginListener('livekit-mobile', 'callkit_event', handler);\n\nexport { clearNativeCallLocalVideoOverlay, clearNativeCallRemoteVideoOverlay, connectNativeCall, disconnectNativeCall, drainPendingSystemCallActions, endSystemCall, fulfillAnswerCall, fulfillEndCall, getAudioRoutes, getNativeCallCapabilities, getNativeCallState, listenNativeCallSnapshot, onSystemCallAction, reportSystemCallConnected, setAudioRoute, setNativeCallCameraEnabled, setNativeCallEncryptionKey, setNativeCallLocalVideoOverlay, setNativeCallMicrophoneEnabled, setNativeCallPiPEnabled, setNativeCallRemoteVideoOverlay, setNativeCallScreenShareEnabled, setSystemCallMuted, startSystemCall, switchNativeCallCamera, updateCallDisplay };\n","import { isMobileTauri } from '$utils/platform';\nimport {\n  getNativeCallCapabilities as probeNativeCallCapabilities,\n  type NativeCallCapabilities as PluginNativeCallCapabilities,\n} from '@sableclient/tauri-plugin-livekit-mobile';\n\nconst supportsNativeCall = (capabilities: PluginNativeCallCapabilities): boolean =>\n  capabilities.supported && capabilities.microphone;\n\nlet availabilityPromise: Promise<PluginNativeCallCapabilities | undefined> | undefined;\n\nconst isStableVerdict = (capabilities: PluginNativeCallCapabilities): boolean =>\n  !capabilities.supported || capabilities.microphone;\n\nexport const getNativeCallCapabilities = (): Promise<PluginNativeCallCapabilities | undefined> => {\n  if (!isMobileTauri()) return Promise.resolve(undefined);\n  return (availabilityPromise ??= probeNativeCallCapabilities().then(\n    (capabilities) => {\n      if (!isStableVerdict(capabilities)) availabilityPromise = undefined;\n      return capabilities;\n    },\n    () => {\n      availabilityPromise = undefined;\n      return undefined;\n    }\n  ));\n};\n\nexport const getNativeCallAvailability = (): Promise<boolean> => {\n  if (!isMobileTauri()) return Promise.resolve(false);\n  return getNativeCallCapabilities().then((capabilities) =>\n    capabilities ? supportsNativeCall(capabilities) : false\n  );\n};\n\nexport const resetNativeCallAvailabilityForTests = (): void => {\n  availabilityPromise = undefined;\n};\n","import {\n  connectNativeCall,\n  disconnectNativeCall,\n  getAudioRoutes,\n  getNativeCallState,\n  listenNativeCallSnapshot,\n  setAudioRoute,\n  setNativeCallCameraEnabled,\n  setNativeCallEncryptionKey,\n  setNativeCallMicrophoneEnabled,\n  setNativeCallPiPEnabled,\n  setNativeCallScreenShareEnabled,\n  switchNativeCallCamera,\n  type NativeCallFailureCode,\n  type NativeCallRemoteCamera,\n  type NativeCallRemoteParticipant,\n  type NativeCallSnapshot,\n} from '@sableclient/tauri-plugin-livekit-mobile';\nimport type {\n  CallAudioRoute,\n  CallConnectionQuality,\n  CallEncryptionKey,\n  CallParticipant,\n  CallTrack,\n  CallTransport,\n  CallTransportConnectOptions,\n  CallTransportState,\n} from '@sableclient/matrixrtc';\nimport { createDebugLogger } from '$utils/debugLogger';\n\nconst debugLog = createDebugLogger('nativeTransport');\n\nconst logFailure = (what: string, cause: unknown): void => {\n  const detail = cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause);\n  debugLog.error('call', `${what}. ${detail}`);\n};\n\nconst failureMessages: Record<NativeCallFailureCode, string> = {\n  invalid_request: 'Could not start the call.',\n  busy: 'Another call is already in progress.',\n  permission_denied: 'Microphone or camera access was denied.',\n  connect_failed: 'Could not connect to the call.',\n  media_failed: 'Your microphone or camera stopped working.',\n  disconnected: 'The connection to the call was lost.',\n  cancelled: 'The call was cancelled.',\n  unavailable: 'Calls are not available on this device.',\n  unexpected: 'The call ended unexpectedly.',\n};\n\nconst failureMessage = (code: NativeCallFailureCode | undefined): string =>\n  (code && failureMessages[code]) || 'The call ended unexpectedly.';\n\nconst toBase64 = (key: Uint8Array): string => {\n  let binary = '';\n  key.forEach((byte) => {\n    binary += String.fromCharCode(byte);\n  });\n  return btoa(binary);\n};\n\nconst toTrack = (track: NativeCallRemoteCamera): CallTrack => ({\n  id: track.sid,\n  muted: track.muted,\n  subscribed: track.subscribed,\n});\n\nconst toQuality = (quality: string | undefined): CallConnectionQuality =>\n  quality === 'lost' || quality === 'poor' || quality === 'good' || quality === 'excellent'\n    ? quality\n    : 'unknown';\n\nconst toParticipant = (participant: NativeCallRemoteParticipant): CallParticipant => ({\n  identity: participant.identity,\n  ...(participant.camera ? { camera: toTrack(participant.camera) } : {}),\n  ...(participant.screenShare ? { screenShare: toTrack(participant.screenShare) } : {}),\n  ...(participant.microphone ? { microphone: toTrack(participant.microphone) } : {}),\n  connectionQuality: toQuality(participant.connectionQuality),\n});\n\nexport type NativeTransportDependencies = {\n  connectCall?: typeof connectNativeCall;\n  disconnectCall?: typeof disconnectNativeCall;\n  setMicrophone?: typeof setNativeCallMicrophoneEnabled;\n  setCamera?: typeof setNativeCallCameraEnabled;\n  setEncryptionKey?: typeof setNativeCallEncryptionKey;\n  listenSnapshot?: typeof listenNativeCallSnapshot;\n};\n\nexport type NativeCallTransport = CallTransport & {\n  /**\n   * Resolves once the snapshot subscription is live. The caller awaits it\n   * before joining so no state change between join and connect is missed.\n   */\n  ready: Promise<void>;\n};\n\n/**\n * `CallTransport` over the native LiveKit SDK, reached through the\n * `livekit-mobile` plugin. One transport per call: `callId` scopes every\n * command and filters the snapshot stream, which is global to the plugin.\n */\nexport const createNativeTransport = (\n  callId: string,\n  dependencies: NativeTransportDependencies = {}\n): NativeCallTransport => {\n  const connectCall = dependencies.connectCall ?? connectNativeCall;\n  const disconnectCall = dependencies.disconnectCall ?? disconnectNativeCall;\n  const setMicrophone = dependencies.setMicrophone ?? setNativeCallMicrophoneEnabled;\n  const setCamera = dependencies.setCamera ?? setNativeCallCameraEnabled;\n  const setKey = dependencies.setEncryptionKey ?? setNativeCallEncryptionKey;\n  const listenSnapshot = dependencies.listenSnapshot ?? listenNativeCallSnapshot;\n\n  let state: CallTransportState = {\n    connection: 'connecting',\n    participants: [],\n    microphoneEnabled: false,\n    cameraEnabled: false,\n    screenShareEnabled: false,\n  };\n  let connected = false;\n  let disposed = false;\n  let revision = -1;\n  const pendingKeys: CallEncryptionKey[] = [];\n  const listeners = new Set<(next: CallTransportState) => void>();\n\n  const publish = (next: CallTransportState): void => {\n    state = next;\n    listeners.forEach((listener) => {\n      try {\n        listener(next);\n      } catch (cause) {\n        // A state observer must not interrupt lifecycle cleanup.\n        logFailure('Native call state listener threw', cause);\n      }\n    });\n  };\n\n  const apply = (snapshot: NativeCallSnapshot): void => {\n    if (disposed) return;\n    if (snapshot.revision < revision) return;\n    revision = snapshot.revision;\n    if (snapshot.connectionState === 'idle' || snapshot.connectionState === 'failed') {\n      // A snapshot with no callId before our connect resolves reports the\n      // plugin's own idle state, not the end of this call.\n      if (snapshot.callId === null && !connected) return;\n      if (snapshot.callId !== null && snapshot.callId !== callId) return;\n      if (snapshot.connectionState === 'failed') {\n        debugLog.error('call', `Native call failed: ${snapshot.lastError?.code ?? 'unknown'}`);\n      }\n      publish({\n        connection: 'disconnected',\n        participants: [],\n        microphoneEnabled: false,\n        cameraEnabled: false,\n        screenShareEnabled: false,\n        ...(snapshot.connectionState === 'failed'\n          ? { error: failureMessage(snapshot.lastError?.code) }\n          : {}),\n      });\n      return;\n    }\n    if (snapshot.callId !== callId) return;\n    publish({\n      connection: snapshot.connectionState,\n      participants: (snapshot.remoteParticipants ?? []).map(toParticipant),\n      microphoneEnabled: snapshot.microphoneEnabled,\n      cameraEnabled: snapshot.cameraEnabled,\n      screenShareEnabled: snapshot.screenShareEnabled,\n    });\n  };\n\n  const unlistenPromise = listenSnapshot(apply);\n  // Mark the listen promise as handled immediately; `disconnect` re-attaches.\n  unlistenPromise.catch(() => undefined);\n\n  // A suspended webview loses the snapshots emitted while it slept, so the\n  // state is stale on resume. Poll instead of trusting the event stream.\n  const resync = (): void => {\n    if (disposed || document.visibilityState !== 'visible') return;\n    void getNativeCallState()\n      .then(apply)\n      .catch((cause: unknown) => logFailure('Native call state resync failed', cause));\n  };\n  document.addEventListener('visibilitychange', resync);\n\n  const send = (key: CallEncryptionKey): Promise<void> =>\n    setKey({\n      callId,\n      identity: key.identity,\n      keyIndex: key.keyIndex,\n      key: toBase64(key.key),\n    }).then(\n      () => undefined,\n      (cause: unknown) => logFailure(`Native call rejected a key for ${key.identity}`, cause)\n    );\n\n  const whenConnected = async (\n    what: string,\n    command: () => Promise<NativeCallSnapshot | void>\n  ): Promise<void> => {\n    if (!connected || disposed) return;\n    await command().then(\n      () => undefined,\n      (cause: unknown) => logFailure(what, cause)\n    );\n  };\n\n  const setCameraEnabled = (enabled: boolean): Promise<void> =>\n    whenConnected(`Native call camera ${enabled ? 'on' : 'off'} failed`, () =>\n      setCamera({ callId, enabled })\n    );\n\n  const connect = async (options: CallTransportConnectOptions): Promise<void> => {\n    const snapshot = await connectCall({\n      callId,\n      url: options.url,\n      token: options.token,\n      microphoneEnabled: options.microphoneEnabled,\n      encryptionKeys: options.encryptionKeys.map((key) => ({\n        identity: key.identity,\n        keyIndex: key.keyIndex,\n        key: toBase64(key.key),\n      })),\n    });\n    connected = true;\n    // Everything that arrived while the connection was being established is\n    // replayed rather than dropped. Re-writing a key ring slot is a no-op.\n    await Promise.all(pendingKeys.splice(0).map(send));\n    apply(snapshot);\n    if (options.cameraEnabled) await setCameraEnabled(true);\n  };\n\n  const disconnect = async (): Promise<void> => {\n    disposed = true;\n    document.removeEventListener('visibilitychange', resync);\n    await disconnectCall({ callId }).then(\n      () => undefined,\n      (cause: unknown) => logFailure('Native call disconnect failed', cause)\n    );\n    await unlistenPromise.then(\n      (unlisten) => unlisten(),\n      (cause: unknown) => logFailure('Native call snapshot listener was never attached', cause)\n    );\n  };\n\n  return {\n    ready: unlistenPromise.then(() => undefined),\n    connect,\n    disconnect,\n    setMicrophoneEnabled: (enabled) =>\n      whenConnected(`Native call microphone ${enabled ? 'on' : 'off'} failed`, () =>\n        setMicrophone({ callId, enabled })\n      ),\n    setCameraEnabled,\n    setEncryptionKey: async (key) => {\n      if (disposed) return;\n      if (!connected) {\n        pendingKeys.push(key);\n        return;\n      }\n      await send(key);\n    },\n    subscribe: (listener) => {\n      listeners.add(listener);\n      return () => listeners.delete(listener);\n    },\n    getState: () => state,\n    capabilities: {\n      camera: {\n        switch: () =>\n          whenConnected('Native call camera switch failed', () =>\n            switchNativeCallCamera({ callId })\n          ),\n      },\n      audioRoutes: {\n        list: async (): Promise<CallAudioRoute[]> => {\n          if (!connected || disposed) return [];\n          return getAudioRoutes({ callId }).then(\n            (result) => result.routes,\n            (cause: unknown) => {\n              logFailure('Native call audio routes unavailable', cause);\n              return [];\n            }\n          );\n        },\n        select: (routeId) =>\n          whenConnected('Native call audio route select failed', () =>\n            setAudioRoute({ callId, routeId })\n          ),\n      },\n      pictureInPicture: {\n        setEnabled: (enabled) =>\n          whenConnected(`Native call picture in picture ${enabled ? 'on' : 'off'} failed`, () =>\n            setNativeCallPiPEnabled({ callId, enabled })\n          ),\n      },\n      screenShare: {\n        setEnabled: (enabled) =>\n          whenConnected(`Native call screen share ${enabled ? 'on' : 'off'} failed`, () =>\n            setNativeCallScreenShareEnabled({ callId, enabled })\n          ),\n      },\n    },\n  };\n};\n","import {\n  type CallKeyPipeline,\n  type CallSessionHandles,\n  type CallTransportState,\n  callEncryptsMedia,\n  createCallKeyPipeline,\n  createCallSessionHandles,\n  disconnectLivekitThenLeaveMatrixRTC,\n  getPreferredLivekitTransport,\n  joinCallSession,\n  provisionLivekitToken,\n} from '@sableclient/matrixrtc';\nimport type { AutoDiscoveryInfo } from '../../cs-api';\nimport type { MatrixClient, MatrixRTCSession, Room } from '$types/matrix-sdk';\nimport {\n  drainPendingSystemCallActions,\n  endSystemCall,\n  fulfillAnswerCall,\n  fulfillEndCall,\n  onSystemCallAction,\n  reportSystemCallConnected,\n  setSystemCallMuted,\n  startSystemCall,\n  updateCallDisplay,\n  type NativeCallAudioRoute,\n  type NativeCallCapabilities as PluginNativeCallCapabilities,\n  type SystemCallAction,\n} from '@sableclient/tauri-plugin-livekit-mobile';\nimport {\n  createNativeTransport,\n  type NativeCallTransport,\n  type NativeTransportDependencies,\n} from './nativeTransport';\nimport { acquireCallOwner, type CallOwnerLease } from '$state/callOwner';\nimport type { NativeCallLifecycle, NativeCallSession } from '$state/nativeCall';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport { getSlidingSyncManager } from '$client/initMatrix';\nimport { fetch as appFetch } from '$utils/fetch';\n\nconst debugLog = createDebugLogger('nativeCallController');\n\ntype SetupStage = 'joining-matrix' | 'authorizing' | 'connecting-livekit';\n\nconst setupStageLabels: Record<SetupStage, string> = {\n  'joining-matrix': 'joining the call',\n  authorizing: 'authorizing',\n  'connecting-livekit': 'connecting',\n};\n\nconst setupErrorMessages: Record<SetupStage, string> = {\n  'joining-matrix': 'Could not join the call.',\n  authorizing: 'Could not get permission to join the call.',\n  'connecting-livekit': 'Could not connect to the call.',\n};\n\nconst ignoreNativeFailure =\n  (operation: string) =>\n  (cause: unknown): undefined => {\n    debugLog.warn('call', `Native call ${operation} failed. ${String(cause)}`);\n    return undefined;\n  };\n\nexport type NativeCallStartOptions = {\n  mx: MatrixClient;\n  room: Room;\n  discovery?: Pick<AutoDiscoveryInfo, 'org.matrix.msc4143.rtc_foci'>;\n  dm: boolean;\n  video: boolean;\n  microphone: boolean;\n  ongoing: boolean;\n  capabilities?: PluginNativeCallCapabilities;\n};\n\ntype NativeCallRecord = {\n  roomId: string;\n  callId: string;\n  session: MatrixRTCSession;\n  keys: CallKeyPipeline;\n  transport: NativeCallTransport;\n  unsubscribeTransport: () => void;\n  ownerLease: CallOwnerLease;\n  cancelled: boolean;\n  handles: CallSessionHandles;\n  cleanupPromise?: Promise<void>;\n  capabilities: PluginNativeCallCapabilities;\n};\n\nexport type NativeCallController = {\n  start: (options: NativeCallStartOptions) => Promise<void>;\n  setMicrophoneEnabled: (enabled: boolean) => Promise<void>;\n  setCameraEnabled: (enabled: boolean) => Promise<void>;\n  setScreenShareEnabled: (enabled: boolean) => Promise<void>;\n  switchCamera: () => Promise<void>;\n  listAudioRoutes: () => Promise<NativeCallAudioRoute[]>;\n  selectAudioRoute: (routeId: string) => Promise<void>;\n};\n\nexport type NativeCallControllerDependencies = NativeTransportDependencies & {\n  setSession: (session: NativeCallSession | undefined) => void;\n  updateDisplay?: typeof updateCallDisplay;\n  createKeyPipeline?: () => CallKeyPipeline;\n  createTransport?: typeof createNativeTransport;\n  getPreferredTransport?: typeof getPreferredLivekitTransport;\n  provisionToken?: typeof provisionLivekitToken;\n  createCallId?: () => string;\n  acquireOwner?: typeof acquireCallOwner;\n  onCleanup?: () => void;\n};\n\nconst noMediaControls = {\n  setMicrophoneEnabled: async (): Promise<void> => {},\n  setCameraEnabled: async (): Promise<void> => {},\n  switchCamera: async (): Promise<void> => {},\n  listAudioRoutes: async (): Promise<NativeCallAudioRoute[]> => [],\n  selectAudioRoute: async (): Promise<void> => {},\n};\n\nexport const createNativeCallController = (\n  dependencies: NativeCallControllerDependencies\n): NativeCallController => {\n  const deps = {\n    ...dependencies,\n    updateDisplay: dependencies.updateDisplay ?? updateCallDisplay,\n    createKeyPipeline: dependencies.createKeyPipeline ?? createCallKeyPipeline,\n    createTransport: dependencies.createTransport ?? createNativeTransport,\n    getPreferredTransport: dependencies.getPreferredTransport ?? getPreferredLivekitTransport,\n    provisionToken: dependencies.provisionToken ?? provisionLivekitToken,\n    createCallId: dependencies.createCallId ?? (() => crypto.randomUUID()),\n    acquireOwner: dependencies.acquireOwner ?? acquireCallOwner,\n  };\n\n  // Register the system-call (CallKit) listener once at controller creation.\n  // Events (answer, end, mute from lock-screen/system-UI) flow from the\n  // native side regardless of call state.\n  const pendingSystemUuids = new Map<string, string>();\n\n  const handleSystemCallAction = (action: SystemCallAction): void => {\n    if (action.action === 'end') {\n      // System UI ended the call: hang up if active, then fulfill the\n      // pending CXEndCallAction so the system UI dismisses immediately.\n      if (activeRecord && !activeRecord.cancelled) {\n        void cleanup(activeRecord, undefined, true).finally(() => {\n          if (action.uuid)\n            void fulfillEndCall(action.uuid).catch(ignoreNativeFailure('end-call fulfillment'));\n        });\n      } else if (action.uuid) {\n        void fulfillEndCall(action.uuid).catch(ignoreNativeFailure('end-call fulfillment'));\n      }\n      void drainPendingSystemCallActions().catch(ignoreNativeFailure('pending-action drain'));\n    } else if (action.action === 'answer' && action.roomId) {\n      pendingSystemUuids.set(action.roomId, action.uuid);\n      window.dispatchEvent(\n        new CustomEvent('nativeCallAnswer', { detail: { roomId: action.roomId } })\n      );\n    } else if (action.action === 'mute') {\n      // System UI mute toggle: push to LiveKit.\n      void activeRecord?.transport.setMicrophoneEnabled(!action.muted);\n    }\n  };\n\n  void onSystemCallAction(handleSystemCallAction).catch(\n    ignoreNativeFailure('system-action subscription')\n  );\n  void drainPendingSystemCallActions()\n    .then((actions) => actions.forEach(handleSystemCallAction))\n    .catch(ignoreNativeFailure('pending-action drain'));\n\n  let activeRecord: NativeCallRecord | undefined;\n  let displayedRecord: NativeCallRecord | undefined;\n\n  const isCurrent = (record: NativeCallRecord): boolean =>\n    activeRecord === record && !record.cancelled;\n\n  const setSession = (session: NativeCallSession | undefined): void => {\n    try {\n      deps.setSession(session);\n    } catch (cause) {\n      debugLog.warn('call', `Failed to publish the native call session. ${String(cause)}`);\n    }\n  };\n\n  const publishError = (\n    roomId: string,\n    callId: string,\n    error: string,\n    hangup: () => Promise<void>\n  ): void => {\n    setSession({\n      backend: 'livekit-mobile',\n      roomId,\n      callId,\n      lifecycle: 'error',\n      error,\n      participants: [],\n      microphoneEnabled: false,\n      cameraEnabled: false,\n      screenShareEnabled: false,\n      capabilities: {\n        camera: false,\n        screenShare: false,\n        pictureInPicture: false,\n        audioRoutes: false,\n      },\n      ...noMediaControls,\n      hangup,\n    });\n  };\n\n  const publish = (\n    record: NativeCallRecord,\n    lifecycle: NativeCallLifecycle,\n    media?: Pick<\n      CallTransportState,\n      'participants' | 'microphoneEnabled' | 'cameraEnabled' | 'screenShareEnabled'\n    >\n  ): void => {\n    if (!isCurrent(record)) return;\n    setSession({\n      backend: 'livekit-mobile',\n      roomId: record.roomId,\n      callId: record.callId,\n      lifecycle,\n      participants: media?.participants ?? [],\n      microphoneEnabled: media?.microphoneEnabled ?? true,\n      cameraEnabled: media?.cameraEnabled ?? false,\n      screenShareEnabled: media?.screenShareEnabled ?? false,\n      capabilities: {\n        camera: record.capabilities.camera,\n        screenShare: record.capabilities.screenShare,\n        pictureInPicture: record.capabilities.pictureInPicture,\n        audioRoutes: record.capabilities.audioRoutes,\n      },\n      setMicrophoneEnabled,\n      setCameraEnabled,\n      ...(record.capabilities.screenShare ? { setScreenShareEnabled } : {}),\n      switchCamera,\n      listAudioRoutes,\n      selectAudioRoute,\n      hangup: () => cleanup(record, undefined, true),\n    });\n    displayedRecord = record;\n  };\n\n  const cleanup = async (\n    record: NativeCallRecord,\n    failure: string | undefined,\n    clear: boolean\n  ): Promise<void> => {\n    if (record.cleanupPromise) {\n      await record.cleanupPromise;\n      if (clear && displayedRecord === record) {\n        displayedRecord = undefined;\n        setSession(undefined);\n      }\n      return;\n    }\n\n    record.cancelled = true;\n    record.handles.cancelMembershipWait?.();\n    record.handles.cancelMembershipWait = undefined;\n    record.handles.removePageHideListener?.();\n    record.handles.removePageHideListener = undefined;\n    record.handles.unsubscribeCallRoom?.();\n    record.handles.unsubscribeCallRoom = undefined;\n    record.unsubscribeTransport();\n    record.keys.setOnKey(undefined);\n    if (failure && activeRecord === record) {\n      publishError(record.roomId, record.callId, failure, () => cleanup(record, undefined, true));\n      displayedRecord = record;\n    }\n\n    record.cleanupPromise = (async () => {\n      // End the system call so CallKit dismisses the active-call UI.\n      void endSystemCall({ callId: record.callId, remoteEnded: true }).catch(\n        ignoreNativeFailure('system-call end')\n      );\n      void record.transport.capabilities.pictureInPicture?.setEnabled(false);\n      await disconnectLivekitThenLeaveMatrixRTC(\n        () => record.transport.disconnect(),\n        record.session\n      );\n      record.keys.detach();\n      record.ownerLease.release();\n      if (activeRecord === record) activeRecord = undefined;\n      if (clear && displayedRecord === record) {\n        displayedRecord = undefined;\n        setSession(undefined);\n      }\n      deps.onCleanup?.();\n    })();\n    await record.cleanupPromise;\n  };\n\n  const handleTransportState = (record: NativeCallRecord, state: CallTransportState): void => {\n    if (!isCurrent(record)) return;\n    if (state.connection === 'disconnected') {\n      // A normal end clears the session; only a failure leaves an error the\n      // user has to dismiss.\n      void cleanup(record, state.error, state.error === undefined);\n      return;\n    }\n    publish(record, state.connection, state);\n  };\n\n  const start = async (options: NativeCallStartOptions) => {\n    const { mx, room, discovery, dm, video, microphone, ongoing } = options;\n    const capabilities = options.capabilities ?? {\n      supported: true,\n      microphone: true,\n      backgroundAudio: true,\n      nativeRoom: true,\n      camera: true,\n      nativeVideoOverlay: true,\n      screenShare: true,\n      pictureInPicture: true,\n      callKit: true,\n      systemCalls: true,\n      audioRoutes: true,\n      pushKit: true,\n    };\n    if (activeRecord) {\n      deps.onCleanup?.();\n      return;\n    }\n    const ownerLease = deps.acquireOwner('livekit-mobile', room.roomId);\n    if (!ownerLease) {\n      deps.onCleanup?.();\n      return;\n    }\n\n    let record: NativeCallRecord | undefined;\n    let stage: SetupStage = 'joining-matrix';\n    try {\n      const callId = deps.createCallId();\n      const session = mx.matrixRTC.getRoomSession(room);\n      const keys = deps.createKeyPipeline();\n      const transport = deps.createTransport(callId, dependencies);\n      record = {\n        roomId: room.roomId,\n        callId,\n        session,\n        keys,\n        transport,\n        unsubscribeTransport: () => {},\n        ownerLease,\n        cancelled: false,\n        handles: createCallSessionHandles(),\n        capabilities,\n      };\n      const currentRecord = record;\n      activeRecord = record;\n      publish(record, 'starting');\n\n      record.unsubscribeTransport = transport.subscribe((state) =>\n        handleTransportState(currentRecord, state)\n      );\n      await transport.ready;\n\n      const encryptMedia = callEncryptsMedia(room);\n      if (encryptMedia) {\n        // The transport queues anything that arrives before it is connected, so\n        // a key is never dropped for being early.\n        keys.setOnKey((key) => void transport.setEncryptionKey(key));\n        keys.attach(session, { userId: mx.getSafeUserId(), deviceId: mx.getDeviceId() });\n      }\n\n      const joined = await joinCallSession(\n        {\n          mx,\n          room,\n          session,\n          discovery,\n          request: appFetch,\n          subscribeToCallRoom: (roomId) => getSlidingSyncManager(mx)?.subscribeToCallRoom(roomId),\n          getPreferredTransport: deps.getPreferredTransport,\n          provisionToken: deps.provisionToken,\n          callIntent: video ? 'video' : 'audio',\n          dm,\n          ongoing,\n          encryptMedia,\n          isCancelled: () => !isCurrent(currentRecord),\n          onStage: (joinStage) => {\n            stage = joinStage === 'joining-matrix' ? 'joining-matrix' : 'authorizing';\n          },\n        },\n        currentRecord.handles\n      );\n      if (!isCurrent(currentRecord)) return;\n\n      stage = 'connecting-livekit';\n      if (encryptMedia) {\n        await keys.waitForOwnKey();\n        if (!isCurrent(currentRecord)) return;\n      }\n\n      await transport.connect({\n        url: joined.provisioned.url,\n        token: joined.provisioned.jwt,\n        microphoneEnabled: microphone,\n        cameraEnabled: video,\n        encryptionKeys: keys.getKeys(),\n      });\n\n      // Report the outgoing system call so CallKit shows the active-call UI.\n      // Use the pending uuid (from an answer action) if present; otherwise\n      // generate a new uuid. The native side maps callId to uuid internally.\n      const pendingSystemUuid = pendingSystemUuids.get(room.roomId);\n      const systemUuid = pendingSystemUuid ?? crypto.randomUUID();\n      const isIncomingAnswer = pendingSystemUuid !== undefined;\n      pendingSystemUuids.delete(room.roomId);\n      const callerName = room.name || room.roomId;\n      void startSystemCall({ callId, uuid: systemUuid, callerName }).catch(\n        ignoreNativeFailure('system-call start')\n      );\n      // Update the system call display with the room name and video flag so\n      // CallKit shows the correct caller info.\n      void deps\n        .updateDisplay({\n          callId,\n          callerName,\n          hasVideo: video,\n        })\n        .catch(ignoreNativeFailure('system-call display update'));\n      // Report the call as connected to CallKit so the system UI updates.\n      void reportSystemCallConnected(systemUuid).catch(\n        ignoreNativeFailure('system-call connected report')\n      );\n      if (capabilities.pictureInPicture)\n        void transport.capabilities.pictureInPicture?.setEnabled(true);\n      // For system-initiated incoming answers: fulfill the deferred answer action.\n      if (isIncomingAnswer) {\n        void fulfillAnswerCall(systemUuid).catch(ignoreNativeFailure('answer-call fulfillment'));\n      }\n    } catch (cause) {\n      const detail = cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause);\n      debugLog.error(\n        'call',\n        `Native call setup failed during ${setupStageLabels[stage]}. ${detail}`\n      );\n      if (record) {\n        await cleanup(record, setupErrorMessages[stage], false);\n      } else {\n        ownerLease.release();\n        publishError(room.roomId, '', setupErrorMessages[stage], async () => {\n          setSession(undefined);\n        });\n        deps.onCleanup?.();\n      }\n    }\n  };\n\n  const setMicrophoneEnabled = async (enabled: boolean): Promise<void> => {\n    const record = activeRecord;\n    if (!record || record.cancelled) return;\n    await record.transport.setMicrophoneEnabled(enabled);\n    // Push mute state back to CallKit for UI consistency.\n    void setSystemCallMuted({ callId: record.callId, muted: !enabled }).catch(\n      ignoreNativeFailure('system-call mute')\n    );\n  };\n\n  const active = (): NativeCallTransport | undefined =>\n    activeRecord && !activeRecord.cancelled ? activeRecord.transport : undefined;\n\n  const setCameraEnabled = async (enabled: boolean): Promise<void> => {\n    await active()?.setCameraEnabled(enabled);\n  };\n\n  const setScreenShareEnabled = async (enabled: boolean): Promise<void> => {\n    await active()?.capabilities.screenShare?.setEnabled(enabled);\n  };\n\n  const switchCamera = async (): Promise<void> => {\n    await active()?.capabilities.camera?.switch();\n  };\n\n  const listAudioRoutes = async (): Promise<NativeCallAudioRoute[]> =>\n    (await active()?.capabilities.audioRoutes?.list()) ?? [];\n\n  const selectAudioRoute = async (routeId: string): Promise<void> => {\n    await active()?.capabilities.audioRoutes?.select(routeId);\n  };\n\n  return {\n    start,\n    setMicrophoneEnabled,\n    setCameraEnabled,\n    setScreenShareEnabled,\n    switchCamera,\n    listAudioRoutes,\n    selectAudioRoute,\n  };\n};\n","import type { useStore } from 'jotai';\n\ntype Store = ReturnType<typeof useStore>;\nimport type { MatrixClient, Room } from '$types/matrix-sdk';\nimport type { AutoDiscoveryInfo } from '../../cs-api';\nimport { callInProgressAtom, nativeCallAtom } from '$state/nativeCall';\nimport { isCallOngoing } from '@sableclient/matrixrtc';\nimport type { NativeCallCapabilities } from '@sableclient/tauri-plugin-livekit-mobile';\nimport {\n  createNativeCallController,\n  type NativeCallController,\n  type NativeCallControllerDependencies,\n} from './nativeCallController';\n\nexport type NativeCallManagerStartOptions = {\n  mx: MatrixClient;\n  room: Room;\n  discovery?: Pick<AutoDiscoveryInfo, 'org.matrix.msc4143.rtc_foci'>;\n  dm?: boolean;\n  video?: boolean;\n  microphone?: boolean;\n  capabilities?: NativeCallCapabilities;\n};\n\nexport type NativeCallManager = {\n  start: (options: NativeCallManagerStartOptions) => void;\n};\n\nexport const createNativeCallManager = (\n  store: Pick<Store, 'get' | 'set'>,\n  createController: (\n    dependencies: Pick<NativeCallControllerDependencies, 'setSession'>\n  ) => NativeCallController = createNativeCallController\n): NativeCallManager => {\n  const controller = createController({\n    setSession: (session) => store.set(nativeCallAtom, session),\n  });\n\n  return {\n    start: ({ mx, room, discovery, dm, video, microphone, capabilities }) => {\n      if (store.get(callInProgressAtom)) return;\n      void controller\n        .start({\n          mx,\n          room,\n          discovery,\n          dm: dm ?? false,\n          video: video ?? false,\n          microphone: microphone ?? true,\n          capabilities,\n          ongoing: isCallOngoing(mx, room),\n        })\n        .catch(() => undefined);\n    },\n  };\n};\n\nconst managers = new WeakMap<Pick<Store, 'get' | 'set'>, NativeCallManager>();\n\nexport const getNativeCallManager = (store: Pick<Store, 'get' | 'set'>): NativeCallManager => {\n  const cached = managers.get(store);\n  if (cached) return cached;\n  const manager = createNativeCallManager(store);\n  managers.set(store, manager);\n  return manager;\n};\n","import type { RefObject } from 'react';\nimport { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport type { MatrixClient, Room } from '$types/matrix-sdk';\nimport { useSetAtom, useStore } from 'jotai';\nimport * as Sentry from '@sentry/react';\nimport type { ElementCallThemeKind } from '../plugins/call';\nimport { CallEmbed, ElementWidgetActions, useClientWidgetApiEvent } from '../plugins/call';\nimport { useMatrixClient } from './useMatrixClient';\nimport { ThemeKind, useTheme } from './useTheme';\nimport { callEmbedAtom } from '../state/callEmbed';\nimport { useResizeObserver } from './useResizeObserver';\nimport { CallControlState } from '../plugins/call/CallControlState';\nimport { useCallMembersChange, useCallSession } from './useCall';\nimport type { CallPreferences } from '../state/callPreferences';\nimport { createDebugLogger } from '../utils/debugLogger';\nimport { useClientConfig } from './useClientConfig';\nimport { callEmbedStartErrorAtom } from '$state/callEmbed';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { acquireCallOwner } from '$state/callOwner';\nimport { selectCallStartOwner } from '@sableclient/matrixrtc';\nimport { useLivekitJsCallManager } from '$features/call/livekitJsCallManager';\nimport { getNativeCallCapabilities } from '$features/call/nativeCallProbe';\nimport { getNativeCallManager } from '$features/call/nativeCallManager';\nimport { useAutoDiscoveryInfo } from './useAutoDiscoveryInfo';\n\nconst debugLog = createDebugLogger('useCallEmbed');\n\nconst CallEmbedContext = createContext<CallEmbed | undefined>(undefined);\n\nexport const CallEmbedContextProvider = CallEmbedContext.Provider;\n\nexport const useCallEmbed = (): CallEmbed | undefined => {\n  const callEmbed = useContext(CallEmbedContext);\n\n  return callEmbed;\n};\n\nconst CallEmbedRefContext = createContext<RefObject<HTMLDivElement | null> | undefined>(undefined);\nexport const CallEmbedRefContextProvider = CallEmbedRefContext.Provider;\nconst useCallEmbedRef = (): RefObject<HTMLDivElement | null> => {\n  const ref = useContext(CallEmbedRefContext);\n  if (!ref) {\n    throw new Error('CallEmbedRef is not provided!');\n  }\n  return ref;\n};\n\nconst createCallEmbed = (\n  mx: MatrixClient,\n  room: Room,\n  dm: boolean,\n  themeKind: ElementCallThemeKind,\n  container: HTMLElement,\n  pref?: CallPreferences,\n  elementCallUrl?: string\n): CallEmbed => {\n  const rtcSession = mx.matrixRTC.getRoomSession(room);\n  const ongoing = rtcSession.memberships.length > 0;\n\n  const intent = CallEmbed.getIntent(dm, ongoing, pref?.video);\n  const widget = CallEmbed.getWidget(mx, room, intent, themeKind, elementCallUrl);\n  const controlState = pref && new CallControlState(pref.microphone, pref.video, pref.sound);\n\n  const embed = new CallEmbed(mx, room, widget, container, controlState);\n\n  return embed;\n};\n\nexport const useCallStart = (dm = false) => {\n  const mx = useMatrixClient();\n  const theme = useTheme();\n  const clientConfig = useClientConfig();\n  const setCallEmbed = useSetAtom(callEmbedAtom);\n  const setCallEmbedStartError = useSetAtom(callEmbedStartErrorAtom);\n  const callEmbedRef = useCallEmbedRef();\n  const store = useStore();\n  const discovery = useAutoDiscoveryInfo();\n  const [newCallsEnabled] = useSetting(settingsAtom, 'newCallsEnabled');\n  const livekitJsCallManager = useLivekitJsCallManager();\n  const startPendingRef = useRef(false);\n\n  const startCall = useCallback(\n    (room: Room, pref?: CallPreferences) => {\n      if (newCallsEnabled) {\n        if (!livekitJsCallManager) {\n          throw new Error('LiveKit JS call manager is not provided!');\n        }\n        if (startPendingRef.current) {\n          debugLog.warn('call', 'Ignoring call start: a start is already in flight', {\n            roomId: room.roomId,\n          });\n          return;\n        }\n        startPendingRef.current = true;\n        // Resolved rather than cached in state so the first tap cannot race the\n        // native capability probe and fall through to the JS backend.\n        void getNativeCallCapabilities()\n          .then((nativeCapabilities) => {\n            const nativeCallAvailable =\n              nativeCapabilities?.supported === true && nativeCapabilities.microphone;\n            if (\n              selectCallStartOwner({ newCallsEnabled, nativeCallAvailable }) === 'livekit-mobile'\n            ) {\n              getNativeCallManager(store).start({\n                mx,\n                room,\n                discovery,\n                dm,\n                video: pref?.video,\n                microphone: pref?.microphone,\n                capabilities: nativeCapabilities,\n              });\n              return;\n            }\n            livekitJsCallManager.start({\n              room,\n              dm,\n              video: pref?.video,\n              microphone: pref?.microphone,\n              sound: pref?.sound,\n              audioDeviceId: pref?.audioDeviceId,\n              videoDeviceId: pref?.videoDeviceId,\n            });\n          })\n          .catch((err: unknown) => {\n            debugLog.error('call', 'Failed to start call', {\n              roomId: room.roomId,\n              error: err instanceof Error ? err.message : String(err),\n            });\n          })\n          .finally(() => {\n            startPendingRef.current = false;\n          });\n        return;\n      }\n      const ownerLease = acquireCallOwner('element', room.roomId);\n      if (!ownerLease) {\n        debugLog.warn('call', 'Failed to start call: another call is already active', {\n          roomId: room.roomId,\n        });\n        return;\n      }\n      const container = callEmbedRef.current;\n      if (!container) {\n        ownerLease.release();\n        debugLog.error('call', 'Failed to start call: no embed container', {\n          roomId: room.roomId,\n        });\n        Sentry.metrics.count('sable.call.start.error', 1, {\n          attributes: { reason: 'no_container' },\n        });\n        throw new Error('Failed to start call, No embed container element found!');\n      }\n      try {\n        debugLog.info('call', 'Starting call', { roomId: room.roomId, dm });\n        Sentry.metrics.count('sable.call.start.attempt', 1, {\n          attributes: { dm: String(dm) },\n        });\n        setCallEmbedStartError(null);\n        const callEmbed = createCallEmbed(\n          mx,\n          room,\n          dm,\n          theme.kind,\n          container,\n          pref,\n          clientConfig.elementCallUrl\n        );\n        setCallEmbed(callEmbed);\n      } catch (err) {\n        ownerLease.release();\n        debugLog.error('call', 'Call embed creation failed', {\n          roomId: room.roomId,\n          error: err instanceof Error ? err.message : String(err),\n        });\n        Sentry.metrics.count('sable.call.start.error', 1, {\n          attributes: { reason: 'embed_create_failed' },\n        });\n        throw err;\n      }\n    },\n    [\n      mx,\n      dm,\n      theme,\n      setCallEmbed,\n      callEmbedRef,\n      store,\n      discovery,\n      clientConfig.elementCallUrl,\n      setCallEmbedStartError,\n      newCallsEnabled,\n      livekitJsCallManager,\n    ]\n  );\n\n  return startCall;\n};\n\nexport const useCallJoined = (embed?: CallEmbed): boolean => {\n  const [joined, setJoined] = useState(embed?.joined ?? false);\n\n  useClientWidgetApiEvent(\n    embed?.call,\n    ElementWidgetActions.JoinCall,\n    useCallback(() => {\n      setJoined(true);\n    }, [])\n  );\n\n  useEffect(() => {\n    setJoined(embed?.joined ?? false);\n  }, [embed]);\n\n  return joined;\n};\n\nexport const useCallHangupEvent = (embed: CallEmbed, callback: () => void) => {\n  useClientWidgetApiEvent(embed.call, ElementWidgetActions.HangupCall, callback);\n};\n\nexport const useCallMemberSoundSync = (embed: CallEmbed) => {\n  const callSession = useCallSession(embed.room);\n  useCallMembersChange(\n    callSession,\n    useCallback(() => embed.control.applySound(), [embed])\n  );\n};\n\nexport const useCallThemeSync = (embed: CallEmbed) => {\n  const theme = useTheme();\n\n  useEffect(() => {\n    const name: ElementCallThemeKind = theme.kind === ThemeKind.Dark ? 'dark' : 'light';\n\n    embed.setTheme(name);\n  }, [theme.kind, embed]);\n};\n\nexport const useCallEmbedPlacementSync = (\n  containerViewRef: RefObject<HTMLDivElement | null>\n): void => {\n  const callEmbedRef = useCallEmbedRef();\n\n  const syncCallEmbedPlacement = useCallback(() => {\n    const embedEl = callEmbedRef.current;\n    const container = containerViewRef.current;\n    if (!embedEl || !container) return;\n\n    const rect = container.getBoundingClientRect();\n\n    embedEl.style.position = 'fixed';\n    embedEl.style.top = `${rect.top}px`;\n    embedEl.style.left = `${rect.left}px`;\n    embedEl.style.width = `${rect.width}px`;\n    embedEl.style.height = `${rect.height}px`;\n  }, [callEmbedRef, containerViewRef]);\n\n  useResizeObserver(\n    syncCallEmbedPlacement,\n    useCallback(() => containerViewRef.current, [containerViewRef])\n  );\n\n  useEffect(() => {\n    let raf = 0;\n    let last = '';\n    const tick = () => {\n      const embedEl = callEmbedRef.current;\n      const container = containerViewRef.current;\n      if (embedEl && container) {\n        const rect = container.getBoundingClientRect();\n        const key = `${rect.top}|${rect.left}|${rect.width}|${rect.height}`;\n        if (key !== last) {\n          last = key;\n          embedEl.style.position = 'fixed';\n          embedEl.style.top = `${rect.top}px`;\n          embedEl.style.left = `${rect.left}px`;\n          embedEl.style.width = `${rect.width}px`;\n          embedEl.style.height = `${rect.height}px`;\n        }\n      }\n      raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [callEmbedRef, containerViewRef]);\n};\n","import { useEffect, useState } from 'react';\nimport type { AutoDiscoveryInfo } from '../cs-api';\nimport { useAutoDiscoveryInfo } from './useAutoDiscoveryInfo';\nimport { useMatrixClient } from './useMatrixClient';\nimport { isLivekitTransportConfig } from '@sableclient/matrixrtc';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { createDebugLogger } from '$utils/debugLogger';\n\nconst debugLog = createDebugLogger('useLivekitSupport');\n\ntype TransportClient = Pick<MatrixClient, '_unstable_getRTCTransports'>;\n\n/** Legacy discovery: the pre-MSC4143 `.well-known` advertisement. */\nexport const livekitSupport = (autoDiscoveryInfo: AutoDiscoveryInfo): boolean => {\n  const rtcFoci = autoDiscoveryInfo['org.matrix.msc4143.rtc_foci'];\n\n  return (\n    Array.isArray(rtcFoci) && rtcFoci.some((info) => typeof info.livekit_service_url === 'string')\n  );\n};\n\n// `/rtc/transports` is a network round trip and every room view asks. One probe\n// per client is enough; the answer only changes when the homeserver does.\nconst probes = new WeakMap<TransportClient, Promise<boolean>>();\n\nexport const probeServerLivekitTransport = (mx: TransportClient): Promise<boolean> => {\n  const existing = probes.get(mx);\n  if (existing) return existing;\n\n  const probe = mx['_unstable_getRTCTransports']()\n    .then((transports) => transports.some(isLivekitTransportConfig))\n    .catch((error: unknown) => {\n      // A homeserver without MSC4143 answers M_NOT_FOUND, which is a legitimate\n      // \"no transport here\" rather than an outage, so it stays at info level.\n      debugLog.info('call', 'homeserver advertised no RTC transports', error);\n      return false;\n    });\n  probes.set(mx, probe);\n  return probe;\n};\n\nexport const useLivekitSupport = (): boolean => {\n  const mx = useMatrixClient();\n  const autoDiscoveryInfo = useAutoDiscoveryInfo();\n  const wellKnownSupported = livekitSupport(autoDiscoveryInfo);\n  const [serverSupported, setServerSupported] = useState<boolean | undefined>(undefined);\n\n  useEffect(() => {\n    let active = true;\n    void probeServerLivekitTransport(mx).then((supported) => {\n      if (active) setServerSupported(supported);\n    });\n    return () => {\n      active = false;\n    };\n  }, [mx]);\n\n  // The server-advertised transport is the MSC4143 answer and `.well-known` is\n  // the legacy fallback, so either one is enough. While the probe is in flight\n  // we report the legacy answer rather than a premature \"unavailable\".\n  return serverSupported === true || wellKnownSupported;\n};\n","export const webRTCSupported = (): boolean => {\n  if (typeof window === 'undefined') return false;\n\n  return (\n    'RTCPeerConnection' in window ||\n    'webkitRTCPeerConnection' in window ||\n    'mozRTCPeerConnection' in window ||\n    'RTCIceGatherer' in window\n  );\n};\n","import { useCallback, useMemo } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport { EventType } from '$types/matrix-sdk';\nimport { useCallEmbed } from '$hooks/useCallEmbed';\nimport { useAtomValue } from 'jotai';\nimport { isLivekitJsCallActive, livekitJsCallAtom } from '$state/livekitJsCall';\nimport { isNativeCallActive, nativeCallAtom } from '$state/nativeCall';\nimport { useLivekitSupport } from '$hooks/useLivekitSupport';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useStateEventCallback } from '$hooks/useStateEventCallback';\nimport { useForceUpdate } from '$hooks/useForceUpdate';\nimport { webRTCSupported } from '$utils/rtc';\nimport { evaluateCallStartCapabilities, type CallStartCapabilities } from '@sableclient/matrixrtc';\n\nexport const useCallStartCapabilities = (room: Room): CallStartCapabilities => {\n  const mx = useMatrixClient();\n  const callEmbed = useCallEmbed();\n  const livekitJsCall = useAtomValue(livekitJsCallAtom);\n  const nativeCall = useAtomValue(nativeCallAtom);\n  const livekitSupported = useLivekitSupport();\n  const rtcSupported = webRTCSupported();\n  const myUserId = mx.getSafeUserId();\n  const [updateCount, forceUpdate] = useForceUpdate();\n  // Terminal sessions stay in their atom for display, but they are not active\n  // calls and must not block starting a later one.\n  const activeLivekitJsRoomId = isLivekitJsCallActive(livekitJsCall)\n    ? livekitJsCall?.roomId\n    : undefined;\n  const activeNativeCallRoomId = isNativeCallActive(nativeCall) ? nativeCall?.roomId : undefined;\n\n  useStateEventCallback(\n    mx,\n    useCallback(\n      (event) => {\n        if (event.getRoomId() !== room.roomId) return;\n        const eventType = event.getType();\n        if (\n          eventType === (EventType.RoomPowerLevels as string) ||\n          (eventType === (EventType.RoomMember as string) && event.getStateKey() === myUserId)\n        ) {\n          forceUpdate();\n        }\n      },\n      [room.roomId, myUserId, forceUpdate]\n    )\n  );\n\n  return useMemo(() => {\n    void updateCount;\n    return evaluateCallStartCapabilities({\n      room,\n      myUserId,\n      activeCallRoomId: callEmbed?.roomId ?? activeLivekitJsRoomId ?? activeNativeCallRoomId,\n      livekitSupported,\n      rtcSupported,\n    });\n  }, [\n    room,\n    myUserId,\n    callEmbed?.roomId,\n    activeLivekitJsRoomId,\n    activeNativeCallRoomId,\n    livekitSupported,\n    rtcSupported,\n    updateCount,\n  ]);\n};\n","import { useSpecVersions } from './useSpecVersions';\n\nexport const useMediaAuthentication = (): boolean => {\n  const { versions, unstable_features: unstableFeatures } = useSpecVersions();\n\n  // Default to authenticated before /versions resolves (fail closed).\n  if (versions.length === 0) return true;\n\n  return unstableFeatures?.['org.matrix.msc3916.stable'] || versions.includes('v1.11');\n};\n","import type { Position, RectCords } from 'folds';\nimport { atom } from 'jotai';\nimport type { UserProfile } from '$hooks/useUserProfile';\nimport type { Persona } from '$app/persona';\n\nexport type UserRoomProfileState = {\n  userId: string;\n  roomId: string;\n  spaceId?: string;\n  pmp?: Persona;\n  cords: RectCords;\n  position?: Position;\n  initialProfile?: Partial<UserProfile>;\n};\n\nexport const userRoomProfileAtom = atom<UserRoomProfileState | undefined>(undefined);\n\nexport const profilesCacheAtom = atom<Record<string, UserProfile>>({});\n\nexport const persistentProfileIdsAtom = atom<Set<string>>(new Set<string>());\n","import { useCallback } from 'react';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport type { Position, RectCords } from 'folds';\nimport type { UserProfile } from '$hooks/useUserProfile';\nimport type { UserRoomProfileState } from '$state/userRoomProfile';\nimport { userRoomProfileAtom } from '$state/userRoomProfile';\nimport type { Persona } from '$app/persona';\n\nexport const useUserRoomProfileState = (): UserRoomProfileState | undefined => {\n  const data = useAtomValue(userRoomProfileAtom);\n  return data;\n};\n\ntype CloseCallback = () => void;\nexport const useCloseUserRoomProfile = (): CloseCallback => {\n  const setUserRoomProfile = useSetAtom(userRoomProfileAtom);\n\n  const close: CloseCallback = useCallback(() => {\n    setUserRoomProfile(undefined);\n  }, [setUserRoomProfile]);\n\n  return close;\n};\n\ntype OpenCallback = (\n  roomId: string,\n  spaceId: string | undefined,\n  userId: string,\n  pmp: Persona | undefined,\n  cords: RectCords,\n  position?: Position,\n  initialProfile?: Partial<UserProfile>\n) => void;\n\nexport const useOpenUserRoomProfile = (): OpenCallback => {\n  const setUserRoomProfile = useSetAtom(userRoomProfileAtom);\n\n  const open: OpenCallback = useCallback(\n    (roomId, spaceId, userId, pmp, cords, position, initialProfile) => {\n      setUserRoomProfile({\n        roomId,\n        spaceId,\n        userId,\n        pmp,\n        cords,\n        position,\n        initialProfile,\n      });\n    },\n    [setUserRoomProfile]\n  );\n\n  return open;\n};\n","import type { ComponentProps } from 'react';\nimport { Box, as } from 'folds';\nimport classNames from 'classnames';\nimport type { ContainerColorVariants } from '$styles/ContainerColor.css';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport * as css from './style.css';\n\nexport const SequenceCard = as<\n  'div',\n  ComponentProps<typeof Box> & ContainerColorVariants & css.SequenceCardVariants\n>(\n  (\n    {\n      as: AsSequenceCard = 'div',\n      className,\n      variant,\n      radii,\n      firstChild,\n      lastChild,\n      outlined,\n      mergeBorder,\n      ...props\n    },\n    ref\n  ) => (\n    <Box\n      as={AsSequenceCard}\n      className={classNames(\n        css.SequenceCard({ radii, outlined, mergeBorder }),\n        ContainerColor({ variant }),\n        className\n      )}\n      data-sequence-card=\"true\"\n      data-first-child={firstChild}\n      data-last-child={lastChild}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n","export type DirectRoomMember = {\n  userId: string;\n  membership?: string;\n};\n\ntype ResolveDmOtherMemberInput<Member extends DirectRoomMember> = {\n  currentUserId: string | null;\n  directMembers: Member[];\n  members: Member[];\n  functionalMemberIds: string[];\n  fallbackMember?: Member;\n};\n\nexport const isFunctionalMember = (\n  member: DirectRoomMember,\n  functionalMemberIds: readonly string[]\n): boolean => functionalMemberIds.includes(member.userId);\n\nconst isActiveMember = (member: DirectRoomMember): boolean =>\n  member.membership === 'join' || member.membership === 'invite';\n\nexport const resolveDmOtherMember = <Member extends DirectRoomMember>({\n  currentUserId,\n  directMembers,\n  members,\n  functionalMemberIds,\n  fallbackMember,\n}: ResolveDmOtherMemberInput<Member>): Member | undefined => {\n  const isFunctional = (member: DirectRoomMember) =>\n    isFunctionalMember(member, functionalMemberIds);\n\n  const directMember = directMembers.filter((member) => !isFunctional(member));\n  if (directMember.length === 1 && isActiveMember(directMember[0]!)) return directMember[0];\n\n  const otherMembers = members.filter(\n    (member) => member.userId !== currentUserId && !isFunctional(member) && isActiveMember(member)\n  );\n  if (otherMembers.length === 1) return otherMembers[0];\n\n  return fallbackMember && !isFunctional(fallbackMember) ? fallbackMember : undefined;\n};\n","import { EventTimeline, EventType, UNSTABLE_ELEMENT_FUNCTIONAL_USERS } from '$types/matrix-sdk';\nimport type { MatrixClient, Room, RoomMember, StateEvents } from '$types/matrix-sdk';\n\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { mxcUrlToHttp } from '../mediaUrl';\nimport { resolveDmOtherMember } from './directMember';\n\n/**\n * The square-cropped avatar conversion every avatar call site repeats. Goes\n * through `mxcUrlToHttp` so the Tauri media rewrite is never bypassed.\n */\nexport const getAvatarUrl = (\n  mx: MatrixClient,\n  mxcUrl: string | null | undefined,\n  size: number,\n  useAuthentication = false\n): string | undefined =>\n  mxcUrl\n    ? (mxcUrlToHttp(mx, mxcUrl, useAuthentication, size, size, 'crop') ?? undefined)\n    : undefined;\n\nexport const getRoomAvatarUrl = (\n  mx: MatrixClient,\n  room: Room,\n  size: 32 | 96 = 32,\n  useAuthentication = false\n): string | undefined => getAvatarUrl(mx, room.getMxcAvatarUrl(), size, useAuthentication);\n\nexport const getDmOtherMember = (mx: MatrixClient, room: Room): RoomMember | undefined => {\n  // A non-array service_members would otherwise make .includes a substring match.\n  const serviceMembers = room\n    .getLiveTimeline?.()\n    ?.getState(EventTimeline.FORWARDS)\n    ?.getStateEvents(UNSTABLE_ELEMENT_FUNCTIONAL_USERS.name as keyof StateEvents, '')\n    ?.getContent<{ service_members?: unknown }>().service_members;\n  const functionalMembers = Array.isArray(serviceMembers)\n    ? serviceMembers.filter((userId): userId is string => typeof userId === 'string')\n    : [];\n  const currentUserId = mx.getUserId();\n  const mDirect = mx.getAccountData(EventType.Direct)?.getContent<Record<string, string[]>>();\n  const directUserIds = Object.entries(mDirect ?? {})\n    .filter(\n      ([userId, roomIds]) =>\n        userId !== currentUserId && Array.isArray(roomIds) && roomIds.includes(room.roomId)\n    )\n    .map(([userId]) => userId);\n\n  const directMembers = directUserIds\n    .map((userId) => room.getMember(userId))\n    .filter((member): member is RoomMember => member != null);\n\n  return resolveDmOtherMember({\n    currentUserId,\n    directMembers,\n    members: room.getMembers(),\n    functionalMemberIds: functionalMembers,\n    fallbackMember: room.getAvatarFallbackMember(),\n  });\n};\n\nexport const getDirectRoomAvatarUrl = (\n  mx: MatrixClient,\n  room: Room,\n  size: 32 | 96 = 32,\n  useAuthentication = false\n): string | undefined => {\n  const mxcUrl = getDmOtherMember(mx, room)?.getMxcAvatarUrl();\n\n  if (!mxcUrl) {\n    return getRoomAvatarUrl(mx, room, size, useAuthentication);\n  }\n\n  return getAvatarUrl(mx, mxcUrl, size, useAuthentication);\n};\n\nexport const trimReplyFromBody = (body: string): string => {\n  const match = body.match(/^> <.+?> .+\\n(>.*\\n)*?\\n/m);\n  if (!match) return body;\n  return body.slice(match[0].length);\n};\n\nexport const trimReplyFromFormattedBody = (formattedBody: string): string => {\n  const suffix = '</mx-reply>';\n  const i = formattedBody.lastIndexOf(suffix);\n  if (i < 0) {\n    return formattedBody;\n  }\n  return formattedBody.slice(i + suffix.length);\n};\n\nexport const getMemberDisplayName = (\n  room: Room,\n  userId: string,\n  nicknames?: Record<string, string>\n): string | undefined => {\n  if (nicknames?.[userId]) return nicknames[userId];\n  const member = room.getMember(userId);\n  const name = member?.rawDisplayName;\n  if (name === userId) return undefined;\n  if (\n    name?.replace(\n      // oxlint-disable-next-line no-misleading-character-class -- Stripping invisible formatting characters from display names\n      /[\\p{Cc}\\p{Cf}\\u180B-\\u180F\\uFE00-\\uFE0F\\u200B-\\u200D\\t\\n ]/gu,\n      ''\n    ).length === 0\n  )\n    return undefined;\n  return name;\n};\n\nexport const getTimelineSenderDisplayName = (\n  room: Room,\n  userId: string,\n  nicknames?: Record<string, string>,\n  profileDisplayName?: string\n): string =>\n  getMemberDisplayName(room, userId, nicknames) ??\n  profileDisplayName ??\n  getMxIdLocalPart(userId) ??\n  userId;\n\nexport const getMemberSearchStr = (\n  member: RoomMember,\n  query: string,\n  mxIdToName: (mxId: string) => string,\n  nicknames?: Record<string, string>\n): string[] => {\n  const nickname = nicknames?.[member.userId];\n  const displayName =\n    member.rawDisplayName === member.userId ? mxIdToName(member.userId) : member.rawDisplayName;\n  const idStr =\n    query.startsWith('@') || query.indexOf(':') > -1 ? member.userId : mxIdToName(member.userId);\n\n  const strings: string[] = [];\n  if (nickname) strings.push(nickname);\n  strings.push(displayName, idStr);\n  return strings;\n};\n\nexport const getMemberAvatarMxc = (room: Room, userId: string): string | undefined => {\n  const member = room.getMember(userId);\n  return member?.getMxcAvatarUrl();\n};\n","// https://github.com/cloudrac3r/cadencegq/blob/master/pug/mxid.pug\n\nfunction hashCode(str?: string): number {\n  let hash = 0;\n  if (str === undefined || str.length === 0) {\n    return hash;\n  }\n  for (let i = 0; i < str.length; i += 1) {\n    const chr = str.codePointAt(i) ?? 0;\n    hash = (hash << 5) - hash + chr;\n\n    hash = Math.trunc(hash);\n  }\n  return Math.abs(hash);\n}\n\nexport function cssColorMXID(userId?: string): string {\n  const colorNumber = hashCode(userId) % 8;\n  return `--mx-uc-${colorNumber + 1}`;\n}\n\nexport default function colorMXID(userId?: string): string {\n  const hash = hashCode(userId);\n\n  const h = hash % 360;\n  const s = 65;\n  const l = 80;\n\n  return `hsl(${h}, ${s}%, ${l}%)`;\n}\n","import { AvatarFallback, AvatarImage, color } from 'folds';\nimport type { ReactEventHandler, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport colorMXID from '$utils/colorMXID';\nimport { useAvatarMediaSource } from '$hooks/useRenderableMediaUrl';\nimport * as css from './UserAvatar.css';\n\ntype UserAvatarProps = {\n  className?: string;\n  userId: string;\n  src?: string;\n  alt?: string;\n  fallbackColor?: string;\n  renderFallback: () => ReactNode;\n};\n\nconst handleImageLoad: ReactEventHandler<HTMLImageElement> = (evt) => {\n  evt.currentTarget.setAttribute('data-image-loaded', 'true');\n};\n\nexport function UserAvatar({\n  className,\n  userId,\n  src,\n  alt,\n  fallbackColor,\n  renderFallback,\n}: UserAvatarProps) {\n  const { mediaSrc, error, onError } = useAvatarMediaSource(src);\n\n  if (!mediaSrc || error) {\n    return (\n      <AvatarFallback\n        style={{\n          backgroundColor: fallbackColor ?? colorMXID(userId),\n          color: color.Surface.Container,\n        }}\n        className={classNames(css.UserAvatar, className)}\n      >\n        {renderFallback()}\n      </AvatarFallback>\n    );\n  }\n\n  return (\n    <AvatarImage\n      className={classNames(css.UserAvatar, className)}\n      src={mediaSrc}\n      alt={alt}\n      loading=\"lazy\"\n      decoding=\"async\"\n      onError={onError}\n      onLoad={handleImageLoad}\n      draggable={false}\n    />\n  );\n}\n","import type { CallMembership } from '$types/matrix-sdk';\nimport { useState } from 'react';\nimport { Avatar, Box, Text } from 'folds';\nimport {\n  CaretDown,\n  CaretUp,\n  sizedIcon,\n  userFallbackIcon,\n  VideoCameraSlash,\n} from '$components/icons/phosphor';\nimport { useMatrixClient } from '../../hooks/useMatrixClient';\nimport { useMediaAuthentication } from '../../hooks/useMediaAuthentication';\nimport { useOpenUserRoomProfile } from '../../state/hooks/userRoomProfile';\nimport { SequenceCard } from '../../components/sequence-card';\nimport { getMemberAvatarMxc, getMemberDisplayName } from '../../utils/room/display';\nimport { useRoom } from '../../hooks/useRoom';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix';\nimport { UserAvatar } from '../../components/user-avatar';\nimport { getMouseEventCords } from '../../utils/dom';\nimport * as css from './styles.css';\n\ninterface MemberWithMembershipData {\n  membershipData?: Record<string, unknown> & {\n    'm.call.intent': 'video' | 'audio';\n  };\n}\n\ntype CallMemberCardProps = {\n  member: CallMembership;\n};\nfunction CallMemberCard({ member }: CallMemberCardProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const room = useRoom();\n\n  const openUserProfile = useOpenUserRoomProfile();\n\n  const userId = member.sender;\n  if (!userId) return null;\n\n  const name = getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId) ?? userId;\n  const avatarMxc = getMemberAvatarMxc(room, userId);\n  const avatarUrl = avatarMxc\n    ? (mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96) ?? undefined)\n    : undefined;\n\n  const audioOnly =\n    (member as unknown as MemberWithMembershipData).membershipData?.['m.call.intent'] === 'audio';\n\n  return (\n    <SequenceCard\n      as=\"button\"\n      key={member.membershipID}\n      className={css.CallMemberCard}\n      variant=\"SurfaceVariant\"\n      radii=\"500\"\n      onClick={(evt: React.MouseEvent) =>\n        openUserProfile(\n          room.roomId,\n          undefined,\n          userId,\n          undefined,\n          getMouseEventCords(evt.nativeEvent),\n          'Right'\n        )\n      }\n    >\n      <Box grow=\"Yes\" gap=\"300\" alignItems=\"Center\">\n        <Avatar size=\"200\" radii=\"400\">\n          <UserAvatar\n            userId={userId}\n            src={avatarUrl}\n            alt={name}\n            renderFallback={() => userFallbackIcon('sm')}\n          />\n        </Avatar>\n        <Box grow=\"Yes\">\n          <Text size=\"L400\" truncate>\n            {name}\n          </Text>\n        </Box>\n        {audioOnly && sizedIcon(VideoCameraSlash, '100')}\n      </Box>\n    </SequenceCard>\n  );\n}\n\nexport function CallMemberRenderer({\n  members,\n  max = 4,\n}: {\n  members: CallMembership[];\n  max?: number;\n}) {\n  const [viewMore, setViewMore] = useState(false);\n\n  const truncatedMembers = viewMore ? members : members.slice(0, 4);\n  const remaining = members.length - truncatedMembers.length;\n\n  return (\n    <>\n      {truncatedMembers.map((member) => (\n        <CallMemberCard key={member.membershipID} member={member} />\n      ))}\n      {members.length > max && (\n        <SequenceCard\n          as=\"button\"\n          className={css.CallMemberCard}\n          variant=\"SurfaceVariant\"\n          radii=\"500\"\n          onClick={() => setViewMore(!viewMore)}\n        >\n          <Box grow=\"Yes\" gap=\"300\" alignItems=\"Center\">\n            {viewMore ? (\n              <Text size=\"L400\" truncate>\n                Collapse\n              </Text>\n            ) : (\n              <Text size=\"L400\" truncate>\n                {remaining === 0 ? `+${remaining} Other` : `+${remaining} Others`}\n              </Text>\n            )}\n          </Box>\n          {sizedIcon(viewMore ? CaretUp : CaretDown, '100')}\n        </SequenceCard>\n      )}\n    </>\n  );\n}\n","import { IconButton, Line, Text, Tooltip } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport {\n  ChatCircle,\n  Headphones,\n  sizedIcon,\n  Microphone,\n  MicrophoneSlash,\n  SpeakerSlash,\n  VideoCamera,\n  VideoCameraSlash,\n} from '$components/icons/phosphor';\nimport { useAtom } from 'jotai';\nimport * as css from './styles.css';\nimport { callChatAtom } from '../../state/callEmbed';\n\nexport function ControlDivider() {\n  return (\n    <Line variant=\"SurfaceVariant\" size=\"300\" direction=\"Vertical\" className={css.ControlDivider} />\n  );\n}\n\ntype MicrophoneButtonProps = {\n  enabled: boolean;\n  onToggle: () => void;\n  disabled?: boolean;\n};\nexport function MicrophoneButton({ enabled, onToggle, disabled }: MicrophoneButtonProps) {\n  return (\n    <TooltipProvider\n      position=\"Top\"\n      delay={500}\n      tooltip={\n        <Tooltip>\n          <Text size=\"T200\">{enabled ? 'Turn Off Microphone' : 'Turn On Microphone'}</Text>\n        </Tooltip>\n      }\n    >\n      {(anchorRef) => (\n        <IconButton\n          ref={anchorRef}\n          variant={enabled ? 'Surface' : 'Warning'}\n          fill=\"Soft\"\n          radii=\"400\"\n          size=\"400\"\n          onClick={() => onToggle()}\n          disabled={disabled}\n          outlined\n        >\n          {sizedIcon(enabled ? Microphone : MicrophoneSlash, '300', { filled: !enabled })}\n        </IconButton>\n      )}\n    </TooltipProvider>\n  );\n}\n\ntype SoundButtonProps = {\n  enabled: boolean;\n  onToggle: () => void;\n};\nexport function SoundButton({ enabled, onToggle }: SoundButtonProps) {\n  return (\n    <TooltipProvider\n      position=\"Top\"\n      delay={500}\n      tooltip={\n        <Tooltip>\n          <Text size=\"T200\">{enabled ? 'Turn Off Sound' : 'Turn On Sound'}</Text>\n        </Tooltip>\n      }\n    >\n      {(anchorRef) => (\n        <IconButton\n          ref={anchorRef}\n          variant={enabled ? 'Surface' : 'Warning'}\n          fill=\"Soft\"\n          radii=\"400\"\n          size=\"400\"\n          onClick={() => onToggle()}\n          outlined\n        >\n          {sizedIcon(enabled ? Headphones : SpeakerSlash, '300', { filled: !enabled })}\n        </IconButton>\n      )}\n    </TooltipProvider>\n  );\n}\n\ntype VideoButtonProps = {\n  enabled: boolean;\n  onToggle: () => void;\n  disabled?: boolean;\n};\nexport function VideoButton({ enabled, onToggle, disabled }: VideoButtonProps) {\n  return (\n    <TooltipProvider\n      position=\"Top\"\n      delay={500}\n      tooltip={\n        <Tooltip>\n          <Text size=\"T200\">{enabled ? 'Stop Camera' : 'Start Camera'}</Text>\n        </Tooltip>\n      }\n    >\n      {(anchorRef) => (\n        <IconButton\n          ref={anchorRef}\n          variant={enabled ? 'Success' : 'Surface'}\n          fill=\"Soft\"\n          radii=\"400\"\n          size=\"400\"\n          onClick={() => onToggle()}\n          disabled={disabled}\n          outlined\n        >\n          {sizedIcon(enabled ? VideoCamera : VideoCameraSlash, '300', { filled: enabled })}\n        </IconButton>\n      )}\n    </TooltipProvider>\n  );\n}\n\nexport function ChatButton() {\n  const [chat, setChat] = useAtom(callChatAtom);\n\n  return (\n    <TooltipProvider\n      position=\"Top\"\n      delay={500}\n      tooltip={\n        <Tooltip>\n          <Text size=\"T200\">{chat ? 'Close Chat' : 'Open Chat'}</Text>\n        </Tooltip>\n      }\n    >\n      {(anchorRef) => (\n        <IconButton\n          ref={anchorRef}\n          variant={chat ? 'Success' : 'Surface'}\n          fill=\"Soft\"\n          radii=\"400\"\n          size=\"400\"\n          onClick={() => setChat(!chat)}\n          outlined\n        >\n          {sizedIcon(ChatCircle, '300', { filled: chat })}\n        </IconButton>\n      )}\n    </TooltipProvider>\n  );\n}\n","import { createContext, useCallback, useContext } from 'react';\nimport { useAtom } from 'jotai';\nimport type { CallPreferences, CallPreferencesAtom } from '../callPreferences';\n\nconst CallPreferencesAtomContext = createContext<CallPreferencesAtom | null>(null);\nexport const CallPreferencesProvider = CallPreferencesAtomContext.Provider;\n\nexport const useCallPreferencesAtom = (): CallPreferencesAtom => {\n  const atom = useContext(CallPreferencesAtomContext);\n  if (!atom) {\n    throw new Error('CallPreferencesAtom not provided!');\n  }\n\n  return atom;\n};\n\nexport const useCallPreferences = (): CallPreferences & {\n  toggleMicrophone: () => void;\n  toggleVideo: () => void;\n  toggleSound: () => void;\n  setAudioDeviceId: (deviceId: string) => void;\n  setVideoDeviceId: (deviceId: string) => void;\n  setPreferences: (prefs: CallPreferences) => void;\n} => {\n  const callPrefAtom = useCallPreferencesAtom();\n  const [pref, setPref] = useAtom(callPrefAtom);\n\n  const toggleMicrophone = useCallback(() => {\n    const microphone = !pref.microphone;\n\n    setPref({\n      ...pref,\n      microphone,\n      sound: !pref.sound && microphone ? true : pref.sound,\n    });\n  }, [setPref, pref]);\n\n  const toggleVideo = useCallback(() => {\n    const video = !pref.video;\n\n    setPref({ ...pref, video });\n  }, [setPref, pref]);\n\n  const toggleSound = useCallback(() => {\n    const sound = !pref.sound;\n\n    setPref({\n      ...pref,\n      microphone: !sound ? false : pref.microphone,\n      sound,\n    });\n  }, [setPref, pref]);\n\n  const setAudioDeviceId = useCallback(\n    (audioDeviceId: string) => setPref({ ...pref, audioDeviceId }),\n    [setPref, pref]\n  );\n\n  const setVideoDeviceId = useCallback(\n    (videoDeviceId: string) => setPref({ ...pref, videoDeviceId }),\n    [setPref, pref]\n  );\n\n  return {\n    ...pref,\n    setAudioDeviceId,\n    setVideoDeviceId,\n    toggleMicrophone,\n    toggleVideo,\n    toggleSound,\n    setPreferences: setPref,\n  };\n};\n","import { LogLevel as Pt, setLogExtension as Qn, setLogLevel as Xn, RoomEvent as y, ParticipantEvent as w, Track as F, TrackEvent as Zt, getBrowser as Jn, compareVersions as Zn, Room as Ot } from \"livekit-client\";\nimport * as D from \"react\";\nconst We = Math.min, de = Math.max, Be = Math.round, Re = Math.floor, te = (e) => ({\n  x: e,\n  y: e\n}), er = {\n  left: \"right\",\n  right: \"left\",\n  bottom: \"top\",\n  top: \"bottom\"\n};\nfunction At(e, t, n) {\n  return de(e, We(t, n));\n}\nfunction Ge(e, t) {\n  return typeof e == \"function\" ? e(t) : e;\n}\nfunction pe(e) {\n  return e.split(\"-\")[0];\n}\nfunction Qe(e) {\n  return e.split(\"-\")[1];\n}\nfunction en(e) {\n  return e === \"x\" ? \"y\" : \"x\";\n}\nfunction tn(e) {\n  return e === \"y\" ? \"height\" : \"width\";\n}\nfunction ae(e) {\n  const t = e[0];\n  return t === \"t\" || t === \"b\" ? \"y\" : \"x\";\n}\nfunction nn(e) {\n  return en(ae(e));\n}\nfunction tr(e, t, n) {\n  n === void 0 && (n = !1);\n  const r = Qe(e), i = nn(e), o = tn(i);\n  let s = i === \"x\" ? r === (n ? \"end\" : \"start\") ? \"right\" : \"left\" : r === \"start\" ? \"bottom\" : \"top\";\n  return t.reference[o] > t.floating[o] && (s = je(s)), [s, je(s)];\n}\nfunction nr(e) {\n  const t = je(e);\n  return [ft(e), t, ft(t)];\n}\nfunction ft(e) {\n  return e.includes(\"start\") ? e.replace(\"start\", \"end\") : e.replace(\"end\", \"start\");\n}\nconst _t = [\"left\", \"right\"], kt = [\"right\", \"left\"], rr = [\"top\", \"bottom\"], ir = [\"bottom\", \"top\"];\nfunction or(e, t, n) {\n  switch (e) {\n    case \"top\":\n    case \"bottom\":\n      return n ? t ? kt : _t : t ? _t : kt;\n    case \"left\":\n    case \"right\":\n      return t ? rr : ir;\n    default:\n      return [];\n  }\n}\nfunction sr(e, t, n, r) {\n  const i = Qe(e);\n  let o = or(pe(e), n === \"start\", r);\n  return i && (o = o.map((s) => s + \"-\" + i), t && (o = o.concat(o.map(ft)))), o;\n}\nfunction je(e) {\n  const t = pe(e);\n  return er[t] + e.slice(t.length);\n}\nfunction ar(e) {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    ...e\n  };\n}\nfunction cr(e) {\n  return typeof e != \"number\" ? ar(e) : {\n    top: e,\n    right: e,\n    bottom: e,\n    left: e\n  };\n}\nfunction Ve(e) {\n  const {\n    x: t,\n    y: n,\n    width: r,\n    height: i\n  } = e;\n  return {\n    width: r,\n    height: i,\n    top: n,\n    left: t,\n    right: t + r,\n    bottom: n + i,\n    x: t,\n    y: n\n  };\n}\nfunction Lt(e, t, n) {\n  let {\n    reference: r,\n    floating: i\n  } = e;\n  const o = ae(t), s = nn(t), a = tn(s), c = pe(t), u = o === \"y\", l = r.x + r.width / 2 - i.width / 2, f = r.y + r.height / 2 - i.height / 2, h = r[a] / 2 - i[a] / 2;\n  let d;\n  switch (c) {\n    case \"top\":\n      d = {\n        x: l,\n        y: r.y - i.height\n      };\n      break;\n    case \"bottom\":\n      d = {\n        x: l,\n        y: r.y + r.height\n      };\n      break;\n    case \"right\":\n      d = {\n        x: r.x + r.width,\n        y: f\n      };\n      break;\n    case \"left\":\n      d = {\n        x: r.x - i.width,\n        y: f\n      };\n      break;\n    default:\n      d = {\n        x: r.x,\n        y: r.y\n      };\n  }\n  switch (Qe(t)) {\n    case \"start\":\n      d[s] -= h * (n && u ? -1 : 1);\n      break;\n    case \"end\":\n      d[s] += h * (n && u ? -1 : 1);\n      break;\n  }\n  return d;\n}\nasync function ur(e, t) {\n  var n;\n  t === void 0 && (t = {});\n  const {\n    x: r,\n    y: i,\n    platform: o,\n    rects: s,\n    elements: a,\n    strategy: c\n  } = e, {\n    boundary: u = \"clippingAncestors\",\n    rootBoundary: l = \"viewport\",\n    elementContext: f = \"floating\",\n    altBoundary: h = !1,\n    padding: d = 0\n  } = Ge(t, e), m = cr(d), g = a[h ? f === \"floating\" ? \"reference\" : \"floating\" : f], v = Ve(await o.getClippingRect({\n    element: (n = await (o.isElement == null ? void 0 : o.isElement(g))) == null || n ? g : g.contextElement || await (o.getDocumentElement == null ? void 0 : o.getDocumentElement(a.floating)),\n    boundary: u,\n    rootBoundary: l,\n    strategy: c\n  })), x = f === \"floating\" ? {\n    x: r,\n    y: i,\n    width: s.floating.width,\n    height: s.floating.height\n  } : s.reference, C = await (o.getOffsetParent == null ? void 0 : o.getOffsetParent(a.floating)), T = await (o.isElement == null ? void 0 : o.isElement(C)) ? await (o.getScale == null ? void 0 : o.getScale(C)) || {\n    x: 1,\n    y: 1\n  } : {\n    x: 1,\n    y: 1\n  }, S = Ve(o.convertOffsetParentRelativeRectToViewportRelativeRect ? await o.convertOffsetParentRelativeRectToViewportRelativeRect({\n    elements: a,\n    rect: x,\n    offsetParent: C,\n    strategy: c\n  }) : x);\n  return {\n    top: (v.top - S.top + m.top) / T.y,\n    bottom: (S.bottom - v.bottom + m.bottom) / T.y,\n    left: (v.left - S.left + m.left) / T.x,\n    right: (S.right - v.right + m.right) / T.x\n  };\n}\nconst lr = 50, fr = async (e, t, n) => {\n  const {\n    placement: r = \"bottom\",\n    strategy: i = \"absolute\",\n    middleware: o = [],\n    platform: s\n  } = n, a = s.detectOverflow ? s : {\n    ...s,\n    detectOverflow: ur\n  }, c = await (s.isRTL == null ? void 0 : s.isRTL(t));\n  let u = await s.getElementRects({\n    reference: e,\n    floating: t,\n    strategy: i\n  }), {\n    x: l,\n    y: f\n  } = Lt(u, r, c), h = r, d = 0;\n  const m = {};\n  for (let p = 0; p < o.length; p++) {\n    const g = o[p];\n    if (!g)\n      continue;\n    const {\n      name: v,\n      fn: x\n    } = g, {\n      x: C,\n      y: T,\n      data: S,\n      reset: b\n    } = await x({\n      x: l,\n      y: f,\n      initialPlacement: r,\n      placement: h,\n      strategy: i,\n      middlewareData: m,\n      rects: u,\n      platform: a,\n      elements: {\n        reference: e,\n        floating: t\n      }\n    });\n    l = C ?? l, f = T ?? f, m[v] = {\n      ...m[v],\n      ...S\n    }, b && d < lr && (d++, typeof b == \"object\" && (b.placement && (h = b.placement), b.rects && (u = b.rects === !0 ? await s.getElementRects({\n      reference: e,\n      floating: t,\n      strategy: i\n    }) : b.rects), {\n      x: l,\n      y: f\n    } = Lt(u, h, c)), p = -1);\n  }\n  return {\n    x: l,\n    y: f,\n    placement: h,\n    strategy: i,\n    middlewareData: m\n  };\n}, dr = function(e) {\n  return e === void 0 && (e = {}), {\n    name: \"flip\",\n    options: e,\n    async fn(t) {\n      var n, r;\n      const {\n        placement: i,\n        middlewareData: o,\n        rects: s,\n        initialPlacement: a,\n        platform: c,\n        elements: u\n      } = t, {\n        mainAxis: l = !0,\n        crossAxis: f = !0,\n        fallbackPlacements: h,\n        fallbackStrategy: d = \"bestFit\",\n        fallbackAxisSideDirection: m = \"none\",\n        flipAlignment: p = !0,\n        ...g\n      } = Ge(e, t);\n      if ((n = o.arrow) != null && n.alignmentOffset)\n        return {};\n      const v = pe(i), x = ae(a), C = pe(a) === a, T = await (c.isRTL == null ? void 0 : c.isRTL(u.floating)), S = h || (C || !p ? [je(a)] : nr(a)), b = m !== \"none\";\n      !h && b && S.push(...sr(a, p, m, T));\n      const P = [a, ...S], R = await c.detectOverflow(t, g), M = [];\n      let W = ((r = o.flip) == null ? void 0 : r.overflows) || [];\n      if (l && M.push(R[v]), f) {\n        const k = tr(i, s, T);\n        M.push(R[k[0]], R[k[1]]);\n      }\n      if (W = [...W, {\n        placement: i,\n        overflows: M\n      }], !M.every((k) => k <= 0)) {\n        var E, O;\n        const k = (((E = o.flip) == null ? void 0 : E.index) || 0) + 1, $ = P[k];\n        if ($ && (!(f === \"alignment\" ? x !== ae($) : !1) || // We leave the current main axis only if every placement on that axis\n        // overflows the main axis.\n        W.every((N) => ae(N.placement) === x ? N.overflows[0] > 0 : !0)))\n          return {\n            data: {\n              index: k,\n              overflows: W\n            },\n            reset: {\n              placement: $\n            }\n          };\n        let G = (O = W.filter((X) => X.overflows[0] <= 0).sort((X, N) => X.overflows[1] - N.overflows[1])[0]) == null ? void 0 : O.placement;\n        if (!G)\n          switch (d) {\n            case \"bestFit\": {\n              var j;\n              const X = (j = W.filter((N) => {\n                if (b) {\n                  const se = ae(N.placement);\n                  return se === x || // Create a bias to the `y` side axis due to horizontal\n                  // reading directions favoring greater width.\n                  se === \"y\";\n                }\n                return !0;\n              }).map((N) => [N.placement, N.overflows.filter((se) => se > 0).reduce((se, Gn) => se + Gn, 0)]).sort((N, se) => N[1] - se[1])[0]) == null ? void 0 : j[0];\n              X && (G = X);\n              break;\n            }\n            case \"initialPlacement\":\n              G = a;\n              break;\n          }\n        if (i !== G)\n          return {\n            reset: {\n              placement: G\n            }\n          };\n      }\n      return {};\n    }\n  };\n}, pr = /* @__PURE__ */ new Set([\"left\", \"top\"]);\nasync function hr(e, t) {\n  const {\n    placement: n,\n    platform: r,\n    elements: i\n  } = e, o = await (r.isRTL == null ? void 0 : r.isRTL(i.floating)), s = pe(n), a = Qe(n), c = ae(n) === \"y\", u = pr.has(s) ? -1 : 1, l = o && c ? -1 : 1, f = Ge(t, e);\n  let {\n    mainAxis: h,\n    crossAxis: d,\n    alignmentAxis: m\n  } = typeof f == \"number\" ? {\n    mainAxis: f,\n    crossAxis: 0,\n    alignmentAxis: null\n  } : {\n    mainAxis: f.mainAxis || 0,\n    crossAxis: f.crossAxis || 0,\n    alignmentAxis: f.alignmentAxis\n  };\n  return a && typeof m == \"number\" && (d = a === \"end\" ? m * -1 : m), c ? {\n    x: d * l,\n    y: h * u\n  } : {\n    x: h * u,\n    y: d * l\n  };\n}\nconst vr = function(e) {\n  return e === void 0 && (e = 0), {\n    name: \"offset\",\n    options: e,\n    async fn(t) {\n      var n, r;\n      const {\n        x: i,\n        y: o,\n        placement: s,\n        middlewareData: a\n      } = t, c = await hr(t, e);\n      return s === ((n = a.offset) == null ? void 0 : n.placement) && (r = a.arrow) != null && r.alignmentOffset ? {} : {\n        x: i + c.x,\n        y: o + c.y,\n        data: {\n          ...c,\n          placement: s\n        }\n      };\n    }\n  };\n}, mr = function(e) {\n  return e === void 0 && (e = {}), {\n    name: \"shift\",\n    options: e,\n    async fn(t) {\n      const {\n        x: n,\n        y: r,\n        placement: i,\n        platform: o\n      } = t, {\n        mainAxis: s = !0,\n        crossAxis: a = !1,\n        limiter: c = {\n          fn: (v) => {\n            let {\n              x,\n              y: C\n            } = v;\n            return {\n              x,\n              y: C\n            };\n          }\n        },\n        ...u\n      } = Ge(e, t), l = {\n        x: n,\n        y: r\n      }, f = await o.detectOverflow(t, u), h = ae(pe(i)), d = en(h);\n      let m = l[d], p = l[h];\n      if (s) {\n        const v = d === \"y\" ? \"top\" : \"left\", x = d === \"y\" ? \"bottom\" : \"right\", C = m + f[v], T = m - f[x];\n        m = At(C, m, T);\n      }\n      if (a) {\n        const v = h === \"y\" ? \"top\" : \"left\", x = h === \"y\" ? \"bottom\" : \"right\", C = p + f[v], T = p - f[x];\n        p = At(C, p, T);\n      }\n      const g = c.fn({\n        ...t,\n        [d]: m,\n        [h]: p\n      });\n      return {\n        ...g,\n        data: {\n          x: g.x - n,\n          y: g.y - r,\n          enabled: {\n            [d]: s,\n            [h]: a\n          }\n        }\n      };\n    }\n  };\n};\nfunction Xe() {\n  return typeof window < \"u\";\n}\nfunction Ce(e) {\n  return rn(e) ? (e.nodeName || \"\").toLowerCase() : \"#document\";\n}\nfunction K(e) {\n  var t;\n  return (e == null || (t = e.ownerDocument) == null ? void 0 : t.defaultView) || window;\n}\nfunction ne(e) {\n  var t;\n  return (t = (rn(e) ? e.ownerDocument : e.document) || window.document) == null ? void 0 : t.documentElement;\n}\nfunction rn(e) {\n  return Xe() ? e instanceof Node || e instanceof K(e).Node : !1;\n}\nfunction Z(e) {\n  return Xe() ? e instanceof Element || e instanceof K(e).Element : !1;\n}\nfunction ie(e) {\n  return Xe() ? e instanceof HTMLElement || e instanceof K(e).HTMLElement : !1;\n}\nfunction It(e) {\n  return !Xe() || typeof ShadowRoot > \"u\" ? !1 : e instanceof ShadowRoot || e instanceof K(e).ShadowRoot;\n}\nfunction Le(e) {\n  const {\n    overflow: t,\n    overflowX: n,\n    overflowY: r,\n    display: i\n  } = ee(e);\n  return /auto|scroll|overlay|hidden|clip/.test(t + r + n) && i !== \"inline\" && i !== \"contents\";\n}\nfunction gr(e) {\n  return /^(table|td|th)$/.test(Ce(e));\n}\nfunction Je(e) {\n  try {\n    if (e.matches(\":popover-open\"))\n      return !0;\n  } catch {\n  }\n  try {\n    return e.matches(\":modal\");\n  } catch {\n    return !1;\n  }\n}\nconst br = /transform|translate|scale|rotate|perspective|filter/, yr = /paint|layout|strict|content/, le = (e) => !!e && e !== \"none\";\nlet it;\nfunction bt(e) {\n  const t = Z(e) ? ee(e) : e;\n  return le(t.transform) || le(t.translate) || le(t.scale) || le(t.rotate) || le(t.perspective) || !yt() && (le(t.backdropFilter) || le(t.filter)) || br.test(t.willChange || \"\") || yr.test(t.contain || \"\");\n}\nfunction wr(e) {\n  let t = ue(e);\n  for (; ie(t) && !we(t); ) {\n    if (bt(t))\n      return t;\n    if (Je(t))\n      return null;\n    t = ue(t);\n  }\n  return null;\n}\nfunction yt() {\n  return it == null && (it = typeof CSS < \"u\" && CSS.supports && CSS.supports(\"-webkit-backdrop-filter\", \"none\")), it;\n}\nfunction we(e) {\n  return /^(html|body|#document)$/.test(Ce(e));\n}\nfunction ee(e) {\n  return K(e).getComputedStyle(e);\n}\nfunction Ze(e) {\n  return Z(e) ? {\n    scrollLeft: e.scrollLeft,\n    scrollTop: e.scrollTop\n  } : {\n    scrollLeft: e.scrollX,\n    scrollTop: e.scrollY\n  };\n}\nfunction ue(e) {\n  if (Ce(e) === \"html\")\n    return e;\n  const t = (\n    // Step into the shadow DOM of the parent of a slotted node.\n    e.assignedSlot || // DOM Element detected.\n    e.parentNode || // ShadowRoot detected.\n    It(e) && e.host || // Fallback.\n    ne(e)\n  );\n  return It(t) ? t.host : t;\n}\nfunction on(e) {\n  const t = ue(e);\n  return we(t) ? e.ownerDocument ? e.ownerDocument.body : e.body : ie(t) && Le(t) ? t : on(t);\n}\nfunction Oe(e, t, n) {\n  var r;\n  t === void 0 && (t = []), n === void 0 && (n = !0);\n  const i = on(e), o = i === ((r = e.ownerDocument) == null ? void 0 : r.body), s = K(i);\n  if (o) {\n    const a = dt(s);\n    return t.concat(s, s.visualViewport || [], Le(i) ? i : [], a && n ? Oe(a) : []);\n  } else\n    return t.concat(i, Oe(i, [], n));\n}\nfunction dt(e) {\n  return e.parent && Object.getPrototypeOf(e.parent) ? e.frameElement : null;\n}\nfunction sn(e) {\n  const t = ee(e);\n  let n = parseFloat(t.width) || 0, r = parseFloat(t.height) || 0;\n  const i = ie(e), o = i ? e.offsetWidth : n, s = i ? e.offsetHeight : r, a = Be(n) !== o || Be(r) !== s;\n  return a && (n = o, r = s), {\n    width: n,\n    height: r,\n    $: a\n  };\n}\nfunction wt(e) {\n  return Z(e) ? e : e.contextElement;\n}\nfunction ge(e) {\n  const t = wt(e);\n  if (!ie(t))\n    return te(1);\n  const n = t.getBoundingClientRect(), {\n    width: r,\n    height: i,\n    $: o\n  } = sn(t);\n  let s = (o ? Be(n.width) : n.width) / r, a = (o ? Be(n.height) : n.height) / i;\n  return (!s || !Number.isFinite(s)) && (s = 1), (!a || !Number.isFinite(a)) && (a = 1), {\n    x: s,\n    y: a\n  };\n}\nconst xr = /* @__PURE__ */ te(0);\nfunction an(e) {\n  const t = K(e);\n  return !yt() || !t.visualViewport ? xr : {\n    x: t.visualViewport.offsetLeft,\n    y: t.visualViewport.offsetTop\n  };\n}\nfunction Sr(e, t, n) {\n  return t === void 0 && (t = !1), !n || t && n !== K(e) ? !1 : t;\n}\nfunction he(e, t, n, r) {\n  t === void 0 && (t = !1), n === void 0 && (n = !1);\n  const i = e.getBoundingClientRect(), o = wt(e);\n  let s = te(1);\n  t && (r ? Z(r) && (s = ge(r)) : s = ge(e));\n  const a = Sr(o, n, r) ? an(o) : te(0);\n  let c = (i.left + a.x) / s.x, u = (i.top + a.y) / s.y, l = i.width / s.x, f = i.height / s.y;\n  if (o) {\n    const h = K(o), d = r && Z(r) ? K(r) : r;\n    let m = h, p = dt(m);\n    for (; p && r && d !== m; ) {\n      const g = ge(p), v = p.getBoundingClientRect(), x = ee(p), C = v.left + (p.clientLeft + parseFloat(x.paddingLeft)) * g.x, T = v.top + (p.clientTop + parseFloat(x.paddingTop)) * g.y;\n      c *= g.x, u *= g.y, l *= g.x, f *= g.y, c += C, u += T, m = K(p), p = dt(m);\n    }\n  }\n  return Ve({\n    width: l,\n    height: f,\n    x: c,\n    y: u\n  });\n}\nfunction et(e, t) {\n  const n = Ze(e).scrollLeft;\n  return t ? t.left + n : he(ne(e)).left + n;\n}\nfunction cn(e, t) {\n  const n = e.getBoundingClientRect(), r = n.left + t.scrollLeft - et(e, n), i = n.top + t.scrollTop;\n  return {\n    x: r,\n    y: i\n  };\n}\nfunction Cr(e) {\n  let {\n    elements: t,\n    rect: n,\n    offsetParent: r,\n    strategy: i\n  } = e;\n  const o = i === \"fixed\", s = ne(r), a = t ? Je(t.floating) : !1;\n  if (r === s || a && o)\n    return n;\n  let c = {\n    scrollLeft: 0,\n    scrollTop: 0\n  }, u = te(1);\n  const l = te(0), f = ie(r);\n  if ((f || !f && !o) && ((Ce(r) !== \"body\" || Le(s)) && (c = Ze(r)), f)) {\n    const d = he(r);\n    u = ge(r), l.x = d.x + r.clientLeft, l.y = d.y + r.clientTop;\n  }\n  const h = s && !f && !o ? cn(s, c) : te(0);\n  return {\n    width: n.width * u.x,\n    height: n.height * u.y,\n    x: n.x * u.x - c.scrollLeft * u.x + l.x + h.x,\n    y: n.y * u.y - c.scrollTop * u.y + l.y + h.y\n  };\n}\nfunction Er(e) {\n  return Array.from(e.getClientRects());\n}\nfunction Tr(e) {\n  const t = ne(e), n = Ze(e), r = e.ownerDocument.body, i = de(t.scrollWidth, t.clientWidth, r.scrollWidth, r.clientWidth), o = de(t.scrollHeight, t.clientHeight, r.scrollHeight, r.clientHeight);\n  let s = -n.scrollLeft + et(e);\n  const a = -n.scrollTop;\n  return ee(r).direction === \"rtl\" && (s += de(t.clientWidth, r.clientWidth) - i), {\n    width: i,\n    height: o,\n    x: s,\n    y: a\n  };\n}\nconst Rt = 25;\nfunction Pr(e, t) {\n  const n = K(e), r = ne(e), i = n.visualViewport;\n  let o = r.clientWidth, s = r.clientHeight, a = 0, c = 0;\n  if (i) {\n    o = i.width, s = i.height;\n    const l = yt();\n    (!l || l && t === \"fixed\") && (a = i.offsetLeft, c = i.offsetTop);\n  }\n  const u = et(r);\n  if (u <= 0) {\n    const l = r.ownerDocument, f = l.body, h = getComputedStyle(f), d = l.compatMode === \"CSS1Compat\" && parseFloat(h.marginLeft) + parseFloat(h.marginRight) || 0, m = Math.abs(r.clientWidth - f.clientWidth - d);\n    m <= Rt && (o -= m);\n  } else u <= Rt && (o += u);\n  return {\n    width: o,\n    height: s,\n    x: a,\n    y: c\n  };\n}\nfunction Or(e, t) {\n  const n = he(e, !0, t === \"fixed\"), r = n.top + e.clientTop, i = n.left + e.clientLeft, o = ie(e) ? ge(e) : te(1), s = e.clientWidth * o.x, a = e.clientHeight * o.y, c = i * o.x, u = r * o.y;\n  return {\n    width: s,\n    height: a,\n    x: c,\n    y: u\n  };\n}\nfunction Mt(e, t, n) {\n  let r;\n  if (t === \"viewport\")\n    r = Pr(e, n);\n  else if (t === \"document\")\n    r = Tr(ne(e));\n  else if (Z(t))\n    r = Or(t, n);\n  else {\n    const i = an(e);\n    r = {\n      x: t.x - i.x,\n      y: t.y - i.y,\n      width: t.width,\n      height: t.height\n    };\n  }\n  return Ve(r);\n}\nfunction un(e, t) {\n  const n = ue(e);\n  return n === t || !Z(n) || we(n) ? !1 : ee(n).position === \"fixed\" || un(n, t);\n}\nfunction Ar(e, t) {\n  const n = t.get(e);\n  if (n)\n    return n;\n  let r = Oe(e, [], !1).filter((a) => Z(a) && Ce(a) !== \"body\"), i = null;\n  const o = ee(e).position === \"fixed\";\n  let s = o ? ue(e) : e;\n  for (; Z(s) && !we(s); ) {\n    const a = ee(s), c = bt(s);\n    !c && a.position === \"fixed\" && (i = null), (o ? !c && !i : !c && a.position === \"static\" && !!i && (i.position === \"absolute\" || i.position === \"fixed\") || Le(s) && !c && un(e, s)) ? r = r.filter((l) => l !== s) : i = a, s = ue(s);\n  }\n  return t.set(e, r), r;\n}\nfunction _r(e) {\n  let {\n    element: t,\n    boundary: n,\n    rootBoundary: r,\n    strategy: i\n  } = e;\n  const s = [...n === \"clippingAncestors\" ? Je(t) ? [] : Ar(t, this._c) : [].concat(n), r], a = Mt(t, s[0], i);\n  let c = a.top, u = a.right, l = a.bottom, f = a.left;\n  for (let h = 1; h < s.length; h++) {\n    const d = Mt(t, s[h], i);\n    c = de(d.top, c), u = We(d.right, u), l = We(d.bottom, l), f = de(d.left, f);\n  }\n  return {\n    width: u - f,\n    height: l - c,\n    x: f,\n    y: c\n  };\n}\nfunction kr(e) {\n  const {\n    width: t,\n    height: n\n  } = sn(e);\n  return {\n    width: t,\n    height: n\n  };\n}\nfunction Lr(e, t, n) {\n  const r = ie(t), i = ne(t), o = n === \"fixed\", s = he(e, !0, o, t);\n  let a = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  const c = te(0);\n  function u() {\n    c.x = et(i);\n  }\n  if (r || !r && !o)\n    if ((Ce(t) !== \"body\" || Le(i)) && (a = Ze(t)), r) {\n      const d = he(t, !0, o, t);\n      c.x = d.x + t.clientLeft, c.y = d.y + t.clientTop;\n    } else i && u();\n  o && !r && i && u();\n  const l = i && !r && !o ? cn(i, a) : te(0), f = s.left + a.scrollLeft - c.x - l.x, h = s.top + a.scrollTop - c.y - l.y;\n  return {\n    x: f,\n    y: h,\n    width: s.width,\n    height: s.height\n  };\n}\nfunction ot(e) {\n  return ee(e).position === \"static\";\n}\nfunction Dt(e, t) {\n  if (!ie(e) || ee(e).position === \"fixed\")\n    return null;\n  if (t)\n    return t(e);\n  let n = e.offsetParent;\n  return ne(e) === n && (n = n.ownerDocument.body), n;\n}\nfunction ln(e, t) {\n  const n = K(e);\n  if (Je(e))\n    return n;\n  if (!ie(e)) {\n    let i = ue(e);\n    for (; i && !we(i); ) {\n      if (Z(i) && !ot(i))\n        return i;\n      i = ue(i);\n    }\n    return n;\n  }\n  let r = Dt(e, t);\n  for (; r && gr(r) && ot(r); )\n    r = Dt(r, t);\n  return r && we(r) && ot(r) && !bt(r) ? n : r || wr(e) || n;\n}\nconst Ir = async function(e) {\n  const t = this.getOffsetParent || ln, n = this.getDimensions, r = await n(e.floating);\n  return {\n    reference: Lr(e.reference, await t(e.floating), e.strategy),\n    floating: {\n      x: 0,\n      y: 0,\n      width: r.width,\n      height: r.height\n    }\n  };\n};\nfunction Rr(e) {\n  return ee(e).direction === \"rtl\";\n}\nconst Mr = {\n  convertOffsetParentRelativeRectToViewportRelativeRect: Cr,\n  getDocumentElement: ne,\n  getClippingRect: _r,\n  getOffsetParent: ln,\n  getElementRects: Ir,\n  getClientRects: Er,\n  getDimensions: kr,\n  getScale: ge,\n  isElement: Z,\n  isRTL: Rr\n};\nfunction fn(e, t) {\n  return e.x === t.x && e.y === t.y && e.width === t.width && e.height === t.height;\n}\nfunction Dr(e, t) {\n  let n = null, r;\n  const i = ne(e);\n  function o() {\n    var a;\n    clearTimeout(r), (a = n) == null || a.disconnect(), n = null;\n  }\n  function s(a, c) {\n    a === void 0 && (a = !1), c === void 0 && (c = 1), o();\n    const u = e.getBoundingClientRect(), {\n      left: l,\n      top: f,\n      width: h,\n      height: d\n    } = u;\n    if (a || t(), !h || !d)\n      return;\n    const m = Re(f), p = Re(i.clientWidth - (l + h)), g = Re(i.clientHeight - (f + d)), v = Re(l), C = {\n      rootMargin: -m + \"px \" + -p + \"px \" + -g + \"px \" + -v + \"px\",\n      threshold: de(0, We(1, c)) || 1\n    };\n    let T = !0;\n    function S(b) {\n      const P = b[0].intersectionRatio;\n      if (P !== c) {\n        if (!T)\n          return s();\n        P ? s(!1, P) : r = setTimeout(() => {\n          s(!1, 1e-7);\n        }, 1e3);\n      }\n      P === 1 && !fn(u, e.getBoundingClientRect()) && s(), T = !1;\n    }\n    try {\n      n = new IntersectionObserver(S, {\n        ...C,\n        // Handle <iframe>s\n        root: i.ownerDocument\n      });\n    } catch {\n      n = new IntersectionObserver(S, C);\n    }\n    n.observe(e);\n  }\n  return s(!0), o;\n}\nfunction $r(e, t, n, r) {\n  r === void 0 && (r = {});\n  const {\n    ancestorScroll: i = !0,\n    ancestorResize: o = !0,\n    elementResize: s = typeof ResizeObserver == \"function\",\n    layoutShift: a = typeof IntersectionObserver == \"function\",\n    animationFrame: c = !1\n  } = r, u = wt(e), l = i || o ? [...u ? Oe(u) : [], ...t ? Oe(t) : []] : [];\n  l.forEach((v) => {\n    i && v.addEventListener(\"scroll\", n, {\n      passive: !0\n    }), o && v.addEventListener(\"resize\", n);\n  });\n  const f = u && a ? Dr(u, n) : null;\n  let h = -1, d = null;\n  s && (d = new ResizeObserver((v) => {\n    let [x] = v;\n    x && x.target === u && d && t && (d.unobserve(t), cancelAnimationFrame(h), h = requestAnimationFrame(() => {\n      var C;\n      (C = d) == null || C.observe(t);\n    })), n();\n  }), u && !c && d.observe(u), t && d.observe(t));\n  let m, p = c ? he(e) : null;\n  c && g();\n  function g() {\n    const v = he(e);\n    p && !fn(p, v) && n(), p = v, m = requestAnimationFrame(g);\n  }\n  return n(), () => {\n    var v;\n    l.forEach((x) => {\n      i && x.removeEventListener(\"scroll\", n), o && x.removeEventListener(\"resize\", n);\n    }), f?.(), (v = d) == null || v.disconnect(), d = null, c && cancelAnimationFrame(m);\n  };\n}\nconst Nr = vr, Fr = mr, Ur = dr, Wr = (e, t, n) => {\n  const r = /* @__PURE__ */ new Map(), i = {\n    platform: Mr,\n    ...n\n  }, o = {\n    ...i.platform,\n    _c: r\n  };\n  return fr(e, t, {\n    ...i,\n    platform: o\n  });\n};\nvar es = typeof globalThis < \"u\" ? globalThis : typeof window < \"u\" ? window : typeof global < \"u\" ? global : typeof self < \"u\" ? self : {};\nfunction Br(e) {\n  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, \"default\") ? e.default : e;\n}\nvar Ne = { exports: {} }, jr = Ne.exports, $t;\nfunction Vr() {\n  return $t || ($t = 1, (function(e) {\n    (function(t, n) {\n      e.exports ? e.exports = n() : t.log = n();\n    })(jr, function() {\n      var t = function() {\n      }, n = \"undefined\", r = typeof window !== n && typeof window.navigator !== n && /Trident\\/|MSIE /.test(window.navigator.userAgent), i = [\n        \"trace\",\n        \"debug\",\n        \"info\",\n        \"warn\",\n        \"error\"\n      ], o = {}, s = null;\n      function a(p, g) {\n        var v = p[g];\n        if (typeof v.bind == \"function\")\n          return v.bind(p);\n        try {\n          return Function.prototype.bind.call(v, p);\n        } catch {\n          return function() {\n            return Function.prototype.apply.apply(v, [p, arguments]);\n          };\n        }\n      }\n      function c() {\n        console.log && (console.log.apply ? console.log.apply(console, arguments) : Function.prototype.apply.apply(console.log, [console, arguments])), console.trace && console.trace();\n      }\n      function u(p) {\n        return p === \"debug\" && (p = \"log\"), typeof console === n ? !1 : p === \"trace\" && r ? c : console[p] !== void 0 ? a(console, p) : console.log !== void 0 ? a(console, \"log\") : t;\n      }\n      function l() {\n        for (var p = this.getLevel(), g = 0; g < i.length; g++) {\n          var v = i[g];\n          this[v] = g < p ? t : this.methodFactory(v, p, this.name);\n        }\n        if (this.log = this.debug, typeof console === n && p < this.levels.SILENT)\n          return \"No console available for logging\";\n      }\n      function f(p) {\n        return function() {\n          typeof console !== n && (l.call(this), this[p].apply(this, arguments));\n        };\n      }\n      function h(p, g, v) {\n        return u(p) || f.apply(this, arguments);\n      }\n      function d(p, g) {\n        var v = this, x, C, T, S = \"loglevel\";\n        typeof p == \"string\" ? S += \":\" + p : typeof p == \"symbol\" && (S = void 0);\n        function b(E) {\n          var O = (i[E] || \"silent\").toUpperCase();\n          if (!(typeof window === n || !S)) {\n            try {\n              window.localStorage[S] = O;\n              return;\n            } catch {\n            }\n            try {\n              window.document.cookie = encodeURIComponent(S) + \"=\" + O + \";\";\n            } catch {\n            }\n          }\n        }\n        function P() {\n          var E;\n          if (!(typeof window === n || !S)) {\n            try {\n              E = window.localStorage[S];\n            } catch {\n            }\n            if (typeof E === n)\n              try {\n                var O = window.document.cookie, j = encodeURIComponent(S), k = O.indexOf(j + \"=\");\n                k !== -1 && (E = /^([^;]+)/.exec(\n                  O.slice(k + j.length + 1)\n                )[1]);\n              } catch {\n              }\n            return v.levels[E] === void 0 && (E = void 0), E;\n          }\n        }\n        function R() {\n          if (!(typeof window === n || !S)) {\n            try {\n              window.localStorage.removeItem(S);\n            } catch {\n            }\n            try {\n              window.document.cookie = encodeURIComponent(S) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n            } catch {\n            }\n          }\n        }\n        function M(E) {\n          var O = E;\n          if (typeof O == \"string\" && v.levels[O.toUpperCase()] !== void 0 && (O = v.levels[O.toUpperCase()]), typeof O == \"number\" && O >= 0 && O <= v.levels.SILENT)\n            return O;\n          throw new TypeError(\"log.setLevel() called with invalid level: \" + E);\n        }\n        v.name = p, v.levels = {\n          TRACE: 0,\n          DEBUG: 1,\n          INFO: 2,\n          WARN: 3,\n          ERROR: 4,\n          SILENT: 5\n        }, v.methodFactory = g || h, v.getLevel = function() {\n          return T ?? C ?? x;\n        }, v.setLevel = function(E, O) {\n          return T = M(E), O !== !1 && b(T), l.call(v);\n        }, v.setDefaultLevel = function(E) {\n          C = M(E), P() || v.setLevel(E, !1);\n        }, v.resetLevel = function() {\n          T = null, R(), l.call(v);\n        }, v.enableAll = function(E) {\n          v.setLevel(v.levels.TRACE, E);\n        }, v.disableAll = function(E) {\n          v.setLevel(v.levels.SILENT, E);\n        }, v.rebuild = function() {\n          if (s !== v && (x = M(s.getLevel())), l.call(v), s === v)\n            for (var E in o)\n              o[E].rebuild();\n        }, x = M(\n          s ? s.getLevel() : \"WARN\"\n        );\n        var W = P();\n        W != null && (T = M(W)), l.call(v);\n      }\n      s = new d(), s.getLogger = function(g) {\n        if (typeof g != \"symbol\" && typeof g != \"string\" || g === \"\")\n          throw new TypeError(\"You must supply a name when creating a logger.\");\n        var v = o[g];\n        return v || (v = o[g] = new d(\n          g,\n          s.methodFactory\n        )), v;\n      };\n      var m = typeof window !== n ? window.log : void 0;\n      return s.noConflict = function() {\n        return typeof window !== n && window.log === s && (window.log = m), s;\n      }, s.getLoggers = function() {\n        return o;\n      }, s.default = s, s;\n    });\n  })(Ne)), Ne.exports;\n}\nvar Hr = Vr();\nconst zr = /* @__PURE__ */ Br(Hr);\nvar pt = function(e, t) {\n  return pt = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, r) {\n    n.__proto__ = r;\n  } || function(n, r) {\n    for (var i in r) Object.prototype.hasOwnProperty.call(r, i) && (n[i] = r[i]);\n  }, pt(e, t);\n};\nfunction oe(e, t) {\n  if (typeof t != \"function\" && t !== null)\n    throw new TypeError(\"Class extends value \" + String(t) + \" is not a constructor or null\");\n  pt(e, t);\n  function n() {\n    this.constructor = e;\n  }\n  e.prototype = t === null ? Object.create(t) : (n.prototype = t.prototype, new n());\n}\nfunction Yr(e, t, n, r) {\n  function i(o) {\n    return o instanceof n ? o : new n(function(s) {\n      s(o);\n    });\n  }\n  return new (n || (n = Promise))(function(o, s) {\n    function a(l) {\n      try {\n        u(r.next(l));\n      } catch (f) {\n        s(f);\n      }\n    }\n    function c(l) {\n      try {\n        u(r.throw(l));\n      } catch (f) {\n        s(f);\n      }\n    }\n    function u(l) {\n      l.done ? o(l.value) : i(l.value).then(a, c);\n    }\n    u((r = r.apply(e, t || [])).next());\n  });\n}\nfunction dn(e, t) {\n  var n = { label: 0, sent: function() {\n    if (o[0] & 1) throw o[1];\n    return o[1];\n  }, trys: [], ops: [] }, r, i, o, s = Object.create((typeof Iterator == \"function\" ? Iterator : Object).prototype);\n  return s.next = a(0), s.throw = a(1), s.return = a(2), typeof Symbol == \"function\" && (s[Symbol.iterator] = function() {\n    return this;\n  }), s;\n  function a(u) {\n    return function(l) {\n      return c([u, l]);\n    };\n  }\n  function c(u) {\n    if (r) throw new TypeError(\"Generator is already executing.\");\n    for (; s && (s = 0, u[0] && (n = 0)), n; ) try {\n      if (r = 1, i && (o = u[0] & 2 ? i.return : u[0] ? i.throw || ((o = i.return) && o.call(i), 0) : i.next) && !(o = o.call(i, u[1])).done) return o;\n      switch (i = 0, o && (u = [u[0] & 2, o.value]), u[0]) {\n        case 0:\n        case 1:\n          o = u;\n          break;\n        case 4:\n          return n.label++, { value: u[1], done: !1 };\n        case 5:\n          n.label++, i = u[1], u = [0];\n          continue;\n        case 7:\n          u = n.ops.pop(), n.trys.pop();\n          continue;\n        default:\n          if (o = n.trys, !(o = o.length > 0 && o[o.length - 1]) && (u[0] === 6 || u[0] === 2)) {\n            n = 0;\n            continue;\n          }\n          if (u[0] === 3 && (!o || u[1] > o[0] && u[1] < o[3])) {\n            n.label = u[1];\n            break;\n          }\n          if (u[0] === 6 && n.label < o[1]) {\n            n.label = o[1], o = u;\n            break;\n          }\n          if (o && n.label < o[2]) {\n            n.label = o[2], n.ops.push(u);\n            break;\n          }\n          o[2] && n.ops.pop(), n.trys.pop();\n          continue;\n      }\n      u = t.call(e, n);\n    } catch (l) {\n      u = [6, l], i = 0;\n    } finally {\n      r = o = 0;\n    }\n    if (u[0] & 5) throw u[1];\n    return { value: u[0] ? u[1] : void 0, done: !0 };\n  }\n}\nfunction xe(e) {\n  var t = typeof Symbol == \"function\" && Symbol.iterator, n = t && e[t], r = 0;\n  if (n) return n.call(e);\n  if (e && typeof e.length == \"number\") return {\n    next: function() {\n      return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e };\n    }\n  };\n  throw new TypeError(t ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction ve(e, t) {\n  var n = typeof Symbol == \"function\" && e[Symbol.iterator];\n  if (!n) return e;\n  var r = n.call(e), i, o = [], s;\n  try {\n    for (; (t === void 0 || t-- > 0) && !(i = r.next()).done; ) o.push(i.value);\n  } catch (a) {\n    s = { error: a };\n  } finally {\n    try {\n      i && !i.done && (n = r.return) && n.call(r);\n    } finally {\n      if (s) throw s.error;\n    }\n  }\n  return o;\n}\nfunction Se(e, t, n) {\n  if (n || arguments.length === 2) for (var r = 0, i = t.length, o; r < i; r++)\n    (o || !(r in t)) && (o || (o = Array.prototype.slice.call(t, 0, r)), o[r] = t[r]);\n  return e.concat(o || Array.prototype.slice.call(t));\n}\nfunction be(e) {\n  return this instanceof be ? (this.v = e, this) : new be(e);\n}\nfunction Kr(e, t, n) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var r = n.apply(e, t || []), i, o = [];\n  return i = Object.create((typeof AsyncIterator == \"function\" ? AsyncIterator : Object).prototype), a(\"next\"), a(\"throw\"), a(\"return\", s), i[Symbol.asyncIterator] = function() {\n    return this;\n  }, i;\n  function s(d) {\n    return function(m) {\n      return Promise.resolve(m).then(d, f);\n    };\n  }\n  function a(d, m) {\n    r[d] && (i[d] = function(p) {\n      return new Promise(function(g, v) {\n        o.push([d, p, g, v]) > 1 || c(d, p);\n      });\n    }, m && (i[d] = m(i[d])));\n  }\n  function c(d, m) {\n    try {\n      u(r[d](m));\n    } catch (p) {\n      h(o[0][3], p);\n    }\n  }\n  function u(d) {\n    d.value instanceof be ? Promise.resolve(d.value.v).then(l, f) : h(o[0][2], d);\n  }\n  function l(d) {\n    c(\"next\", d);\n  }\n  function f(d) {\n    c(\"throw\", d);\n  }\n  function h(d, m) {\n    d(m), o.shift(), o.length && c(o[0][0], o[0][1]);\n  }\n}\nfunction qr(e) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var t = e[Symbol.asyncIterator], n;\n  return t ? t.call(e) : (e = typeof xe == \"function\" ? xe(e) : e[Symbol.iterator](), n = {}, r(\"next\"), r(\"throw\"), r(\"return\"), n[Symbol.asyncIterator] = function() {\n    return this;\n  }, n);\n  function r(o) {\n    n[o] = e[o] && function(s) {\n      return new Promise(function(a, c) {\n        s = e[o](s), i(a, c, s.done, s.value);\n      });\n    };\n  }\n  function i(o, s, a, c) {\n    Promise.resolve(c).then(function(u) {\n      o({ value: u, done: a });\n    }, s);\n  }\n}\nfunction A(e) {\n  return typeof e == \"function\";\n}\nfunction xt(e) {\n  var t = function(r) {\n    Error.call(r), r.stack = new Error().stack;\n  }, n = e(t);\n  return n.prototype = Object.create(Error.prototype), n.prototype.constructor = n, n;\n}\nvar st = xt(function(e) {\n  return function(n) {\n    e(this), this.message = n ? n.length + ` errors occurred during unsubscription:\n` + n.map(function(r, i) {\n      return i + 1 + \") \" + r.toString();\n    }).join(`\n  `) : \"\", this.name = \"UnsubscriptionError\", this.errors = n;\n  };\n});\nfunction He(e, t) {\n  if (e) {\n    var n = e.indexOf(t);\n    0 <= n && e.splice(n, 1);\n  }\n}\nvar Ie = (function() {\n  function e(t) {\n    this.initialTeardown = t, this.closed = !1, this._parentage = null, this._finalizers = null;\n  }\n  return e.prototype.unsubscribe = function() {\n    var t, n, r, i, o;\n    if (!this.closed) {\n      this.closed = !0;\n      var s = this._parentage;\n      if (s)\n        if (this._parentage = null, Array.isArray(s))\n          try {\n            for (var a = xe(s), c = a.next(); !c.done; c = a.next()) {\n              var u = c.value;\n              u.remove(this);\n            }\n          } catch (p) {\n            t = { error: p };\n          } finally {\n            try {\n              c && !c.done && (n = a.return) && n.call(a);\n            } finally {\n              if (t) throw t.error;\n            }\n          }\n        else\n          s.remove(this);\n      var l = this.initialTeardown;\n      if (A(l))\n        try {\n          l();\n        } catch (p) {\n          o = p instanceof st ? p.errors : [p];\n        }\n      var f = this._finalizers;\n      if (f) {\n        this._finalizers = null;\n        try {\n          for (var h = xe(f), d = h.next(); !d.done; d = h.next()) {\n            var m = d.value;\n            try {\n              Nt(m);\n            } catch (p) {\n              o = o ?? [], p instanceof st ? o = Se(Se([], ve(o)), ve(p.errors)) : o.push(p);\n            }\n          }\n        } catch (p) {\n          r = { error: p };\n        } finally {\n          try {\n            d && !d.done && (i = h.return) && i.call(h);\n          } finally {\n            if (r) throw r.error;\n          }\n        }\n      }\n      if (o)\n        throw new st(o);\n    }\n  }, e.prototype.add = function(t) {\n    var n;\n    if (t && t !== this)\n      if (this.closed)\n        Nt(t);\n      else {\n        if (t instanceof e) {\n          if (t.closed || t._hasParent(this))\n            return;\n          t._addParent(this);\n        }\n        (this._finalizers = (n = this._finalizers) !== null && n !== void 0 ? n : []).push(t);\n      }\n  }, e.prototype._hasParent = function(t) {\n    var n = this._parentage;\n    return n === t || Array.isArray(n) && n.includes(t);\n  }, e.prototype._addParent = function(t) {\n    var n = this._parentage;\n    this._parentage = Array.isArray(n) ? (n.push(t), n) : n ? [n, t] : t;\n  }, e.prototype._removeParent = function(t) {\n    var n = this._parentage;\n    n === t ? this._parentage = null : Array.isArray(n) && He(n, t);\n  }, e.prototype.remove = function(t) {\n    var n = this._finalizers;\n    n && He(n, t), t instanceof e && t._removeParent(this);\n  }, e.EMPTY = (function() {\n    var t = new e();\n    return t.closed = !0, t;\n  })(), e;\n})(), pn = Ie.EMPTY;\nfunction hn(e) {\n  return e instanceof Ie || e && \"closed\" in e && A(e.remove) && A(e.add) && A(e.unsubscribe);\n}\nfunction Nt(e) {\n  A(e) ? e() : e.unsubscribe();\n}\nvar Gr = {\n  Promise: void 0\n}, Qr = {\n  setTimeout: function(e, t) {\n    for (var n = [], r = 2; r < arguments.length; r++)\n      n[r - 2] = arguments[r];\n    return setTimeout.apply(void 0, Se([e, t], ve(n)));\n  },\n  clearTimeout: function(e) {\n    return clearTimeout(e);\n  },\n  delegate: void 0\n};\nfunction vn(e) {\n  Qr.setTimeout(function() {\n    throw e;\n  });\n}\nfunction ze() {\n}\nfunction Fe(e) {\n  e();\n}\nvar St = (function(e) {\n  oe(t, e);\n  function t(n) {\n    var r = e.call(this) || this;\n    return r.isStopped = !1, n ? (r.destination = n, hn(n) && n.add(r)) : r.destination = Zr, r;\n  }\n  return t.create = function(n, r, i) {\n    return new Ae(n, r, i);\n  }, t.prototype.next = function(n) {\n    this.isStopped || this._next(n);\n  }, t.prototype.error = function(n) {\n    this.isStopped || (this.isStopped = !0, this._error(n));\n  }, t.prototype.complete = function() {\n    this.isStopped || (this.isStopped = !0, this._complete());\n  }, t.prototype.unsubscribe = function() {\n    this.closed || (this.isStopped = !0, e.prototype.unsubscribe.call(this), this.destination = null);\n  }, t.prototype._next = function(n) {\n    this.destination.next(n);\n  }, t.prototype._error = function(n) {\n    try {\n      this.destination.error(n);\n    } finally {\n      this.unsubscribe();\n    }\n  }, t.prototype._complete = function() {\n    try {\n      this.destination.complete();\n    } finally {\n      this.unsubscribe();\n    }\n  }, t;\n})(Ie), Xr = (function() {\n  function e(t) {\n    this.partialObserver = t;\n  }\n  return e.prototype.next = function(t) {\n    var n = this.partialObserver;\n    if (n.next)\n      try {\n        n.next(t);\n      } catch (r) {\n        Me(r);\n      }\n  }, e.prototype.error = function(t) {\n    var n = this.partialObserver;\n    if (n.error)\n      try {\n        n.error(t);\n      } catch (r) {\n        Me(r);\n      }\n    else\n      Me(t);\n  }, e.prototype.complete = function() {\n    var t = this.partialObserver;\n    if (t.complete)\n      try {\n        t.complete();\n      } catch (n) {\n        Me(n);\n      }\n  }, e;\n})(), Ae = (function(e) {\n  oe(t, e);\n  function t(n, r, i) {\n    var o = e.call(this) || this, s;\n    return A(n) || !n ? s = {\n      next: n ?? void 0,\n      error: r ?? void 0,\n      complete: i ?? void 0\n    } : s = n, o.destination = new Xr(s), o;\n  }\n  return t;\n})(St);\nfunction Me(e) {\n  vn(e);\n}\nfunction Jr(e) {\n  throw e;\n}\nvar Zr = {\n  closed: !0,\n  next: ze,\n  error: Jr,\n  complete: ze\n}, Ct = (function() {\n  return typeof Symbol == \"function\" && Symbol.observable || \"@@observable\";\n})();\nfunction tt(e) {\n  return e;\n}\nfunction ei(e) {\n  return e.length === 0 ? tt : e.length === 1 ? e[0] : function(n) {\n    return e.reduce(function(r, i) {\n      return i(r);\n    }, n);\n  };\n}\nvar L = (function() {\n  function e(t) {\n    t && (this._subscribe = t);\n  }\n  return e.prototype.lift = function(t) {\n    var n = new e();\n    return n.source = this, n.operator = t, n;\n  }, e.prototype.subscribe = function(t, n, r) {\n    var i = this, o = ni(t) ? t : new Ae(t, n, r);\n    return Fe(function() {\n      var s = i, a = s.operator, c = s.source;\n      o.add(a ? a.call(o, c) : c ? i._subscribe(o) : i._trySubscribe(o));\n    }), o;\n  }, e.prototype._trySubscribe = function(t) {\n    try {\n      return this._subscribe(t);\n    } catch (n) {\n      t.error(n);\n    }\n  }, e.prototype.forEach = function(t, n) {\n    var r = this;\n    return n = Ft(n), new n(function(i, o) {\n      var s = new Ae({\n        next: function(a) {\n          try {\n            t(a);\n          } catch (c) {\n            o(c), s.unsubscribe();\n          }\n        },\n        error: o,\n        complete: i\n      });\n      r.subscribe(s);\n    });\n  }, e.prototype._subscribe = function(t) {\n    var n;\n    return (n = this.source) === null || n === void 0 ? void 0 : n.subscribe(t);\n  }, e.prototype[Ct] = function() {\n    return this;\n  }, e.prototype.pipe = function() {\n    for (var t = [], n = 0; n < arguments.length; n++)\n      t[n] = arguments[n];\n    return ei(t)(this);\n  }, e.prototype.toPromise = function(t) {\n    var n = this;\n    return t = Ft(t), new t(function(r, i) {\n      var o;\n      n.subscribe(function(s) {\n        return o = s;\n      }, function(s) {\n        return i(s);\n      }, function() {\n        return r(o);\n      });\n    });\n  }, e.create = function(t) {\n    return new e(t);\n  }, e;\n})();\nfunction Ft(e) {\n  var t;\n  return (t = e ?? Gr.Promise) !== null && t !== void 0 ? t : Promise;\n}\nfunction ti(e) {\n  return e && A(e.next) && A(e.error) && A(e.complete);\n}\nfunction ni(e) {\n  return e && e instanceof St || ti(e) && hn(e);\n}\nfunction ri(e) {\n  return A(e?.lift);\n}\nfunction B(e) {\n  return function(t) {\n    if (ri(t))\n      return t.lift(function(n) {\n        try {\n          return e(n, this);\n        } catch (r) {\n          this.error(r);\n        }\n      });\n    throw new TypeError(\"Unable to lift unknown Observable type\");\n  };\n}\nfunction z(e, t, n, r, i) {\n  return new ii(e, t, n, r, i);\n}\nvar ii = (function(e) {\n  oe(t, e);\n  function t(n, r, i, o, s, a) {\n    var c = e.call(this, n) || this;\n    return c.onFinalize = s, c.shouldUnsubscribe = a, c._next = r ? function(u) {\n      try {\n        r(u);\n      } catch (l) {\n        n.error(l);\n      }\n    } : e.prototype._next, c._error = o ? function(u) {\n      try {\n        o(u);\n      } catch (l) {\n        n.error(l);\n      } finally {\n        this.unsubscribe();\n      }\n    } : e.prototype._error, c._complete = i ? function() {\n      try {\n        i();\n      } catch (u) {\n        n.error(u);\n      } finally {\n        this.unsubscribe();\n      }\n    } : e.prototype._complete, c;\n  }\n  return t.prototype.unsubscribe = function() {\n    var n;\n    if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n      var r = this.closed;\n      e.prototype.unsubscribe.call(this), !r && ((n = this.onFinalize) === null || n === void 0 || n.call(this));\n    }\n  }, t;\n})(St), oi = xt(function(e) {\n  return function() {\n    e(this), this.name = \"ObjectUnsubscribedError\", this.message = \"object unsubscribed\";\n  };\n}), re = (function(e) {\n  oe(t, e);\n  function t() {\n    var n = e.call(this) || this;\n    return n.closed = !1, n.currentObservers = null, n.observers = [], n.isStopped = !1, n.hasError = !1, n.thrownError = null, n;\n  }\n  return t.prototype.lift = function(n) {\n    var r = new Ut(this, this);\n    return r.operator = n, r;\n  }, t.prototype._throwIfClosed = function() {\n    if (this.closed)\n      throw new oi();\n  }, t.prototype.next = function(n) {\n    var r = this;\n    Fe(function() {\n      var i, o;\n      if (r._throwIfClosed(), !r.isStopped) {\n        r.currentObservers || (r.currentObservers = Array.from(r.observers));\n        try {\n          for (var s = xe(r.currentObservers), a = s.next(); !a.done; a = s.next()) {\n            var c = a.value;\n            c.next(n);\n          }\n        } catch (u) {\n          i = { error: u };\n        } finally {\n          try {\n            a && !a.done && (o = s.return) && o.call(s);\n          } finally {\n            if (i) throw i.error;\n          }\n        }\n      }\n    });\n  }, t.prototype.error = function(n) {\n    var r = this;\n    Fe(function() {\n      if (r._throwIfClosed(), !r.isStopped) {\n        r.hasError = r.isStopped = !0, r.thrownError = n;\n        for (var i = r.observers; i.length; )\n          i.shift().error(n);\n      }\n    });\n  }, t.prototype.complete = function() {\n    var n = this;\n    Fe(function() {\n      if (n._throwIfClosed(), !n.isStopped) {\n        n.isStopped = !0;\n        for (var r = n.observers; r.length; )\n          r.shift().complete();\n      }\n    });\n  }, t.prototype.unsubscribe = function() {\n    this.isStopped = this.closed = !0, this.observers = this.currentObservers = null;\n  }, Object.defineProperty(t.prototype, \"observed\", {\n    get: function() {\n      var n;\n      return ((n = this.observers) === null || n === void 0 ? void 0 : n.length) > 0;\n    },\n    enumerable: !1,\n    configurable: !0\n  }), t.prototype._trySubscribe = function(n) {\n    return this._throwIfClosed(), e.prototype._trySubscribe.call(this, n);\n  }, t.prototype._subscribe = function(n) {\n    return this._throwIfClosed(), this._checkFinalizedStatuses(n), this._innerSubscribe(n);\n  }, t.prototype._innerSubscribe = function(n) {\n    var r = this, i = this, o = i.hasError, s = i.isStopped, a = i.observers;\n    return o || s ? pn : (this.currentObservers = null, a.push(n), new Ie(function() {\n      r.currentObservers = null, He(a, n);\n    }));\n  }, t.prototype._checkFinalizedStatuses = function(n) {\n    var r = this, i = r.hasError, o = r.thrownError, s = r.isStopped;\n    i ? n.error(o) : s && n.complete();\n  }, t.prototype.asObservable = function() {\n    var n = new L();\n    return n.source = this, n;\n  }, t.create = function(n, r) {\n    return new Ut(n, r);\n  }, t;\n})(L), Ut = (function(e) {\n  oe(t, e);\n  function t(n, r) {\n    var i = e.call(this) || this;\n    return i.destination = n, i.source = r, i;\n  }\n  return t.prototype.next = function(n) {\n    var r, i;\n    (i = (r = this.destination) === null || r === void 0 ? void 0 : r.next) === null || i === void 0 || i.call(r, n);\n  }, t.prototype.error = function(n) {\n    var r, i;\n    (i = (r = this.destination) === null || r === void 0 ? void 0 : r.error) === null || i === void 0 || i.call(r, n);\n  }, t.prototype.complete = function() {\n    var n, r;\n    (r = (n = this.destination) === null || n === void 0 ? void 0 : n.complete) === null || r === void 0 || r.call(n);\n  }, t.prototype._subscribe = function(n) {\n    var r, i;\n    return (i = (r = this.source) === null || r === void 0 ? void 0 : r.subscribe(n)) !== null && i !== void 0 ? i : pn;\n  }, t;\n})(re), mn = (function(e) {\n  oe(t, e);\n  function t(n) {\n    var r = e.call(this) || this;\n    return r._value = n, r;\n  }\n  return Object.defineProperty(t.prototype, \"value\", {\n    get: function() {\n      return this.getValue();\n    },\n    enumerable: !1,\n    configurable: !0\n  }), t.prototype._subscribe = function(n) {\n    var r = e.prototype._subscribe.call(this, n);\n    return !r.closed && n.next(this._value), r;\n  }, t.prototype.getValue = function() {\n    var n = this, r = n.hasError, i = n.thrownError, o = n._value;\n    if (r)\n      throw i;\n    return this._throwIfClosed(), o;\n  }, t.prototype.next = function(n) {\n    e.prototype.next.call(this, this._value = n);\n  }, t;\n})(re), si = {\n  now: function() {\n    return Date.now();\n  }\n}, ai = (function(e) {\n  oe(t, e);\n  function t(n, r) {\n    return e.call(this) || this;\n  }\n  return t.prototype.schedule = function(n, r) {\n    return this;\n  }, t;\n})(Ie), Wt = {\n  setInterval: function(e, t) {\n    for (var n = [], r = 2; r < arguments.length; r++)\n      n[r - 2] = arguments[r];\n    return setInterval.apply(void 0, Se([e, t], ve(n)));\n  },\n  clearInterval: function(e) {\n    return clearInterval(e);\n  },\n  delegate: void 0\n}, ci = (function(e) {\n  oe(t, e);\n  function t(n, r) {\n    var i = e.call(this, n, r) || this;\n    return i.scheduler = n, i.work = r, i.pending = !1, i;\n  }\n  return t.prototype.schedule = function(n, r) {\n    var i;\n    if (r === void 0 && (r = 0), this.closed)\n      return this;\n    this.state = n;\n    var o = this.id, s = this.scheduler;\n    return o != null && (this.id = this.recycleAsyncId(s, o, r)), this.pending = !0, this.delay = r, this.id = (i = this.id) !== null && i !== void 0 ? i : this.requestAsyncId(s, this.id, r), this;\n  }, t.prototype.requestAsyncId = function(n, r, i) {\n    return i === void 0 && (i = 0), Wt.setInterval(n.flush.bind(n, this), i);\n  }, t.prototype.recycleAsyncId = function(n, r, i) {\n    if (i === void 0 && (i = 0), i != null && this.delay === i && this.pending === !1)\n      return r;\n    r != null && Wt.clearInterval(r);\n  }, t.prototype.execute = function(n, r) {\n    if (this.closed)\n      return new Error(\"executing a cancelled action\");\n    this.pending = !1;\n    var i = this._execute(n, r);\n    if (i)\n      return i;\n    this.pending === !1 && this.id != null && (this.id = this.recycleAsyncId(this.scheduler, this.id, null));\n  }, t.prototype._execute = function(n, r) {\n    var i = !1, o;\n    try {\n      this.work(n);\n    } catch (s) {\n      i = !0, o = s || new Error(\"Scheduled action threw falsy error\");\n    }\n    if (i)\n      return this.unsubscribe(), o;\n  }, t.prototype.unsubscribe = function() {\n    if (!this.closed) {\n      var n = this, r = n.id, i = n.scheduler, o = i.actions;\n      this.work = this.state = this.scheduler = null, this.pending = !1, He(o, this), r != null && (this.id = this.recycleAsyncId(i, r, null)), this.delay = null, e.prototype.unsubscribe.call(this);\n    }\n  }, t;\n})(ai), Bt = (function() {\n  function e(t, n) {\n    n === void 0 && (n = e.now), this.schedulerActionCtor = t, this.now = n;\n  }\n  return e.prototype.schedule = function(t, n, r) {\n    return n === void 0 && (n = 0), new this.schedulerActionCtor(this, t).schedule(r, n);\n  }, e.now = si.now, e;\n})(), ui = (function(e) {\n  oe(t, e);\n  function t(n, r) {\n    r === void 0 && (r = Bt.now);\n    var i = e.call(this, n, r) || this;\n    return i.actions = [], i._active = !1, i;\n  }\n  return t.prototype.flush = function(n) {\n    var r = this.actions;\n    if (this._active) {\n      r.push(n);\n      return;\n    }\n    var i;\n    this._active = !0;\n    do\n      if (i = n.execute(n.state, n.delay))\n        break;\n    while (n = r.shift());\n    if (this._active = !1, i) {\n      for (; n = r.shift(); )\n        n.unsubscribe();\n      throw i;\n    }\n  }, t;\n})(Bt), li = new ui(ci);\nfunction fi(e) {\n  return e && A(e.schedule);\n}\nfunction di(e) {\n  return e[e.length - 1];\n}\nfunction Et(e) {\n  return fi(di(e)) ? e.pop() : void 0;\n}\nvar Tt = (function(e) {\n  return e && typeof e.length == \"number\" && typeof e != \"function\";\n});\nfunction gn(e) {\n  return A(e?.then);\n}\nfunction bn(e) {\n  return A(e[Ct]);\n}\nfunction yn(e) {\n  return Symbol.asyncIterator && A(e?.[Symbol.asyncIterator]);\n}\nfunction wn(e) {\n  return new TypeError(\"You provided \" + (e !== null && typeof e == \"object\" ? \"an invalid object\" : \"'\" + e + \"'\") + \" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.\");\n}\nfunction pi() {\n  return typeof Symbol != \"function\" || !Symbol.iterator ? \"@@iterator\" : Symbol.iterator;\n}\nvar xn = pi();\nfunction Sn(e) {\n  return A(e?.[xn]);\n}\nfunction Cn(e) {\n  return Kr(this, arguments, function() {\n    var n, r, i, o;\n    return dn(this, function(s) {\n      switch (s.label) {\n        case 0:\n          n = e.getReader(), s.label = 1;\n        case 1:\n          s.trys.push([1, , 9, 10]), s.label = 2;\n        case 2:\n          return [4, be(n.read())];\n        case 3:\n          return r = s.sent(), i = r.value, o = r.done, o ? [4, be(void 0)] : [3, 5];\n        case 4:\n          return [2, s.sent()];\n        case 5:\n          return [4, be(i)];\n        case 6:\n          return [4, s.sent()];\n        case 7:\n          return s.sent(), [3, 2];\n        case 8:\n          return [3, 10];\n        case 9:\n          return n.releaseLock(), [7];\n        case 10:\n          return [2];\n      }\n    });\n  });\n}\nfunction En(e) {\n  return A(e?.getReader);\n}\nfunction Q(e) {\n  if (e instanceof L)\n    return e;\n  if (e != null) {\n    if (bn(e))\n      return hi(e);\n    if (Tt(e))\n      return vi(e);\n    if (gn(e))\n      return mi(e);\n    if (yn(e))\n      return Tn(e);\n    if (Sn(e))\n      return gi(e);\n    if (En(e))\n      return bi(e);\n  }\n  throw wn(e);\n}\nfunction hi(e) {\n  return new L(function(t) {\n    var n = e[Ct]();\n    if (A(n.subscribe))\n      return n.subscribe(t);\n    throw new TypeError(\"Provided object does not correctly implement Symbol.observable\");\n  });\n}\nfunction vi(e) {\n  return new L(function(t) {\n    for (var n = 0; n < e.length && !t.closed; n++)\n      t.next(e[n]);\n    t.complete();\n  });\n}\nfunction mi(e) {\n  return new L(function(t) {\n    e.then(function(n) {\n      t.closed || (t.next(n), t.complete());\n    }, function(n) {\n      return t.error(n);\n    }).then(null, vn);\n  });\n}\nfunction gi(e) {\n  return new L(function(t) {\n    var n, r;\n    try {\n      for (var i = xe(e), o = i.next(); !o.done; o = i.next()) {\n        var s = o.value;\n        if (t.next(s), t.closed)\n          return;\n      }\n    } catch (a) {\n      n = { error: a };\n    } finally {\n      try {\n        o && !o.done && (r = i.return) && r.call(i);\n      } finally {\n        if (n) throw n.error;\n      }\n    }\n    t.complete();\n  });\n}\nfunction Tn(e) {\n  return new L(function(t) {\n    yi(e, t).catch(function(n) {\n      return t.error(n);\n    });\n  });\n}\nfunction bi(e) {\n  return Tn(Cn(e));\n}\nfunction yi(e, t) {\n  var n, r, i, o;\n  return Yr(this, void 0, void 0, function() {\n    var s, a;\n    return dn(this, function(c) {\n      switch (c.label) {\n        case 0:\n          c.trys.push([0, 5, 6, 11]), n = qr(e), c.label = 1;\n        case 1:\n          return [4, n.next()];\n        case 2:\n          if (r = c.sent(), !!r.done) return [3, 4];\n          if (s = r.value, t.next(s), t.closed)\n            return [2];\n          c.label = 3;\n        case 3:\n          return [3, 1];\n        case 4:\n          return [3, 11];\n        case 5:\n          return a = c.sent(), i = { error: a }, [3, 11];\n        case 6:\n          return c.trys.push([6, , 9, 10]), r && !r.done && (o = n.return) ? [4, o.call(n)] : [3, 8];\n        case 7:\n          c.sent(), c.label = 8;\n        case 8:\n          return [3, 10];\n        case 9:\n          if (i) throw i.error;\n          return [7];\n        case 10:\n          return [7];\n        case 11:\n          return t.complete(), [2];\n      }\n    });\n  });\n}\nfunction ce(e, t, n, r, i) {\n  r === void 0 && (r = 0), i === void 0 && (i = !1);\n  var o = t.schedule(function() {\n    n(), i ? e.add(this.schedule(null, r)) : this.unsubscribe();\n  }, r);\n  if (e.add(o), !i)\n    return o;\n}\nfunction Pn(e, t) {\n  return t === void 0 && (t = 0), B(function(n, r) {\n    n.subscribe(z(r, function(i) {\n      return ce(r, e, function() {\n        return r.next(i);\n      }, t);\n    }, function() {\n      return ce(r, e, function() {\n        return r.complete();\n      }, t);\n    }, function(i) {\n      return ce(r, e, function() {\n        return r.error(i);\n      }, t);\n    }));\n  });\n}\nfunction On(e, t) {\n  return t === void 0 && (t = 0), B(function(n, r) {\n    r.add(e.schedule(function() {\n      return n.subscribe(r);\n    }, t));\n  });\n}\nfunction wi(e, t) {\n  return Q(e).pipe(On(t), Pn(t));\n}\nfunction xi(e, t) {\n  return Q(e).pipe(On(t), Pn(t));\n}\nfunction Si(e, t) {\n  return new L(function(n) {\n    var r = 0;\n    return t.schedule(function() {\n      r === e.length ? n.complete() : (n.next(e[r++]), n.closed || this.schedule());\n    });\n  });\n}\nfunction Ci(e, t) {\n  return new L(function(n) {\n    var r;\n    return ce(n, t, function() {\n      r = e[xn](), ce(n, t, function() {\n        var i, o, s;\n        try {\n          i = r.next(), o = i.value, s = i.done;\n        } catch (a) {\n          n.error(a);\n          return;\n        }\n        s ? n.complete() : n.next(o);\n      }, 0, !0);\n    }), function() {\n      return A(r?.return) && r.return();\n    };\n  });\n}\nfunction An(e, t) {\n  if (!e)\n    throw new Error(\"Iterable cannot be null\");\n  return new L(function(n) {\n    ce(n, t, function() {\n      var r = e[Symbol.asyncIterator]();\n      ce(n, t, function() {\n        r.next().then(function(i) {\n          i.done ? n.complete() : n.next(i.value);\n        });\n      }, 0, !0);\n    });\n  });\n}\nfunction Ei(e, t) {\n  return An(Cn(e), t);\n}\nfunction Ti(e, t) {\n  if (e != null) {\n    if (bn(e))\n      return wi(e, t);\n    if (Tt(e))\n      return Si(e, t);\n    if (gn(e))\n      return xi(e, t);\n    if (yn(e))\n      return An(e, t);\n    if (Sn(e))\n      return Ci(e, t);\n    if (En(e))\n      return Ei(e, t);\n  }\n  throw wn(e);\n}\nfunction ye(e, t) {\n  return t ? Ti(e, t) : Q(e);\n}\nfunction ht() {\n  for (var e = [], t = 0; t < arguments.length; t++)\n    e[t] = arguments[t];\n  var n = Et(e);\n  return ye(e, n);\n}\nfunction Pi(e) {\n  return e instanceof Date && !isNaN(e);\n}\nvar Oi = xt(function(e) {\n  return function(n) {\n    n === void 0 && (n = null), e(this), this.message = \"Timeout has occurred\", this.name = \"TimeoutError\", this.info = n;\n  };\n});\nfunction Ai(e, t) {\n  var n = Pi(e) ? { first: e } : typeof e == \"number\" ? { each: e } : e, r = n.first, i = n.each, o = n.with, s = o === void 0 ? _i : o, a = n.scheduler, c = a === void 0 ? li : a, u = n.meta, l = u === void 0 ? null : u;\n  if (r == null && i == null)\n    throw new TypeError(\"No timeout provided.\");\n  return B(function(f, h) {\n    var d, m, p = null, g = 0, v = function(x) {\n      m = ce(h, c, function() {\n        try {\n          d.unsubscribe(), Q(s({\n            meta: l,\n            lastValue: p,\n            seen: g\n          })).subscribe(h);\n        } catch (C) {\n          h.error(C);\n        }\n      }, x);\n    };\n    d = f.subscribe(z(h, function(x) {\n      m?.unsubscribe(), g++, h.next(p = x), i > 0 && v(i);\n    }, void 0, void 0, function() {\n      m?.closed || m?.unsubscribe(), p = null;\n    })), !g && v(r != null ? typeof r == \"number\" ? r : +r - c.now() : i);\n  });\n}\nfunction _i(e) {\n  throw new Oi(e);\n}\nfunction _(e, t) {\n  return B(function(n, r) {\n    var i = 0;\n    n.subscribe(z(r, function(o) {\n      r.next(e.call(t, o, i++));\n    }));\n  });\n}\nvar ki = Array.isArray;\nfunction Li(e, t) {\n  return ki(t) ? e.apply(void 0, Se([], ve(t))) : e(t);\n}\nfunction Ii(e) {\n  return _(function(t) {\n    return Li(e, t);\n  });\n}\nfunction Ri(e, t, n, r, i, o, s, a) {\n  var c = [], u = 0, l = 0, f = !1, h = function() {\n    f && !c.length && !u && t.complete();\n  }, d = function(p) {\n    return u < r ? m(p) : c.push(p);\n  }, m = function(p) {\n    u++;\n    var g = !1;\n    Q(n(p, l++)).subscribe(z(t, function(v) {\n      t.next(v);\n    }, function() {\n      g = !0;\n    }, void 0, function() {\n      if (g)\n        try {\n          u--;\n          for (var v = function() {\n            var x = c.shift();\n            s || m(x);\n          }; c.length && u < r; )\n            v();\n          h();\n        } catch (x) {\n          t.error(x);\n        }\n    }));\n  };\n  return e.subscribe(z(t, d, function() {\n    f = !0, h();\n  })), function() {\n  };\n}\nfunction _e(e, t, n) {\n  return n === void 0 && (n = 1 / 0), A(t) ? _e(function(r, i) {\n    return _(function(o, s) {\n      return t(r, o, i, s);\n    })(Q(e(r, i)));\n  }, n) : (typeof t == \"number\" && (n = t), B(function(r, i) {\n    return Ri(r, i, e, n);\n  }));\n}\nfunction Mi(e) {\n  return _e(tt, e);\n}\nfunction Di() {\n  return Mi(1);\n}\nfunction Ye() {\n  for (var e = [], t = 0; t < arguments.length; t++)\n    e[t] = arguments[t];\n  return Di()(ye(e, Et(e)));\n}\nvar $i = [\"addListener\", \"removeListener\"], Ni = [\"addEventListener\", \"removeEventListener\"], Fi = [\"on\", \"off\"];\nfunction vt(e, t, n, r) {\n  if (A(n) && (r = n, n = void 0), r)\n    return vt(e, t, n).pipe(Ii(r));\n  var i = ve(Bi(e) ? Ni.map(function(a) {\n    return function(c) {\n      return e[a](t, c, n);\n    };\n  }) : Ui(e) ? $i.map(jt(e, t)) : Wi(e) ? Fi.map(jt(e, t)) : [], 2), o = i[0], s = i[1];\n  if (!o && Tt(e))\n    return _e(function(a) {\n      return vt(a, t, n);\n    })(Q(e));\n  if (!o)\n    throw new TypeError(\"Invalid event target\");\n  return new L(function(a) {\n    var c = function() {\n      for (var u = [], l = 0; l < arguments.length; l++)\n        u[l] = arguments[l];\n      return a.next(1 < u.length ? u : u[0]);\n    };\n    return o(c), function() {\n      return s(c);\n    };\n  });\n}\nfunction jt(e, t) {\n  return function(n) {\n    return function(r) {\n      return e[n](t, r);\n    };\n  };\n}\nfunction Ui(e) {\n  return A(e.addListener) && A(e.removeListener);\n}\nfunction Wi(e) {\n  return A(e.on) && A(e.off);\n}\nfunction Bi(e) {\n  return A(e.addEventListener) && A(e.removeEventListener);\n}\nfunction nt(e, t) {\n  return B(function(n, r) {\n    var i = 0;\n    n.subscribe(z(r, function(o) {\n      return e.call(t, o, i++) && r.next(o);\n    }));\n  });\n}\nfunction ji(e, t, n, r, i) {\n  return function(o, s) {\n    var a = n, c = t, u = 0;\n    o.subscribe(z(s, function(l) {\n      var f = u++;\n      c = a ? e(c, l, f) : (a = !0, l), s.next(c);\n    }, i));\n  };\n}\nfunction Vi(e, t) {\n  return t === void 0 && (t = tt), e = e ?? Hi, B(function(n, r) {\n    var i, o = !0;\n    n.subscribe(z(r, function(s) {\n      var a = t(s);\n      (o || !e(i, a)) && (o = !1, i = a, r.next(s));\n    }));\n  });\n}\nfunction Hi(e, t) {\n  return e === t;\n}\nfunction zi(e) {\n  return B(function(t, n) {\n    try {\n      t.subscribe(n);\n    } finally {\n      n.add(e);\n    }\n  });\n}\nfunction Ue(e, t) {\n  return B(ji(e, t, arguments.length >= 2, !0));\n}\nfunction Yi(e) {\n  e === void 0 && (e = {});\n  var t = e.connector, n = t === void 0 ? function() {\n    return new re();\n  } : t, r = e.resetOnError, i = r === void 0 ? !0 : r, o = e.resetOnComplete, s = o === void 0 ? !0 : o, a = e.resetOnRefCountZero, c = a === void 0 ? !0 : a;\n  return function(u) {\n    var l, f, h, d = 0, m = !1, p = !1, g = function() {\n      f?.unsubscribe(), f = void 0;\n    }, v = function() {\n      g(), l = h = void 0, m = p = !1;\n    }, x = function() {\n      var C = l;\n      v(), C?.unsubscribe();\n    };\n    return B(function(C, T) {\n      d++, !p && !m && g();\n      var S = h = h ?? n();\n      T.add(function() {\n        d--, d === 0 && !p && !m && (f = at(x, c));\n      }), S.subscribe(T), !l && d > 0 && (l = new Ae({\n        next: function(b) {\n          return S.next(b);\n        },\n        error: function(b) {\n          p = !0, g(), f = at(v, i, b), S.error(b);\n        },\n        complete: function() {\n          m = !0, g(), f = at(v, s), S.complete();\n        }\n      }), Q(C).subscribe(l));\n    })(u);\n  };\n}\nfunction at(e, t) {\n  for (var n = [], r = 2; r < arguments.length; r++)\n    n[r - 2] = arguments[r];\n  if (t === !0) {\n    e();\n    return;\n  }\n  if (t !== !1) {\n    var i = new Ae({\n      next: function() {\n        i.unsubscribe(), e();\n      }\n    });\n    return Q(t.apply(void 0, Se([], ve(n)))).subscribe(i);\n  }\n}\nfunction Ki(e) {\n  return B(function(t, n) {\n    var r = !1, i = z(n, function() {\n      i?.unsubscribe(), r = !0;\n    }, ze);\n    Q(e).subscribe(i), t.subscribe(z(n, function(o) {\n      return r && n.next(o);\n    }));\n  });\n}\nfunction U() {\n  for (var e = [], t = 0; t < arguments.length; t++)\n    e[t] = arguments[t];\n  var n = Et(e);\n  return B(function(r, i) {\n    (n ? Ye(e, r, n) : Ye(e, r)).subscribe(i);\n  });\n}\nfunction _n(e, t) {\n  return B(function(n, r) {\n    var i = null, o = 0, s = !1, a = function() {\n      return s && !i && r.complete();\n    };\n    n.subscribe(z(r, function(c) {\n      i?.unsubscribe();\n      var u = 0, l = o++;\n      Q(e(c, l)).subscribe(i = z(r, function(f) {\n        return r.next(t ? t(c, f, l, u++) : f);\n      }, function() {\n        i = null, a();\n      }));\n    }, function() {\n      s = !0, a();\n    }));\n  });\n}\nfunction Vt(e) {\n  return B(function(t, n) {\n    Q(e).subscribe(z(n, function() {\n      return n.complete();\n    }, ze)), !n.closed && t.subscribe(n);\n  });\n}\nfunction qi(e, t, n) {\n  var r = A(e) || t || n ? { next: e, error: t, complete: n } : e;\n  return r ? B(function(i, o) {\n    var s;\n    (s = r.subscribe) === null || s === void 0 || s.call(r);\n    var a = !0;\n    i.subscribe(z(o, function(c) {\n      var u;\n      (u = r.next) === null || u === void 0 || u.call(r, c), o.next(c);\n    }, function() {\n      var c;\n      a = !1, (c = r.complete) === null || c === void 0 || c.call(r), o.complete();\n    }, function(c) {\n      var u;\n      a = !1, (u = r.error) === null || u === void 0 || u.call(r, c), o.error(c);\n    }, function() {\n      var c, u;\n      a && ((c = r.unsubscribe) === null || c === void 0 || c.call(r)), (u = r.finalize) === null || u === void 0 || u.call(r);\n    }));\n  }) : tt;\n}\nvar Gi = Object.defineProperty, Qi = Object.defineProperties, Xi = Object.getOwnPropertyDescriptors, Ht = Object.getOwnPropertySymbols, Ji = Object.prototype.hasOwnProperty, Zi = Object.prototype.propertyIsEnumerable, zt = (e, t) => (t = Symbol[e]) ? t : /* @__PURE__ */ Symbol.for(\"Symbol.\" + e), Yt = (e, t, n) => t in e ? Gi(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, J = (e, t) => {\n  for (var n in t || (t = {}))\n    Ji.call(t, n) && Yt(e, n, t[n]);\n  if (Ht)\n    for (var n of Ht(t))\n      Zi.call(t, n) && Yt(e, n, t[n]);\n  return e;\n}, fe = (e, t) => Qi(e, Xi(t)), H = (e, t, n) => new Promise((r, i) => {\n  var o = (c) => {\n    try {\n      a(n.next(c));\n    } catch (u) {\n      i(u);\n    }\n  }, s = (c) => {\n    try {\n      a(n.throw(c));\n    } catch (u) {\n      i(u);\n    }\n  }, a = (c) => c.done ? r(c.value) : Promise.resolve(c.value).then(o, s);\n  a((n = n.apply(e, t)).next());\n}), eo = (e, t, n) => (t = e[zt(\"asyncIterator\")]) ? t.call(e) : (e = e[zt(\"iterator\")](), t = {}, n = (r, i) => (i = e[r]) && (t[r] = (o) => new Promise((s, a, c) => (o = i.call(e, o), c = o.done, Promise.resolve(o.value).then((u) => s({ value: u, done: c }), a)))), n(\"next\"), n(\"return\"), t), kn = \"lk\";\nfunction q(e) {\n  return typeof e > \"u\" ? !1 : to(e) || no(e);\n}\nfunction to(e) {\n  var t;\n  return e ? e.hasOwnProperty(\"participant\") && e.hasOwnProperty(\"source\") && e.hasOwnProperty(\"track\") && typeof ((t = e.publication) == null ? void 0 : t.track) < \"u\" : !1;\n}\nfunction no(e) {\n  return e ? e.hasOwnProperty(\"participant\") && e.hasOwnProperty(\"source\") && e.hasOwnProperty(\"publication\") && typeof e.publication < \"u\" : !1;\n}\nfunction ke(e) {\n  return e ? e.hasOwnProperty(\"participant\") && e.hasOwnProperty(\"source\") && typeof e.publication > \"u\" : !1;\n}\nfunction V(e) {\n  if (typeof e == \"string\" || typeof e == \"number\")\n    return `${e}`;\n  if (ke(e))\n    return `${e.participant.identity}_${e.source}_placeholder`;\n  if (q(e))\n    return `${e.participant.identity}_${e.publication.source}_${e.publication.trackSid}`;\n  throw new Error(`Can't generate a id for the given track reference: ${e}`);\n}\nfunction ts(e, t) {\n  return e === void 0 || t === void 0 ? !1 : q(e) && q(t) ? e.publication.trackSid === t.publication.trackSid : V(e) === V(t);\n}\nfunction ns(e, t) {\n  return typeof t > \"u\" ? !1 : q(e) ? t.some(\n    (n) => n.participant.identity === e.participant.identity && q(n) && n.publication.trackSid === e.publication.trackSid\n  ) : ke(e) ? t.some(\n    (n) => n.participant.identity === e.participant.identity && ke(n) && n.source === e.source\n  ) : !1;\n}\nfunction ro(e, t) {\n  return ke(e) && q(t) && t.participant.identity === e.participant.identity && t.source === e.source;\n}\nfunction rs() {\n  const e = document.createElement(\"p\");\n  e.style.width = \"100%\", e.style.height = \"200px\";\n  const t = document.createElement(\"div\");\n  t.style.position = \"absolute\", t.style.top = \"0px\", t.style.left = \"0px\", t.style.visibility = \"hidden\", t.style.width = \"200px\", t.style.height = \"150px\", t.style.overflow = \"hidden\", t.appendChild(e), document.body.appendChild(t);\n  const n = e.offsetWidth;\n  t.style.overflow = \"scroll\";\n  let r = e.offsetWidth;\n  return n === r && (r = t.clientWidth), document.body.removeChild(t), n - r;\n}\nfunction is() {\n  return typeof document < \"u\";\n}\nfunction io(e) {\n  e = J({}, e);\n  const t = \"(?:(?:[a-z]+:)?//)?\", n = \"(?:\\\\S+(?::\\\\S*)?@)?\", r = new RegExp(\n    \"(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}\",\n    \"g\"\n  ).source, u = `(?:${t}|www\\\\.)${n}(?:localhost|${r}|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9][-_]*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\\\\.?)(?::\\\\d{2,5})?(?:[/?#][^\\\\s\"]*)?`;\n  return e.exact ? new RegExp(`(?:^${u}$)`, \"i\") : new RegExp(u, \"ig\");\n}\nvar Kt = \"[^\\\\.\\\\s@:](?:[^\\\\s@:]*[^\\\\s@:\\\\.])?@[^\\\\.\\\\s@]+(?:\\\\.[^\\\\.\\\\s@]+)*\";\nfunction oo({ exact: e } = {}) {\n  return e ? new RegExp(`^${Kt}$`) : new RegExp(Kt, \"g\");\n}\nfunction os(e, t, n) {\n  return $r(e, t, () => H(null, null, function* () {\n    const { x: i, y: o } = yield Wr(e, t, {\n      placement: \"top\",\n      middleware: [Nr(6), Ur(), Fr({ padding: 5 })]\n    });\n    n?.(i, o);\n  }));\n}\nfunction ss(e, t) {\n  return !e.contains(t.target);\n}\nvar as = () => ({\n  email: oo(),\n  url: io({})\n});\nfunction cs(e, t) {\n  const n = Object.entries(t).map(\n    ([o, s], a) => Array.from(e.matchAll(s)).map(({ index: c, 0: u }) => ({\n      type: o,\n      weight: a,\n      content: u,\n      index: c ?? 0\n    }))\n  ).flat().sort((o, s) => {\n    const a = o.index - s.index;\n    return a !== 0 ? a : o.weight - s.weight;\n  }).filter(({ index: o }, s, a) => {\n    if (s === 0) return !0;\n    const c = a[s - 1];\n    return c.index + c.content.length <= o;\n  }), r = [];\n  let i = 0;\n  for (const { type: o, content: s, index: a } of n)\n    a > i && r.push(e.substring(i, a)), r.push({ type: o, content: s }), i = a + s.length;\n  return e.length > i && r.push(e.substring(i)), r;\n}\nvar so = [\n  y.ConnectionStateChanged,\n  y.RoomMetadataChanged,\n  y.ActiveSpeakersChanged,\n  y.ConnectionQualityChanged,\n  y.ParticipantConnected,\n  y.ParticipantDisconnected,\n  y.ParticipantPermissionsChanged,\n  y.ParticipantMetadataChanged,\n  y.ParticipantNameChanged,\n  y.ParticipantAttributesChanged,\n  y.TrackMuted,\n  y.TrackUnmuted,\n  y.TrackPublished,\n  y.TrackUnpublished,\n  y.TrackStreamStateChanged,\n  y.TrackSubscriptionFailed,\n  y.TrackSubscriptionPermissionChanged,\n  y.TrackSubscriptionStatusChanged\n], Ln = [\n  ...so,\n  y.LocalTrackPublished,\n  y.LocalTrackUnpublished\n], ao = [\n  w.TrackPublished,\n  w.TrackUnpublished,\n  w.TrackMuted,\n  w.TrackUnmuted,\n  w.TrackStreamStateChanged,\n  w.TrackSubscribed,\n  w.TrackUnsubscribed,\n  w.TrackSubscriptionPermissionChanged,\n  w.TrackSubscriptionFailed,\n  w.LocalTrackPublished,\n  w.LocalTrackUnpublished\n], co = [\n  w.ConnectionQualityChanged,\n  w.IsSpeakingChanged,\n  w.ParticipantMetadataChanged,\n  w.ParticipantPermissionsChanged,\n  w.TrackMuted,\n  w.TrackUnmuted,\n  w.TrackPublished,\n  w.TrackUnpublished,\n  w.TrackStreamStateChanged,\n  w.TrackSubscriptionFailed,\n  w.TrackSubscriptionPermissionChanged,\n  w.TrackSubscriptionStatusChanged\n], In = [\n  ...co,\n  w.LocalTrackPublished,\n  w.LocalTrackUnpublished\n], I = zr.getLogger(\"lk-components-js\");\nI.setDefaultLevel(\"WARN\");\nfunction us(e, t = {}) {\n  var n;\n  I.setLevel(e), Xn((n = t.liveKitClientLogLevel) != null ? n : e);\n}\nfunction ls(e, t = {}) {\n  var n;\n  const r = I.methodFactory;\n  I.methodFactory = (i, o, s) => {\n    const a = r(i, o, s), c = Pt[i], u = c >= o && c < Pt.silent;\n    return (l, f) => {\n      f ? a(l, f) : a(l), u && e(c, l, f);\n    };\n  }, I.setLevel(I.getLevel()), Qn((n = t.liveKitClientLogExtension) != null ? n : e);\n}\nvar fs = [\n  {\n    columns: 1,\n    rows: 1\n  },\n  {\n    columns: 1,\n    rows: 2,\n    orientation: \"portrait\"\n  },\n  {\n    columns: 2,\n    rows: 1,\n    orientation: \"landscape\"\n  },\n  {\n    columns: 2,\n    rows: 2,\n    minWidth: 560\n  },\n  {\n    columns: 3,\n    rows: 3,\n    minWidth: 700\n  },\n  {\n    columns: 4,\n    rows: 4,\n    minWidth: 960\n  },\n  {\n    columns: 5,\n    rows: 5,\n    minWidth: 1100\n  }\n];\nfunction uo(e, t, n, r) {\n  if (e.length < 1)\n    throw new Error(\"At least one grid layout definition must be provided.\");\n  const i = lo(e);\n  if (n <= 0 || r <= 0)\n    return i[0];\n  let o = 0;\n  const s = n / r > 1 ? \"landscape\" : \"portrait\";\n  let a = i.find((c, u, l) => {\n    o = u;\n    const f = l.findIndex((h, d) => {\n      const m = !h.orientation || h.orientation === s, p = d > u, g = h.maxTiles === c.maxTiles;\n      return p && g && m;\n    }) !== -1;\n    return c.maxTiles >= t && !f;\n  });\n  if (a === void 0)\n    if (a = i[i.length - 1], a)\n      I.warn(\n        `No layout found for: participantCount: ${t}, width/height: ${n}/${r} fallback to biggest available layout (${a}).`\n      );\n    else\n      throw new Error(\"No layout or fallback layout found.\");\n  if ((n < a.minWidth || r < a.minHeight) && o > 0) {\n    const c = i[o - 1];\n    a = uo(\n      i.slice(0, o),\n      c.maxTiles,\n      n,\n      r\n    );\n  }\n  return a;\n}\nfunction lo(e) {\n  return [...e].map((t) => {\n    var n, r;\n    return {\n      name: `${t.columns}x${t.rows}`,\n      columns: t.columns,\n      rows: t.rows,\n      maxTiles: t.columns * t.rows,\n      minWidth: (n = t.minWidth) != null ? n : 0,\n      minHeight: (r = t.minHeight) != null ? r : 0,\n      orientation: t.orientation\n    };\n  }).sort((t, n) => t.maxTiles !== n.maxTiles ? t.maxTiles - n.maxTiles : t.minWidth !== 0 || n.minWidth !== 0 ? t.minWidth - n.minWidth : t.minHeight !== 0 || n.minHeight !== 0 ? t.minHeight - n.minHeight : 0);\n}\nfunction ds() {\n  return typeof navigator < \"u\" && navigator.mediaDevices && !!navigator.mediaDevices.getDisplayMedia;\n}\nfunction ps(e, t) {\n  var n;\n  return fe(J({}, e), {\n    receivedAtMediaTimestamp: (n = t.rtpTimestamp) != null ? n : 0,\n    receivedAt: t.timestamp\n  });\n}\nfunction hs(e, t, n) {\n  return [...e, ...t].reduceRight((r, i) => (r.find((o) => o.id === i.id) || r.unshift(i), r), []).slice(0 - n);\n}\nvar fo = /* @__PURE__ */ ((e) => (e.AgentState = \"lk.agent.state\", e.PublishOnBehalf = \"lk.publish_on_behalf\", e.TranscriptionFinal = \"lk.transcription_final\", e.TranscriptionSegmentId = \"lk.segment_id\", e.TranscribedTrackId = \"lk.transcribed_track_id\", e))(fo || {}), Rn = [], Mn = {\n  showChat: !1,\n  unreadMessages: 0,\n  showSettings: !1\n};\nfunction po(e) {\n  return typeof e == \"object\";\n}\nfunction vs(e) {\n  return Array.isArray(e) && e.filter(po).length > 0;\n}\nfunction Dn(e, t) {\n  return t.audioLevel - e.audioLevel;\n}\nfunction $n(e, t) {\n  return e.isSpeaking === t.isSpeaking ? 0 : e.isSpeaking ? -1 : 1;\n}\nfunction Nn(e, t) {\n  var n, r, i, o;\n  return e.lastSpokeAt !== void 0 || t.lastSpokeAt !== void 0 ? ((r = (n = t.lastSpokeAt) == null ? void 0 : n.getTime()) != null ? r : 0) - ((o = (i = e.lastSpokeAt) == null ? void 0 : i.getTime()) != null ? o : 0) : 0;\n}\nfunction Ke(e, t) {\n  var n, r, i, o;\n  return ((r = (n = e.joinedAt) == null ? void 0 : n.getTime()) != null ? r : 0) - ((o = (i = t.joinedAt) == null ? void 0 : i.getTime()) != null ? o : 0);\n}\nfunction ho(e, t) {\n  return q(e) ? q(t) ? 0 : -1 : q(t) ? 1 : 0;\n}\nfunction vo(e, t) {\n  const n = e.participant.isCameraEnabled, r = t.participant.isCameraEnabled;\n  return n !== r ? n ? -1 : 1 : 0;\n}\nfunction ms(e) {\n  const t = [], n = [], r = [], i = [];\n  e.forEach((a) => {\n    a.participant.isLocal && a.source === F.Source.Camera ? t.push(a) : a.source === F.Source.ScreenShare ? n.push(a) : a.source === F.Source.Camera ? r.push(a) : i.push(a);\n  });\n  const o = mo(n), s = go(r);\n  return [...t, ...o, ...s, ...i];\n}\nfunction mo(e) {\n  const t = [], n = [];\n  return e.forEach((i) => {\n    i.participant.isLocal ? t.push(i) : n.push(i);\n  }), t.sort((i, o) => Ke(i.participant, o.participant)), n.sort((i, o) => Ke(i.participant, o.participant)), [...n, ...t];\n}\nfunction go(e) {\n  const t = [], n = [];\n  return e.forEach((r) => {\n    r.participant.isLocal ? t.push(r) : n.push(r);\n  }), n.sort((r, i) => r.participant.isSpeaking && i.participant.isSpeaking ? Dn(r.participant, i.participant) : r.participant.isSpeaking !== i.participant.isSpeaking ? $n(r.participant, i.participant) : r.participant.lastSpokeAt !== i.participant.lastSpokeAt ? Nn(r.participant, i.participant) : q(r) !== q(i) ? ho(r, i) : r.participant.isCameraEnabled !== i.participant.isCameraEnabled ? vo(r, i) : Ke(r.participant, i.participant)), [...t, ...n];\n}\nfunction gs(e) {\n  const t = [...e];\n  t.sort((r, i) => {\n    if (r.isSpeaking && i.isSpeaking)\n      return Dn(r, i);\n    if (r.isSpeaking !== i.isSpeaking)\n      return $n(r, i);\n    if (r.lastSpokeAt !== i.lastSpokeAt)\n      return Nn(r, i);\n    const o = r.videoTrackPublications.size > 0, s = i.videoTrackPublications.size > 0;\n    return o !== s ? o ? -1 : 1 : Ke(r, i);\n  });\n  const n = t.find((r) => r.isLocal);\n  if (n) {\n    const r = t.indexOf(n);\n    r >= 0 && (t.splice(r, 1), t.length > 0 ? t.splice(0, 0, n) : t.push(n));\n  }\n  return t;\n}\nfunction bo(e, t) {\n  return e.reduce(\n    (n, r, i) => i % t === 0 ? [...n, [r]] : [...n.slice(0, -1), [...n.slice(-1)[0], r]],\n    []\n  );\n}\nfunction qt(e, t) {\n  const n = Math.max(e.length, t.length);\n  return new Array(n).fill([]).map((r, i) => [e[i], t[i]]);\n}\nfunction qe(e, t, n) {\n  return e.filter((r) => !t.map((i) => n(i)).includes(n(r)));\n}\nfunction mt(e) {\n  return e.map((t) => typeof t == \"string\" || typeof t == \"number\" ? `${t}` : V(t));\n}\nfunction yo(e, t) {\n  return {\n    dropped: qe(e, t, V),\n    added: qe(t, e, V)\n  };\n}\nfunction wo(e) {\n  return e.added.length !== 0 || e.dropped.length !== 0;\n}\nfunction gt(e, t) {\n  const n = t.findIndex(\n    (r) => V(r) === V(e)\n  );\n  if (n === -1)\n    throw new Error(\n      `Element not part of the array: ${V(\n        e\n      )} not in ${mt(t)}`\n    );\n  return n;\n}\nfunction xo(e, t, n) {\n  const r = gt(e, n), i = gt(t, n);\n  return n.splice(r, 1, t), n.splice(i, 1, e), n;\n}\nfunction So(e, t) {\n  const n = gt(e, t);\n  return t.splice(n, 1), t;\n}\nfunction Co(e, t) {\n  return [...t, e];\n}\nfunction ct(e, t) {\n  return bo(e, t);\n}\nfunction bs(e, t, n) {\n  let r = Eo(e, t);\n  if (r.length < t.length) {\n    const s = qe(t, r, V);\n    r = [...r, ...s];\n  }\n  const i = ct(r, n), o = ct(t, n);\n  if (qt(i, o).forEach(([s, a], c) => {\n    if (s && a) {\n      const u = ct(r, n)[c], l = yo(u, a);\n      wo(l) && (I.debug(\n        `Detected visual changes on page: ${c}, current: ${mt(\n          s\n        )}, next: ${mt(a)}`,\n        { changes: l }\n      ), l.added.length === l.dropped.length && qt(l.added, l.dropped).forEach(([f, h]) => {\n        if (f && h)\n          r = xo(f, h, r);\n        else\n          throw new Error(\n            `For a swap action we need a addition and a removal one is missing: ${f}, ${h}`\n          );\n      }), l.added.length === 0 && l.dropped.length > 0 && l.dropped.forEach((f) => {\n        r = So(f, r);\n      }), l.added.length > 0 && l.dropped.length === 0 && l.added.forEach((f) => {\n        r = Co(f, r);\n      }));\n    }\n  }), r.length > t.length) {\n    const s = qe(r, t, V);\n    r = r.filter(\n      (a) => !s.map(V).includes(V(a))\n    );\n  }\n  return r;\n}\nfunction Eo(e, t) {\n  return e.map((n) => {\n    const r = t.find(\n      (i) => (\n        // If the IDs match or ..\n        V(n) === V(i) || // ... if the current item is a placeholder and the new item is the track reference can replace it.\n        typeof n != \"number\" && ke(n) && q(i) && ro(n, i)\n      )\n    );\n    return r ?? n;\n  });\n}\nfunction Y(e) {\n  return `${kn}-${e}`;\n}\nfunction ys(e) {\n  const t = Gt(e), n = Fn(e.participant).pipe(\n    _(() => Gt(e)),\n    U(t)\n  );\n  return { className: Y(\n    e.source === F.Source.Camera || e.source === F.Source.ScreenShare ? \"participant-media-video\" : \"participant-media-audio\"\n  ), trackObserver: n };\n}\nfunction Gt(e) {\n  if (q(e))\n    return e.publication;\n  {\n    const { source: t, name: n, participant: r } = e;\n    if (t && n)\n      return r.getTrackPublications().find((i) => i.source === t && i.trackName === n);\n    if (n)\n      return r.getTrackPublicationByName(n);\n    if (t)\n      return r.getTrackPublication(t);\n    throw new Error(\"At least one of source and name needs to be defined\");\n  }\n}\nfunction me(e, ...t) {\n  return new L((r) => {\n    const i = () => {\n      r.next(e);\n    };\n    return t.forEach((s) => {\n      e.on(s, i);\n    }), () => {\n      t.forEach((s) => {\n        e.off(s, i);\n      });\n    };\n  }).pipe(U(e));\n}\nfunction Ee(e, t) {\n  return new L((r) => {\n    const i = (...s) => {\n      r.next(s);\n    };\n    return e.on(t, i), () => {\n      e.off(t, i);\n    };\n  });\n}\nfunction ws(e) {\n  return Ee(e, y.ConnectionStateChanged).pipe(\n    _(([t]) => t),\n    U(e.state)\n  );\n}\nfunction xs(e) {\n  return me(\n    e,\n    y.RoomMetadataChanged,\n    y.ConnectionStateChanged\n  ).pipe(\n    _((n) => ({ name: n.name, metadata: n.metadata }))\n  );\n}\nfunction Ss(e) {\n  return Ee(e, y.ActiveSpeakersChanged).pipe(\n    _(([t]) => t)\n  );\n}\nfunction Cs(e, t, n = !0) {\n  const r = new L((o) => {\n    Ot.getLocalDevices(e, n).then((s) => {\n      o.next(s), o.complete();\n    }).catch((s) => {\n      t?.(s), o.next([]), o.complete();\n    });\n  }), i = new L((o) => {\n    var s;\n    const a = () => H(null, null, function* () {\n      try {\n        const c = yield Ot.getLocalDevices(e, n);\n        o.next(c);\n      } catch (c) {\n        t?.(c);\n      }\n    });\n    if (typeof window < \"u\") {\n      if (!window.isSecureContext)\n        throw new Error(\n          \"Accessing media devices is available only in secure contexts (HTTPS and localhost), in some or all supporting browsers. See: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/mediaDevices\"\n        );\n      (s = navigator?.mediaDevices) == null || s.addEventListener(\"devicechange\", a);\n    }\n    return () => {\n      var c;\n      (c = navigator?.mediaDevices) == null || c.removeEventListener(\"devicechange\", a);\n    };\n  });\n  return Ye(r, i);\n}\nfunction To(e) {\n  return Ee(e, y.DataReceived);\n}\nfunction Po(e) {\n  return me(e, y.AudioPlaybackStatusChanged).pipe(\n    _((n) => ({ canPlayAudio: n.canPlaybackAudio }))\n  );\n}\nfunction Oo(e) {\n  return me(e, y.VideoPlaybackStatusChanged).pipe(\n    _((n) => ({ canPlayVideo: n.canPlaybackVideo }))\n  );\n}\nfunction Ao(e, t) {\n  return Ee(e, y.ActiveDeviceChanged).pipe(\n    nt(([n]) => n === t),\n    _(([n, r]) => (I.debug(\"activeDeviceObservable | RoomEvent.ActiveDeviceChanged\", { kind: n, deviceId: r }), r))\n  );\n}\nfunction Es(e, t) {\n  return Ee(e, y.ParticipantEncryptionStatusChanged).pipe(\n    nt(\n      ([, n]) => t?.identity === n?.identity || !n && t?.identity === e.localParticipant.identity\n    ),\n    _(([n]) => n),\n    U(\n      t?.isLocal ? t.isE2EEEnabled : !!t?.isEncrypted\n    )\n  );\n}\nfunction Ts(e) {\n  return Ee(e, y.RecordingStatusChanged).pipe(\n    _(([t]) => t),\n    U(e.isRecording)\n  );\n}\nfunction Te(e, ...t) {\n  return new L((r) => {\n    const i = () => {\n      r.next(e);\n    };\n    return t.forEach((s) => {\n      e.on(s, i);\n    }), () => {\n      t.forEach((s) => {\n        e.off(s, i);\n      });\n    };\n  }).pipe(U(e));\n}\nfunction Fn(e) {\n  return Te(\n    e,\n    w.TrackMuted,\n    w.TrackUnmuted,\n    w.ParticipantPermissionsChanged,\n    // ParticipantEvent.IsSpeakingChanged,\n    w.TrackPublished,\n    w.TrackUnpublished,\n    w.LocalTrackPublished,\n    w.LocalTrackUnpublished,\n    w.MediaDevicesError,\n    w.TrackSubscriptionStatusChanged\n    // ParticipantEvent.ConnectionQualityChanged,\n  ).pipe(\n    _((n) => {\n      const { isMicrophoneEnabled: r, isCameraEnabled: i, isScreenShareEnabled: o } = n, s = n.getTrackPublication(F.Source.Microphone), a = n.getTrackPublication(F.Source.Camera);\n      return {\n        isCameraEnabled: i,\n        isMicrophoneEnabled: r,\n        isScreenShareEnabled: o,\n        cameraTrack: a,\n        microphoneTrack: s,\n        participant: n\n      };\n    })\n  );\n}\nfunction _o(e) {\n  return e ? Te(\n    e,\n    w.ParticipantMetadataChanged,\n    w.ParticipantNameChanged\n  ).pipe(\n    _(({ name: n, identity: r, metadata: i }) => ({\n      name: n,\n      identity: r,\n      metadata: i\n    })),\n    U({\n      name: e.name,\n      identity: e.identity,\n      metadata: e.metadata\n    })\n  ) : void 0;\n}\nfunction ko(e) {\n  return rt(\n    e,\n    w.ConnectionQualityChanged\n  ).pipe(\n    _(([n]) => n),\n    U(e.connectionQuality)\n  );\n}\nfunction rt(e, t) {\n  return new L((r) => {\n    const i = (...s) => {\n      r.next(s);\n    };\n    return e.on(t, i), () => {\n      e.off(t, i);\n    };\n  });\n}\nfunction Lo(e) {\n  var t, n, r, i;\n  return Te(\n    e.participant,\n    w.TrackMuted,\n    w.TrackUnmuted,\n    w.TrackSubscribed,\n    w.TrackUnsubscribed,\n    w.LocalTrackPublished,\n    w.LocalTrackUnpublished\n  ).pipe(\n    _((o) => {\n      var s, a;\n      const c = (s = e.publication) != null ? s : o.getTrackPublication(e.source);\n      return (a = c?.isMuted) != null ? a : !0;\n    }),\n    U(\n      (i = (r = (t = e.publication) == null ? void 0 : t.isMuted) != null ? r : (n = e.participant.getTrackPublication(e.source)) == null ? void 0 : n.isMuted) != null ? i : !0\n    )\n  );\n}\nfunction Ps(e) {\n  return rt(e, w.IsSpeakingChanged).pipe(\n    _(([t]) => t)\n  );\n}\nfunction Os(e, t = {}) {\n  var n;\n  let r;\n  const i = new L((c) => (r = c, () => a.unsubscribe())).pipe(U(Array.from(e.remoteParticipants.values()))), o = (n = t.additionalRoomEvents) != null ? n : Ln, s = Array.from(\n    /* @__PURE__ */ new Set([\n      y.ParticipantConnected,\n      y.ParticipantDisconnected,\n      y.ConnectionStateChanged,\n      ...o\n    ])\n  ), a = me(e, ...s).subscribe(\n    (c) => r?.next(Array.from(c.remoteParticipants.values()))\n  );\n  return e.remoteParticipants.size > 0 && r?.next(Array.from(e.remoteParticipants.values())), i;\n}\nfunction As(e, t, n = {}) {\n  var r;\n  const i = (r = n.additionalEvents) != null ? r : In;\n  return me(\n    e,\n    y.ParticipantConnected,\n    y.ParticipantDisconnected,\n    y.ConnectionStateChanged\n  ).pipe(\n    _n((s) => {\n      const a = s.getParticipantByIdentity(t);\n      return a ? Te(a, ...i) : new L((c) => c.next(void 0));\n    }),\n    U(e.getParticipantByIdentity(t))\n  );\n}\nfunction _s(e) {\n  return rt(\n    e,\n    w.ParticipantPermissionsChanged\n  ).pipe(\n    _(() => e.permissions),\n    U(e.permissions)\n  );\n}\nfunction ks(e, { kind: t, identity: n }, r = {}) {\n  var i;\n  const o = (i = r.additionalEvents) != null ? i : In, s = (c) => {\n    let u = !0;\n    return t && (u = u && c.kind === t), n && (u = u && c.identity === n), u;\n  };\n  return me(\n    e,\n    y.ParticipantConnected,\n    y.ParticipantDisconnected,\n    y.ConnectionStateChanged\n  ).pipe(\n    _n((c) => {\n      const u = Array.from(c.remoteParticipants.values()).find(\n        (l) => s(l)\n      );\n      return u ? Te(u, ...o) : new L((l) => l.next(void 0));\n    }),\n    U(Array.from(e.remoteParticipants.values()).find((c) => s(c)))\n  );\n}\nfunction Ls(e) {\n  return typeof e > \"u\" ? new L() : rt(e, w.AttributesChanged).pipe(\n    _(([t]) => ({\n      changed: t,\n      attributes: e.attributes\n    })),\n    U({ changed: e.attributes, attributes: e.attributes })\n  );\n}\nfunction Is(e, t, n, r, i) {\n  const { localParticipant: o } = t, s = (f, h) => {\n    let d = !1;\n    switch (f) {\n      case F.Source.Camera:\n        d = h.isCameraEnabled;\n        break;\n      case F.Source.Microphone:\n        d = h.isMicrophoneEnabled;\n        break;\n      case F.Source.ScreenShare:\n        d = h.isScreenShareEnabled;\n        break;\n    }\n    return d;\n  }, a = Fn(o).pipe(\n    _((f) => s(e, f.participant)),\n    U(s(e, o))\n  ), c = new re(), u = (f, h) => H(null, null, function* () {\n    try {\n      switch (h ?? (h = n), c.next(!0), e) {\n        case F.Source.Camera:\n          return yield o.setCameraEnabled(\n            f ?? !o.isCameraEnabled,\n            h,\n            r\n          ), o.isCameraEnabled;\n        case F.Source.Microphone:\n          return yield o.setMicrophoneEnabled(\n            f ?? !o.isMicrophoneEnabled,\n            h,\n            r\n          ), o.isMicrophoneEnabled;\n        case F.Source.ScreenShare:\n          return yield o.setScreenShareEnabled(\n            f ?? !o.isScreenShareEnabled,\n            h,\n            r\n          ), o.isScreenShareEnabled;\n        default:\n          throw new TypeError(\"Tried to toggle unsupported source\");\n      }\n    } catch (d) {\n      if (i && d instanceof Error) {\n        i?.(d);\n        return;\n      } else\n        throw d;\n    } finally {\n      c.next(!1);\n    }\n  });\n  return {\n    className: Y(\"button\"),\n    toggle: u,\n    enabledObserver: a,\n    pendingObserver: c.asObservable()\n  };\n}\nfunction Rs() {\n  let e = !1;\n  const t = new re(), n = new re(), r = (o) => H(null, null, function* () {\n    n.next(!0), e = o ?? !e, t.next(e), n.next(!1);\n  });\n  return {\n    className: Y(\"button\"),\n    toggle: r,\n    enabledObserver: t.asObservable(),\n    pendingObserver: n.asObservable()\n  };\n}\nfunction Ms(e, t, n) {\n  const r = new mn(void 0), i = Ao(t, e), o = (a, ...c) => H(null, [a, ...c], function* (u, l = {}) {\n    var f, h, d;\n    if (n) {\n      yield n.setDeviceId(l.exact ? { exact: u } : u);\n      const m = yield n.getDeviceId(!1);\n      r.next(\n        u === \"default\" && n.mediaStreamTrack.label.startsWith(\"Default\") ? u : m\n      );\n    } else if (t) {\n      const m = Jn();\n      if (e === \"audiooutput\" && (m?.name === \"Safari\" || m?.os === \"iOS\")) {\n        I.warn(\"Switching audio output device is not supported on Safari and iOS.\");\n        return;\n      }\n      I.debug(`Switching active device of kind \"${e}\" with id ${u}.`), yield t.switchActiveDevice(e, u, l.exact);\n      const p = (f = t.getActiveDevice(e)) != null ? f : u;\n      p !== u && u !== \"default\" && I.info(\n        `We tried to select the device with id (${u}), but the browser decided to select the device with id (${p}) instead.`\n      );\n      let g;\n      e === \"audioinput\" ? g = (h = t.localParticipant.getTrackPublication(F.Source.Microphone)) == null ? void 0 : h.track : e === \"videoinput\" && (g = (d = t.localParticipant.getTrackPublication(F.Source.Camera)) == null ? void 0 : d.track);\n      const v = u === \"default\" && !g || u === \"default\" && g?.mediaStreamTrack.label.startsWith(\"Default\");\n      r.next(v ? u : p);\n    }\n  });\n  return {\n    className: Y(\"media-device-select\"),\n    activeDeviceObservable: i,\n    setActiveMediaDevice: o\n  };\n}\nfunction Ds(e) {\n  const t = (r) => {\n    e.disconnect(r);\n  };\n  return { className: Y(\"disconnect-button\"), disconnect: t };\n}\nfunction $s(e) {\n  const t = Y(\"connection-quality\"), n = ko(e);\n  return { className: t, connectionQualityObserver: n };\n}\nfunction Ns(e) {\n  let t = \"track-muted-indicator-camera\";\n  switch (e.source) {\n    case F.Source.Camera:\n      t = \"track-muted-indicator-camera\";\n      break;\n    case F.Source.Microphone:\n      t = \"track-muted-indicator-microphone\";\n      break;\n  }\n  const n = Y(t), r = Lo(e);\n  return { className: n, mediaMutedObserver: r };\n}\nfunction Fs(e) {\n  return { className: \"lk-participant-name\", infoObserver: _o(e) };\n}\nfunction Us() {\n  return {\n    className: Y(\"participant-tile\")\n  };\n}\nvar Io = {\n  CHAT: \"lk.chat\",\n  TRANSCRIPTION: \"lk.transcription\"\n}, Ro = {\n  CHAT: \"lk-chat-topic\"\n};\nfunction Un(e, t) {\n  return H(this, arguments, function* (n, r, i = {}) {\n    const { reliable: o, destinationIdentities: s, topic: a } = i;\n    yield n.publishData(r, {\n      destinationIdentities: s,\n      topic: a,\n      reliable: o\n    });\n  });\n}\nfunction Mo(e, t, n) {\n  const r = Array.isArray(t) ? t : [t], i = To(e).pipe(\n    nt(\n      ([, , , c]) => t === void 0 || c !== void 0 && r.includes(c)\n    ),\n    _(([c, u, , l]) => {\n      const f = {\n        payload: c,\n        topic: l,\n        from: u\n      };\n      return n?.(f), f;\n    })\n  );\n  let o;\n  const s = new L((c) => {\n    o = c;\n  });\n  return { messageObservable: i, isSendingObservable: s, send: (c, ...u) => H(null, [c, ...u], function* (l, f = {}) {\n    o.next(!0);\n    try {\n      yield Un(e.localParticipant, l, J({ topic: r[0] }, f));\n    } finally {\n      o.next(!1);\n    }\n  }) };\n}\nvar Do = class {\n  constructor(e, t) {\n    this._isResolved = !1, this.onFinally = t, this.promise = new Promise((n, r) => H(this, null, function* () {\n      this.resolve = n, this.reject = r, e && (yield e(n, r));\n    })).finally(() => {\n      var n;\n      this._isResolved = !0, (n = this.onFinally) == null || n.call(this);\n    });\n  }\n  get isResolved() {\n    return this._isResolved;\n  }\n}, De = /* @__PURE__ */ new WeakMap(), $e = /* @__PURE__ */ new Map();\nfunction $o(e) {\n  return e.ignoreLegacy == !0;\n}\nvar No = (e) => JSON.parse(new TextDecoder().decode(e)), Fo = (e) => new TextEncoder().encode(JSON.stringify(e));\nfunction Ws(e, t) {\n  var n, r, i, o, s, a;\n  const c = () => {\n    var S, b, P;\n    return ((S = e.serverInfo) == null ? void 0 : S.edition) === 1 || !!((b = e.serverInfo) != null && b.version) && Zn((P = e.serverInfo) == null ? void 0 : P.version, \"1.8.2\") > 0;\n  }, u = new re(), l = (n = t?.channelTopic) != null ? n : Io.CHAT, f = (r = t?.channelTopic) != null ? r : Ro.CHAT;\n  let h = !1;\n  De.has(e) || (h = !0);\n  const d = (i = De.get(e)) != null ? i : /* @__PURE__ */ new Map(), m = (o = d.get(l)) != null ? o : new re();\n  d.set(l, m), De.set(e, d);\n  const p = (s = t?.messageDecoder) != null ? s : No;\n  if (h) {\n    e.registerTextStreamHandler(l, (b, P) => H(null, null, function* () {\n      const { id: R, timestamp: M, attributes: W, attachedStreamIds: E } = b.info, O = new Map(\n        (E ?? []).map((k) => [\n          k,\n          new Do()\n        ])\n      );\n      $e.set(R, O), ye(b).pipe(\n        Ue((k, $) => k + $),\n        _e((k) => O.size === 0 ? ht({ chunk: k, attachedFiles: [] }) : ye(O.values()).pipe(\n          _e(($) => ye($.promise)),\n          Ue(\n            ($, G) => [...$, new File(G.buffer, G.fileName)],\n            []\n          ),\n          _(($) => ({ chunk: k, attachedFiles: $ }))\n        )),\n        _(({ chunk: k, attachedFiles: $ }) => ({\n          id: R,\n          timestamp: M,\n          message: k,\n          from: e.getParticipantByIdentity(P.identity),\n          type: \"chatMessage\",\n          attributes: W,\n          attachedFiles: $\n          // editTimestamp: type === 'update' ? timestamp : undefined,\n        })),\n        zi(() => $e.delete(R))\n      ).subscribe({\n        next: (k) => m.next(k)\n      });\n    })), e.registerByteStreamHandler(l, (b) => H(null, null, function* () {\n      var P, R;\n      const { id: M } = b.info, W = Array.from($e).find(\n        ([, N]) => N.has(M)\n      );\n      if (!W)\n        return;\n      const E = W[0], O = [];\n      try {\n        for (var j = eo(b), k, $, G; k = !($ = yield j.next()).done; k = !1) {\n          const N = $.value;\n          O.push(N);\n        }\n      } catch (N) {\n        G = [N];\n      } finally {\n        try {\n          k && ($ = j.return) && (yield $.call(j));\n        } finally {\n          if (G)\n            throw G[0];\n        }\n      }\n      const X = (P = $e.get(E)) == null ? void 0 : P.get(M);\n      X && ((R = X.resolve) == null || R.call(X, {\n        fileName: b.info.name,\n        buffer: O\n      }));\n    }));\n    const { messageObservable: S } = Mo(e, [f]);\n    S.pipe(\n      _((b) => {\n        const P = p(b.payload);\n        return $o(P) ? void 0 : fe(J({}, P), {\n          type: \"chatMessage\",\n          from: b.from\n        });\n      }),\n      nt((b) => !!b),\n      Vt(u)\n    ).subscribe(m);\n  }\n  const g = m.pipe(\n    Ue((S, b) => {\n      if (\"id\" in b && S.find((P) => {\n        var R, M;\n        return ((R = P.from) == null ? void 0 : R.identity) === ((M = b.from) == null ? void 0 : M.identity) && P.id === b.id;\n      })) {\n        const P = S.findIndex((R) => R.id === b.id);\n        if (P > -1) {\n          const R = S[P];\n          S[P] = fe(J({}, b), {\n            timestamp: R.timestamp,\n            editTimestamp: b.timestamp\n          });\n        }\n        return [...S];\n      }\n      return [...S, b];\n    }, []),\n    Vt(u)\n  ), v = new mn(!1), x = (a = t?.messageEncoder) != null ? a : Fo, C = (S, b) => H(null, null, function* () {\n    var P;\n    b || (b = {}), (P = b.topic) != null || (b.topic = l), v.next(!0);\n    try {\n      const M = {\n        id: (yield e.localParticipant.sendText(S, b)).id,\n        timestamp: Date.now(),\n        message: S\n      }, W = fe(J({}, M), {\n        attachedFiles: b.attachments\n      }), E = fe(J({}, W), {\n        type: \"chatMessage\",\n        from: e.localParticipant,\n        attributes: b.attributes\n      });\n      m.next(E);\n      const O = x(fe(J({}, M), {\n        ignoreLegacy: c()\n      }));\n      try {\n        yield Un(e.localParticipant, O, {\n          reliable: !0,\n          topic: f\n        });\n      } catch (j) {\n        I.info(\"could not send message in legacy chat format\", j);\n      }\n      return E;\n    } finally {\n      v.next(!1);\n    }\n  });\n  function T() {\n    u.next(), u.complete(), m.complete(), De.delete(e), e.unregisterTextStreamHandler(l), e.unregisterByteStreamHandler(l);\n  }\n  return e.once(y.Disconnected, T), {\n    messageObservable: g,\n    isSendingObservable: v,\n    send: C\n  };\n}\nfunction Bs() {\n  const e = (n) => H(null, null, function* () {\n    I.info(\"Start Audio for room: \", n), yield n.startAudio();\n  });\n  return { className: Y(\"start-audio-button\"), roomAudioPlaybackAllowedObservable: Po, handleStartAudioPlayback: e };\n}\nfunction js() {\n  const e = (n) => H(null, null, function* () {\n    I.info(\"Start Video for room: \", n), yield n.startVideo();\n  });\n  return { className: Y(\"start-audio-button\"), roomVideoPlaybackAllowedObservable: Oo, handleStartVideoPlayback: e };\n}\nfunction Vs() {\n  return { className: [Y(\"button\"), Y(\"chat-toggle\")].join(\" \") };\n}\nfunction Hs() {\n  return { className: [Y(\"button\"), Y(\"focus-toggle-button\")].join(\" \") };\n}\nfunction zs() {\n  return { className: \"lk-clear-pin-button lk-button\" };\n}\nfunction Ys() {\n  return { className: \"lk-room-container\" };\n}\nfunction Qt(e, t, n = !0) {\n  const i = [e.localParticipant, ...Array.from(e.remoteParticipants.values())], o = [];\n  return i.forEach((s) => {\n    t.forEach((a) => {\n      const c = Array.from(\n        s.trackPublications.values()\n      ).filter(\n        (u) => u.source === a && // either return all or only the ones that are subscribed\n        (!n || u.track)\n      ).map((u) => ({\n        participant: s,\n        publication: u,\n        source: u.source\n      }));\n      o.push(...c);\n    });\n  }), { trackReferences: o, participants: i };\n}\nfunction Xt(e, t, n = !1) {\n  const { sources: r, kind: i, name: o } = t;\n  return Array.from(e.trackPublications.values()).filter(\n    (a) => (!r || r.includes(a.source)) && (!i || a.kind === i) && (!o || a.trackName === o) && // either return all or only the ones that are subscribed\n    (!n || a.track)\n  ).map((a) => ({\n    participant: e,\n    publication: a,\n    source: a.source\n  }));\n}\nfunction Ks(e, t, n) {\n  var r, i;\n  const o = (r = n.additionalRoomEvents) != null ? r : Ln, s = (i = n.onlySubscribed) != null ? i : !0, a = Array.from(\n    (/* @__PURE__ */ new Set([\n      y.ParticipantConnected,\n      y.ParticipantDisconnected,\n      y.ConnectionStateChanged,\n      y.LocalTrackPublished,\n      y.LocalTrackUnpublished,\n      y.TrackPublished,\n      y.TrackUnpublished,\n      y.TrackSubscriptionStatusChanged,\n      ...o\n    ])).values()\n  );\n  return me(e, ...a).pipe(\n    _((u) => {\n      const l = Qt(u, t, s);\n      return I.debug(`TrackReference[] was updated. (length ${l.trackReferences.length})`, l), l;\n    }),\n    U(Qt(e, t, s))\n  );\n}\nfunction qs(e, t) {\n  return Te(e, ...ao).pipe(\n    _((r) => {\n      const i = Xt(r, t);\n      return I.debug(`TrackReference[] was updated. (length ${i.length})`, i), i;\n    }),\n    U(Xt(e, t))\n  );\n}\nfunction Wn(e, t) {\n  return new L((r) => {\n    const i = (...s) => {\n      r.next(s);\n    };\n    return e.on(t, i), () => {\n      e.off(t, i);\n    };\n  });\n}\nfunction Gs(e) {\n  return Wn(e, Zt.TranscriptionReceived);\n}\nfunction Qs(e) {\n  return Wn(e, Zt.TimeSyncUpdate).pipe(\n    _(([t]) => t)\n  );\n}\nfunction Xs(e, t = 1e3) {\n  if (e === null) return ht(!1);\n  const n = vt(e, \"mousemove\", { passive: !0 }).pipe(_(() => !0)), r = n.pipe(\n    Ai({\n      each: t,\n      with: () => Ye(ht(!1), r.pipe(Ki(n)))\n    }),\n    Vi()\n  );\n  return r;\n}\nfunction Uo(e, t) {\n  if (typeof localStorage > \"u\") {\n    I.error(\"Local storage is not available.\");\n    return;\n  }\n  try {\n    if (t) {\n      const n = Object.fromEntries(\n        Object.entries(t).filter(([, r]) => r !== \"\")\n      );\n      localStorage.setItem(e, JSON.stringify(n));\n    }\n  } catch (n) {\n    I.error(`Error setting item to local storage: ${n}`);\n  }\n}\nfunction Wo(e) {\n  if (typeof localStorage > \"u\") {\n    I.error(\"Local storage is not available.\");\n    return;\n  }\n  try {\n    const t = localStorage.getItem(e);\n    if (!t) {\n      I.warn(`Item with key ${e} does not exist in local storage.`);\n      return;\n    }\n    return JSON.parse(t);\n  } catch (t) {\n    I.error(`Error getting item from local storage: ${t}`);\n    return;\n  }\n}\nfunction Bo(e) {\n  return {\n    load: () => Wo(e),\n    save: (t) => Uo(e, t)\n  };\n}\nvar jo = `${kn}-user-choices`, Pe = {\n  videoEnabled: !0,\n  audioEnabled: !0,\n  videoDeviceId: \"default\",\n  audioDeviceId: \"default\",\n  username: \"\"\n}, { load: Vo, save: Ho } = Bo(jo);\nfunction Js(e, t = !1) {\n  t !== !0 && Ho(e);\n}\nfunction Zs(e, t = !1) {\n  var n, r, i, o, s;\n  const a = {\n    videoEnabled: (n = e?.videoEnabled) != null ? n : Pe.videoEnabled,\n    audioEnabled: (r = e?.audioEnabled) != null ? r : Pe.audioEnabled,\n    videoDeviceId: (i = e?.videoDeviceId) != null ? i : Pe.videoDeviceId,\n    audioDeviceId: (o = e?.audioDeviceId) != null ? o : Pe.audioDeviceId,\n    username: (s = e?.username) != null ? s : Pe.username\n  };\n  if (t)\n    return a;\n  {\n    const c = Vo();\n    return J(J({}, a), c ?? {});\n  }\n}\nvar ut = null, lt = null, zo = 0;\nfunction Jt() {\n  return ut || (ut = /* @__PURE__ */ new Map()), ut;\n}\nfunction Yo() {\n  return lt || (lt = /* @__PURE__ */ new WeakMap()), lt;\n}\nfunction Ko(e, t) {\n  const n = Yo();\n  let r = n.get(e);\n  return r || (r = `room_${zo++}`, n.set(e, r)), `${r}:${t}`;\n}\nfunction ea(e, t) {\n  const n = Ko(e, t), r = Jt(), i = r.get(n);\n  if (i)\n    return i;\n  const o = new re();\n  let s = [];\n  const a = \"lk.segment_id\", c = o.pipe(\n    qi({\n      subscribe: () => {\n        e.registerTextStreamHandler(t, (u, l) => H(null, null, function* () {\n          var f;\n          const h = ye(u).pipe(\n            Ue((m, p) => m + p, \"\")\n          ), d = !!((f = u.info.attributes) != null && f[a]);\n          h.subscribe((m) => {\n            const p = s.findIndex(\n              (g) => {\n                var v, x;\n                return g.streamInfo.id === u.info.id || d && ((v = g.streamInfo.attributes) == null ? void 0 : v[a]) === ((x = u.info.attributes) == null ? void 0 : x[a]);\n              }\n            );\n            p !== -1 ? (s[p] = fe(J({}, s[p]), {\n              text: m,\n              // Carry the latest streamInfo forward. Transcription updates for a\n              // segment arrive as separate streams sharing the same lk.segment_id;\n              // keeping the original streamInfo would freeze attributes that change\n              // over the segment's lifetime — notably lk.transcription_final flipping\n              // \"false\" -> \"true\" on the final user STT result.\n              streamInfo: u.info\n            }), o.next([...s])) : (s.push({\n              text: m,\n              participantInfo: l,\n              streamInfo: u.info\n            }), o.next([...s]));\n          });\n        }));\n      },\n      finalize: () => {\n        e.unregisterTextStreamHandler(t);\n      }\n    }),\n    Yi()\n  );\n  return r.set(n, c), e.on(y.Disconnected, () => {\n    Jt().delete(n), s = [], o.next([]);\n  }), c;\n}\nfunction Bn(e, t) {\n  if (t.msg === \"show_chat\")\n    return { ...e, showChat: !0, unreadMessages: 0 };\n  if (t.msg === \"hide_chat\")\n    return { ...e, showChat: !1 };\n  if (t.msg === \"toggle_chat\") {\n    const n = { ...e, showChat: !e.showChat };\n    return n.showChat === !0 && (n.unreadMessages = 0), n;\n  } else return t.msg === \"unread_msg\" ? { ...e, unreadMessages: t.count } : t.msg === \"toggle_settings\" ? { ...e, showSettings: !e.showSettings } : { ...e };\n}\nfunction jn(e, t) {\n  return t.msg === \"set_pin\" ? [t.trackReference] : t.msg === \"clear_pin\" ? [] : { ...e };\n}\nconst Vn = D.createContext(void 0);\nfunction ta() {\n  const e = D.useContext(Vn);\n  if (!e)\n    throw Error(\"Tried to access LayoutContext context outside a LayoutContextProvider provider.\");\n  return e;\n}\nfunction na(e) {\n  const t = qo();\n  if (e ?? (e = t), !e)\n    throw Error(\"Tried to access LayoutContext context outside a LayoutContextProvider provider.\");\n  return e;\n}\nfunction ra() {\n  const [e, t] = D.useReducer(jn, Rn), [n, r] = D.useReducer(Bn, Mn);\n  return {\n    pin: { dispatch: t, state: e },\n    widget: { dispatch: r, state: n }\n  };\n}\nfunction ia(e) {\n  const [t, n] = D.useReducer(jn, Rn), [r, i] = D.useReducer(Bn, Mn);\n  return e ?? {\n    pin: { dispatch: n, state: t },\n    widget: { dispatch: i, state: r }\n  };\n}\nfunction qo() {\n  return D.useContext(Vn);\n}\nconst Hn = D.createContext(\n  void 0\n);\nfunction oa() {\n  const e = D.useContext(Hn);\n  if (!e)\n    throw Error(\"tried to access track context outside of track context provider\");\n  return e;\n}\nfunction zn() {\n  return D.useContext(Hn);\n}\nfunction sa(e) {\n  const t = zn(), n = e ?? t;\n  if (!n)\n    throw new Error(\n      \"No TrackRef, make sure you are inside a TrackRefContext or pass the TrackRef explicitly\"\n    );\n  return n;\n}\nconst Yn = D.createContext(void 0);\nfunction aa() {\n  const e = D.useContext(Yn);\n  if (!e)\n    throw Error(\"tried to access participant context outside of participant context provider\");\n  return e;\n}\nfunction Go() {\n  return D.useContext(Yn);\n}\nfunction ca(e) {\n  const t = Go(), n = zn(), r = e ?? t ?? n?.participant;\n  if (!r)\n    throw new Error(\n      \"No participant provided, make sure you are inside a participant context or pass the participant explicitly\"\n    );\n  return r;\n}\nconst Kn = D.createContext(void 0);\nfunction ua() {\n  const e = D.useContext(Kn);\n  if (!e)\n    throw Error(\"tried to access room context outside of livekit room component\");\n  return e;\n}\nfunction Qo() {\n  return D.useContext(Kn);\n}\nfunction la(e) {\n  const t = Qo(), n = e ?? t;\n  if (!n)\n    throw new Error(\n      \"No room provided, make sure you are inside a Room context or pass the room explicitly\"\n    );\n  return n;\n}\nconst qn = D.createContext(void 0);\nfunction fa() {\n  const e = D.useContext(qn);\n  if (!e)\n    throw Error(\"tried to access session context outside of SessionProvider component\");\n  return e;\n}\nfunction Xo() {\n  return D.useContext(qn);\n}\nfunction da(e) {\n  const t = Xo(), n = e ?? t;\n  if (!n)\n    throw new Error(\n      \"No session provided, make sure you are inside a Session context or pass the session explicitly\"\n    );\n  return n;\n}\nconst Jo = D.createContext(void 0);\nfunction pa(e) {\n  const t = D.useContext(Jo);\n  if (e === !0) {\n    if (t)\n      return t;\n    throw Error(\"tried to access feature context, but none is present\");\n  }\n  return t;\n}\nexport {\n  Js as $,\n  bs as A,\n  Go as B,\n  _o as C,\n  Us as D,\n  Os as E,\n  na as F,\n  fs as G,\n  As as H,\n  ks as I,\n  xs as J,\n  Ss as K,\n  Jo as L,\n  gs as M,\n  Bs as N,\n  js as O,\n  Vs as P,\n  Ns as Q,\n  Kn as R,\n  Is as S,\n  Rs as T,\n  po as U,\n  Ks as V,\n  vs as W,\n  Gt as X,\n  ys as Y,\n  Ws as Z,\n  Zs as _,\n  ta as a,\n  Es as a0,\n  q as a1,\n  qs as a2,\n  Qs as a3,\n  Gs as a4,\n  hs as a5,\n  ps as a6,\n  Ls as a7,\n  fo as a8,\n  Ts as a9,\n  aa as aA,\n  fa as aB,\n  oa as aC,\n  ea as aa,\n  Io as ab,\n  Xo as ac,\n  da as ad,\n  zn as ae,\n  Vn as af,\n  Fs as ag,\n  es as ah,\n  Br as ai,\n  Yn as aj,\n  pa as ak,\n  Hn as al,\n  Xs as am,\n  rs as an,\n  ia as ao,\n  cs as ap,\n  as as aq,\n  qn as ar,\n  os as as,\n  ss as at,\n  ds as au,\n  ra as av,\n  ts as aw,\n  is as ax,\n  ls as ay,\n  us as az,\n  zs as b,\n  ca as c,\n  $s as d,\n  ws as e,\n  ua as f,\n  Mo as g,\n  Ds as h,\n  sa as i,\n  qo as j,\n  Hs as k,\n  I as l,\n  ns as m,\n  uo as n,\n  Lo as o,\n  V as p,\n  Ps as q,\n  Po as r,\n  Ys as s,\n  Fn as t,\n  la as u,\n  _s as v,\n  Qo as w,\n  Cs as x,\n  Ms as y,\n  ms as z\n};\n//# sourceMappingURL=contexts-BtSGUJjc.mjs.map\n","import * as i from \"react\";\nimport { l, s as x, R as V, L as j } from \"./contexts-BtSGUJjc.mjs\";\nimport { Room as U, RoomEvent as a, MediaDeviceFailure as _ } from \"livekit-client\";\nfunction M(n) {\n  var e, t, o = \"\";\n  if (typeof n == \"string\" || typeof n == \"number\") o += n;\n  else if (typeof n == \"object\") if (Array.isArray(n)) {\n    var r = n.length;\n    for (e = 0; e < r; e++) n[e] && (t = M(n[e])) && (o && (o += \" \"), o += t);\n  } else for (t in n) n[t] && (o && (o += \" \"), o += t);\n  return o;\n}\nfunction F() {\n  for (var n, e, t = 0, o = \"\", r = arguments.length; t < r; t++) (n = arguments[t]) && (e = M(n)) && (o && (o += \" \"), o += e);\n  return o;\n}\nfunction I(...n) {\n  return (...e) => {\n    for (const t of n)\n      if (typeof t == \"function\")\n        try {\n          t(...e);\n        } catch (o) {\n          console.error(o);\n        }\n  };\n}\nfunction L(...n) {\n  const e = { ...n[0] };\n  for (let t = 1; t < n.length; t++) {\n    const o = n[t];\n    for (const r in o) {\n      const f = e[r], c = o[r];\n      typeof f == \"function\" && typeof c == \"function\" && // This is a lot faster than a regex.\n      r[0] === \"o\" && r[1] === \"n\" && r.charCodeAt(2) >= /* 'A' */\n      65 && r.charCodeAt(2) <= /* 'Z' */\n      90 ? e[r] = I(f, c) : (r === \"className\" || r === \"UNSAFE_className\") && typeof f == \"string\" && typeof c == \"string\" ? e[r] = F(f, c) : e[r] = c !== void 0 ? c : f;\n    }\n  }\n  return e;\n}\nfunction J(n) {\n  return n !== void 0;\n}\nfunction G(...n) {\n  return L(...n.filter(J));\n}\nfunction H(n, e, t) {\n  return i.Children.map(n, (o) => i.isValidElement(o) && i.Children.only(n) ? (o.props.className && (e ?? (e = {}), e.className = F(o.props.className, e.className), e.style = { ...o.props.style, ...e.style }), i.cloneElement(o, { ...e, key: t })) : o);\n}\nfunction Q(n) {\n  if (typeof window < \"u\" && typeof process < \"u\" && // eslint-disable-next-line turbo/no-undeclared-env-vars\n  (process?.env?.NODE_ENV === \"dev\" || // eslint-disable-next-line turbo/no-undeclared-env-vars\n  process?.env?.NODE_ENV === \"development\")) {\n    const e = document.querySelector(\".lk-room-container\");\n    e && !getComputedStyle(e).getPropertyValue(\"--lk-has-imported-styles\") && l.warn(\n      \"It looks like you're not using the `@livekit/components-styles package`. To render the UI with the default styling, please import it in your layout or page.\"\n    );\n  }\n}\nfunction T(n, e) {\n  return n === \"processor\" && e && typeof e == \"object\" && \"name\" in e ? e.name : (n === \"e2ee\" || n === \"encryption\") && e ? \"e2ee-enabled\" : e;\n}\nconst q = {\n  connect: !0,\n  audio: !1,\n  video: !1\n};\nfunction $(n) {\n  const {\n    token: e,\n    serverUrl: t,\n    options: o,\n    room: r,\n    connectOptions: f,\n    connect: c,\n    audio: p,\n    video: y,\n    screen: g,\n    onConnected: b,\n    onDisconnected: C,\n    onError: m,\n    onMediaDeviceFailure: R,\n    onEncryptionError: w,\n    simulateParticipants: E,\n    ...N\n  } = { ...q, ...n };\n  o && r && l.warn(\n    \"when using a manually created room, the options object will be ignored. set the desired options directly when creating the room instead.\"\n  );\n  const [s, A] = i.useState(), h = i.useRef(c);\n  i.useEffect(() => {\n    A(r ?? new U(o));\n  }, [r, JSON.stringify(o, T)]);\n  const O = i.useMemo(() => {\n    const { className: d } = x();\n    return L(N, { className: d });\n  }, [N]);\n  return i.useEffect(() => {\n    if (!s) return;\n    const d = () => {\n      const u = s.localParticipant;\n      l.debug(\"trying to publish local tracks\"), Promise.all([\n        u.setMicrophoneEnabled(!!p, typeof p != \"boolean\" ? p : void 0),\n        u.setCameraEnabled(!!y, typeof y != \"boolean\" ? y : void 0),\n        u.setScreenShareEnabled(!!g, typeof g != \"boolean\" ? g : void 0)\n      ]).catch((v) => {\n        l.warn(v), m?.(v);\n      });\n    }, P = (u, v) => {\n      const K = _.getFailure(u);\n      R?.(K, v);\n    }, S = (u) => {\n      w?.(u);\n    }, k = (u) => {\n      C?.(u);\n    }, D = () => {\n      b?.();\n    };\n    return s.on(a.SignalConnected, d).on(a.MediaDevicesError, P).on(a.EncryptionError, S).on(a.Disconnected, k).on(a.Connected, D), () => {\n      s.off(a.SignalConnected, d).off(a.MediaDevicesError, P).off(a.EncryptionError, S).off(a.Disconnected, k).off(a.Connected, D);\n    };\n  }, [\n    s,\n    p,\n    y,\n    g,\n    m,\n    w,\n    R,\n    b,\n    C\n  ]), i.useEffect(() => {\n    if (s) {\n      if (E) {\n        s.simulateParticipants({\n          participants: {\n            count: E\n          },\n          publish: {\n            audio: !0,\n            useRealTracks: !0\n          }\n        });\n        return;\n      }\n      if (c) {\n        if (h.current = !0, l.debug(\"connecting\"), !e) {\n          l.debug(\"no token yet\");\n          return;\n        }\n        if (!t) {\n          l.warn(\"no livekit url provided\"), m?.(Error(\"no livekit url provided\"));\n          return;\n        }\n        s.connect(t, e, f).catch((d) => {\n          l.warn(d), h.current === !0 && m?.(d);\n        });\n      } else\n        l.debug(\"disconnecting because connect is false\"), h.current = !1, s.disconnect();\n    }\n  }, [\n    c,\n    e,\n    JSON.stringify(f),\n    s,\n    m,\n    t,\n    E\n  ]), i.useEffect(() => {\n    if (s)\n      return () => {\n        l.info(\"disconnecting on onmount\"), s.disconnect();\n      };\n  }, [s]), { room: s, htmlProps: O };\n}\nconst W = /* @__PURE__ */ i.forwardRef(function(e, t) {\n  const { room: o, htmlProps: r } = $(e);\n  return /* @__PURE__ */ i.createElement(\"div\", { ref: t, ...r }, o && /* @__PURE__ */ i.createElement(V.Provider, { value: o }, /* @__PURE__ */ i.createElement(j.Provider, { value: e.featureFlags }, e.children)));\n});\nexport {\n  W as L,\n  G as a,\n  H as c,\n  L as m,\n  T as r,\n  $ as u,\n  Q as w\n};\n//# sourceMappingURL=room-BC_ml4G1.mjs.map\n","import * as r from \"react\";\nimport { useRef as pe, useMemo as qe, useCallback as se, useEffect as We } from \"react\";\nimport { u as U, r as $e, a as _e, b as Ge, c as X, d as Je, e as Ke, f as de, g as Qe, h as Ye, i as be, j as Xe, k as Ze, m as et, G as tt, n as nt, o as rt, p as ge, q as st, t as ot, v as xe, w as ve, x as Fe, y as at, l as V, z as it, A as ct, B as ye, C as ut, D as lt, E as dt, F as ft, H as pt, I as mt, J as ht, K as bt, M as Me, N as gt, O as vt, P as yt, Q as St, S as Ct, T as kt, U as Et, V as Tt, W as Ue, X as Mt, Y as wt, Z as Pt, _ as Rt, $ as Lt, a0 as At, a1 as Ot, a2 as It, a3 as Dt, a4 as Nt, a5 as _t, a6 as xt, a7 as he, a8 as G, a9 as Ft, aa as Ut, ab as zt, ac as Ht, ad as ze } from \"./contexts-BtSGUJjc.mjs\";\nimport { m as J } from \"./room-BC_ml4G1.mjs\";\nimport { ConnectionState as I, LocalTrackPublication as Vt, facingModeFromLocalTrack as jt, Room as He, Track as P, createAudioAnalyser as Se, ParticipantKind as ue, Mutex as Bt, RoomEvent as H, ParticipantEvent as ie, ExternalE2EEKeyProvider as qt, decodeTokenPayload as Wt, TokenSourceConfigurable as $t, RpcError as te, serializers as we, isSerializer as Gt } from \"livekit-client\";\nconst Jt = (e) => {\n  const n = r.useRef(e);\n  return r.useEffect(() => {\n    n.current = e;\n  }), n;\n};\nfunction Kt(e, n) {\n  const t = Yt(), o = Jt(n);\n  return r.useLayoutEffect(() => {\n    let s = !1;\n    const a = e.current;\n    if (!a) return;\n    function i(u, l) {\n      s || o.current(u, l);\n    }\n    return t?.subscribe(a, i), () => {\n      s = !0, t?.unsubscribe(a, i);\n    };\n  }, [e.current, t, o]), t?.observer;\n}\nfunction Qt() {\n  let e = !1, n = [];\n  const t = /* @__PURE__ */ new Map();\n  if (typeof window > \"u\")\n    return;\n  const o = new ResizeObserver((s, a) => {\n    n = n.concat(s), e || window.requestAnimationFrame(() => {\n      const i = /* @__PURE__ */ new Set();\n      for (let u = 0; u < n.length; u++) {\n        if (i.has(n[u].target)) continue;\n        i.add(n[u].target), t.get(n[u].target)?.forEach((h) => h(n[u], a));\n      }\n      n = [], e = !1;\n    }), e = !0;\n  });\n  return {\n    observer: o,\n    subscribe(s, a) {\n      o.observe(s);\n      const i = t.get(s) ?? [];\n      i.push(a), t.set(s, i);\n    },\n    unsubscribe(s, a) {\n      const i = t.get(s) ?? [];\n      if (i.length === 1) {\n        o.unobserve(s), t.delete(s);\n        return;\n      }\n      const u = i.indexOf(a);\n      u !== -1 && i.splice(u, 1), t.set(s, i);\n    }\n  };\n}\nlet me;\nconst Yt = () => me || (me = Qt()), Xt = (e) => {\n  const [n, t] = r.useState({ width: 0, height: 0 });\n  r.useLayoutEffect(() => {\n    if (e.current) {\n      const { width: s, height: a } = e.current.getBoundingClientRect();\n      t({ width: s, height: a });\n    }\n  }, [e.current]);\n  const o = r.useCallback(\n    (s) => t(s.contentRect),\n    []\n  );\n  return Kt(e, o), n;\n};\nfunction A(e, n, t = !0) {\n  const [o, s] = r.useState(n);\n  return r.useEffect(() => {\n    if (t && s(n), typeof window > \"u\" || !e) return;\n    const a = e.subscribe(s);\n    return () => a.unsubscribe();\n  }, [e, t]), o;\n}\nfunction Un(e) {\n  const n = (a) => typeof window < \"u\" ? window.matchMedia(a).matches : !1, [t, o] = r.useState(n(e));\n  function s() {\n    o(n(e));\n  }\n  return r.useEffect(() => {\n    const a = window.matchMedia(e);\n    return s(), a.addListener ? a.addListener(s) : a.addEventListener(\"change\", s), () => {\n      a.removeListener ? a.removeListener(s) : a.removeEventListener(\"change\", s);\n    };\n  }, [e]), t;\n}\nfunction zn(e) {\n  const n = U(e), t = r.useCallback(async () => {\n    await n.startAudio();\n  }, [n]), o = r.useMemo(\n    () => $e(n),\n    [n]\n  ), { canPlayAudio: s } = A(o, {\n    canPlayAudio: n.canPlaybackAudio\n  });\n  return { canPlayAudio: s, startAudio: t };\n}\nfunction Hn(e) {\n  const { state: n, dispatch: t } = _e().pin;\n  return { buttonProps: r.useMemo(() => {\n    const { className: s } = Ge();\n    return J(e, {\n      className: s,\n      disabled: !n?.length,\n      onClick: () => {\n        t && t({ msg: \"clear_pin\" });\n      }\n    });\n  }, [e, t, n]) };\n}\nfunction Vn(e = {}) {\n  const n = X(e.participant), { className: t, connectionQualityObserver: o } = r.useMemo(\n    () => Je(n),\n    [n]\n  ), s = A(o, n.connectionQuality);\n  return { className: t, quality: s };\n}\nfunction oe(e) {\n  const n = U(e), t = r.useMemo(() => Ke(n), [n]);\n  return A(t, n.state);\n}\nfunction jn(e, n) {\n  const t = typeof e == \"function\" ? e : n, o = typeof e == \"string\" ? e : void 0, s = de(), { send: a, messageObservable: i, isSendingObservable: u } = r.useMemo(\n    () => Qe(s, o, t),\n    [s, o, t]\n  ), l = A(i, void 0), h = A(u, !1);\n  return {\n    message: l,\n    send: a,\n    isSending: h\n  };\n}\nfunction Bn(e) {\n  const n = de(), t = oe(n);\n  return { buttonProps: r.useMemo(() => {\n    const { className: s, disconnect: a } = Ye(n);\n    return J(e, {\n      className: s,\n      onClick: () => a(e.stopTracks ?? !0),\n      disabled: t === I.Disconnected\n    });\n  }, [n, e, t]) };\n}\nfunction Zt(e) {\n  if (e.publication instanceof Vt) {\n    const n = e.publication.track;\n    if (n) {\n      const { facingMode: t } = jt(n);\n      return t;\n    }\n  }\n  return \"undefined\";\n}\nfunction qn({ trackRef: e, props: n }) {\n  const t = be(e), o = Xe(), { className: s } = r.useMemo(() => Ze(), []), a = r.useMemo(() => et(t, o?.pin.state), [t, o?.pin.state]);\n  return { mergedProps: r.useMemo(\n    () => J(n, {\n      className: s,\n      onClick: (u) => {\n        n.onClick?.(u), a ? o?.pin.dispatch?.({\n          msg: \"clear_pin\"\n        }) : o?.pin.dispatch?.({\n          msg: \"set_pin\",\n          trackReference: t\n        });\n      }\n    }),\n    [n, s, t, a, o?.pin]\n  ), inFocus: a };\n}\nfunction Wn(e, n, t = {}) {\n  const o = t.gridLayouts ?? tt, { width: s, height: a } = Xt(e), i = nt(o, n, s, a);\n  return r.useEffect(() => {\n    e.current && i && (e.current.style.setProperty(\"--lk-col-count\", i?.columns.toString()), e.current.style.setProperty(\"--lk-row-count\", i?.rows.toString()));\n  }, [e, i]), {\n    layout: i,\n    containerWidth: s,\n    containerHeight: a\n  };\n}\nfunction Pe(e, n = {}) {\n  const t = typeof e == \"string\" ? n.participant : e.participant, o = X(t), s = typeof e == \"string\" ? { participant: o, source: e } : e, [a, i] = r.useState(\n    !!(s.publication?.isMuted || o.getTrackPublication(s.source)?.isMuted)\n  );\n  return r.useEffect(() => {\n    const u = rt(s).subscribe(i);\n    return () => u.unsubscribe();\n  }, [ge(s)]), a;\n}\nfunction en(e) {\n  const n = X(e), t = r.useMemo(() => st(n), [n]);\n  return A(t, n.isSpeaking);\n}\nfunction Ve(e = {}) {\n  const n = U(e.room), [t, o] = r.useState(n.localParticipant), [s, a] = r.useState(\n    t.isMicrophoneEnabled\n  ), [i, u] = r.useState(t.isCameraEnabled), [l, h] = r.useState(\n    t.isScreenShareEnabled\n  ), [m, d] = r.useState(\n    t.lastMicrophoneError\n  ), [c, g] = r.useState(t.lastCameraError), [k, M] = r.useState(\n    void 0\n  ), [T, w] = r.useState(void 0), O = (L) => {\n    u(L.isCameraEnabled), a(L.isMicrophoneEnabled), h(L.isScreenShareEnabled), w(L.cameraTrack), M(L.microphoneTrack), d(L.participant.lastMicrophoneError), g(L.participant.lastCameraError), o(L.participant);\n  };\n  return r.useEffect(() => {\n    const L = ot(n.localParticipant).subscribe(O);\n    return () => L.unsubscribe();\n  }, [n]), {\n    isMicrophoneEnabled: s,\n    isScreenShareEnabled: l,\n    isCameraEnabled: i,\n    microphoneTrack: k,\n    cameraTrack: T,\n    lastMicrophoneError: m,\n    lastCameraError: c,\n    localParticipant: t\n  };\n}\nfunction $n() {\n  const e = de(), n = r.useMemo(\n    () => xe(e.localParticipant),\n    [e]\n  );\n  return A(n, e.localParticipant.permissions);\n}\nfunction Gn({\n  kind: e,\n  room: n,\n  track: t,\n  requestPermissions: o,\n  onError: s\n}) {\n  const a = ve(), i = r.useMemo(() => n ?? a ?? new He(), [n, a]), u = r.useMemo(\n    () => Fe(e, s, o),\n    [e, o, s]\n  ), l = A(u, []), [h, m] = r.useState(\n    i?.getActiveDevice(e) ?? \"default\"\n  ), { className: d, activeDeviceObservable: c, setActiveMediaDevice: g } = r.useMemo(\n    () => at(e, i, t),\n    [e, i, t]\n  );\n  return r.useEffect(() => {\n    const k = c.subscribe((M) => {\n      M && (V.info(\"setCurrentDeviceId\", M), m(M));\n    });\n    return () => {\n      k?.unsubscribe();\n    };\n  }, [c]), { devices: l, className: d, activeDeviceId: h, setActiveMediaDevice: g };\n}\nfunction Jn({\n  kind: e,\n  onError: n\n}) {\n  const t = r.useMemo(\n    () => Fe(e, n),\n    [e, n]\n  );\n  return A(t, []);\n}\nfunction tn(e, n, t = {}) {\n  const o = r.useRef([]), s = r.useRef(-1), a = n !== s.current, i = typeof t.customSortFunction == \"function\" ? t.customSortFunction(e) : it(e);\n  let u = [...i];\n  if (a === !1)\n    try {\n      u = ct(o.current, i, n);\n    } catch (l) {\n      V.error(\"Error while running updatePages(): \", l);\n    }\n  return a ? o.current = i : o.current = u, s.current = n, u;\n}\nfunction Kn(e, n) {\n  const [t, o] = r.useState(1), s = Math.max(Math.ceil(n.length / e), 1);\n  t > s && o(s);\n  const a = t * e, i = a - e, u = (d) => {\n    o((c) => d === \"next\" ? c === s ? c : c + 1 : c === 1 ? c : c - 1);\n  }, l = (d) => {\n    d > s ? o(s) : d < 1 ? o(1) : o(d);\n  }, m = tn(n, e).slice(i, a);\n  return {\n    totalPageCount: s,\n    nextPage: () => u(\"next\"),\n    prevPage: () => u(\"previous\"),\n    setPage: l,\n    firstItemIndex: i,\n    lastItemIndex: a,\n    tracks: m,\n    currentPage: t\n  };\n}\nfunction nn(e = {}) {\n  let n = ye();\n  e.participant && (n = e.participant);\n  const t = r.useMemo(() => ut(n), [n]), { identity: o, name: s, metadata: a } = A(t, {\n    name: n?.name,\n    identity: n?.identity,\n    metadata: n?.metadata\n  });\n  return { identity: o, name: s, metadata: a };\n}\nfunction Qn(e = {}) {\n  const n = X(e.participant), t = r.useMemo(() => xe(n), [n]);\n  return A(t, n.permissions);\n}\nfunction Yn({\n  trackRef: e,\n  onParticipantClick: n,\n  disableSpeakingIndicator: t,\n  htmlProps: o\n}) {\n  const s = be(e), a = r.useMemo(() => {\n    const { className: c } = lt();\n    return J(o, {\n      className: c,\n      onClick: (g) => {\n        if (o.onClick?.(g), typeof n == \"function\") {\n          const k = s.publication ?? s.participant.getTrackPublication(s.source);\n          n({ participant: s.participant, track: k });\n        }\n      }\n    });\n  }, [\n    o,\n    n,\n    s.publication,\n    s.source,\n    s.participant\n  ]), i = s.participant.getTrackPublication(P.Source.Microphone), u = r.useMemo(() => ({\n    participant: s.participant,\n    source: P.Source.Microphone,\n    publication: i\n  }), [i, s.participant]), l = Pe(s), h = Pe(u), m = en(s.participant), d = Zt(s);\n  return {\n    elementProps: {\n      \"data-lk-audio-muted\": h,\n      \"data-lk-video-muted\": l,\n      \"data-lk-speaking\": t === !0 ? !1 : m,\n      \"data-lk-local-participant\": s.participant.isLocal,\n      \"data-lk-source\": s.source,\n      \"data-lk-facing-mode\": d,\n      ...a\n    }\n  };\n}\nfunction Ce(e = {}) {\n  const n = U(e.room), [t, o] = r.useState([]);\n  return r.useEffect(() => {\n    const s = dt(n, {\n      additionalRoomEvents: e.updateOnlyOn\n    }).subscribe(o);\n    return () => s.unsubscribe();\n  }, [n, JSON.stringify(e.updateOnlyOn)]), t;\n}\nfunction rn(e = {}) {\n  const n = Ce(e), { localParticipant: t } = Ve(e);\n  return r.useMemo(\n    () => [t, ...n],\n    [t, n]\n  );\n}\nfunction Xn(e) {\n  return e = ft(e), r.useMemo(() => e?.pin.state !== void 0 && e.pin.state.length >= 1 ? e.pin.state : [], [e.pin.state]);\n}\nfunction Zn(e, n = {}) {\n  const t = de(), [o] = r.useState(n.updateOnlyOn), s = r.useMemo(() => typeof e == \"string\" ? pt(t, e, {\n    additionalEvents: o\n  }) : mt(t, e, {\n    additionalEvents: o\n  }), [t, JSON.stringify(e), o]), [a, i] = r.useState({\n    p: void 0\n  });\n  return r.useEffect(() => {\n    const u = s.subscribe((l) => i({ p: l }));\n    return () => u.unsubscribe();\n  }, [s]), a.p;\n}\nfunction er(e = {}) {\n  const n = U(e.room), t = r.useMemo(() => ht(n), [n]), { name: o, metadata: s } = A(t, {\n    name: n.name,\n    metadata: n.metadata\n  });\n  return { name: o, metadata: s };\n}\nfunction sn(e) {\n  const n = U(e?.room), t = r.useMemo(() => bt(n), [n]);\n  return A(t, n.activeSpeakers);\n}\nfunction tr(e) {\n  const [n, t] = r.useState(\n    Me(e)\n  ), o = sn();\n  return r.useEffect(() => {\n    t(Me(e));\n  }, [o, e]), n;\n}\nfunction nr({ room: e, props: n }) {\n  const t = U(e), { className: o, roomAudioPlaybackAllowedObservable: s, handleStartAudioPlayback: a } = r.useMemo(\n    () => gt(),\n    []\n  ), i = r.useMemo(\n    () => s(t),\n    [t, s]\n  ), { canPlayAudio: u } = A(i, {\n    canPlayAudio: t.canPlaybackAudio\n  });\n  return { mergedProps: r.useMemo(\n    () => J(n, {\n      className: o,\n      onClick: () => {\n        a(t);\n      },\n      style: { display: u ? \"none\" : \"block\" }\n    }),\n    [n, o, u, a, t]\n  ), canPlayAudio: u };\n}\nfunction rr({ room: e, props: n }) {\n  const t = U(e), { className: o, roomVideoPlaybackAllowedObservable: s, handleStartVideoPlayback: a } = r.useMemo(\n    () => vt(),\n    []\n  ), i = r.useMemo(\n    () => s(t),\n    [t, s]\n  ), { canPlayVideo: u } = A(i, {\n    canPlayVideo: t.canPlaybackVideo\n  });\n  return { mergedProps: r.useMemo(\n    () => J(n, {\n      className: o,\n      onClick: () => {\n        a(t);\n      },\n      style: { display: u ? \"none\" : \"block\" }\n    }),\n    [n, o, u, a, t]\n  ), canPlayVideo: u };\n}\nfunction sr(e, n = {}) {\n  const t = r.useRef(null), o = r.useRef(null), s = n.minSwipeDistance ?? 50, a = (l) => {\n    o.current = null, t.current = l.targetTouches[0].clientX;\n  }, i = (l) => {\n    o.current = l.targetTouches[0].clientX;\n  }, u = r.useCallback(() => {\n    if (!t.current || !o.current)\n      return;\n    const l = t.current - o.current, h = l > s, m = l < -s;\n    h && n.onLeftSwipe && n.onLeftSwipe(), m && n.onRightSwipe && n.onRightSwipe();\n  }, [s, n]);\n  r.useEffect(() => {\n    const l = e.current;\n    return l && (l.addEventListener(\"touchstart\", a, { passive: !0 }), l.addEventListener(\"touchmove\", i, { passive: !0 }), l.addEventListener(\"touchend\", u, { passive: !0 })), () => {\n      l && (l.removeEventListener(\"touchstart\", a), l.removeEventListener(\"touchmove\", i), l.removeEventListener(\"touchend\", u));\n    };\n  }, [e, u]);\n}\nfunction or({ props: e }) {\n  const { dispatch: n, state: t } = _e().widget, { className: o } = r.useMemo(() => yt(), []);\n  return { mergedProps: r.useMemo(() => J(e, {\n    className: o,\n    onClick: () => {\n      n && n({ msg: \"toggle_chat\" });\n    },\n    \"aria-pressed\": t?.showChat ? \"true\" : \"false\",\n    \"data-lk-unread-msgs\": t ? t.unreadMessages < 10 ? t.unreadMessages.toFixed(0) : \"9+\" : \"0\"\n  }), [e, o, n, t]) };\n}\nfunction ar(e, n, t = {}) {\n  const [o, s] = r.useState(void 0);\n  return r.useEffect(() => {\n    if (e === void 0)\n      throw Error(\"token endpoint needs to be defined\");\n    if (t.userInfo?.identity === void 0)\n      return;\n    (async () => {\n      V.debug(\"fetching token\");\n      const i = new URLSearchParams({ ...t.userInfo, roomName: n }), u = await fetch(`${e}?${i.toString()}`);\n      if (!u.ok) {\n        V.error(\n          `Could not fetch token. Server responded with status ${u.status}: ${u.statusText}`\n        );\n        return;\n      }\n      const { accessToken: l } = await u.json();\n      s(l);\n    })();\n  }, [e, n, JSON.stringify(t)]), o;\n}\nfunction ir(e) {\n  const n = be(e), { className: t, mediaMutedObserver: o } = r.useMemo(\n    () => St(n),\n    [ge(n)]\n  );\n  return { isMuted: A(\n    o,\n    !!(n.publication?.isMuted || n.participant.getTrackPublication(n.source)?.isMuted)\n  ), className: t };\n}\nfunction cr({\n  source: e,\n  onChange: n,\n  initialState: t,\n  captureOptions: o,\n  publishOptions: s,\n  onDeviceError: a,\n  room: i,\n  ...u\n}) {\n  const l = ve(), h = r.useMemo(() => i ?? l, [i, l]), m = h?.localParticipant?.getTrackPublication(e), d = r.useRef(!1), { toggle: c, className: g, pendingObserver: k, enabledObserver: M } = r.useMemo(\n    () => h ? Ct(e, h, o, s, a) : kt(),\n    [h, e, JSON.stringify(o), s]\n  ), T = A(k, !1), w = A(M, t ?? !!m?.isEnabled);\n  r.useEffect(() => {\n    n?.(w, d.current), d.current = !1;\n  }, [w, n]), r.useEffect(() => {\n    t !== void 0 && (V.debug(\"forcing initial toggle state\", e, t), c(t));\n  }, []);\n  const O = r.useMemo(() => J(u, { className: g }), [u, g]), L = r.useCallback(\n    (p) => {\n      d.current = !0, c().catch(() => d.current = !1), u.onClick?.(p);\n    },\n    [u, c]\n  );\n  return {\n    toggle: c,\n    enabled: w,\n    pending: T,\n    track: m,\n    buttonProps: {\n      ...O,\n      \"aria-pressed\": w,\n      \"data-lk-source\": e,\n      \"data-lk-enabled\": w,\n      disabled: T,\n      onClick: L\n    }\n  };\n}\nfunction ur(e = [\n  P.Source.Camera,\n  P.Source.Microphone,\n  P.Source.ScreenShare,\n  P.Source.ScreenShareAudio,\n  P.Source.Unknown\n], n = {}) {\n  const t = U(n.room), [o, s] = r.useState([]), [a, i] = r.useState([]), u = r.useMemo(() => e.map((h) => Et(h) ? h.source : h), [JSON.stringify(e)]);\n  return r.useEffect(() => {\n    const h = Tt(t, u, {\n      additionalRoomEvents: n.updateOnlyOn,\n      onlySubscribed: n.onlySubscribed\n    }).subscribe(({ trackReferences: m, participants: d }) => {\n      V.debug(\"setting track bundles\", m, d), s(m), i(d);\n    });\n    return () => h.unsubscribe();\n  }, [\n    t,\n    JSON.stringify(n.onlySubscribed),\n    JSON.stringify(n.updateOnlyOn),\n    JSON.stringify(e)\n  ]), r.useMemo(() => {\n    if (Ue(e)) {\n      const h = an(e, a), m = Array.from(o);\n      return a.forEach((d) => {\n        h.has(d.identity) && (h.get(d.identity) ?? []).forEach((g) => {\n          if (o.find(\n            ({ participant: M, publication: T }) => d.identity === M.identity && T.source === g\n          ))\n            return;\n          V.debug(\n            `Add ${g} placeholder for participant ${d.identity}.`\n          );\n          const k = {\n            participant: d,\n            source: g\n          };\n          m.push(k);\n        });\n      }), m;\n    } else\n      return o;\n  }, [o, a, e]);\n}\nfunction on(e, n) {\n  const t = new Set(e);\n  for (const o of n)\n    t.delete(o);\n  return t;\n}\nfunction an(e, n) {\n  const t = /* @__PURE__ */ new Map();\n  if (Ue(e)) {\n    const o = e.filter((s) => s.withPlaceholder).map((s) => s.source);\n    n.forEach((s) => {\n      const a = s.getTrackPublications().map((u) => u.track?.source).filter((u) => u !== void 0), i = Array.from(\n        on(new Set(o), new Set(a))\n      );\n      i.length > 0 && t.set(s.identity, i);\n    });\n  }\n  return t;\n}\nfunction cn(e) {\n  const [n, t] = r.useState(Mt(e)), { trackObserver: o } = r.useMemo(() => wt(e), [e.participant.sid ?? e.participant.identity, e.source]);\n  return r.useEffect(() => {\n    const s = o.subscribe((a) => {\n      t(a);\n    });\n    return () => s?.unsubscribe();\n  }, [o]), {\n    participant: e.participant,\n    source: e.source ?? P.Source.Unknown,\n    publication: n\n  };\n}\nfunction lr(e, n) {\n  const t = X(n);\n  return cn({ name: e, participant: t });\n}\nfunction un(e) {\n  const n = U(e?.room), t = oe(n), o = r.useMemo(\n    () => t === I.Disconnected,\n    [t]\n  ), s = r.useMemo(\n    () => Pt(n, e),\n    [n, e, o]\n  ), a = A(s.isSendingObservable, !1), i = A(s.messageObservable, []);\n  return { send: s.send, chatMessages: i, isSending: a };\n}\nfunction dr(e = {}) {\n  const [n, t] = r.useState(\n    Rt(e.defaults, e.preventLoad ?? !1)\n  ), o = r.useCallback((l) => {\n    t((h) => ({ ...h, audioEnabled: l }));\n  }, []), s = r.useCallback((l) => {\n    t((h) => ({ ...h, videoEnabled: l }));\n  }, []), a = r.useCallback((l) => {\n    t((h) => ({ ...h, audioDeviceId: l }));\n  }, []), i = r.useCallback((l) => {\n    t((h) => ({ ...h, videoDeviceId: l }));\n  }, []), u = r.useCallback((l) => {\n    t((h) => ({ ...h, username: l }));\n  }, []);\n  return r.useEffect(() => {\n    Lt(n, e.preventSave ?? !1);\n  }, [n, e.preventSave]), {\n    userChoices: n,\n    saveAudioInputEnabled: o,\n    saveVideoInputEnabled: s,\n    saveAudioInputDeviceId: a,\n    saveVideoInputDeviceId: i,\n    saveUsername: u\n  };\n}\nfunction fr(e, n = {}) {\n  const t = X(e), o = U(n.room), s = r.useMemo(() => At(o, t), [o, t]);\n  return A(\n    s,\n    t.isLocal ? t.isE2EEEnabled : !!t?.isEncrypted\n  );\n}\nfunction pr(e, n = { fftSize: 32, smoothingTimeConstant: 0 }) {\n  const t = Ot(e) ? e.publication.track : e, [o, s] = r.useState(0);\n  return r.useEffect(() => {\n    if (!t || !t.mediaStream)\n      return;\n    const { cleanup: a, analyser: i } = Se(t, n), u = i.frequencyBinCount, l = new Uint8Array(u), m = setInterval(() => {\n      i.getByteFrequencyData(l);\n      let d = 0;\n      for (let c = 0; c < l.length; c++) {\n        const g = l[c];\n        d += g * g;\n      }\n      s(Math.sqrt(d / l.length) / 255);\n    }, 1e3 / 30);\n    return () => {\n      a(), clearInterval(m);\n    };\n  }, [t, t?.mediaStream, JSON.stringify(n)]), o;\n}\nconst ln = (e) => {\n  const n = (t) => {\n    let a = 1 - Math.max(-100, Math.min(-10, t)) * -1 / 100;\n    return a = Math.sqrt(a), a;\n  };\n  return e.map((t) => t === -1 / 0 ? 0 : n(t));\n}, dn = {\n  bands: 5,\n  loPass: 100,\n  hiPass: 600,\n  updateInterval: 32,\n  analyserOptions: { fftSize: 2048 }\n};\nfunction mr(e, n = {}) {\n  const t = e instanceof P ? e : e?.publication?.track, o = { ...dn, ...n }, [s, a] = r.useState(\n    new Array(o.bands).fill(0)\n  );\n  return r.useEffect(() => {\n    if (!t || !t?.mediaStream) {\n      a((c) => c.slice().fill(0));\n      return;\n    }\n    const { analyser: i, cleanup: u } = Se(t, o.analyserOptions), l = i.frequencyBinCount, h = new Float32Array(l), d = setInterval(() => {\n      i.getFloatFrequencyData(h);\n      let c = new Float32Array(h.length);\n      for (let T = 0; T < h.length; T++)\n        c[T] = h[T];\n      c = c.slice(o.loPass, o.hiPass);\n      const g = ln(c), k = g.length, M = [];\n      for (let T = 0; T < o.bands; T++) {\n        const w = Math.floor(T * k / o.bands), O = Math.floor((T + 1) * k / o.bands), L = g.slice(w, O), p = L.length;\n        if (p === 0)\n          M.push(0);\n        else {\n          const f = L.reduce((b, v) => b += v, 0);\n          M.push(f / p);\n        }\n      }\n      a(M);\n    }, o.updateInterval);\n    return () => {\n      u(), clearInterval(d);\n    };\n  }, [t, t?.mediaStream, JSON.stringify(n)]), s;\n}\nconst fn = {\n  barCount: 120,\n  volMultiplier: 5,\n  updateInterval: 20\n};\nfunction hr(e, n = {}) {\n  const t = e instanceof P ? e : e?.publication?.track, o = { ...fn, ...n }, s = r.useRef(new Float32Array()), a = r.useRef(performance.now()), i = r.useRef(0), [u, l] = r.useState([]), h = r.useCallback((m) => {\n    l(\n      Array.from(\n        mn(m, o.barCount).map((d) => Math.sqrt(d) * o.volMultiplier)\n        // wave.slice(0, opts.barCount).map((v) => sigmoid(v * opts.volMultiplier, 0.08, 0.2)),\n      )\n    );\n  }, []);\n  return r.useEffect(() => {\n    if (!t || !t?.mediaStream)\n      return;\n    const { analyser: m, cleanup: d } = Se(t, {\n      fftSize: Re(o.barCount)\n    }), c = Re(o.barCount), g = new Float32Array(c), k = () => {\n      if (M = requestAnimationFrame(k), m.getFloatTimeDomainData(g), s.current.map((T, w) => T + g[w]), i.current += 1, performance.now() - a.current >= o.updateInterval) {\n        const T = g.map((w) => w / i.current);\n        h(T), a.current = performance.now(), i.current = 0;\n      }\n    };\n    let M = requestAnimationFrame(k);\n    return () => {\n      d(), cancelAnimationFrame(M);\n    };\n  }, [t, t?.mediaStream, JSON.stringify(n), h]), {\n    bars: u\n  };\n}\nfunction Re(e) {\n  return e < 32 ? 32 : pn(e);\n}\nfunction pn(e) {\n  let n = 2;\n  for (; e >>= 1; )\n    n <<= 1;\n  return n;\n}\nfunction mn(e, n) {\n  const t = Math.floor(e.length / n), o = new Float32Array(n);\n  for (let s = 0; s < n; s++) {\n    const a = t * s;\n    let i = 0;\n    for (let u = 0; u < t; u++)\n      i = i + Math.abs(e[a + u]);\n    o[s] = i / t;\n  }\n  return o;\n}\nfunction le(e, n = {}) {\n  let t, o;\n  typeof n == \"string\" ? t = n : (t = n?.participantIdentity, o = n?.room);\n  const s = ye(), a = rn({ room: o, updateOnlyOn: [] }), i = r.useMemo(() => t ? a.find((h) => h.identity === t) : s, [t, a, s]), u = r.useMemo(() => {\n    if (i)\n      return It(i, { sources: e });\n  }, [i, JSON.stringify(e)]);\n  return A(u, []);\n}\nfunction hn(e) {\n  const n = r.useMemo(\n    () => e?.publication?.track ? Dt(e?.publication.track) : void 0,\n    [e?.publication?.track]\n  );\n  return A(n, {\n    timestamp: Date.now(),\n    rtpTimestamp: e?.publication?.track?.rtpTimestamp\n  });\n}\nconst bn = {\n  bufferSize: 100\n  // maxAge: 2_000,\n};\nfunction gn(e, n) {\n  const t = { ...bn, ...n }, [o, s] = r.useState([]), a = hn(e), i = (u) => {\n    t.onTranscription?.(u), s(\n      (l) => _t(\n        l,\n        // when first receiving a segment, add the current media timestamp to it\n        u.map((h) => xt(h, a)),\n        t.bufferSize\n      )\n    );\n  };\n  return r.useEffect(() => {\n    if (!e?.publication)\n      return;\n    const u = Nt(e.publication).subscribe((l) => {\n      i(...l);\n    });\n    return () => {\n      u.unsubscribe();\n    };\n  }, [e && ge(e), i]), { segments: o };\n}\nfunction vn(e = {}) {\n  const n = ye(), t = e.participant ?? n, o = r.useMemo(\n    // weird typescript constraint\n    () => t ? he(t) : he(t),\n    [t]\n  );\n  return A(o, {\n    attributes: t?.attributes\n  });\n}\nfunction br(e, n = {}) {\n  const t = X(n.participant), [o, s] = r.useState(t.attributes[e]);\n  return r.useEffect(() => {\n    if (!t)\n      return;\n    const a = he(t).subscribe((i) => {\n      i.changed[e] !== void 0 && s(i.attributes[e]);\n    });\n    return () => {\n      a.unsubscribe();\n    };\n  }, [t, e]), o;\n}\nconst Le = G.AgentState;\nfunction gr() {\n  const e = Ce(), n = e.find(\n    (d) => d.kind === ue.AGENT && !(G.PublishOnBehalf in d.attributes)\n  ), t = e.find(\n    (d) => d.kind === ue.AGENT && d.attributes[G.PublishOnBehalf] === n?.identity\n  ), o = le(\n    [P.Source.Microphone, P.Source.Camera],\n    n?.identity\n  ), s = le(\n    [P.Source.Microphone, P.Source.Camera],\n    t?.identity\n  ), a = o.find((d) => d.source === P.Source.Microphone) ?? s.find((d) => d.source === P.Source.Microphone), i = o.find((d) => d.source === P.Source.Camera) ?? s.find((d) => d.source === P.Source.Camera), { segments: u } = gn(a), l = oe(), { attributes: h } = vn({ participant: n }), m = r.useMemo(() => l === I.Disconnected ? \"disconnected\" : l === I.Connecting || !n || !h?.[Le] ? \"connecting\" : h[Le], [h, n, l]);\n  return {\n    agent: n,\n    state: m,\n    audioTrack: a,\n    videoTrack: i,\n    agentTranscriptions: u,\n    agentAttributes: h\n  };\n}\nfunction vr(e) {\n  const n = U(e), t = oe(n), o = r.useMemo(() => Ft(n), [n, t]);\n  return A(o, n.isRecording);\n}\nfunction yn(e, n) {\n  const t = U(n?.room), s = oe(t) === I.Disconnected, a = r.useMemo(() => Ut(t, e), [t, e]);\n  return { textStreams: A(s ? void 0 : a, []) };\n}\nfunction Sn(e) {\n  const { participantIdentities: n, trackSids: t } = e ?? {}, { textStreams: o } = yn(zt.TRANSCRIPTION, { room: e?.room });\n  return r.useMemo(\n    () => o.filter(\n      (a) => n ? n.includes(a.participantInfo.identity) : !0\n    ).filter(\n      (a) => t ? t.includes(\n        a.streamInfo.attributes?.[G.TranscribedTrackId] ?? \"\"\n      ) : !0\n    ),\n    [o, n, t]\n  );\n}\nconst Ae = 2, Oe = 400, Ie = 3, De = 1e3;\nfunction yr(e) {\n  const n = pe([]), t = qe(() => new Bt(), []), o = se(async () => t.lock().then(async (m) => {\n    for (; ; ) {\n      const d = n.current.pop();\n      if (!d) {\n        m();\n        break;\n      }\n      switch (d.type) {\n        case \"connect\":\n          await d.room.connect(...d.args).then(d.resolve).catch(d.reject);\n          break;\n        case \"disconnect\":\n          await d.room.disconnect(...d.args).then(d.resolve).catch(d.reject);\n          break;\n      }\n    }\n  }), []), s = pe([]), a = se((m) => {\n    let d = 0;\n    s.current = s.current.filter((c) => {\n      const g = m.getTime() - c.getTime() < De;\n      return g && (d += 1), g;\n    }), d > Ie && V.warn(\n      `useSequentialRoomConnectDisconnect: room changed reference rapidly (over ${Ie}x in ${De}ms). This is not recommended.`\n    );\n  }, []);\n  We(() => {\n    n.current = [];\n    const m = /* @__PURE__ */ new Date();\n    s.current.push(m), a(m);\n  }, [e, a]);\n  const i = pe([]), u = se((m) => {\n    let d = 0;\n    i.current = i.current.filter((c) => {\n      const g = m.getTime() - c.getTime() < Oe;\n      return g && (d += 1), g;\n    }), d > Ae && V.warn(\n      `useSequentialRoomConnectDisconnect: room connect / disconnect occurring in rapid sequence (over ${Ae}x in ${Oe}ms). This is not recommended and may be the sign of a bug like a useEffect dependency changing every render.`\n    );\n  }, []), l = se(\n    async (...m) => new Promise((d, c) => {\n      if (!e)\n        throw new Error(\"Called connect(), but room was unset\");\n      const g = /* @__PURE__ */ new Date();\n      u(g), n.current.push({ type: \"connect\", room: e, args: m, resolve: d, reject: c }), i.current.push(g), o();\n    }),\n    [e, u, o]\n  ), h = se(\n    async (...m) => new Promise((d, c) => {\n      if (!e)\n        throw new Error(\"Called discconnect(), but room was unset\");\n      const g = /* @__PURE__ */ new Date();\n      u(g), n.current.push({ type: \"disconnect\", room: e, args: m, resolve: d, reject: c }), i.current.push(g), o();\n    }),\n    [e, u, o]\n  );\n  return {\n    connect: e ? l : null,\n    disconnect: e ? h : null\n  };\n}\nvar ce = { exports: {} }, Ne;\nfunction Cn() {\n  if (Ne) return ce.exports;\n  Ne = 1;\n  var e = typeof Reflect == \"object\" ? Reflect : null, n = e && typeof e.apply == \"function\" ? e.apply : function(f, b, v) {\n    return Function.prototype.apply.call(f, b, v);\n  }, t;\n  e && typeof e.ownKeys == \"function\" ? t = e.ownKeys : Object.getOwnPropertySymbols ? t = function(f) {\n    return Object.getOwnPropertyNames(f).concat(Object.getOwnPropertySymbols(f));\n  } : t = function(f) {\n    return Object.getOwnPropertyNames(f);\n  };\n  function o(p) {\n    console && console.warn && console.warn(p);\n  }\n  var s = Number.isNaN || function(f) {\n    return f !== f;\n  };\n  function a() {\n    a.init.call(this);\n  }\n  ce.exports = a, ce.exports.once = w, a.EventEmitter = a, a.prototype._events = void 0, a.prototype._eventsCount = 0, a.prototype._maxListeners = void 0;\n  var i = 10;\n  function u(p) {\n    if (typeof p != \"function\")\n      throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof p);\n  }\n  Object.defineProperty(a, \"defaultMaxListeners\", {\n    enumerable: !0,\n    get: function() {\n      return i;\n    },\n    set: function(p) {\n      if (typeof p != \"number\" || p < 0 || s(p))\n        throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + p + \".\");\n      i = p;\n    }\n  }), a.init = function() {\n    (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) && (this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;\n  }, a.prototype.setMaxListeners = function(f) {\n    if (typeof f != \"number\" || f < 0 || s(f))\n      throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + f + \".\");\n    return this._maxListeners = f, this;\n  };\n  function l(p) {\n    return p._maxListeners === void 0 ? a.defaultMaxListeners : p._maxListeners;\n  }\n  a.prototype.getMaxListeners = function() {\n    return l(this);\n  }, a.prototype.emit = function(f) {\n    for (var b = [], v = 1; v < arguments.length; v++) b.push(arguments[v]);\n    var C = f === \"error\", R = this._events;\n    if (R !== void 0)\n      C = C && R.error === void 0;\n    else if (!C)\n      return !1;\n    if (C) {\n      var y;\n      if (b.length > 0 && (y = b[0]), y instanceof Error)\n        throw y;\n      var N = new Error(\"Unhandled error.\" + (y ? \" (\" + y.message + \")\" : \"\"));\n      throw N.context = y, N;\n    }\n    var x = R[f];\n    if (x === void 0)\n      return !1;\n    if (typeof x == \"function\")\n      n(x, this, b);\n    else\n      for (var j = x.length, z = k(x, j), v = 0; v < j; ++v)\n        n(z[v], this, b);\n    return !0;\n  };\n  function h(p, f, b, v) {\n    var C, R, y;\n    if (u(b), R = p._events, R === void 0 ? (R = p._events = /* @__PURE__ */ Object.create(null), p._eventsCount = 0) : (R.newListener !== void 0 && (p.emit(\n      \"newListener\",\n      f,\n      b.listener ? b.listener : b\n    ), R = p._events), y = R[f]), y === void 0)\n      y = R[f] = b, ++p._eventsCount;\n    else if (typeof y == \"function\" ? y = R[f] = v ? [b, y] : [y, b] : v ? y.unshift(b) : y.push(b), C = l(p), C > 0 && y.length > C && !y.warned) {\n      y.warned = !0;\n      var N = new Error(\"Possible EventEmitter memory leak detected. \" + y.length + \" \" + String(f) + \" listeners added. Use emitter.setMaxListeners() to increase limit\");\n      N.name = \"MaxListenersExceededWarning\", N.emitter = p, N.type = f, N.count = y.length, o(N);\n    }\n    return p;\n  }\n  a.prototype.addListener = function(f, b) {\n    return h(this, f, b, !1);\n  }, a.prototype.on = a.prototype.addListener, a.prototype.prependListener = function(f, b) {\n    return h(this, f, b, !0);\n  };\n  function m() {\n    if (!this.fired)\n      return this.target.removeListener(this.type, this.wrapFn), this.fired = !0, arguments.length === 0 ? this.listener.call(this.target) : this.listener.apply(this.target, arguments);\n  }\n  function d(p, f, b) {\n    var v = { fired: !1, wrapFn: void 0, target: p, type: f, listener: b }, C = m.bind(v);\n    return C.listener = b, v.wrapFn = C, C;\n  }\n  a.prototype.once = function(f, b) {\n    return u(b), this.on(f, d(this, f, b)), this;\n  }, a.prototype.prependOnceListener = function(f, b) {\n    return u(b), this.prependListener(f, d(this, f, b)), this;\n  }, a.prototype.removeListener = function(f, b) {\n    var v, C, R, y, N;\n    if (u(b), C = this._events, C === void 0)\n      return this;\n    if (v = C[f], v === void 0)\n      return this;\n    if (v === b || v.listener === b)\n      --this._eventsCount === 0 ? this._events = /* @__PURE__ */ Object.create(null) : (delete C[f], C.removeListener && this.emit(\"removeListener\", f, v.listener || b));\n    else if (typeof v != \"function\") {\n      for (R = -1, y = v.length - 1; y >= 0; y--)\n        if (v[y] === b || v[y].listener === b) {\n          N = v[y].listener, R = y;\n          break;\n        }\n      if (R < 0)\n        return this;\n      R === 0 ? v.shift() : M(v, R), v.length === 1 && (C[f] = v[0]), C.removeListener !== void 0 && this.emit(\"removeListener\", f, N || b);\n    }\n    return this;\n  }, a.prototype.off = a.prototype.removeListener, a.prototype.removeAllListeners = function(f) {\n    var b, v, C;\n    if (v = this._events, v === void 0)\n      return this;\n    if (v.removeListener === void 0)\n      return arguments.length === 0 ? (this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0) : v[f] !== void 0 && (--this._eventsCount === 0 ? this._events = /* @__PURE__ */ Object.create(null) : delete v[f]), this;\n    if (arguments.length === 0) {\n      var R = Object.keys(v), y;\n      for (C = 0; C < R.length; ++C)\n        y = R[C], y !== \"removeListener\" && this.removeAllListeners(y);\n      return this.removeAllListeners(\"removeListener\"), this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0, this;\n    }\n    if (b = v[f], typeof b == \"function\")\n      this.removeListener(f, b);\n    else if (b !== void 0)\n      for (C = b.length - 1; C >= 0; C--)\n        this.removeListener(f, b[C]);\n    return this;\n  };\n  function c(p, f, b) {\n    var v = p._events;\n    if (v === void 0)\n      return [];\n    var C = v[f];\n    return C === void 0 ? [] : typeof C == \"function\" ? b ? [C.listener || C] : [C] : b ? T(C) : k(C, C.length);\n  }\n  a.prototype.listeners = function(f) {\n    return c(this, f, !0);\n  }, a.prototype.rawListeners = function(f) {\n    return c(this, f, !1);\n  }, a.listenerCount = function(p, f) {\n    return typeof p.listenerCount == \"function\" ? p.listenerCount(f) : g.call(p, f);\n  }, a.prototype.listenerCount = g;\n  function g(p) {\n    var f = this._events;\n    if (f !== void 0) {\n      var b = f[p];\n      if (typeof b == \"function\")\n        return 1;\n      if (b !== void 0)\n        return b.length;\n    }\n    return 0;\n  }\n  a.prototype.eventNames = function() {\n    return this._eventsCount > 0 ? t(this._events) : [];\n  };\n  function k(p, f) {\n    for (var b = new Array(f), v = 0; v < f; ++v)\n      b[v] = p[v];\n    return b;\n  }\n  function M(p, f) {\n    for (; f + 1 < p.length; f++)\n      p[f] = p[f + 1];\n    p.pop();\n  }\n  function T(p) {\n    for (var f = new Array(p.length), b = 0; b < f.length; ++b)\n      f[b] = p[b].listener || p[b];\n    return f;\n  }\n  function w(p, f) {\n    return new Promise(function(b, v) {\n      function C(y) {\n        p.removeListener(f, R), v(y);\n      }\n      function R() {\n        typeof p.removeListener == \"function\" && p.removeListener(\"error\", C), b([].slice.call(arguments));\n      }\n      L(p, f, R, { once: !0 }), f !== \"error\" && O(p, C, { once: !0 });\n    });\n  }\n  function O(p, f, b) {\n    typeof p.on == \"function\" && L(p, \"error\", f, b);\n  }\n  function L(p, f, b, v) {\n    if (typeof p.on == \"function\")\n      v.once ? p.once(f, b) : p.on(f, b);\n    else if (typeof p.addEventListener == \"function\")\n      p.addEventListener(f, function C(R) {\n        v.once && p.removeEventListener(f, C), b(R);\n      });\n    else\n      throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof p);\n  }\n  return ce.exports;\n}\nvar ke = Cn();\nconst kn = 2e4;\nvar En = /* @__PURE__ */ ((e) => (e.CameraChanged = \"cameraChanged\", e.MicrophoneChanged = \"microphoneChanged\", e.StateChanged = \"stateChanged\", e))(En || {});\nconst F = (e) => ({\n  isConnected: e === \"listening\" || e === \"thinking\" || e === \"speaking\",\n  canListen: e === \"pre-connect-buffering\" || e === \"listening\" || e === \"thinking\" || e === \"speaking\",\n  isFinished: e === \"disconnected\" || e === \"failed\",\n  isPending: e === \"connecting\" || e === \"initializing\" || e === \"idle\"\n}), Tn = () => {\n  const [e, n] = r.useState(\n    null\n  ), [t, o] = r.useState(\n    null\n  ), s = r.useRef(\"connecting\"), a = r.useRef(!1), i = (u) => setTimeout(() => {\n    if (!a.current) {\n      n(\"Agent did not join the room.\");\n      return;\n    }\n    const { isConnected: l } = F(s.current);\n    if (!l) {\n      n(\"Agent joined the room but did not complete initializing.\");\n      return;\n    }\n  }, u ?? kn);\n  return {\n    agentTimeoutFailureReason: e,\n    startAgentTimeout: r.useCallback(\n      (u) => {\n        t && clearTimeout(t), n(null), o(i(u)), s.current = \"connecting\", a.current = !1;\n      },\n      [t]\n    ),\n    clearAgentTimeout: r.useCallback(() => {\n      t && clearTimeout(t), n(null), o(null), s.current = \"connecting\", a.current = !1;\n    }, [t]),\n    clearAgentTimeoutFailureReason: r.useCallback(() => {\n      n(null);\n    }, []),\n    updateAgentTimeoutState: r.useCallback((u) => {\n      s.current = u;\n    }, []),\n    updateAgentTimeoutParticipantExists: r.useCallback((u) => {\n      a.current = u;\n    }, [])\n  };\n};\nfunction Mn(e, n) {\n  const t = r.useRef(n);\n  r.useEffect(() => {\n    t.current = n;\n  }, [n]);\n  const o = r.useCallback(\n    async (i) => {\n      const { isConnected: u } = F(t.current);\n      if (!u)\n        return new Promise((l, h) => {\n          const m = (g) => {\n            const { isConnected: k } = F(g);\n            k && (c(), l());\n          }, d = () => {\n            c(), h(new Error(\"useAgent(/* ... */).waitUntilConnected - signal aborted\"));\n          }, c = () => {\n            e.off(\"stateChanged\", m), i?.removeEventListener(\"abort\", d);\n          };\n          e.on(\"stateChanged\", m), i?.addEventListener(\"abort\", d);\n        });\n    },\n    [e]\n  ), s = r.useCallback(\n    async (i) => {\n      const { canListen: u } = F(t.current);\n      if (!u)\n        return new Promise((l, h) => {\n          const m = (g) => {\n            const { canListen: k } = F(g);\n            k && (c(), l());\n          }, d = () => {\n            c(), h(new Error(\"useAgent(/* ... */).waitUntilCouldBeListening - signal aborted\"));\n          }, c = () => {\n            e.off(\"stateChanged\", m), i?.removeEventListener(\"abort\", d);\n          };\n          e.on(\"stateChanged\", m), i?.addEventListener(\"abort\", d);\n        });\n    },\n    [e]\n  ), a = r.useCallback(\n    async (i) => {\n      const { isFinished: u } = F(t.current);\n      if (!u)\n        return new Promise((l, h) => {\n          const m = (g) => {\n            const { isFinished: k } = F(g);\n            k && (c(), l());\n          }, d = () => {\n            c(), h(new Error(\"useAgent(/* ... */).waitUntilFinished - signal aborted\"));\n          }, c = () => {\n            e.off(\"stateChanged\", m), i?.removeEventListener(\"abort\", d);\n          };\n          e.on(\"stateChanged\", m), i?.addEventListener(\"abort\", d);\n        });\n    },\n    [e]\n  );\n  return { waitUntilConnected: o, waitUntilCouldBeListening: s, waitUntilFinished: a };\n}\nfunction je(e) {\n  const n = Ht();\n  if (e = e ?? n, !e)\n    throw new Error(\n      \"No session provided, make sure you are inside a Session context or pass the session explicitly\"\n    );\n  const {\n    room: t,\n    internal: {\n      agentConnectTimeoutMilliseconds: o,\n      agentTimeoutFailureReason: s,\n      startAgentTimeout: a,\n      clearAgentTimeout: i,\n      clearAgentTimeoutFailureReason: u,\n      updateAgentTimeoutState: l,\n      updateAgentTimeoutParticipantExists: h\n    }\n  } = e, m = r.useMemo(() => new ke.EventEmitter(), []), d = Ce({ room: t }), c = r.useMemo(() => d.find(\n    (S) => S.kind === ue.AGENT && !(G.PublishOnBehalf in S.attributes)\n  ) ?? null, [d]), g = r.useMemo(() => c ? d.find(\n    (S) => S.kind === ue.AGENT && S.attributes[G.PublishOnBehalf] === c.identity\n  ) ?? null : null, [c, d]), k = c?.attributes ?? {}, M = le([P.Source.Camera, P.Source.Microphone], {\n    room: t,\n    participantIdentity: c?.identity\n  }), T = le([P.Source.Camera, P.Source.Microphone], {\n    room: t,\n    participantIdentity: g?.identity\n  }), w = r.useMemo(\n    () => M.find((S) => S.source === P.Source.Camera) ?? T.find((S) => S.source === P.Source.Camera),\n    [M, T]\n  );\n  r.useEffect(() => {\n    m.emit(\"cameraChanged\", w);\n  }, [m, w]);\n  const O = r.useMemo(\n    () => M.find((S) => S.source === P.Source.Microphone) ?? T.find((S) => S.source === P.Source.Microphone),\n    [M, T]\n  );\n  r.useEffect(() => {\n    m.emit(\"microphoneChanged\", O);\n  }, [m, O]);\n  const [L, p] = r.useState(t.state);\n  r.useEffect(() => {\n    const S = (_) => {\n      p(_);\n    };\n    return t.on(H.ConnectionStateChanged, S), () => {\n      t.off(H.ConnectionStateChanged, S);\n    };\n  }, [t]), r.useEffect(() => {\n    c && u();\n  }, [c]);\n  const [f, b] = r.useState(null);\n  r.useEffect(() => {\n    if (!c)\n      return;\n    const S = (_) => {\n      _.identity === c?.identity && b(\"Agent left the room unexpectedly.\");\n    };\n    return t.on(H.ParticipantDisconnected, S), () => {\n      t.off(H.ParticipantDisconnected, S);\n    };\n  }, [c, t]), r.useEffect(() => {\n    L === I.Disconnected && b(null);\n  }, [L]);\n  const [v, C] = r.useState(\n    () => t.localParticipant.getTrackPublication(P.Source.Microphone) ?? null\n  );\n  r.useEffect(() => {\n    const S = () => {\n      C(t.localParticipant.getTrackPublication(P.Source.Microphone) ?? null);\n    }, _ = () => {\n      C(null);\n    };\n    return t.localParticipant.on(\n      ie.LocalTrackPublished,\n      S\n    ), t.localParticipant.on(\n      ie.LocalTrackUnpublished,\n      _\n    ), () => {\n      t.localParticipant.off(\n        ie.LocalTrackPublished,\n        S\n      ), t.localParticipant.off(\n        ie.LocalTrackUnpublished,\n        _\n      );\n    };\n  }, [t.localParticipant]);\n  const R = r.useMemo(() => {\n    const S = [];\n    return s && S.push(s), f && S.push(f), S;\n  }, [s, f]), y = r.useMemo(() => {\n    if (R.length > 0)\n      return \"failed\";\n    let S = \"disconnected\";\n    return L !== I.Disconnected && (S = \"connecting\"), v && (S = \"pre-connect-buffering\"), c && k[G.AgentState] && (S = k[G.AgentState]), S;\n  }, [\n    R,\n    L,\n    v,\n    c,\n    k\n  ]);\n  r.useEffect(() => {\n    m.emit(\"stateChanged\", y), l(y);\n  }, [m, y]), r.useEffect(() => {\n    h(c !== null);\n  }, [c]);\n  const N = e.connectionState === \"disconnected\";\n  r.useEffect(() => {\n    if (!N)\n      return a(o), () => {\n        i();\n      };\n  }, [N, o]);\n  const {\n    identity: x,\n    name: j,\n    metadata: z\n  } = nn({ participant: c ?? void 0 }), B = r.useMemo(() => {\n    const S = {\n      attributes: k,\n      internal: {\n        agentParticipant: c,\n        workerParticipant: g,\n        emitter: m\n      }\n    };\n    switch (y) {\n      case \"disconnected\":\n        return {\n          ...S,\n          identity: void 0,\n          name: void 0,\n          metadata: void 0,\n          state: y,\n          ...F(y),\n          failureReasons: null,\n          // Clear inner values if no longer connected\n          cameraTrack: void 0,\n          microphoneTrack: void 0\n        };\n      case \"connecting\":\n        return {\n          ...S,\n          identity: void 0,\n          name: void 0,\n          metadata: void 0,\n          state: y,\n          ...F(y),\n          failureReasons: null,\n          // Clear inner values if no longer connected\n          cameraTrack: void 0,\n          microphoneTrack: void 0\n        };\n      case \"initializing\":\n      case \"idle\":\n        return {\n          ...S,\n          identity: x,\n          name: j,\n          metadata: z,\n          state: y,\n          ...F(y),\n          failureReasons: null,\n          cameraTrack: w,\n          microphoneTrack: O\n        };\n      case \"pre-connect-buffering\":\n        return {\n          ...S,\n          identity: x,\n          name: j,\n          metadata: z,\n          state: y,\n          ...F(y),\n          failureReasons: null,\n          cameraTrack: w,\n          microphoneTrack: O\n        };\n      case \"listening\":\n      case \"thinking\":\n      case \"speaking\":\n        return {\n          ...S,\n          identity: x,\n          name: j,\n          metadata: z,\n          state: y,\n          ...F(y),\n          failureReasons: null,\n          cameraTrack: w,\n          microphoneTrack: O\n        };\n      case \"failed\":\n        return {\n          ...S,\n          identity: void 0,\n          name: void 0,\n          metadata: void 0,\n          state: \"failed\",\n          ...F(\"failed\"),\n          failureReasons: R,\n          // Clear inner values if no longer connected\n          cameraTrack: void 0,\n          microphoneTrack: void 0\n        };\n    }\n  }, [\n    x,\n    j,\n    z,\n    k,\n    m,\n    c,\n    y,\n    w,\n    O\n  ]), { waitUntilConnected: K, waitUntilCouldBeListening: Q, waitUntilFinished: Y } = Mn(m, y), ne = r.useCallback(\n    (S) => new Promise((_, Z) => {\n      const $ = (D) => {\n        D && (E(), _(D));\n      }, q = () => {\n        E(), Z(new Error(\"useAgent(/* ... */).waitUntilCamera - signal aborted\"));\n      }, E = () => {\n        m.off(\"cameraChanged\", $), S?.removeEventListener(\"abort\", q);\n      };\n      m.on(\"cameraChanged\", $), S?.addEventListener(\"abort\", q);\n    }),\n    [m]\n  ), re = r.useCallback(\n    (S) => new Promise((_, Z) => {\n      const $ = (D) => {\n        D && (E(), _(D));\n      }, q = () => {\n        E(), Z(new Error(\"useAgent(/* ... */).waitUntilMicrophone - signal aborted\"));\n      }, E = () => {\n        m.off(\"microphoneChanged\", $), S?.removeEventListener(\"abort\", q);\n      };\n      m.on(\"microphoneChanged\", $), S?.addEventListener(\"abort\", q);\n    }),\n    [m]\n  );\n  return r.useMemo(() => ({\n    ...B,\n    waitUntilConnected: K,\n    waitUntilCouldBeListening: Q,\n    waitUntilFinished: Y,\n    waitUntilCamera: ne,\n    waitUntilMicrophone: re\n  }), [\n    B,\n    K,\n    Q,\n    Y,\n    ne,\n    re\n  ]);\n}\nvar wn = /* @__PURE__ */ ((e) => (e.ConnectionStateChanged = \"connectionStateChanged\", e.MediaDevicesError = \"mediaDevicesError\", e.EncryptionError = \"encryptionError\", e))(wn || {});\nfunction Pn(e) {\n  return typeof e == \"object\" && e !== null && \"room\" in e && \"connectionState\" in e && \"internal\" in e;\n}\nfunction Rn(e, n) {\n  const t = /* @__PURE__ */ new Set([...Object.keys(e), ...Object.keys(n)]);\n  for (const o of t)\n    switch (o) {\n      case \"roomName\":\n      case \"participantName\":\n      case \"participantIdentity\":\n      case \"participantMetadata\":\n      case \"participantAttributes\":\n      case \"agentName\":\n      case \"agentMetadata\":\n        if (e[o] !== n[o])\n          return !1;\n        break;\n      default:\n        const s = o;\n        throw new Error(`Options key ${s} not being checked for equality!`);\n    }\n  return !0;\n}\nfunction Ln(e, n) {\n  const t = r.useRef(n);\n  return r.useEffect(() => {\n    t.current = n;\n  }, [n]), r.useCallback(\n    async (s, a) => {\n      if (t.current !== s)\n        return new Promise((i, u) => {\n          const l = (d) => {\n            d === s && (m(), i());\n          }, h = () => {\n            m(), u(\n              new Error(\n                `useSession(/* ... */).waitUntilConnectionState(${s}, /* signal */) - signal aborted`\n              )\n            );\n          }, m = () => {\n            e.off(\"connectionStateChanged\", l), a?.removeEventListener(\"abort\", h);\n          };\n          e.on(\"connectionStateChanged\", l), a?.addEventListener(\"abort\", h);\n        });\n    },\n    [e]\n  );\n}\nfunction An(e, n) {\n  const t = e instanceof $t, o = r.useRef(\n    t ? n : null\n  );\n  return r.useEffect(() => {\n    if (!t) {\n      o.current = null;\n      return;\n    }\n    o.current !== null && Rn(o.current, n) || (o.current = n);\n  }, [t, n]), r.useCallback(\n    async (a) => {\n      if (t) {\n        if (!o.current)\n          throw new Error(\n            \"AgentSession - memoized token fetch options are not set, but the passed tokenSource was an instance of TokenSourceConfigurable. If you are seeing this please make a new GitHub issue!\"\n          );\n        return e.fetch(o.current, a);\n      } else\n        return e.fetch();\n    },\n    [t, e]\n  );\n}\nfunction Sr(e, n = {}) {\n  const {\n    room: t,\n    agentConnectTimeoutMilliseconds: o,\n    encryption: s,\n    ...a\n  } = n, i = s && \"e2eeManager\" in s ? s.e2eeManager : null, u = s && !(\"e2eeManager\" in s) ? s.key ?? null : null, l = s && !(\"e2eeManager\" in s) ? s.worker ?? null : null, h = ve(), m = r.useRef(null), d = r.useMemo(() => typeof u == \"string\" || u instanceof ArrayBuffer ? (m.current === null && (m.current = new qt()), m.current.setKey(u).catch((E) => V.error(E)), m.current) : u, [u]), c = r.useMemo(() => {\n    const E = h ?? t;\n    if (E)\n      return E;\n    const D = !!(d && l), W = !!i, fe = D || W, ee = {};\n    D ? ee.encryption = {\n      keyProvider: d,\n      worker: l\n    } : W ? ee.encryption = {\n      e2eeManager: i\n    } : s !== void 0 && V.warn(\n      \"useSession options encryption was set, but neither encryption.key with encryption.worker nor encryption.e2eeManager was provided.\"\n    );\n    const ae = new He(ee);\n    return fe && ae.setE2EEEnabled(!0), ae;\n  }, [h, t, d, l, i]);\n  r.useEffect(() => () => {\n    c.disconnect();\n  }, [c]);\n  const g = r.useMemo(\n    () => new ke.EventEmitter(),\n    []\n  ), k = r.useCallback(\n    (E) => ({\n      isConnected: E === I.Connected || E === I.Reconnecting || E === I.SignalReconnecting\n    }),\n    []\n  ), [M, T] = r.useState(c.state);\n  r.useEffect(() => {\n    const E = (D) => {\n      T(D);\n    };\n    return c.on(H.ConnectionStateChanged, E), () => {\n      c.off(H.ConnectionStateChanged, E);\n    };\n  }, [c]), r.useEffect(() => {\n    const E = async (D) => {\n      g.emit(\"mediaDevicesError\", D);\n    };\n    return c.on(H.MediaDevicesError, E), () => {\n      c.off(H.MediaDevicesError, E);\n    };\n  }, [c, g]), r.useEffect(() => {\n    const E = async (D) => {\n      g.emit(\"encryptionError\", D);\n    };\n    return c.on(H.EncryptionError, E), () => {\n      c.off(H.EncryptionError, E);\n    };\n  }, [c, g]);\n  const { localParticipant: w } = Ve({ room: c }), O = w.getTrackPublication(P.Source.Camera), L = r.useMemo(() => {\n    if (O)\n      return {\n        source: P.Source.Camera,\n        participant: w,\n        publication: O\n      };\n  }, [w, O]), p = w.getTrackPublication(P.Source.Microphone), f = r.useMemo(() => {\n    if (p)\n      return {\n        source: P.Source.Microphone,\n        participant: w,\n        publication: p\n      };\n  }, [w, p]), b = w.getTrackPublication(P.Source.ScreenShare), v = r.useMemo(() => {\n    if (b)\n      return {\n        source: P.Source.ScreenShare,\n        participant: w,\n        publication: b\n      };\n  }, [w, b]), {\n    agentTimeoutFailureReason: C,\n    startAgentTimeout: R,\n    clearAgentTimeout: y,\n    clearAgentTimeoutFailureReason: N,\n    updateAgentTimeoutState: x,\n    updateAgentTimeoutParticipantExists: j\n  } = Tn(), z = r.useMemo(\n    () => ({\n      emitter: g,\n      tokenSource: e,\n      agentConnectTimeoutMilliseconds: o,\n      agentTimeoutFailureReason: C,\n      startAgentTimeout: R,\n      clearAgentTimeout: y,\n      clearAgentTimeoutFailureReason: N,\n      updateAgentTimeoutState: x,\n      updateAgentTimeoutParticipantExists: j\n    }),\n    [\n      g,\n      o,\n      e,\n      C,\n      R,\n      y,\n      N,\n      x,\n      j\n    ]\n  ), B = r.useMemo(() => {\n    const E = {\n      room: c,\n      internal: z\n    };\n    switch (M) {\n      case I.Connecting:\n        return {\n          ...E,\n          connectionState: I.Connecting,\n          ...k(I.Connecting),\n          local: {\n            cameraTrack: void 0,\n            microphoneTrack: void 0,\n            screenShareTrack: void 0\n          }\n        };\n      case I.Connected:\n      case I.Reconnecting:\n      case I.SignalReconnecting:\n        return {\n          ...E,\n          connectionState: M,\n          ...k(M),\n          local: {\n            cameraTrack: L,\n            microphoneTrack: f,\n            screenShareTrack: v\n          }\n        };\n      case I.Disconnected:\n        return {\n          ...E,\n          connectionState: I.Disconnected,\n          ...k(I.Disconnected),\n          local: {\n            cameraTrack: void 0,\n            microphoneTrack: void 0,\n            screenShareTrack: void 0\n          }\n        };\n    }\n  }, [\n    z,\n    c,\n    M,\n    L,\n    f,\n    k\n  ]);\n  r.useEffect(() => {\n    g.emit(\"connectionStateChanged\", B.connectionState);\n  }, [g, B.connectionState]);\n  const K = Ln(\n    g,\n    B.connectionState\n  ), Q = r.useCallback(\n    async (E) => K(\n      I.Connected,\n      E\n    ),\n    [K]\n  ), Y = r.useCallback(\n    async (E) => K(I.Disconnected, E),\n    [K]\n  ), ne = r.useCallback(\n    async (E) => c.setE2EEEnabled(E),\n    [c]\n  ), re = je(\n    r.useMemo(\n      () => ({\n        connectionState: B.connectionState,\n        room: c,\n        internal: z\n      }),\n      [B, c, z]\n    )\n  ), S = An(e, a), _ = r.useRef(!1), Z = r.useCallback(\n    async (E = {}) => {\n      const {\n        signal: D,\n        tracks: W = { microphone: { enabled: !0, publishOptions: { preConnectBuffer: !0 } } },\n        roomConnectOptions: fe\n      } = E;\n      await Y(D), _.current = !1;\n      const ee = () => {\n        c.disconnect();\n      };\n      D?.addEventListener(\"abort\", ee);\n      const ae = () => {\n        _.current || S(!0);\n      };\n      c.once(H.Disconnected, ae);\n      let Ee = !1;\n      await Promise.all([\n        S().then(({ serverUrl: Be, participantToken: Te }) => (Ee = (Wt(Te).roomConfig?.agents?.length ?? 0) > 0, c.connect(Be, Te, fe))),\n        // Start microphone (with preconnect buffer) by default\n        W.microphone?.enabled ? c.localParticipant.setMicrophoneEnabled(\n          !0,\n          void 0,\n          W.microphone?.publishOptions ?? {}\n        ) : Promise.resolve(),\n        W.camera?.enabled ? c.localParticipant.setCameraEnabled(\n          !0,\n          void 0,\n          W.camera?.publishOptions ?? {}\n        ) : Promise.resolve(),\n        W.screenShare?.enabled ? c.localParticipant.setScreenShareEnabled(\n          !0,\n          void 0,\n          W.screenShare?.publishOptions ?? {}\n        ) : Promise.resolve()\n      ]), await Q(D), Ee && await re.waitUntilConnected(D), D?.removeEventListener(\"abort\", ee);\n    },\n    [c, Y, S, Q, re.waitUntilConnected]\n  ), $ = r.useCallback(async () => {\n    _.current = !0, S(!0), await c.disconnect();\n  }, [c, S]), q = r.useCallback(async () => {\n    const E = await S();\n    await c.prepareConnection(E.serverUrl, E.participantToken);\n  }, [S, c]);\n  return r.useEffect(\n    () => {\n      q().catch((E) => {\n        console.warn(\"WARNING: Room.prepareConnection failed:\", E);\n      });\n    },\n    [\n      /* note: no prepareConnection here, this effect should only ever run once! */\n    ]\n  ), r.useMemo(\n    () => ({\n      ...B,\n      waitUntilConnected: Q,\n      waitUntilDisconnected: Y,\n      prepareConnection: q,\n      start: Z,\n      end: $,\n      setEncryptionEnabled: ne\n    }),\n    [\n      B,\n      Q,\n      Y,\n      q,\n      Z,\n      $,\n      ne\n    ]\n  );\n}\nfunction Cr(e, n, t, o) {\n  const s = r.useMemo(() => () => {\n  }, []), a = r.useCallback(t ?? s, o ?? []), i = o ? a : t, u = r.useMemo(() => e ? \"internal\" in e ? e.internal.emitter : e : null, [e]);\n  r.useEffect(() => {\n    if (!(!u || !i))\n      return u.on(n, i), () => {\n        u.off(n, i);\n      };\n  }, [u, n, i]);\n}\nvar On = /* @__PURE__ */ ((e) => (e.MessageReceived = \"messageReceived\", e))(On || {});\nfunction kr(e) {\n  const { room: n } = ze(e), t = r.useMemo(\n    () => new ke.EventEmitter(),\n    []\n  ), o = je(e), s = Sn({ room: n }), a = r.useMemo(() => ({ room: n }), [n]), i = un(a), u = r.useMemo(() => s.map((c) => {\n    switch (c.participantInfo.identity) {\n      case n.localParticipant.identity:\n        return {\n          type: \"userTranscript\",\n          message: c.text,\n          id: c.streamInfo.id,\n          timestamp: c.streamInfo.timestamp,\n          from: n.localParticipant\n        };\n      case o.internal.agentParticipant?.identity:\n      case o.internal.workerParticipant?.identity:\n        return {\n          type: \"agentTranscript\",\n          message: c.text,\n          id: c.streamInfo.id,\n          timestamp: c.streamInfo.timestamp,\n          from: o.internal.agentParticipant?.identity === c.participantInfo.identity ? o.internal.agentParticipant : o.internal.workerParticipant\n        };\n      default:\n        return {\n          type: \"agentTranscript\",\n          message: c.text,\n          id: c.streamInfo.id,\n          timestamp: c.streamInfo.timestamp,\n          from: Array.from(n.remoteParticipants.values()).find(\n            (g) => g.identity === c.participantInfo.identity\n          )\n        };\n    }\n  }), [s, n]), l = r.useMemo(() => [...u, ...i.chatMessages], [u, i.chatMessages]), h = r.useRef(/* @__PURE__ */ new Map()), m = r.useMemo(() => {\n    const c = /* @__PURE__ */ new Date();\n    for (const g of l)\n      h.current.has(g.id) || h.current.set(g.id, c);\n    return l.sort((g, k) => {\n      const M = h.current.get(g.id), T = h.current.get(k.id);\n      return typeof M > \"u\" || typeof T > \"u\" ? 0 : M.getTime() - T.getTime();\n    });\n  }, [l]), d = r.useRef(/* @__PURE__ */ new Set());\n  return r.useEffect(() => {\n    for (const c of m)\n      d.current.has(c.id) || (d.current.add(c.id), t.emit(\"messageReceived\", c));\n  }, [m]), r.useMemo(\n    () => ({\n      messages: m,\n      send: i.send,\n      isSending: i.isSending,\n      internal: { emitter: t }\n    }),\n    [m, i.send, i.isSending]\n  );\n}\nfunction Er(e, n, t, o) {\n  let s, a, i, u;\n  Pn(e) ? (s = e, a = n, i = t, u = o) : (a = e, i = n, u = t);\n  const { room: l } = ze(s), h = r.useRef(i);\n  h.current = i;\n  const m = r.useRef(u);\n  m.current = u, r.useEffect(() => {\n    if (a)\n      return l.registerRpcMethod(a, async (c) => {\n        const g = m.current?.fromIdentity;\n        if (g && c.callerIdentity !== g)\n          throw te.builtIn(\n            \"UNSUPPORTED_METHOD\",\n            `Method not available for caller ${c.callerIdentity}`\n          );\n        const k = h.current;\n        if (!k)\n          throw te.builtIn(\n            \"APPLICATION_ERROR\",\n            `No handler registered for method \"${a}\"`\n          );\n        const M = m.current?.serializer ?? we.json();\n        let T;\n        try {\n          T = M.parse(c.payload);\n        } catch (O) {\n          throw te.builtIn(\"APPLICATION_ERROR\", `Failed to parse RPC payload: ${O}`);\n        }\n        const w = await k(T, c);\n        try {\n          return M.serialize(w);\n        } catch (O) {\n          throw te.builtIn(\"APPLICATION_ERROR\", `Failed to serialize RPC response: ${O}`);\n        }\n      }), () => {\n        l.unregisterRpcMethod(a);\n      };\n  }, [l, a]);\n  const d = r.useCallback(\n    async (c, g = we.json()) => {\n      if (Gt(g)) {\n        let k;\n        try {\n          k = g.serialize(c.payload);\n        } catch (T) {\n          throw te.builtIn(\"APPLICATION_ERROR\", `Failed to serialize RPC payload: ${T}`);\n        }\n        const M = await l.localParticipant.performRpc({\n          destinationIdentity: c.destinationIdentity,\n          method: c.method,\n          payload: k,\n          responseTimeout: c.responseTimeout\n        });\n        try {\n          return g.parse(M);\n        } catch (T) {\n          throw te.builtIn(\"APPLICATION_ERROR\", `Failed to parse RPC response: ${T}`);\n        }\n      } else\n        return l.localParticipant.performRpc(c);\n    },\n    [l]\n  );\n  return r.useMemo(() => ({ perform: d }), [d]);\n}\nexport {\n  kr as $,\n  $n as A,\n  Xn as B,\n  Ve as C,\n  En as D,\n  Pn as E,\n  je as F,\n  zn as G,\n  hr as H,\n  jn as I,\n  Cr as J,\n  Zt as K,\n  Pe as L,\n  On as M,\n  vr as N,\n  en as O,\n  br as P,\n  vn as Q,\n  nn as R,\n  wn as S,\n  Qn as T,\n  le as U,\n  rn as V,\n  Zn as W,\n  Ce as X,\n  Er as Y,\n  yr as Z,\n  Sr as _,\n  oe as a,\n  tr as a0,\n  sn as a1,\n  yn as a2,\n  ar as a3,\n  lr as a4,\n  gn as a5,\n  pr as a6,\n  Sn as a7,\n  gr as a8,\n  or as b,\n  Bn as c,\n  qn as d,\n  Gn as e,\n  nr as f,\n  rr as g,\n  cr as h,\n  Vn as i,\n  A as j,\n  ir as k,\n  Yn as l,\n  fr as m,\n  Wn as n,\n  Kn as o,\n  sr as p,\n  Xt as q,\n  tn as r,\n  mr as s,\n  ur as t,\n  Hn as u,\n  er as v,\n  un as w,\n  dr as x,\n  Jn as y,\n  Un as z\n};\n//# sourceMappingURL=hooks-C7fu1g_i.mjs.map\n","import * as e from \"react\";\nimport { useState as j, useRef as z, useEffect as F, useMemo as Ne } from \"react\";\nimport { u as Le, a as he, b as ze, c as Fe, d as Ve, e as Be, f as ge, g as He, h as je, i as De, j as _e, k as Oe, l as ve, m as We, n as qe, o as $e, p as Ue, q as Ge, r as Qe, s as pe, t as Xe, v as Ye } from \"./hooks-C7fu1g_i.mjs\";\nimport { a as x, c as ee } from \"./room-BC_ml4G1.mjs\";\nimport { RoomEvent as Ze, ConnectionQuality as Y, Track as I, RemoteTrackPublication as $, RemoteAudioTrack as Je, ConnectionState as Z } from \"livekit-client\";\nimport { ae as te, af as Ee, w as Ke, u as et, f as tt, c as nt, ag as at, X as rt, Y as ct, a1 as U, l as D, ah as q, ai as lt, i as _, B as it, aj as we, j as ot, ak as st, m as ut, al as ne, p as ke, am as dt, an as mt, ao as ft, ap as ht, aq as gt, ar as vt, R as pt } from \"./contexts-BtSGUJjc.mjs\";\nconst cn = /* @__PURE__ */ e.forwardRef(\n  function(n, a) {\n    const { buttonProps: c } = Le(n);\n    return /* @__PURE__ */ e.createElement(\"button\", { ref: a, ...c }, n.children);\n  }\n), ln = /* @__PURE__ */ e.forwardRef(\n  function({ room: n, ...a }, c) {\n    const r = he(n);\n    return /* @__PURE__ */ e.createElement(\"div\", { ref: c, ...a }, r);\n  }\n), on = /* @__PURE__ */ e.forwardRef(\n  function(n, a) {\n    const { mergedProps: c } = ze({ props: n });\n    return /* @__PURE__ */ e.createElement(\"button\", { ref: a, ...c }, n.children);\n  }\n), sn = /* @__PURE__ */ e.forwardRef(\n  function(n, a) {\n    const { buttonProps: c } = Fe(n);\n    return /* @__PURE__ */ e.createElement(\"button\", { ref: a, ...c }, n.children);\n  }\n), Et = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"currentColor\", ...t }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M1.354.646a.5.5 0 1 0-.708.708l14 14a.5.5 0 0 0 .708-.708L11 10.293V4.5A1.5 1.5 0 0 0 9.5 3H3.707zM0 4.5a1.5 1.5 0 0 1 .943-1.393l9.532 9.533c-.262.224-.603.36-.975.36h-8A1.5 1.5 0 0 1 0 11.5z\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"m15.2 3.6-2.8 2.1a1 1 0 0 0-.4.8v3a1 1 0 0 0 .4.8l2.8 2.1a.5.5 0 0 0 .8-.4V4a.5.5 0 0 0-.8-.4\" })), wt = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"currentColor\", ...t }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 4.5A1.5 1.5 0 0 1 1.5 3h8A1.5 1.5 0 0 1 11 4.5v7A1.5 1.5 0 0 1 9.5 13h-8A1.5 1.5 0 0 1 0 11.5zM15.2 3.6l-2.8 2.1a1 1 0 0 0-.4.8v3a1 1 0 0 0 .4.8l2.8 2.1a.5.5 0 0 0 .8-.4V4a.5.5 0 0 0-.8-.4\" })), un = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, viewBox: \"0 0 24 24\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"#FFF\",\n    d: \"M4.99 3.99a1 1 0 0 0-.697 1.717L10.586 12l-6.293 6.293a1 1 0 1 0 1.414 1.414L12 13.414l6.293 6.293a1 1 0 1 0 1.414-1.414L13.414 12l6.293-6.293a1 1 0 0 0-.727-1.717 1 1 0 0 0-.687.303L12 10.586 5.707 4.293a1 1 0 0 0-.717-.303\"\n  }\n)), dn = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 18, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M0 2.75A2.75 2.75 0 0 1 2.75 0h10.5A2.75 2.75 0 0 1 16 2.75v13.594a.75.75 0 0 1-1.234.572l-3.691-3.12a1.25 1.25 0 0 0-.807-.296H2.75A2.75 2.75 0 0 1 0 10.75zM2.75 1.5c-.69 0-1.25.56-1.25 1.25v8c0 .69.56 1.25 1.25 1.25h7.518c.65 0 1.279.23 1.775.65l2.457 2.077V2.75c0-.69-.56-1.25-1.25-1.25z\",\n    clipRule: \"evenodd\"\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M3 4.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5m0 2a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5m0 2a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5\",\n    clipRule: \"evenodd\"\n  }\n)), oe = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentcolor\",\n    fillRule: \"evenodd\",\n    d: \"M5.293 2.293a1 1 0 0 1 1.414 0l4.823 4.823a1.25 1.25 0 0 1 0 1.768l-4.823 4.823a1 1 0 0 1-1.414-1.414L9.586 8 5.293 3.707a1 1 0 0 1 0-1.414\",\n    clipRule: \"evenodd\"\n  }\n)), kt = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\"g\", { stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: 1.5 }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M10 1.75h4.25m0 0V6m0-4.25L9 7M6 14.25H1.75m0 0V10m0 4.25L7 9\" }))), mn = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentcolor\",\n    fillRule: \"evenodd\",\n    d: \"M8.961.894C8.875-.298 7.125-.298 7.04.894c-.066.912-1.246 1.228-1.76.472-.67-.99-2.186-.115-1.664.96.399.824-.465 1.688-1.288 1.289-1.076-.522-1.95.994-.961 1.665.756.513.44 1.693-.472 1.759-1.192.086-1.192 1.836 0 1.922.912.066 1.228 1.246.472 1.76-.99.67-.115 2.186.96 1.664.824-.399 1.688.465 1.289 1.288-.522 1.076.994 1.95 1.665.961.513-.756 1.693-.44 1.759.472.086 1.192 1.836 1.192 1.922 0 .066-.912 1.246-1.228 1.76-.472.67.99 2.186.115 1.664-.96-.399-.824.465-1.687 1.288-1.289 1.076.522 1.95-.994.961-1.665-.756-.513-.44-1.693.472-1.759 1.192-.086 1.192-1.836 0-1.922-.912-.066-1.228-1.246-.472-1.76.99-.67.115-2.186-.96-1.664-.824.399-1.687-.465-1.289-1.288.522-1.076-.994-1.95-1.665-.961-.513.756-1.693.44-1.759-.472M8 13A5 5 0 1 0 8 3a5 5 0 0 0 0 10\",\n    clipRule: \"evenodd\"\n  }\n)), fn = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M2 2.75A2.75 2.75 0 0 1 4.75 0h6.5A2.75 2.75 0 0 1 14 2.75v10.5A2.75 2.75 0 0 1 11.25 16h-6.5A2.75 2.75 0 0 1 2 13.25v-.5a.75.75 0 0 1 1.5 0v.5c0 .69.56 1.25 1.25 1.25h6.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25h-6.5c-.69 0-1.25.56-1.25 1.25v.5a.75.75 0 0 1-1.5 0z\",\n    clipRule: \"evenodd\"\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M8.78 7.47a.75.75 0 0 1 0 1.06l-2.25 2.25a.75.75 0 1 1-1.06-1.06l.97-.97H1.75a.75.75 0 0 1 0-1.5h4.69l-.97-.97a.75.75 0 0 1 1.06-1.06z\",\n    clipRule: \"evenodd\"\n  }\n)), bt = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentcolor\",\n    fillRule: \"evenodd\",\n    d: \"M4 6.104V4a4 4 0 1 1 8 0v2.104c1.154.326 2 1.387 2 2.646v4.5A2.75 2.75 0 0 1 11.25 16h-6.5A2.75 2.75 0 0 1 2 13.25v-4.5c0-1.259.846-2.32 2-2.646M5.5 4a2.5 2.5 0 0 1 5 0v2h-5z\",\n    clipRule: \"evenodd\"\n  }\n)), Rt = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"currentColor\", ...t }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M12.227 11.52a5.48 5.48 0 0 0 1.246-2.97.5.5 0 0 0-.995-.1 4.5 4.5 0 0 1-.962 2.359l-1.07-1.07C10.794 9.247 11 8.647 11 8V3a3 3 0 0 0-6 0v1.293L1.354.646a.5.5 0 1 0-.708.708l14 14a.5.5 0 0 0 .708-.708zM8 12.5c.683 0 1.33-.152 1.911-.425l.743.743c-.649.359-1.378.59-2.154.66V15h2a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1h2v-1.522a5.5 5.5 0 0 1-4.973-4.929.5.5 0 0 1 .995-.098A4.5 4.5 0 0 0 8 12.5\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M8.743 10.907 5 7.164V8a3 3 0 0 0 3.743 2.907\" })), yt = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"currentColor\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fillRule: \"evenodd\",\n    d: \"M2.975 8.002a.5.5 0 0 1 .547.449 4.5 4.5 0 0 0 8.956 0 .5.5 0 1 1 .995.098A5.5 5.5 0 0 1 8.5 13.478V15h2a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1h2v-1.522a5.5 5.5 0 0 1-4.973-4.929.5.5 0 0 1 .448-.547\",\n    clipRule: \"evenodd\"\n  }\n), /* @__PURE__ */ e.createElement(\"path\", { d: \"M5 3a3 3 0 1 1 6 0v5a3 3 0 0 1-6 0z\" })), Mt = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"currentcolor\", ...t }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" })), St = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"currentcolor\", ...t }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"g\", { opacity: 0.25 }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }))), Ct = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"currentcolor\", ...t }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"g\", { opacity: 0.25 }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M6 6.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M6 6.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }))), It = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"currentColor\", ...t }, /* @__PURE__ */ e.createElement(\"g\", { opacity: 0.25 }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" }))), be = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 20, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M0 2.75A2.75 2.75 0 0 1 2.75 0h14.5A2.75 2.75 0 0 1 20 2.75v10.5A2.75 2.75 0 0 1 17.25 16H2.75A2.75 2.75 0 0 1 0 13.25zM2.75 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h14.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25z\",\n    clipRule: \"evenodd\"\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M9.47 4.22a.75.75 0 0 1 1.06 0l2.25 2.25a.75.75 0 0 1-1.06 1.06l-.97-.97v4.69a.75.75 0 0 1-1.5 0V6.56l-.97.97a.75.75 0 0 1-1.06-1.06z\",\n    clipRule: \"evenodd\"\n  }\n)), xt = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 20, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\"g\", { fill: \"currentColor\" }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M7.28 4.22a.75.75 0 0 0-1.06 1.06L8.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L10 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L11.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L10 6.94z\" }), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fillRule: \"evenodd\",\n    d: \"M2.75 0A2.75 2.75 0 0 0 0 2.75v10.5A2.75 2.75 0 0 0 2.75 16h14.5A2.75 2.75 0 0 0 20 13.25V2.75A2.75 2.75 0 0 0 17.25 0zM1.5 2.75c0-.69.56-1.25 1.25-1.25h14.5c.69 0 1.25.56 1.25 1.25v10.5c0 .69-.56 1.25-1.25 1.25H2.75c-.69 0-1.25-.56-1.25-1.25z\",\n    clipRule: \"evenodd\"\n  }\n))), se = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M8 0a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0V.75A.75.75 0 0 1 8 0\",\n    clipRule: \"evenodd\"\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M8 12a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0v-2.5A.75.75 0 0 1 8 12\",\n    clipRule: \"evenodd\",\n    opacity: 0.7\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M12 1.072a.75.75 0 0 1 .274 1.024l-1.25 2.165a.75.75 0 0 1-1.299-.75l1.25-2.165A.75.75 0 0 1 12 1.072\",\n    clipRule: \"evenodd\"\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M6 11.464a.75.75 0 0 1 .274 1.025l-1.25 2.165a.75.75 0 0 1-1.299-.75l1.25-2.165A.75.75 0 0 1 6 11.464\",\n    clipRule: \"evenodd\",\n    opacity: 0.6\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M14.928 4a.75.75 0 0 1-.274 1.025l-2.165 1.25a.75.75 0 1 1-.75-1.3l2.165-1.25A.75.75 0 0 1 14.928 4\",\n    clipRule: \"evenodd\"\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M4.536 10a.75.75 0 0 1-.275 1.024l-2.165 1.25a.75.75 0 0 1-.75-1.298l2.165-1.25A.75.75 0 0 1 4.536 10\",\n    clipRule: \"evenodd\",\n    opacity: 0.5\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M16 8a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h2.5A.75.75 0 0 1 16 8\",\n    clipRule: \"evenodd\"\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M4 8a.75.75 0 0 1-.75.75H.75a.75.75 0 0 1 0-1.5h2.5A.75.75 0 0 1 4 8\",\n    clipRule: \"evenodd\",\n    opacity: 0.4\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M14.928 12a.75.75 0 0 1-1.024.274l-2.165-1.25a.75.75 0 0 1 .75-1.299l2.165 1.25A.75.75 0 0 1 14.928 12\",\n    clipRule: \"evenodd\",\n    opacity: 0.9\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M4.536 6a.75.75 0 0 1-1.025.275l-2.165-1.25a.75.75 0 1 1 .75-1.3l2.165 1.25A.75.75 0 0 1 4.536 6\",\n    clipRule: \"evenodd\",\n    opacity: 0.3\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M12 14.928a.75.75 0 0 1-1.024-.274l-1.25-2.165a.75.75 0 0 1 1.298-.75l1.25 2.165A.75.75 0 0 1 12 14.928\",\n    clipRule: \"evenodd\",\n    opacity: 0.8\n  }\n), /* @__PURE__ */ e.createElement(\n  \"path\",\n  {\n    fill: \"currentColor\",\n    fillRule: \"evenodd\",\n    d: \"M6 4.536a.75.75 0 0 1-1.024-.275l-1.25-2.165a.75.75 0 1 1 1.299-.75l1.25 2.165A.75.75 0 0 1 6 4.536\",\n    clipRule: \"evenodd\",\n    opacity: 0.2\n  }\n)), Pt = (t) => /* @__PURE__ */ e.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, fill: \"none\", ...t }, /* @__PURE__ */ e.createElement(\"g\", { stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: 1.5 }, /* @__PURE__ */ e.createElement(\"path\", { d: \"M13.25 7H9m0 0V2.75M9 7l5.25-5.25M2.75 9H7m0 0v4.25M7 9l-5.25 5.25\" }))), Tt = /* @__PURE__ */ e.forwardRef(\n  function({ trackRef: n, ...a }, c) {\n    const r = te(), { mergedProps: i, inFocus: s } = Ve({\n      trackRef: n ?? r,\n      props: a\n    });\n    return /* @__PURE__ */ e.createElement(Ee.Consumer, null, (l) => l !== void 0 && /* @__PURE__ */ e.createElement(\"button\", { ref: c, ...i }, a.children ? a.children : s ? /* @__PURE__ */ e.createElement(Pt, null) : /* @__PURE__ */ e.createElement(kt, null)));\n  }\n), hn = /* @__PURE__ */ e.forwardRef(\n  function({\n    kind: n,\n    initialSelection: a,\n    onActiveDeviceChange: c,\n    onDeviceListChange: r,\n    onDeviceSelectError: i,\n    exactMatch: s,\n    track: l,\n    requestPermissions: o,\n    onError: u,\n    ...d\n  }, f) {\n    const m = Ke(), E = e.useRef(\"default\"), w = e.useCallback(\n      (p) => {\n        m && m.emit(Ze.MediaDevicesError, p), u?.(p);\n      },\n      [m, u]\n    ), { devices: g, activeDeviceId: v, setActiveMediaDevice: y, className: M } = Be({\n      kind: n,\n      room: m,\n      track: l,\n      requestPermissions: o,\n      onError: w\n    });\n    e.useEffect(() => {\n      a !== void 0 && y(a);\n    }, [y]), e.useEffect(() => {\n      typeof r == \"function\" && r(g);\n    }, [r, g]), e.useEffect(() => {\n      v !== E.current && c?.(v), E.current = v;\n    }, [v]);\n    const P = async (p) => {\n      try {\n        await y(p, { exact: s ?? !0 });\n      } catch (R) {\n        if (R instanceof Error)\n          i?.(R);\n        else\n          throw R;\n      }\n    }, S = e.useMemo(\n      () => x(d, { className: M }, { className: \"lk-list\" }),\n      [M, d]\n    ), h = !!g.find((p) => p.label.toLowerCase().startsWith(\"default\"));\n    function b(p, R, A) {\n      return p === R || !h && A === 0 && R === \"default\";\n    }\n    return /* @__PURE__ */ e.createElement(\"ul\", { ref: f, ...S }, g.map((p, R) => /* @__PURE__ */ e.createElement(\n      \"li\",\n      {\n        key: p.deviceId,\n        id: p.deviceId,\n        \"data-lk-active\": b(p.deviceId, v, R),\n        \"aria-selected\": b(p.deviceId, v, R),\n        role: \"option\"\n      },\n      /* @__PURE__ */ e.createElement(\"button\", { className: \"lk-button\", onClick: () => P(p.deviceId) }, p.label)\n    )));\n  }\n), gn = /* @__PURE__ */ e.forwardRef(\n  function({ label: n = \"Allow Audio\", ...a }, c) {\n    const r = et(a.room), { mergedProps: i } = ge({ room: r, props: a });\n    return /* @__PURE__ */ e.createElement(\"button\", { ref: c, ...i }, n);\n  }\n), vn = /* @__PURE__ */ e.forwardRef(\n  function({ label: n, ...a }, c) {\n    const r = tt(), { mergedProps: i, canPlayAudio: s } = ge({ room: r, props: a }), { mergedProps: l, canPlayVideo: o } = He({ room: r, props: i }), { style: u, ...d } = l;\n    return u.display = s && o ? \"none\" : \"block\", /* @__PURE__ */ e.createElement(\"button\", { ref: c, style: u, ...d }, n ?? `Start ${s ? \"Video\" : \"Audio\"}`);\n  }\n);\nfunction Re(t, n) {\n  switch (t) {\n    case I.Source.Microphone:\n      return n ? /* @__PURE__ */ e.createElement(yt, null) : /* @__PURE__ */ e.createElement(Rt, null);\n    case I.Source.Camera:\n      return n ? /* @__PURE__ */ e.createElement(wt, null) : /* @__PURE__ */ e.createElement(Et, null);\n    case I.Source.ScreenShare:\n      return n ? /* @__PURE__ */ e.createElement(xt, null) : /* @__PURE__ */ e.createElement(be, null);\n    default:\n      return;\n  }\n}\nfunction At(t) {\n  switch (t) {\n    case Y.Excellent:\n      return /* @__PURE__ */ e.createElement(Mt, null);\n    case Y.Good:\n      return /* @__PURE__ */ e.createElement(St, null);\n    case Y.Poor:\n      return /* @__PURE__ */ e.createElement(Ct, null);\n    default:\n      return /* @__PURE__ */ e.createElement(It, null);\n  }\n}\nconst pn = /* @__PURE__ */ e.forwardRef(function({ showIcon: n, ...a }, c) {\n  const { buttonProps: r, enabled: i } = je(a), [s, l] = e.useState(!1);\n  return e.useEffect(() => {\n    l(!0);\n  }, []), s && /* @__PURE__ */ e.createElement(\"button\", { ref: c, ...r }, (n ?? !0) && Re(a.source, i), a.children);\n}), ye = /* @__PURE__ */ e.forwardRef(function(n, a) {\n  const { className: c, quality: r } = De(n), i = e.useMemo(() => ({ ...x(n, { className: c }), \"data-lk-quality\": r }), [r, n, c]);\n  return /* @__PURE__ */ e.createElement(\"div\", { ref: a, ...i }, n.children ?? At(r));\n}), K = /* @__PURE__ */ e.forwardRef(\n  function({ participant: n, ...a }, c) {\n    const r = nt(n), { className: i, infoObserver: s } = e.useMemo(() => at(r), [r]), { identity: l, name: o } = _e(s, {\n      name: r.name,\n      identity: r.identity,\n      metadata: r.metadata\n    }), u = e.useMemo(() => x(a, { className: i, \"data-lk-participant-name\": o }), [a, i, o]);\n    return /* @__PURE__ */ e.createElement(\"span\", { ref: c, ...u }, o !== \"\" ? o : l, a.children);\n  }\n), Me = /* @__PURE__ */ e.forwardRef(\n  function({ trackRef: n, show: a = \"always\", ...c }, r) {\n    const { className: i, isMuted: s } = Oe(n), l = a === \"always\" || a === \"muted\" && s || a === \"unmuted\" && !s, o = e.useMemo(\n      () => x(c, {\n        className: i\n      }),\n      [i, c]\n    );\n    return l ? /* @__PURE__ */ e.createElement(\"div\", { ref: r, ...o, \"data-lk-muted\": s }, c.children ?? Re(n.source, !s)) : null;\n  }\n), Nt = (t) => /* @__PURE__ */ e.createElement(\n  \"svg\",\n  {\n    width: 320,\n    height: 320,\n    viewBox: \"0 0 320 320\",\n    preserveAspectRatio: \"xMidYMid meet\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    ...t\n  },\n  /* @__PURE__ */ e.createElement(\n    \"path\",\n    {\n      d: \"M160 180C204.182 180 240 144.183 240 100C240 55.8172 204.182 20 160 20C115.817 20 79.9997 55.8172 79.9997 100C79.9997 144.183 115.817 180 160 180Z\",\n      fill: \"white\",\n      fillOpacity: 0.25\n    }\n  ),\n  /* @__PURE__ */ e.createElement(\n    \"path\",\n    {\n      d: \"M97.6542 194.614C103.267 191.818 109.841 192.481 115.519 195.141C129.025 201.466 144.1 205 159.999 205C175.899 205 190.973 201.466 204.48 195.141C210.158 192.481 216.732 191.818 222.345 194.614C262.703 214.719 291.985 253.736 298.591 300.062C300.15 310.997 291.045 320 280 320H39.9997C28.954 320 19.8495 310.997 21.4087 300.062C28.014 253.736 57.2966 214.72 97.6542 194.614Z\",\n      fill: \"white\",\n      fillOpacity: 0.25\n    }\n  )\n);\nfunction Se(t, n = {}) {\n  const [a, c] = e.useState(rt(t)), [r, i] = e.useState(a?.isMuted), [s, l] = e.useState(a?.isSubscribed), [o, u] = e.useState(a?.track), [d, f] = e.useState(\"landscape\"), m = e.useRef(), { className: E, trackObserver: w } = e.useMemo(() => ct(t), [\n    t.participant.sid ?? t.participant.identity,\n    t.source,\n    U(t) && t.publication.trackSid\n  ]);\n  return e.useEffect(() => {\n    const g = w.subscribe((v) => {\n      D.debug(\"update track\", v), c(v), i(v?.isMuted), l(v?.isSubscribed), u(v?.track);\n    });\n    return () => g?.unsubscribe();\n  }, [w]), e.useEffect(() => (o && (m.current && o.detach(m.current), n.element?.current && !(t.participant.isLocal && o?.kind === \"audio\") && o.attach(n.element.current)), m.current = n.element?.current, () => {\n    m.current && o?.detach(m.current);\n  }), [o, n.element]), e.useEffect(() => {\n    if (typeof a?.dimensions?.width == \"number\" && typeof a?.dimensions?.height == \"number\") {\n      const g = a.dimensions.width > a.dimensions.height ? \"landscape\" : \"portrait\";\n      f(g);\n    }\n  }, [a]), {\n    publication: a,\n    isMuted: r,\n    isSubscribed: s,\n    track: o,\n    elementProps: x(n.props, {\n      className: E,\n      \"data-lk-local-participant\": t.participant.isLocal,\n      \"data-lk-source\": a?.source,\n      ...a?.kind === \"video\" && { \"data-lk-orientation\": d }\n    })\n  };\n}\nvar J, ue;\nfunction Lt() {\n  if (ue) return J;\n  ue = 1;\n  var t = \"Expected a function\", n = NaN, a = \"[object Symbol]\", c = /^\\s+|\\s+$/g, r = /^[-+]0x[0-9a-f]+$/i, i = /^0b[01]+$/i, s = /^0o[0-7]+$/i, l = parseInt, o = typeof q == \"object\" && q && q.Object === Object && q, u = typeof self == \"object\" && self && self.Object === Object && self, d = o || u || Function(\"return this\")(), f = Object.prototype, m = f.toString, E = Math.max, w = Math.min, g = function() {\n    return d.Date.now();\n  };\n  function v(h, b, p) {\n    var R, A, O, L, C, N, V = 0, re = !1, B = !1, G = !0;\n    if (typeof h != \"function\")\n      throw new TypeError(t);\n    b = S(b) || 0, y(p) && (re = !!p.leading, B = \"maxWait\" in p, O = B ? E(S(p.maxWait) || 0, b) : O, G = \"trailing\" in p ? !!p.trailing : G);\n    function Q(k) {\n      var T = R, H = A;\n      return R = A = void 0, V = k, L = h.apply(H, T), L;\n    }\n    function xe(k) {\n      return V = k, C = setTimeout(W, b), re ? Q(k) : L;\n    }\n    function Pe(k) {\n      var T = k - N, H = k - V, ie = b - T;\n      return B ? w(ie, O - H) : ie;\n    }\n    function ce(k) {\n      var T = k - N, H = k - V;\n      return N === void 0 || T >= b || T < 0 || B && H >= O;\n    }\n    function W() {\n      var k = g();\n      if (ce(k))\n        return le(k);\n      C = setTimeout(W, Pe(k));\n    }\n    function le(k) {\n      return C = void 0, G && R ? Q(k) : (R = A = void 0, L);\n    }\n    function Te() {\n      C !== void 0 && clearTimeout(C), V = 0, R = N = A = C = void 0;\n    }\n    function Ae() {\n      return C === void 0 ? L : le(g());\n    }\n    function X() {\n      var k = g(), T = ce(k);\n      if (R = arguments, A = this, N = k, T) {\n        if (C === void 0)\n          return xe(N);\n        if (B)\n          return C = setTimeout(W, b), Q(N);\n      }\n      return C === void 0 && (C = setTimeout(W, b)), L;\n    }\n    return X.cancel = Te, X.flush = Ae, X;\n  }\n  function y(h) {\n    var b = typeof h;\n    return !!h && (b == \"object\" || b == \"function\");\n  }\n  function M(h) {\n    return !!h && typeof h == \"object\";\n  }\n  function P(h) {\n    return typeof h == \"symbol\" || M(h) && m.call(h) == a;\n  }\n  function S(h) {\n    if (typeof h == \"number\")\n      return h;\n    if (P(h))\n      return n;\n    if (y(h)) {\n      var b = typeof h.valueOf == \"function\" ? h.valueOf() : h;\n      h = y(b) ? b + \"\" : b;\n    }\n    if (typeof h != \"string\")\n      return h === 0 ? h : +h;\n    h = h.replace(c, \"\");\n    var p = i.test(h);\n    return p || s.test(h) ? l(h.slice(2), p ? 2 : 8) : r.test(h) ? n : +h;\n  }\n  return J = v, J;\n}\nvar zt = Lt();\nconst de = /* @__PURE__ */ lt(zt);\nfunction Ft(t) {\n  const n = z(t);\n  n.current = t, F(\n    () => () => {\n      n.current();\n    },\n    []\n  );\n}\nfunction Vt(t, n = 500, a) {\n  const c = z();\n  Ft(() => {\n    c.current && c.current.cancel();\n  });\n  const r = Ne(() => {\n    const i = de(t, n, a), s = (...l) => i(...l);\n    return s.cancel = () => {\n      i.cancel();\n    }, s.isPending = () => !!c.current, s.flush = () => i.flush(), s;\n  }, [t, n, a]);\n  return F(() => {\n    c.current = de(t, n, a);\n  }, [t, n, a]), r;\n}\nfunction Bt(t, n, a) {\n  const c = ((u, d) => u === d), r = t instanceof Function ? t() : t, [i, s] = j(r), l = z(r), o = Vt(\n    s,\n    n,\n    a\n  );\n  return c(l.current, r) || (o(r), l.current = r), [i, o];\n}\nfunction Ht({\n  threshold: t = 0,\n  root: n = null,\n  rootMargin: a = \"0%\",\n  freezeOnceVisible: c = !1,\n  initialIsIntersecting: r = !1,\n  onChange: i\n} = {}) {\n  var s;\n  const [l, o] = j(null), [u, d] = j(() => ({\n    isIntersecting: r,\n    entry: void 0\n  })), f = z();\n  f.current = i;\n  const m = ((s = u.entry) == null ? void 0 : s.isIntersecting) && c;\n  F(() => {\n    if (!l || !(\"IntersectionObserver\" in window) || m)\n      return;\n    const g = new IntersectionObserver(\n      (v) => {\n        const y = Array.isArray(g.thresholds) ? g.thresholds : [g.thresholds];\n        v.forEach((M) => {\n          const P = M.isIntersecting && y.some((S) => M.intersectionRatio >= S);\n          d({ isIntersecting: P, entry: M }), f.current && f.current(P, M);\n        });\n      },\n      { threshold: t, root: n, rootMargin: a }\n    );\n    return g.observe(l), () => {\n      g.disconnect();\n    };\n  }, [\n    l,\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    JSON.stringify(t),\n    n,\n    a,\n    m,\n    c\n  ]);\n  const E = z(null);\n  F(() => {\n    var g;\n    !l && ((g = u.entry) != null && g.target) && !c && !m && E.current !== u.entry.target && (E.current = u.entry.target, d({ isIntersecting: r, entry: void 0 }));\n  }, [l, u.entry, c, m, r]);\n  const w = [\n    o,\n    !!u.isIntersecting,\n    u.entry\n  ];\n  return w.ref = w[0], w.isIntersecting = w[1], w.entry = w[2], w;\n}\nconst jt = /* @__PURE__ */ e.forwardRef(\n  function({\n    onTrackClick: n,\n    onClick: a,\n    onSubscriptionStatusChanged: c,\n    trackRef: r,\n    manageSubscription: i,\n    ...s\n  }, l) {\n    const o = _(r), u = e.useRef(null);\n    e.useImperativeHandle(l, () => u.current);\n    const { ref: d, entry: f } = Ht({\n      root: null\n    }), [m] = Bt(f, 3e3), E = e.useRef(null), w = e.useRef(!1);\n    e.useEffect(() => {\n      w.current = !!i, E.current = o.publication instanceof $ ? o.publication : null;\n    }, [o.publication, i]), e.useEffect(() => {\n      i && o.publication instanceof $ && m?.isIntersecting === !1 && f?.isIntersecting === !1 && o.publication.setSubscribed(!1);\n    }, [m, f, o, i]), e.useEffect(() => {\n      i && o.publication instanceof $ && f?.isIntersecting === !0 && o.publication.setSubscribed(!0);\n    }, [f, o, i]), e.useEffect(() => () => {\n      w.current && E.current?.setSubscribed(!1);\n    }, []);\n    const {\n      elementProps: g,\n      publication: v,\n      isSubscribed: y\n    } = Se(o, {\n      element: u,\n      props: s\n    });\n    e.useEffect(() => {\n      c?.(!!y);\n    }, [y, c]);\n    const M = (S) => {\n      a?.(S), n?.({ participant: o?.participant, track: v });\n    }, P = e.useCallback(\n      (S) => {\n        u.current = S, d(S);\n      },\n      [d]\n    );\n    return /* @__PURE__ */ e.createElement(\"video\", { ref: P, ...g, muted: !0, onClick: M });\n  }\n), ae = /* @__PURE__ */ e.forwardRef(\n  function({ trackRef: n, onSubscriptionStatusChanged: a, volume: c, ...r }, i) {\n    const s = _(n), l = e.useRef(null);\n    e.useImperativeHandle(i, () => l.current);\n    const {\n      elementProps: o,\n      isSubscribed: u,\n      track: d,\n      publication: f\n    } = Se(s, {\n      element: l,\n      props: r\n    });\n    return e.useEffect(() => {\n      a?.(!!u);\n    }, [u, a]), e.useEffect(() => {\n      d === void 0 || c === void 0 || (d instanceof Je ? d.setVolume(c) : D.warn(\"Volume can only be set on remote audio tracks.\"));\n    }, [c, d]), e.useEffect(() => {\n      f === void 0 || r.muted === void 0 || (f instanceof $ ? f.setEnabled(!r.muted) : D.warn(\"Can only call setEnabled on remote track publications.\"));\n    }, [r.muted, f, d]), /* @__PURE__ */ e.createElement(\"audio\", { ref: l, ...o });\n  }\n);\nfunction Dt(t) {\n  const n = !!it();\n  return t.participant && !n ? /* @__PURE__ */ e.createElement(we.Provider, { value: t.participant }, t.children) : /* @__PURE__ */ e.createElement(e.Fragment, null, t.children);\n}\nfunction _t(t) {\n  const n = !!te();\n  return t.trackRef && !n ? /* @__PURE__ */ e.createElement(ne.Provider, { value: t.trackRef }, t.children) : /* @__PURE__ */ e.createElement(e.Fragment, null, t.children);\n}\nconst Ot = /* @__PURE__ */ e.forwardRef(\n  function({\n    trackRef: n,\n    children: a,\n    onParticipantClick: c,\n    disableSpeakingIndicator: r,\n    ...i\n  }, s) {\n    const l = _(n), { elementProps: o } = ve({\n      htmlProps: i,\n      disableSpeakingIndicator: r,\n      onParticipantClick: c,\n      trackRef: l\n    }), u = We(l.participant), d = ot(), f = st()?.autoSubscription, m = e.useCallback(\n      (E) => {\n        l.source && !E && d && d.pin.dispatch && ut(l, d.pin.state) && d.pin.dispatch({ msg: \"clear_pin\" });\n      },\n      [l, d]\n    );\n    return /* @__PURE__ */ e.createElement(\"div\", { ref: s, style: { position: \"relative\" }, ...o }, /* @__PURE__ */ e.createElement(_t, { trackRef: l }, /* @__PURE__ */ e.createElement(Dt, { participant: l.participant }, a ?? /* @__PURE__ */ e.createElement(e.Fragment, null, U(l) && (l.publication?.kind === \"video\" || l.source === I.Source.Camera || l.source === I.Source.ScreenShare) ? /* @__PURE__ */ e.createElement(\n      jt,\n      {\n        trackRef: l,\n        onSubscriptionStatusChanged: m,\n        manageSubscription: f\n      }\n    ) : U(l) && /* @__PURE__ */ e.createElement(\n      ae,\n      {\n        trackRef: l,\n        onSubscriptionStatusChanged: m\n      }\n    ), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-participant-placeholder\" }, /* @__PURE__ */ e.createElement(Nt, null)), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-participant-metadata\" }, /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-participant-metadata-item\" }, l.source === I.Source.Camera ? /* @__PURE__ */ e.createElement(e.Fragment, null, u && /* @__PURE__ */ e.createElement(bt, { style: { marginRight: \"0.25rem\" } }), /* @__PURE__ */ e.createElement(\n      Me,\n      {\n        trackRef: {\n          participant: l.participant,\n          source: I.Source.Microphone\n        },\n        show: \"muted\"\n      }\n    ), /* @__PURE__ */ e.createElement(K, null)) : /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(be, { style: { marginRight: \"0.25rem\" } }), /* @__PURE__ */ e.createElement(K, null, \"'s screen\"))), /* @__PURE__ */ e.createElement(ye, { className: \"lk-participant-metadata-item\" }))), /* @__PURE__ */ e.createElement(Tt, { trackRef: l }))));\n  }\n);\nfunction En(t) {\n  const n = x(t, { className: \"lk-focus-layout\" });\n  return /* @__PURE__ */ e.createElement(\"div\", { ...n }, t.children);\n}\nfunction wn({ trackRef: t, ...n }) {\n  return /* @__PURE__ */ e.createElement(Ot, { trackRef: t, ...n });\n}\nfunction Ce({ tracks: t, ...n }) {\n  return /* @__PURE__ */ e.createElement(e.Fragment, null, t.map((a) => /* @__PURE__ */ e.createElement(\n    ne.Provider,\n    {\n      value: a,\n      key: ke(a)\n    },\n    ee(n.children)\n  )));\n}\nfunction Wt({\n  totalPageCount: t,\n  nextPage: n,\n  prevPage: a,\n  currentPage: c,\n  pagesContainer: r\n}) {\n  const [i, s] = e.useState(!1);\n  return e.useEffect(() => {\n    let l;\n    return r && (l = dt(r.current, 2e3).subscribe(\n      s\n    )), () => {\n      l && l.unsubscribe();\n    };\n  }, [r]), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-pagination-control\", \"data-lk-user-interaction\": i }, /* @__PURE__ */ e.createElement(\"button\", { className: \"lk-button\", onClick: a }, /* @__PURE__ */ e.createElement(oe, null)), /* @__PURE__ */ e.createElement(\"span\", { className: \"lk-pagination-count\" }, `${c} of ${t}`), /* @__PURE__ */ e.createElement(\"button\", { className: \"lk-button\", onClick: n }, /* @__PURE__ */ e.createElement(oe, null)));\n}\nconst qt = /* @__PURE__ */ e.forwardRef(\n  function({ totalPageCount: n, currentPage: a }, c) {\n    const r = new Array(n).fill(\"\").map((i, s) => s + 1 === a ? /* @__PURE__ */ e.createElement(\"span\", { \"data-lk-active\": !0, key: s }) : /* @__PURE__ */ e.createElement(\"span\", { key: s }));\n    return /* @__PURE__ */ e.createElement(\"div\", { ref: c, className: \"lk-pagination-indicator\" }, r);\n  }\n);\nfunction kn({ tracks: t, ...n }) {\n  const a = e.createRef(), c = e.useMemo(\n    () => x(n, { className: \"lk-grid-layout\" }),\n    [n]\n  ), { layout: r } = qe(a, t.length), i = $e(r.maxTiles, t);\n  return Ue(a, {\n    onLeftSwipe: i.nextPage,\n    onRightSwipe: i.prevPage\n  }), /* @__PURE__ */ e.createElement(\"div\", { ref: a, \"data-lk-pagination\": i.totalPageCount > 1, ...c }, /* @__PURE__ */ e.createElement(Ce, { tracks: i.tracks }, n.children), t.length > r.maxTiles && /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n    qt,\n    {\n      totalPageCount: i.totalPageCount,\n      currentPage: i.currentPage\n    }\n  ), /* @__PURE__ */ e.createElement(Wt, { pagesContainer: a, ...i })));\n}\nconst $t = 130, Ut = 140, me = 1, Ie = 16 / 10, Gt = (1 - Ie) * -1;\nfunction bn({ tracks: t, orientation: n, ...a }) {\n  const c = e.useRef(null), [r, i] = e.useState(0), { width: s, height: l } = Ge(c), o = n || (l >= s ? \"vertical\" : \"horizontal\"), u = o === \"vertical\" ? Math.max(s * Gt, $t) : Math.max(l * Ie, Ut), d = mt(), f = Math.max(o === \"vertical\" ? (l - d) / u : (s - d) / u, me);\n  let m = Math.round(f);\n  Math.abs(f - r) < 0.5 ? m = Math.round(r) : r !== f && i(f);\n  const E = Qe(t, m);\n  return e.useLayoutEffect(() => {\n    c.current && (c.current.dataset.lkOrientation = o, c.current.style.setProperty(\"--lk-max-visible-tiles\", m.toString()));\n  }, [m, o]), /* @__PURE__ */ e.createElement(\"aside\", { key: o, className: \"lk-carousel\", ref: c, ...a }, /* @__PURE__ */ e.createElement(Ce, { tracks: E }, a.children));\n}\nfunction Rn({\n  value: t,\n  onPinChange: n,\n  onWidgetChange: a,\n  children: c\n}) {\n  const r = ft(t);\n  return e.useEffect(() => {\n    D.debug(\"PinState Updated\", { state: r.pin.state }), n && r.pin.state && n(r.pin.state);\n  }, [r.pin.state, n]), e.useEffect(() => {\n    D.debug(\"Widget Updated\", { widgetState: r.widget.state }), a && r.widget.state && a(r.widget.state);\n  }, [a, r.widget.state]), /* @__PURE__ */ e.createElement(Ee.Provider, { value: r }, c);\n}\nconst yn = /* @__PURE__ */ e.forwardRef(\n  function({ trackRef: n, ...a }, c) {\n    const d = _(n), f = pe(d, { bands: 7, loPass: 300 });\n    return /* @__PURE__ */ e.createElement(\n      \"svg\",\n      {\n        ref: c,\n        width: \"100%\",\n        height: \"100%\",\n        viewBox: \"0 0 200 90\",\n        ...a,\n        className: \"lk-audio-visualizer\"\n      },\n      /* @__PURE__ */ e.createElement(\"rect\", { x: \"0\", y: \"0\", width: \"100%\", height: \"100%\" }),\n      /* @__PURE__ */ e.createElement(\n        \"g\",\n        {\n          style: {\n            transform: `translate(${130 / 2}px, 0)`\n          }\n        },\n        f.map((m, E) => /* @__PURE__ */ e.createElement(\n          \"rect\",\n          {\n            key: E,\n            x: E * 10,\n            y: 90 / 2 - m * 50 / 2,\n            width: 6,\n            height: m * 50\n          }\n        ))\n      )\n    );\n  }\n);\nfunction Mn({ participants: t, ...n }) {\n  return /* @__PURE__ */ e.createElement(e.Fragment, null, t.map((a) => /* @__PURE__ */ e.createElement(we.Provider, { value: a, key: a.identity }, ee(n.children))));\n}\nfunction Sn({ room: t, volume: n, muted: a }) {\n  const c = Xe(\n    [I.Source.Microphone, I.Source.ScreenShareAudio, I.Source.Unknown],\n    {\n      updateOnlyOn: [],\n      onlySubscribed: !0,\n      room: t\n    }\n  ).filter((r) => !r.participant.isLocal && r.publication.kind === I.Kind.Audio);\n  return /* @__PURE__ */ e.createElement(\"div\", { style: { display: \"none\" } }, c.map((r) => /* @__PURE__ */ e.createElement(\n    ae,\n    {\n      key: ke(r),\n      trackRef: r,\n      volume: n,\n      muted: a\n    }\n  )));\n}\nconst Cn = /* @__PURE__ */ e.forwardRef(function({ childrenPosition: n = \"before\", children: a, ...c }, r) {\n  const { name: i } = Ye();\n  return /* @__PURE__ */ e.createElement(\"span\", { ref: r, ...c }, n === \"before\" && a, i, n === \"after\" && a);\n});\nfunction Qt(t) {\n  const n = e.useMemo(() => x(t, { className: \"lk-toast\" }), [t]);\n  return /* @__PURE__ */ e.createElement(\"div\", { ...n }, t.children);\n}\nconst Xt = (t) => {\n  const n = [];\n  for (let a = 0; a < t; a++)\n    n.push([a, t - 1 - a]);\n  return n;\n}, fe = (t) => [[Math.floor(t / 2)], [-1]], Yt = (t, n, a) => {\n  const [c, r] = j(0), [i, s] = j([[]]);\n  F(() => {\n    if (t === \"thinking\")\n      s(fe(n));\n    else if (t === \"connecting\" || t === \"initializing\") {\n      const o = [...Xt(n)];\n      s(o);\n    } else s(t === \"listening\" ? fe(n) : t === void 0 || t === \"speaking\" ? [new Array(n).fill(0).map((o, u) => u)] : [[]]);\n    r(0);\n  }, [t, n]);\n  const l = z(null);\n  return F(() => {\n    let o = performance.now();\n    const u = (d) => {\n      d - o >= a && (r((m) => m + 1), o = d), l.current = requestAnimationFrame(u);\n    };\n    return l.current = requestAnimationFrame(u), () => {\n      l.current !== null && cancelAnimationFrame(l.current);\n    };\n  }, [a, n, t, i.length]), i[c % i.length];\n}, Zt = /* @__PURE__ */ new Map([\n  [\"connecting\", 2e3],\n  [\"initializing\", 2e3],\n  [\"listening\", 500],\n  [\"thinking\", 150]\n]), Jt = (t, n) => {\n  if (t === void 0)\n    return 1e3;\n  let a = Zt.get(t);\n  return a && t === \"connecting\" && (a /= n), a;\n}, Kt = /* @__PURE__ */ e.forwardRef(\n  function({ state: n, options: a, barCount: c = 15, trackRef: r, track: i, children: s, ...l }, o) {\n    const u = x(l, { className: \"lk-audio-bar-visualizer\" });\n    let d = te();\n    (r || i) && (d = r || i);\n    const f = pe(d, {\n      bands: c,\n      loPass: 100,\n      hiPass: 200\n    }), m = a?.minHeight ?? 20, E = a?.maxHeight ?? 100, w = Yt(\n      n,\n      c,\n      Jt(n, c) ?? 100\n    );\n    return /* @__PURE__ */ e.createElement(\"div\", { ref: o, ...u, \"data-lk-va-state\": n }, f.map(\n      (g, v) => s ? ee(s, {\n        \"data-lk-highlighted\": w.includes(v),\n        \"data-lk-bar-index\": v,\n        className: \"lk-audio-bar\",\n        style: { height: `${Math.min(E, Math.max(m, g * 100 + 5))}%` }\n      }) : /* @__PURE__ */ e.createElement(\n        \"span\",\n        {\n          key: v,\n          \"data-lk-highlighted\": w.includes(v),\n          \"data-lk-bar-index\": v,\n          className: `lk-audio-bar ${w.includes(v) && \"lk-highlighted\"}`,\n          style: {\n            // TODO transform animations would be more performant, however the border-radius gets distorted when using scale transforms. a 9-slice approach (or 3 in this case) could work\n            // transform: `scale(1, ${Math.min(maxHeight, Math.max(minHeight, volume))}`,\n            height: `${Math.min(E, Math.max(m, g * 100 + 5))}%`\n          }\n        }\n      )\n    ));\n  }\n), In = /* @__PURE__ */ e.forwardRef(\n  function({\n    children: n,\n    disableSpeakingIndicator: a,\n    onParticipantClick: c,\n    trackRef: r,\n    ...i\n  }, s) {\n    const l = _(r), { elementProps: o } = ve({\n      trackRef: l,\n      htmlProps: i,\n      disableSpeakingIndicator: a,\n      onParticipantClick: c\n    });\n    return /* @__PURE__ */ e.createElement(\"div\", { ref: s, style: { position: \"relative\", minHeight: \"160px\" }, ...o }, /* @__PURE__ */ e.createElement(ne.Provider, { value: l }, n ?? /* @__PURE__ */ e.createElement(e.Fragment, null, U(l) && /* @__PURE__ */ e.createElement(ae, { trackRef: l }), /* @__PURE__ */ e.createElement(Kt, { barCount: 7, options: { minHeight: 8 } }), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-participant-metadata\" }, /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-participant-metadata-item\" }, /* @__PURE__ */ e.createElement(Me, { trackRef: l }), /* @__PURE__ */ e.createElement(K, null)), /* @__PURE__ */ e.createElement(ye, { className: \"lk-participant-metadata-item\" })))));\n  }\n);\nfunction xn(t) {\n  const [n, a] = e.useState(void 0), c = he(t.room);\n  return e.useEffect(() => {\n    switch (c) {\n      case Z.Reconnecting:\n        a(\n          /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(se, { className: \"lk-spinner\" }), \" Reconnecting\")\n        );\n        break;\n      case Z.Connecting:\n        a(\n          /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(se, { className: \"lk-spinner\" }), \" Connecting\")\n        );\n        break;\n      case Z.Disconnected:\n        a(/* @__PURE__ */ e.createElement(e.Fragment, null, \"Disconnected\"));\n        break;\n      default:\n        a(void 0);\n        break;\n    }\n  }, [c]), n ? /* @__PURE__ */ e.createElement(Qt, { className: \"lk-toast-connection-state\" }, n) : /* @__PURE__ */ e.createElement(e.Fragment, null);\n}\nconst Pn = /* @__PURE__ */ e.forwardRef(\n  function({ entry: n, hideName: a = !1, hideTimestamp: c = !1, messageFormatter: r, ...i }, s) {\n    const l = e.useMemo(() => r ? r(n.message) : n.message, [n.message, r]), o = !!n.editTimestamp, u = new Date(n.timestamp), d = typeof navigator < \"u\" ? navigator.language : \"en-US\", f = n.from?.name ?? n.from?.identity;\n    return /* @__PURE__ */ e.createElement(\n      \"li\",\n      {\n        ref: s,\n        className: \"lk-chat-entry\",\n        title: u.toLocaleTimeString(d, { timeStyle: \"full\" }),\n        \"data-lk-message-origin\": n.from?.isLocal ? \"local\" : \"remote\",\n        ...i\n      },\n      (!c || !a || o) && /* @__PURE__ */ e.createElement(\"span\", { className: \"lk-meta-data\" }, !a && /* @__PURE__ */ e.createElement(\"strong\", { className: \"lk-participant-name\" }, f), (!c || o) && /* @__PURE__ */ e.createElement(\"span\", { className: \"lk-timestamp\" }, o && \"edited \", u.toLocaleTimeString(d, { timeStyle: \"short\" }))),\n      /* @__PURE__ */ e.createElement(\"span\", { className: \"lk-message-body\" }, l),\n      /* @__PURE__ */ e.createElement(\"span\", { className: \"lk-message-attachements\" }, n.attachedFiles?.map(\n        (m) => m.type.startsWith(\"image/\") && /* @__PURE__ */ e.createElement(\n          \"img\",\n          {\n            style: { maxWidth: \"300px\", maxHeight: \"300px\" },\n            key: m.name,\n            src: URL.createObjectURL(m),\n            alt: m.name\n          }\n        )\n      ))\n    );\n  }\n);\nfunction Tn(t) {\n  return ht(t, gt()).map((n, a) => {\n    if (typeof n == \"string\")\n      return n;\n    {\n      const c = n.content.toString(), r = n.type === \"url\" ? /^http(s?):\\/\\//.test(c) ? c : `https://${c}` : `mailto:${c}`;\n      return /* @__PURE__ */ e.createElement(\"a\", { className: \"lk-chat-link\", key: a, href: r, target: \"_blank\", rel: \"noreferrer\" }, c);\n    }\n  });\n}\nfunction An(t) {\n  return /* @__PURE__ */ e.createElement(vt.Provider, { value: t.session }, /* @__PURE__ */ e.createElement(pt.Provider, { value: t.session.room }, t.children));\n}\nexport {\n  Tn as $,\n  ae as A,\n  Kt as B,\n  on as C,\n  sn as D,\n  Mt as E,\n  En as F,\n  kn as G,\n  St as H,\n  Ct as I,\n  It as J,\n  Cn as K,\n  Rn as L,\n  hn as M,\n  be as N,\n  xt as O,\n  Ot as P,\n  An as Q,\n  Sn as R,\n  un as S,\n  pn as T,\n  se as U,\n  gn as V,\n  Qt as W,\n  Me as X,\n  _t as Y,\n  Pt as Z,\n  jt as _,\n  Pn as a,\n  Nt as b,\n  dn as c,\n  mn as d,\n  fn as e,\n  vn as f,\n  bn as g,\n  wn as h,\n  xn as i,\n  Ce as j,\n  In as k,\n  yn as l,\n  Et as m,\n  wt as n,\n  oe as o,\n  cn as p,\n  ye as q,\n  ln as r,\n  Tt as s,\n  kt as t,\n  bt as u,\n  Rt as v,\n  yt as w,\n  Dt as x,\n  Mn as y,\n  K as z\n};\n//# sourceMappingURL=components-zhA5OhZT.mjs.map\n","import * as e from \"react\";\nimport { c as oe, w as ie, r as ue, m as le, a as K } from \"./room-BC_ml4G1.mjs\";\nimport { C as G, S as de, a as me, M as _, b as fe, T as N, c as he, d as pe, D as J, e as ge, f as z, L as H, G as ve, P as q, F as Ee, g as Se, h as ke, R as be, i as Ce, j as we, k as ye, B as De } from \"./components-zhA5OhZT.mjs\";\nimport { w as Ie, x as B, y as Te, z as Me, A as Q, t as X, B as Pe, C as Ne } from \"./hooks-C7fu1g_i.mjs\";\nimport { j as Y, as as Ae, at as Le, l as T, a as Re, au as Ve, av as Oe, a1 as F, aw as xe, ax as $e } from \"./contexts-BtSGUJjc.mjs\";\nimport { Track as E, facingModeFromLocalTrack as Ue, Mutex as _e, createLocalTracks as Fe, createLocalVideoTrack as Be, VideoPresets as We, createLocalAudioTrack as je, RoomEvent as qe } from \"livekit-client\";\nfunction Z({\n  messageFormatter: n,\n  messageDecoder: o,\n  messageEncoder: i,\n  channelTopic: u,\n  ...g\n}) {\n  const h = e.useRef(null), l = e.useRef(null), d = e.useMemo(() => ({ messageDecoder: o, messageEncoder: i, channelTopic: u }), [o, i, u]), { chatMessages: c, send: C, isSending: t } = Ie(d), f = Y(), s = e.useRef(0);\n  async function v(a) {\n    a.preventDefault(), l.current && l.current.value.trim() !== \"\" && (await C(l.current.value), l.current.value = \"\", l.current.focus());\n  }\n  return e.useEffect(() => {\n    h && h.current?.scrollTo({ top: h.current.scrollHeight });\n  }, [h, c]), e.useEffect(() => {\n    if (!f || c.length === 0)\n      return;\n    if (f.widget.state?.showChat && c.length > 0 && s.current !== c[c.length - 1]?.timestamp) {\n      s.current = c[c.length - 1]?.timestamp;\n      return;\n    }\n    const a = c.filter(\n      (p) => !s.current || p.timestamp > s.current\n    ).length, { widget: m } = f;\n    a > 0 && m.state?.unreadMessages !== a && m.dispatch?.({ msg: \"unread_msg\", count: a });\n  }, [c, f?.widget]), /* @__PURE__ */ e.createElement(\"div\", { ...g, className: \"lk-chat\" }, /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-chat-header\" }, \"Messages\", f && /* @__PURE__ */ e.createElement(G, { className: \"lk-close-button\" }, /* @__PURE__ */ e.createElement(de, null))), /* @__PURE__ */ e.createElement(\"ul\", { className: \"lk-list lk-chat-messages\", ref: h }, g.children ? c.map(\n    (a, m) => oe(g.children, {\n      entry: a,\n      key: a.id ?? m,\n      messageFormatter: n\n    })\n  ) : c.map((a, m, p) => {\n    const k = m >= 1 && p[m - 1].from === a.from, r = m >= 1 && a.timestamp - p[m - 1].timestamp < 6e4;\n    return /* @__PURE__ */ e.createElement(\n      me,\n      {\n        key: a.id ?? m,\n        hideName: k,\n        hideTimestamp: k === !1 ? !1 : r,\n        entry: a,\n        messageFormatter: n\n      }\n    );\n  })), /* @__PURE__ */ e.createElement(\"form\", { className: \"lk-chat-form\", onSubmit: v }, /* @__PURE__ */ e.createElement(\n    \"input\",\n    {\n      className: \"lk-form-control lk-chat-form-input\",\n      disabled: t,\n      ref: l,\n      type: \"text\",\n      placeholder: \"Enter a message...\",\n      onInput: (a) => a.stopPropagation(),\n      onKeyDown: (a) => a.stopPropagation(),\n      onKeyUp: (a) => a.stopPropagation()\n    }\n  ), /* @__PURE__ */ e.createElement(\"button\", { type: \"submit\", className: \"lk-button lk-chat-form-button\", disabled: t }, \"Send\")));\n}\nfunction L({\n  kind: n,\n  initialSelection: o,\n  onActiveDeviceChange: i,\n  tracks: u,\n  requestPermissions: g = !1,\n  ...h\n}) {\n  const [l, d] = e.useState(!1), [c, C] = e.useState([]), [t, f] = e.useState(!0), [s, v] = e.useState(g), a = (r, D) => {\n    T.debug(\"handle device change\"), d(!1), i?.(r, D);\n  }, m = e.useRef(null), p = e.useRef(null);\n  e.useLayoutEffect(() => {\n    l && v(!0);\n  }, [l]), e.useLayoutEffect(() => {\n    let r;\n    return m.current && p.current && (c || t) && (r = Ae(m.current, p.current, (D, w) => {\n      p.current && Object.assign(p.current.style, { left: `${D}px`, top: `${w}px` });\n    })), f(!1), () => {\n      r?.();\n    };\n  }, [m, p, c, t]);\n  const k = e.useCallback(\n    (r) => {\n      p.current && r.target !== m.current && l && Le(p.current, r) && d(!1);\n    },\n    [l, p, m]\n  );\n  return e.useEffect(() => (document.addEventListener(\"click\", k), () => {\n    document.removeEventListener(\"click\", k);\n  }), [k]), /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n    \"button\",\n    {\n      className: \"lk-button lk-button-menu\",\n      \"aria-pressed\": l,\n      ...h,\n      onClick: () => d(!l),\n      ref: m\n    },\n    h.children\n  ), !h.disabled && /* @__PURE__ */ e.createElement(\n    \"div\",\n    {\n      className: \"lk-device-menu\",\n      ref: p,\n      style: { visibility: l ? \"visible\" : \"hidden\" }\n    },\n    n ? /* @__PURE__ */ e.createElement(\n      _,\n      {\n        initialSelection: o,\n        onActiveDeviceChange: (r) => a(n, r),\n        onDeviceListChange: C,\n        kind: n,\n        track: u?.[n],\n        requestPermissions: s\n      }\n    ) : /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-device-menu-heading\" }, \"Audio inputs\"), /* @__PURE__ */ e.createElement(\n      _,\n      {\n        kind: \"audioinput\",\n        onActiveDeviceChange: (r) => a(\"audioinput\", r),\n        onDeviceListChange: C,\n        track: u?.audioinput,\n        requestPermissions: s\n      }\n    ), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-device-menu-heading\" }, \"Video inputs\"), /* @__PURE__ */ e.createElement(\n      _,\n      {\n        kind: \"videoinput\",\n        onActiveDeviceChange: (r) => a(\"videoinput\", r),\n        onDeviceListChange: C,\n        track: u?.videoinput,\n        requestPermissions: s\n      }\n    ))\n  ));\n}\nfunction W() {\n  e.useEffect(() => {\n    ie();\n  }, []);\n}\nfunction Ke(n, o) {\n  const [i, u] = e.useState(), g = e.useMemo(() => new _e(), []);\n  return e.useEffect(() => {\n    let h = !1, l = [];\n    return g.lock().then(async (d) => {\n      try {\n        (n.audio || n.video) && (l = await Fe(n), h ? l.forEach((c) => c.stop()) : u(l));\n      } catch (c) {\n        o && c instanceof Error ? o(c) : T.error(c);\n      } finally {\n        d();\n      }\n    }), () => {\n      h = !0, l.forEach((d) => {\n        d.stop();\n      });\n    };\n  }, [JSON.stringify(n, ue), o, g]), i;\n}\nfunction et(n, o, i) {\n  const [u, g] = e.useState(null), [h, l] = e.useState(!1), d = Te({ kind: i }), [c, C] = e.useState(\n    void 0\n  ), [t, f] = e.useState(), [s, v] = e.useState(o);\n  e.useEffect(() => {\n    v(o);\n  }, [o]);\n  const a = async (k, r) => {\n    try {\n      const D = r === \"videoinput\" ? await Be({\n        deviceId: k,\n        resolution: We.h720.resolution\n      }) : await je({ deviceId: k }), w = await D.getDeviceId(!1);\n      w && k !== w && (p.current = w, v(w)), f(D);\n    } catch (D) {\n      D instanceof Error && g(D);\n    }\n  }, m = async (k, r) => {\n    await k.setDeviceId(r), p.current = r;\n  }, p = e.useRef(s);\n  return e.useEffect(() => {\n    n && !t && !u && !h && (T.debug(\"creating track\", i), l(!0), a(s, i).finally(() => {\n      l(!1);\n    }));\n  }, [n, t, u, h]), e.useEffect(() => {\n    t && (n ? c?.deviceId && p.current !== c?.deviceId ? (T.debug(`switching ${i} device from`, p.current, c.deviceId), m(t, c.deviceId)) : (T.debug(`unmuting local ${i} track`), t.unmute()) : (T.debug(`muting ${i} track`), t.mute().then(() => T.debug(t.mediaStreamTrack))));\n  }, [t, c, n, i]), e.useEffect(() => () => {\n    t && (T.debug(`stopping local ${i} track`), t.stop(), t.mute());\n  }, []), e.useEffect(() => {\n    C(d?.find((k) => k.deviceId === s));\n  }, [s, d]), {\n    selectedDevice: c,\n    localTrack: t,\n    deviceError: u\n  };\n}\nfunction tt({\n  defaults: n = {},\n  onValidate: o,\n  onSubmit: i,\n  onError: u,\n  debug: g,\n  joinLabel: h = \"Join Room\",\n  micLabel: l = \"Microphone\",\n  camLabel: d = \"Camera\",\n  userLabel: c = \"Username\",\n  persistUserChoices: C = !0,\n  videoProcessor: t,\n  ...f\n}) {\n  const {\n    userChoices: s,\n    saveAudioInputDeviceId: v,\n    saveAudioInputEnabled: a,\n    saveVideoInputDeviceId: m,\n    saveVideoInputEnabled: p,\n    saveUsername: k\n  } = B({\n    defaults: n,\n    preventSave: !C,\n    preventLoad: !C\n  }), [r, D] = e.useState(s), [w, V] = e.useState(r.audioEnabled), [M, O] = e.useState(r.videoEnabled), [P, b] = e.useState(r.audioDeviceId), [y, te] = e.useState(r.videoDeviceId), [A, ae] = e.useState(r.username);\n  e.useEffect(() => {\n    a(w);\n  }, [w, a]), e.useEffect(() => {\n    p(M);\n  }, [M, p]), e.useEffect(() => {\n    v(P);\n  }, [P, v]), e.useEffect(() => {\n    m(y);\n  }, [y, m]), e.useEffect(() => {\n    k(A);\n  }, [A, k]);\n  const R = Ke(\n    {\n      audio: w ? { deviceId: s.audioDeviceId } : !1,\n      video: M ? { deviceId: s.videoDeviceId, processor: t } : !1\n    },\n    u\n  ), x = e.useRef(null), I = e.useMemo(\n    () => R?.filter((S) => S.kind === E.Kind.Video)[0],\n    [R]\n  ), ne = e.useMemo(() => {\n    if (I) {\n      const { facingMode: S } = Ue(I);\n      return S;\n    } else\n      return \"undefined\";\n  }, [I]), j = e.useMemo(\n    () => R?.filter((S) => S.kind === E.Kind.Audio)[0],\n    [R]\n  );\n  e.useEffect(() => (x.current && I && (I.unmute(), I.attach(x.current)), () => {\n    I?.detach();\n  }), [I]);\n  const [ce, se] = e.useState(), $ = e.useCallback(\n    (S) => typeof o == \"function\" ? o(S) : S.username !== \"\",\n    [o]\n  );\n  e.useEffect(() => {\n    const S = {\n      username: A,\n      videoEnabled: M,\n      videoDeviceId: y,\n      audioEnabled: w,\n      audioDeviceId: P\n    };\n    D(S), se($(S));\n  }, [A, M, $, w, P, y]);\n  function re(S) {\n    S.preventDefault(), $(r) ? typeof i == \"function\" && i(r) : T.warn(\"Validation failed with: \", r);\n  }\n  return W(), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-prejoin\", ...f }, /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-video-container\" }, I && /* @__PURE__ */ e.createElement(\"video\", { ref: x, width: \"1280\", height: \"720\", \"data-lk-facing-mode\": ne }), (!I || !M) && /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-camera-off-note\" }, /* @__PURE__ */ e.createElement(fe, null))), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group-container\" }, /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group audio\" }, /* @__PURE__ */ e.createElement(\n    N,\n    {\n      initialState: w,\n      source: E.Source.Microphone,\n      onChange: (S) => V(S)\n    },\n    l\n  ), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group-menu\" }, /* @__PURE__ */ e.createElement(\n    L,\n    {\n      initialSelection: P,\n      kind: \"audioinput\",\n      disabled: !j,\n      tracks: { audioinput: j },\n      onActiveDeviceChange: (S, U) => b(U)\n    }\n  ))), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group video\" }, /* @__PURE__ */ e.createElement(\n    N,\n    {\n      initialState: M,\n      source: E.Source.Camera,\n      onChange: (S) => O(S)\n    },\n    d\n  ), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group-menu\" }, /* @__PURE__ */ e.createElement(\n    L,\n    {\n      initialSelection: y,\n      kind: \"videoinput\",\n      disabled: !I,\n      tracks: { videoinput: I },\n      onActiveDeviceChange: (S, U) => te(U)\n    }\n  )))), /* @__PURE__ */ e.createElement(\"form\", { className: \"lk-username-container\" }, /* @__PURE__ */ e.createElement(\n    \"input\",\n    {\n      className: \"lk-form-control\",\n      id: \"username\",\n      name: \"username\",\n      type: \"text\",\n      defaultValue: A,\n      placeholder: c,\n      onChange: (S) => ae(S.target.value),\n      autoComplete: \"off\"\n    }\n  ), /* @__PURE__ */ e.createElement(\n    \"button\",\n    {\n      className: \"lk-button lk-join-button\",\n      type: \"submit\",\n      onClick: re,\n      disabled: !ce\n    },\n    h\n  )), g && /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"strong\", null, \"User Choices:\"), /* @__PURE__ */ e.createElement(\"ul\", { className: \"lk-list\", style: { overflow: \"hidden\", maxWidth: \"15rem\" } }, /* @__PURE__ */ e.createElement(\"li\", null, \"Username: \", `${r.username}`), /* @__PURE__ */ e.createElement(\"li\", null, \"Video Enabled: \", `${r.videoEnabled}`), /* @__PURE__ */ e.createElement(\"li\", null, \"Audio Enabled: \", `${r.audioEnabled}`), /* @__PURE__ */ e.createElement(\"li\", null, \"Video Device: \", `${r.videoDeviceId}`), /* @__PURE__ */ e.createElement(\"li\", null, \"Audio Device: \", `${r.audioDeviceId}`))));\n}\nfunction Ge({ props: n }) {\n  const { dispatch: o, state: i } = Re().widget, u = \"lk-button lk-settings-toggle\";\n  return { mergedProps: e.useMemo(() => le(n, {\n    className: u,\n    onClick: () => {\n      o && o({ msg: \"toggle_settings\" });\n    },\n    \"aria-pressed\": i?.showSettings ? \"true\" : \"false\"\n  }), [n, u, o, i]) };\n}\nconst Je = /* @__PURE__ */ e.forwardRef(\n  function(o, i) {\n    const { mergedProps: u } = Ge({ props: o });\n    return /* @__PURE__ */ e.createElement(\"button\", { ref: i, ...u }, o.children);\n  }\n), ze = (n) => {\n  switch (n) {\n    case E.Source.Camera:\n      return 1;\n    case E.Source.Microphone:\n      return 2;\n    case E.Source.ScreenShare:\n      return 3;\n    default:\n      return 0;\n  }\n};\nfunction ee({\n  variation: n,\n  controls: o,\n  saveUserChoices: i = !0,\n  onDeviceError: u,\n  ...g\n}) {\n  const [h, l] = e.useState(!1), d = Y();\n  e.useEffect(() => {\n    d?.widget.state?.showChat !== void 0 && l(d?.widget.state?.showChat);\n  }, [d?.widget.state?.showChat]);\n  const C = Me(`(max-width: ${h ? 1e3 : 760}px)`) ? \"minimal\" : \"verbose\";\n  n ?? (n = C);\n  const t = { leave: !0, ...o }, f = Q();\n  if (!f)\n    t.camera = !1, t.chat = !1, t.microphone = !1, t.screenShare = !1;\n  else {\n    const b = (y) => f.canPublish && (f.canPublishSources.length === 0 || f.canPublishSources.includes(ze(y)));\n    t.camera ?? (t.camera = b(E.Source.Camera)), t.microphone ?? (t.microphone = b(E.Source.Microphone)), t.screenShare ?? (t.screenShare = b(E.Source.ScreenShare)), t.chat ?? (t.chat = f.canPublishData && o?.chat);\n  }\n  const s = e.useMemo(\n    () => n === \"minimal\" || n === \"verbose\",\n    [n]\n  ), v = e.useMemo(\n    () => n === \"textOnly\" || n === \"verbose\",\n    [n]\n  ), a = Ve(), [m, p] = e.useState(!1), k = e.useCallback(\n    (b) => {\n      p(b);\n    },\n    [p]\n  ), r = K({ className: \"lk-control-bar\" }, g), {\n    saveAudioInputEnabled: D,\n    saveVideoInputEnabled: w,\n    saveAudioInputDeviceId: V,\n    saveVideoInputDeviceId: M\n  } = B({ preventSave: !i }), O = e.useCallback(\n    (b, y) => y ? D(b) : null,\n    [D]\n  ), P = e.useCallback(\n    (b, y) => y ? w(b) : null,\n    [w]\n  );\n  return /* @__PURE__ */ e.createElement(\"div\", { ...r }, t.microphone && /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group\" }, /* @__PURE__ */ e.createElement(\n    N,\n    {\n      source: E.Source.Microphone,\n      showIcon: s,\n      onChange: O,\n      onDeviceError: (b) => u?.({ source: E.Source.Microphone, error: b })\n    },\n    v && \"Microphone\"\n  ), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group-menu\" }, /* @__PURE__ */ e.createElement(\n    L,\n    {\n      kind: \"audioinput\",\n      onActiveDeviceChange: (b, y) => V(y ?? \"default\")\n    }\n  ))), t.camera && /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group\" }, /* @__PURE__ */ e.createElement(\n    N,\n    {\n      source: E.Source.Camera,\n      showIcon: s,\n      onChange: P,\n      onDeviceError: (b) => u?.({ source: E.Source.Camera, error: b })\n    },\n    v && \"Camera\"\n  ), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group-menu\" }, /* @__PURE__ */ e.createElement(\n    L,\n    {\n      kind: \"videoinput\",\n      onActiveDeviceChange: (b, y) => M(y ?? \"default\")\n    }\n  ))), t.screenShare && a && /* @__PURE__ */ e.createElement(\n    N,\n    {\n      source: E.Source.ScreenShare,\n      captureOptions: { audio: !0, selfBrowserSurface: \"include\" },\n      showIcon: s,\n      onChange: k,\n      onDeviceError: (b) => u?.({ source: E.Source.ScreenShare, error: b })\n    },\n    v && (m ? \"Stop screen share\" : \"Share screen\")\n  ), t.chat && /* @__PURE__ */ e.createElement(G, null, s && /* @__PURE__ */ e.createElement(he, null), v && \"Chat\"), t.settings && /* @__PURE__ */ e.createElement(Je, null, s && /* @__PURE__ */ e.createElement(pe, null), v && \"Settings\"), t.leave && /* @__PURE__ */ e.createElement(J, null, s && /* @__PURE__ */ e.createElement(ge, null), v && \"Leave\"), /* @__PURE__ */ e.createElement(z, null));\n}\nfunction at({\n  chatMessageFormatter: n,\n  chatMessageDecoder: o,\n  chatMessageEncoder: i,\n  SettingsComponent: u,\n  ...g\n}) {\n  const [h, l] = e.useState({\n    showChat: !1,\n    unreadMessages: 0,\n    showSettings: !1\n  }), d = e.useRef(null), c = X(\n    [\n      { source: E.Source.Camera, withPlaceholder: !0 },\n      { source: E.Source.ScreenShare, withPlaceholder: !1 }\n    ],\n    { updateOnlyOn: [qe.ActiveSpeakersChanged], onlySubscribed: !1 }\n  ), C = (a) => {\n    T.debug(\"updating widget state\", a), l(a);\n  }, t = Oe(), f = c.filter(F).filter((a) => a.publication.source === E.Source.ScreenShare), s = Pe(t)?.[0], v = c.filter((a) => !xe(a, s));\n  return e.useEffect(() => {\n    if (f.some((a) => a.publication.isSubscribed) && d.current === null ? (T.debug(\"Auto set screen share focus:\", { newScreenShareTrack: f[0] }), t.pin.dispatch?.({ msg: \"set_pin\", trackReference: f[0] }), d.current = f[0]) : d.current && !f.some(\n      (a) => a.publication.trackSid === d.current?.publication?.trackSid\n    ) && (T.debug(\"Auto clearing screen share focus.\"), t.pin.dispatch?.({ msg: \"clear_pin\" }), d.current = null), s && !F(s)) {\n      const a = c.find(\n        (m) => m.participant.identity === s.participant.identity && m.source === s.source\n      );\n      a !== s && F(a) && t.pin.dispatch?.({ msg: \"set_pin\", trackReference: a });\n    }\n  }, [\n    f.map((a) => `${a.publication.trackSid}_${a.publication.isSubscribed}`).join(),\n    s?.publication?.trackSid,\n    c\n  ]), W(), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-video-conference\", ...g }, $e() && /* @__PURE__ */ e.createElement(\n    H,\n    {\n      value: t,\n      onWidgetChange: C\n    },\n    /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-video-conference-inner\" }, s ? /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-focus-layout-wrapper\" }, /* @__PURE__ */ e.createElement(Ee, null, /* @__PURE__ */ e.createElement(Se, { tracks: v }, /* @__PURE__ */ e.createElement(q, null)), s && /* @__PURE__ */ e.createElement(ke, { trackRef: s }))) : /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-grid-layout-wrapper\" }, /* @__PURE__ */ e.createElement(ve, { tracks: c }, /* @__PURE__ */ e.createElement(q, null))), /* @__PURE__ */ e.createElement(ee, { controls: { chat: !0, settings: !!u } })),\n    /* @__PURE__ */ e.createElement(\n      Z,\n      {\n        style: { display: h.showChat ? \"grid\" : \"none\" },\n        messageFormatter: n,\n        messageEncoder: i,\n        messageDecoder: o\n      }\n    ),\n    u && /* @__PURE__ */ e.createElement(\n      \"div\",\n      {\n        className: \"lk-settings-menu-modal\",\n        style: { display: h.showSettings ? \"block\" : \"none\" }\n      },\n      /* @__PURE__ */ e.createElement(u, null)\n    )\n  ), /* @__PURE__ */ e.createElement(be, null), /* @__PURE__ */ e.createElement(Ce, null));\n}\nfunction nt({ ...n }) {\n  const [o, i] = e.useState({\n    showChat: !1,\n    unreadMessages: 0\n  }), u = X([E.Source.Microphone]);\n  return W(), /* @__PURE__ */ e.createElement(H, { onWidgetChange: i }, /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-audio-conference\", ...n }, /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-audio-conference-stage\" }, /* @__PURE__ */ e.createElement(we, { tracks: u }, /* @__PURE__ */ e.createElement(ye, null))), /* @__PURE__ */ e.createElement(\n    ee,\n    {\n      controls: { microphone: !0, screenShare: !1, camera: !1, chat: !0 }\n    }\n  ), o.showChat && /* @__PURE__ */ e.createElement(Z, null)));\n}\nfunction ct({\n  controls: n,\n  saveUserChoices: o = !0,\n  onDeviceError: i,\n  ...u\n}) {\n  const g = { leave: !0, microphone: !0, ...n }, h = Q(), { microphoneTrack: l, localParticipant: d } = Ne(), c = e.useMemo(() => ({\n    participant: d,\n    source: E.Source.Microphone,\n    publication: l\n  }), [d, l]);\n  h ? g.microphone ?? (g.microphone = h.canPublish) : g.microphone = !1;\n  const C = K({ className: \"lk-agent-control-bar\" }, u), { saveAudioInputEnabled: t, saveAudioInputDeviceId: f } = B({\n    preventSave: !o\n  }), s = e.useCallback(\n    (v, a) => {\n      a && t(v);\n    },\n    [t]\n  );\n  return /* @__PURE__ */ e.createElement(\"div\", { ...C }, g.microphone && /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group\" }, /* @__PURE__ */ e.createElement(\n    N,\n    {\n      source: E.Source.Microphone,\n      showIcon: !0,\n      onChange: s,\n      onDeviceError: (v) => i?.({ source: E.Source.Microphone, error: v })\n    },\n    /* @__PURE__ */ e.createElement(De, { trackRef: c, barCount: 7, options: { minHeight: 5 } })\n  ), /* @__PURE__ */ e.createElement(\"div\", { className: \"lk-button-group-menu\" }, /* @__PURE__ */ e.createElement(\n    L,\n    {\n      kind: \"audioinput\",\n      onActiveDeviceChange: (v, a) => f(a ?? \"default\")\n    }\n  ))), g.leave && /* @__PURE__ */ e.createElement(J, null, \"Disconnect\"), /* @__PURE__ */ e.createElement(z, null));\n}\nexport {\n  nt as AudioConference,\n  Z as Chat,\n  ee as ControlBar,\n  L as MediaDeviceMenu,\n  tt as PreJoin,\n  at as VideoConference,\n  ct as VoiceAssistantControlBar,\n  et as usePreviewDevice,\n  Ke as usePreviewTracks\n};\n//# sourceMappingURL=prefabs.mjs.map\n","import { useEffect, useMemo, useRef } from 'react';\nimport { Box, Text, config, toRem } from 'folds';\nimport { useMediaDeviceSelect, usePreviewTracks, useTrackVolume } from '@livekit/components-react';\nimport { Track, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';\nimport { VideoCameraSlash, sizedIcon } from '$components/icons/phosphor';\nimport * as css from './CallDevicePreview.css';\n\ntype DeviceSelectProps = {\n  label: string;\n  kind: MediaDeviceKind;\n  deviceId?: string;\n  onChange: (deviceId: string) => void;\n  hasTrack: boolean;\n};\n\nfunction DeviceSelect({ label, kind, deviceId, onChange, hasTrack }: DeviceSelectProps) {\n  const { devices } = useMediaDeviceSelect({ kind, requestPermissions: hasTrack });\n  const namedDevices = devices.filter((device) => device.deviceId !== '');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\" grow=\"Yes\" style={{ minWidth: 0 }}>\n      <Text size=\"T200\">{label}</Text>\n      <select\n        className={css.DeviceSelect}\n        aria-label={label}\n        value={deviceId ?? ''}\n        onChange={(event) => onChange(event.target.value)}\n      >\n        <option value=\"\">System default</option>\n        {namedDevices.map((device, index) => (\n          <option key={device.deviceId} value={device.deviceId}>\n            {device.label || `${label} ${index + 1}`}\n          </option>\n        ))}\n      </select>\n    </Box>\n  );\n}\n\nfunction MicrophoneLevel({ track }: { track?: LocalAudioTrack }) {\n  const volume = useTrackVolume(track);\n  const level = Math.min(1, volume * 3);\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"T200\">Microphone level</Text>\n      <div\n        className={css.LevelTrack}\n        role=\"meter\"\n        aria-label=\"Microphone level\"\n        aria-valuemin={0}\n        aria-valuemax={1}\n        aria-valuenow={Number(level.toFixed(2))}\n      >\n        <div className={css.LevelFill} style={{ transform: `scaleX(${level})` }} />\n      </div>\n    </Box>\n  );\n}\n\nfunction VideoPreview({ track }: { track?: LocalVideoTrack }) {\n  const videoRef = useRef<HTMLVideoElement>(null);\n\n  useEffect(() => {\n    const element = videoRef.current;\n    if (!track || !element) return undefined;\n    track.attach(element);\n    return () => {\n      track.detach(element);\n    };\n  }, [track]);\n\n  if (!track) {\n    return (\n      <Box className={css.PreviewSurface} alignItems=\"Center\" justifyContent=\"Center\" gap=\"200\">\n        {sizedIcon(VideoCameraSlash, '400')}\n        <Text size=\"T300\">Camera is off</Text>\n      </Box>\n    );\n  }\n\n  return (\n    <Box className={css.PreviewSurface}>\n      <video ref={videoRef} className={css.PreviewVideo} muted playsInline autoPlay />\n    </Box>\n  );\n}\n\nexport type CallDevicePreviewProps = {\n  microphone: boolean;\n  video: boolean;\n  audioDeviceId?: string;\n  videoDeviceId?: string;\n  onAudioDeviceChange: (deviceId: string) => void;\n  onVideoDeviceChange: (deviceId: string) => void;\n};\n\nexport function CallDevicePreview({\n  microphone,\n  video,\n  audioDeviceId,\n  videoDeviceId,\n  onAudioDeviceChange,\n  onVideoDeviceChange,\n}: CallDevicePreviewProps) {\n  const tracks = usePreviewTracks({\n    audio: microphone ? { deviceId: audioDeviceId } : false,\n    video: video ? { deviceId: videoDeviceId } : false,\n  });\n\n  const videoTrack = useMemo(\n    () => tracks?.find((track) => track.kind === Track.Kind.Video) as LocalVideoTrack | undefined,\n    [tracks]\n  );\n  const audioTrack = useMemo(\n    () => tracks?.find((track) => track.kind === Track.Kind.Audio) as LocalAudioTrack | undefined,\n    [tracks]\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"300\" style={{ width: '100%', maxWidth: toRem(382) }}>\n      <VideoPreview track={videoTrack} />\n      {microphone && <MicrophoneLevel track={audioTrack} />}\n      <Box direction=\"Column\" gap=\"200\" style={{ paddingBottom: config.space.S100 }}>\n        <DeviceSelect\n          label=\"Microphone\"\n          kind=\"audioinput\"\n          deviceId={audioDeviceId}\n          onChange={onAudioDeviceChange}\n          hasTrack={!!audioTrack}\n        />\n        <DeviceSelect\n          label=\"Camera\"\n          kind=\"videoinput\"\n          deviceId={videoDeviceId}\n          onChange={onVideoDeviceChange}\n          hasTrack={!!videoTrack}\n        />\n      </Box>\n    </Box>\n  );\n}\n","import { Box, Button, Spinner, Text } from 'folds';\nimport classNames from 'classnames';\nimport { sizedIcon, Phone } from '$components/icons/phosphor';\nimport { SequenceCard } from '../../components/sequence-card';\nimport * as css from './styles.css';\nimport { ChatButton, ControlDivider, MicrophoneButton, SoundButton, VideoButton } from './Controls';\nimport { useIsDirectRoom, useRoom } from '../../hooks/useRoom';\nimport { useCallEmbed, useCallJoined, useCallStart } from '../../hooks/useCallEmbed';\nimport { useCallPreferences } from '../../state/hooks/callPreferences';\nimport { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { CallDevicePreview } from './CallDevicePreview';\n\ntype PrescreenControlsProps = {\n  canJoin?: boolean;\n};\nexport function PrescreenControls({ canJoin }: PrescreenControlsProps) {\n  const room = useRoom();\n  const callEmbed = useCallEmbed();\n  const callJoined = useCallJoined(callEmbed);\n  const direct = useIsDirectRoom();\n\n  const screenSize = useScreenSizeContext();\n  const compact = screenSize === ScreenSize.Mobile;\n\n  const inOtherCall = callEmbed && callEmbed.roomId !== room.roomId;\n\n  const startCall = useCallStart(direct);\n  const joining = callEmbed?.roomId === room.roomId && !callJoined;\n\n  const disabled = inOtherCall || !canJoin;\n\n  const {\n    microphone,\n    video,\n    sound,\n    audioDeviceId,\n    videoDeviceId,\n    toggleMicrophone,\n    toggleVideo,\n    toggleSound,\n    setAudioDeviceId,\n    setVideoDeviceId,\n  } = useCallPreferences();\n  // Only the new-call path applies the chosen devices; Element Call picks its\n  // own, so previewing there would promise something we cannot honour.\n  const [newCallsEnabled] = useSetting(settingsAtom, 'newCallsEnabled');\n  const showPreview = newCallsEnabled && !disabled && !joining && !compact;\n\n  return (\n    <Box direction=\"Column\" gap=\"300\" alignItems=\"Center\" style={{ width: '100%' }}>\n      {showPreview && (\n        <CallDevicePreview\n          microphone={microphone}\n          video={video}\n          audioDeviceId={audioDeviceId}\n          videoDeviceId={videoDeviceId}\n          onAudioDeviceChange={setAudioDeviceId}\n          onVideoDeviceChange={setVideoDeviceId}\n        />\n      )}\n      <Box\n        justifyContent=\"Center\"\n        alignItems=\"Center\"\n        className={css.PrescreenBox}\n        style={{\n          maxWidth: '100%',\n          overflowX: 'auto',\n        }}\n      >\n        <SequenceCard\n          className={classNames(css.ControlCard, css.PrescreenGroup)}\n          variant=\"SurfaceVariant\"\n          radii=\"500\"\n          alignItems=\"Center\"\n          justifyContent=\"Center\"\n          direction=\"Row\"\n        >\n          <Box\n            shrink=\"No\"\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            className={css.PrescreenGroup}\n            direction=\"Row\"\n          >\n            <MicrophoneButton enabled={microphone} onToggle={toggleMicrophone} />\n            {!compact && <SoundButton enabled={sound} onToggle={toggleSound} />}\n          </Box>\n\n          {!compact && <ControlDivider />}\n\n          <Box\n            shrink=\"No\"\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            className={css.PrescreenGroup}\n            direction=\"Row\"\n          >\n            <VideoButton enabled={video} onToggle={toggleVideo} />\n            {room?.isCallRoom() && <ChatButton />}\n          </Box>\n\n          <Box shrink=\"No\" alignItems=\"Center\" justifyContent=\"Center\" direction=\"Row\">\n            <Button\n              className={css.PrescreenJoinButton}\n              variant={disabled ? 'Secondary' : 'Success'}\n              fill={disabled ? 'Soft' : 'Solid'}\n              onClick={() =>\n                startCall(room, { microphone, video, sound, audioDeviceId, videoDeviceId })\n              }\n              disabled={disabled || joining}\n              before={\n                joining ? (\n                  <Spinner variant=\"Success\" fill=\"Solid\" size=\"200\" />\n                ) : (\n                  sizedIcon(Phone, '200', { filled: true })\n                )\n              }\n            >\n              {!compact && <Text size=\"B400\">Join</Text>}\n            </Button>\n          </Box>\n        </SequenceCard>\n      </Box>\n    </Box>\n  );\n}\n","import { useMemo } from 'react';\nimport { Avatar, Text, toRem } from 'folds';\nimport { userFallbackIcon } from '$components/icons/phosphor';\nimport { UserAvatar } from '$components/user-avatar';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRoom } from '$hooks/useRoom';\nimport { getMemberAvatarMxc, getMemberDisplayName } from '$utils/room/display';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport type { UserIdByRtcIdentity } from '@sableclient/matrixrtc';\n\nconst debugLog = createDebugLogger('callParticipant');\n\nexport type CallParticipantProfile = {\n  name: string;\n  avatarUrl?: string;\n  userId?: string;\n};\n\nexport const useCallParticipantProfile = (\n  identity: string,\n  isLocal: boolean,\n  userIdByIdentity: UserIdByRtcIdentity,\n  avatarSize = 96\n): CallParticipantProfile => {\n  const mx = useMatrixClient();\n  const room = useRoom();\n  const useAuthentication = useMediaAuthentication();\n\n  return useMemo(() => {\n    // We always know who we are, whatever identity the SFU handed us.\n    const userId =\n      userIdByIdentity.get(identity) ?? (isLocal ? (mx.getUserId() ?? undefined) : undefined);\n    if (!userId) {\n      debugLog.warn('call', 'Unresolved LiveKit participant identity', {\n        identity,\n        known: [...userIdByIdentity.keys()],\n      });\n      return { name: 'Unknown participant' };\n    }\n\n    const avatarMxc = getMemberAvatarMxc(room, userId);\n    return {\n      userId,\n      name: getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId) ?? userId,\n      avatarUrl: avatarMxc\n        ? (mxcUrlToHttp(mx, avatarMxc, useAuthentication, avatarSize, avatarSize) ?? undefined)\n        : undefined,\n    };\n  }, [mx, room, useAuthentication, identity, isLocal, userIdByIdentity, avatarSize]);\n};\n\nexport function CallParticipantAvatar({\n  profile,\n  size,\n}: {\n  profile: CallParticipantProfile;\n  size: string;\n}) {\n  return (\n    <Avatar style={{ width: size, height: size }} radii=\"Pill\">\n      <UserAvatar\n        userId={profile.userId ?? profile.name}\n        src={profile.avatarUrl}\n        alt={profile.name}\n        renderFallback={() => userFallbackIcon('sm')}\n      />\n    </Avatar>\n  );\n}\n\nexport function CallParticipantName({ profile }: { profile: CallParticipantProfile }) {\n  return (\n    <Text size=\"T200\" truncate style={{ maxWidth: toRem(180) }}>\n      {profile.name}\n    </Text>\n  );\n}\n","import type {\n  CSSProperties,\n  FocusEventHandler,\n  KeyboardEventHandler,\n  PointerEventHandler,\n  ReactNode,\n} from 'react';\nimport { Box, Button, color, Text } from 'folds';\nimport {\n  Microphone,\n  MicrophoneSlash,\n  VideoCamera,\n  VideoCameraSlash,\n  sizedIcon,\n} from '$components/icons/phosphor';\nimport type { CallStatusView } from './callClient';\nimport * as css from './callChrome.css';\n\n/** Shared layout for web and native call surfaces. */\nexport type CallLayoutProps = {\n  children: ReactNode;\n  stack?: boolean;\n  callSurfaceMarker?: boolean;\n  className?: string;\n  style?: CSSProperties;\n  onPointerMove?: PointerEventHandler<HTMLDivElement>;\n  onPointerDown?: PointerEventHandler<HTMLDivElement>;\n  onFocusCapture?: FocusEventHandler<HTMLDivElement>;\n  onKeyDown?: KeyboardEventHandler<HTMLDivElement>;\n};\n\nexport function CallLayout({\n  children,\n  stack,\n  callSurfaceMarker,\n  className,\n  style,\n  onPointerMove,\n  onPointerDown,\n  onFocusCapture,\n  onKeyDown,\n}: CallLayoutProps) {\n  const mergedClassName = [css.callLayout, className].filter(Boolean).join(' ') || undefined;\n  return (\n    <Box\n      className={mergedClassName}\n      direction={stack ? 'Column' : undefined}\n      role=\"region\"\n      aria-label=\"Call\"\n      data-livekit-call-surface={callSurfaceMarker ? true : undefined}\n      onPointerMove={onPointerMove}\n      onPointerDown={onPointerDown}\n      onFocusCapture={onFocusCapture}\n      onKeyDown={onKeyDown}\n      style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n    >\n      {children}\n    </Box>\n  );\n}\n\n/** Shared shell for the web overlay and native in-flow controls. */\nexport type CallControlBarProps = {\n  children: ReactNode;\n  layout?: 'overlay' | 'flow';\n  visible?: boolean;\n  onFocusCapture?: FocusEventHandler<HTMLDivElement>;\n};\n\nexport function CallControlBar({\n  children,\n  layout = 'flow',\n  visible,\n  onFocusCapture,\n}: CallControlBarProps) {\n  if (layout === 'overlay') {\n    return (\n      <Box\n        data-livekit-controls\n        role=\"group\"\n        aria-label=\"Call controls\"\n        className={css.controlBarOverlay}\n        onFocusCapture={onFocusCapture}\n        style={\n          visible !== undefined\n            ? { opacity: visible ? 1 : 0, visibility: visible ? 'visible' : 'hidden' }\n            : undefined\n        }\n      >\n        <div\n          className={css.controlPill}\n          style={visible !== undefined ? { pointerEvents: visible ? 'auto' : 'none' } : undefined}\n        >\n          {children}\n        </div>\n      </Box>\n    );\n  }\n\n  return (\n    <Box className={css.controlBarFlow} role=\"group\" aria-label=\"Call controls\">\n      <div className={css.controlPill}>{children}</div>\n    </Box>\n  );\n}\n\n/** Status display for call setup and failures. */\nexport function CallStatusBar({\n  status,\n  onHangup,\n}: {\n  status: CallStatusView;\n  onHangup: () => void;\n}) {\n  const failed = status.phase === 'failed';\n  return (\n    <Box alignItems=\"Center\" justifyContent=\"Center\" direction=\"Column\" gap=\"300\" grow=\"Yes\">\n      <Box direction=\"Column\" gap=\"100\" alignItems=\"Center\">\n        <Text size=\"L400\">{status.statusLabel}</Text>\n        {status.error && (\n          <Text style={{ color: color.Critical.Main }} size=\"T300\" align=\"Center\">\n            {status.error}\n          </Text>\n        )}\n      </Box>\n      <Button size=\"300\" variant=\"Critical\" fill=\"Soft\" radii=\"300\" onClick={onHangup}>\n        <Text as=\"span\" size=\"B300\">\n          {failed ? 'Dismiss' : 'End'}\n        </Text>\n      </Button>\n    </Box>\n  );\n}\n\n/** Shared mic and camera toggle. */\nexport type CallMediaToggleButtonProps = {\n  on: boolean;\n  disabled?: boolean;\n  label: string;\n  children: ReactNode;\n  onToggle: () => void;\n};\n\nexport function CallMediaToggleButton({\n  on,\n  disabled,\n  label,\n  children,\n  onToggle,\n}: CallMediaToggleButtonProps) {\n  return (\n    <button\n      type=\"button\"\n      className={css.controlButton}\n      data-on={on}\n      aria-pressed={on}\n      aria-label={label}\n      title={label}\n      disabled={disabled}\n      onClick={onToggle}\n    >\n      {children}\n    </button>\n  );\n}\n\n/** Native mic and camera controls. */\nexport type CallMediaControlsProps = {\n  microphoneEnabled: boolean;\n  cameraEnabled: boolean;\n  setMicrophoneEnabled: (enabled: boolean) => Promise<void>;\n  setCameraEnabled: (enabled: boolean) => Promise<void>;\n  cameraAvailable?: boolean;\n  disabled?: boolean;\n};\n\nexport function CallMediaControls({\n  microphoneEnabled,\n  cameraEnabled,\n  setMicrophoneEnabled,\n  setCameraEnabled,\n  cameraAvailable = true,\n  disabled,\n}: CallMediaControlsProps) {\n  return (\n    <>\n      {cameraAvailable && (\n        <CallMediaToggleButton\n          on={microphoneEnabled}\n          disabled={disabled}\n          label={microphoneEnabled ? 'Mute microphone' : 'Unmute microphone'}\n          onToggle={() => void setMicrophoneEnabled(!microphoneEnabled)}\n        >\n          {sizedIcon(microphoneEnabled ? Microphone : MicrophoneSlash, '300', {\n            filled: !microphoneEnabled,\n          })}\n        </CallMediaToggleButton>\n      )}\n      <CallMediaToggleButton\n        on={cameraEnabled}\n        disabled={disabled}\n        label={cameraEnabled ? 'Stop camera' : 'Start camera'}\n        onToggle={() => void setCameraEnabled(!cameraEnabled)}\n      >\n        {sizedIcon(cameraEnabled ? VideoCamera : VideoCameraSlash, '300', {\n          filled: cameraEnabled,\n        })}\n      </CallMediaToggleButton>\n    </>\n  );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useAtom } from 'jotai';\nimport { Box, Button, color, config, Text, toRem } from 'folds';\nimport {\n  CarouselLayout,\n  ConnectionQualityIndicator,\n  ControlBar,\n  MediaDeviceMenu,\n  FocusLayout,\n  FocusLayoutContainer,\n  GridLayout,\n  ParticipantTile,\n  RoomContext,\n  TrackMutedIndicator,\n  TrackToggle,\n  useConnectionState,\n  useEnsureTrackRef,\n  useIsSpeaking,\n  useLocalParticipant,\n  useParticipants,\n  useTracks,\n  VideoTrack,\n} from '@livekit/components-react';\nimport { ConnectionState, Track, type Participant, type Room } from 'livekit-client';\nimport { SpeakerHigh, sizedIcon } from '$components/icons/phosphor';\nimport { useCallMembers, useCallSession } from '$hooks/useCall';\nimport { useRoom } from '$hooks/useRoom';\nimport {\n  livekitJsCallInitialMediaAppliedAtom,\n  type LivekitJsCallMedia,\n} from '$state/livekitJsCall';\nimport { buildRtcIdentityMap, type UserIdByRtcIdentity } from '@sableclient/matrixrtc';\nimport {\n  CallParticipantAvatar,\n  CallParticipantName,\n  useCallParticipantProfile,\n} from './LivekitCallParticipant';\nimport { CallControlBar, CallLayout } from './callChrome';\nimport * as css from './LivekitJsCallSurface.css';\n\nconst controlIdleDelay = 3500;\n\n// Camera carries a placeholder so participants without video still get a tile;\n// screen share must not, or every participant would fake a shared screen.\nconst trackSources = [\n  { source: Track.Source.Camera, withPlaceholder: true },\n  { source: Track.Source.ScreenShare, withPlaceholder: false },\n];\n\nconst trackOptions = { onlySubscribed: false };\n\nfunction CallTileContent({ userIdByIdentity }: { userIdByIdentity: UserIdByRtcIdentity }) {\n  const trackRef = useEnsureTrackRef();\n  const { participant, publication, source } = trackRef;\n  const profile = useCallParticipantProfile(\n    participant.identity,\n    participant.isLocal,\n    userIdByIdentity\n  );\n  const isScreenShare = source === Track.Source.ScreenShare;\n\n  return (\n    <>\n      {publication ? (\n        // Without this, iOS WKWebView pops its own PiP overlay over the call.\n        <VideoTrack trackRef={trackRef} disablePictureInPicture />\n      ) : (\n        <div className=\"lk-participant-placeholder\">\n          <CallParticipantAvatar profile={profile} size=\"min(96px, 40%)\" />\n        </div>\n      )}\n      <div className=\"lk-participant-metadata\">\n        <div className=\"lk-participant-metadata-item\">\n          {!isScreenShare && (\n            <TrackMutedIndicator\n              trackRef={{ participant, source: Track.Source.Microphone }}\n              show=\"muted\"\n            />\n          )}\n          <span className=\"lk-participant-name\">\n            {isScreenShare ? `${profile.name}'s screen` : profile.name}\n          </span>\n        </div>\n        <ConnectionQualityIndicator className=\"lk-participant-metadata-item\" />\n      </div>\n    </>\n  );\n}\n\nfunction GridTile({ userIdByIdentity }: { userIdByIdentity: UserIdByRtcIdentity }) {\n  return (\n    <ParticipantTile\n      style={{\n        position: 'relative',\n        height: '100%',\n        minWidth: 0,\n        minHeight: 0,\n        overflow: 'hidden',\n      }}\n    >\n      <CallTileContent userIdByIdentity={userIdByIdentity} />\n    </ParticipantTile>\n  );\n}\n\nfunction CarouselTile({ userIdByIdentity }: { userIdByIdentity: UserIdByRtcIdentity }) {\n  return (\n    <ParticipantTile style={{ position: 'relative', minWidth: 0, overflow: 'hidden' }}>\n      <CallTileContent userIdByIdentity={userIdByIdentity} />\n    </ParticipantTile>\n  );\n}\n\nfunction AudioCallParticipant({\n  participant,\n  userIdByIdentity,\n}: {\n  participant: Participant;\n  userIdByIdentity: UserIdByRtcIdentity;\n}) {\n  const profile = useCallParticipantProfile(\n    participant.identity,\n    participant.isLocal,\n    userIdByIdentity,\n    192\n  );\n  const speaking = useIsSpeaking(participant);\n\n  return (\n    <Box\n      className={css.AudioParticipant}\n      data-lk-speaking={speaking ? 'true' : 'false'}\n      direction=\"Column\"\n      alignItems=\"Center\"\n      gap=\"200\"\n    >\n      <CallParticipantAvatar profile={profile} size={toRem(96)} />\n      <CallParticipantName profile={profile} />\n    </Box>\n  );\n}\n\nfunction AudioCallLayout({ userIdByIdentity }: { userIdByIdentity: UserIdByRtcIdentity }) {\n  const participants = useParticipants();\n\n  return (\n    <Box\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      direction=\"Column\"\n      gap=\"500\"\n      style={{ width: '100%', height: '100%' }}\n    >\n      <Text size=\"L400\" style={{ color: color.Surface.OnContainer, opacity: 0.7 }}>\n        Audio call\n      </Text>\n      <Box wrap=\"Wrap\" justifyContent=\"Center\" alignItems=\"Center\" gap=\"400\">\n        {participants.map((participant) => (\n          <AudioCallParticipant\n            key={participant.identity}\n            participant={participant}\n            userIdByIdentity={userIdByIdentity}\n          />\n        ))}\n      </Box>\n    </Box>\n  );\n}\n\nfunction MediaLayout({\n  tracks,\n  userIdByIdentity,\n}: {\n  tracks: ReturnType<typeof useTracks>;\n  userIdByIdentity: UserIdByRtcIdentity;\n}) {\n  const screenShare = tracks.find((track) => track.source === Track.Source.ScreenShare);\n\n  if (screenShare) {\n    const remainingTracks = tracks.filter((track) => track !== screenShare);\n    return (\n      // Both layouts need an explicit width: their parent Box is a flex row, and\n      // every video is absolutely positioned, so laying out on intrinsic width\n      // collapses the focus pane to the carousel's and blanks the screen share.\n      <FocusLayoutContainer\n        style={{\n          display: 'flex',\n          gap: config.space.S200,\n          width: '100%',\n          height: '100%',\n          minHeight: 0,\n          minWidth: 0,\n        }}\n      >\n        <FocusLayout\n          trackRef={screenShare}\n          style={{ position: 'relative', flex: 1, minWidth: 0, minHeight: 0, overflow: 'hidden' }}\n        >\n          <CallTileContent userIdByIdentity={userIdByIdentity} />\n        </FocusLayout>\n        {remainingTracks.length > 0 && (\n          <CarouselLayout\n            tracks={remainingTracks}\n            orientation=\"vertical\"\n            style={{ minWidth: 0, minHeight: 0, overflowY: 'auto' }}\n          >\n            <CarouselTile userIdByIdentity={userIdByIdentity} />\n          </CarouselLayout>\n        )}\n      </FocusLayoutContainer>\n    );\n  }\n\n  return (\n    <GridLayout\n      tracks={tracks}\n      style={{\n        display: 'grid',\n        gridTemplateColumns: 'repeat(var(--lk-col-count, 1), minmax(0, 1fr))',\n        gridTemplateRows: 'repeat(var(--lk-row-count, 1), minmax(0, 1fr))',\n        gap: config.space.S200,\n        width: '100%',\n        height: '100%',\n        minHeight: 0,\n        minWidth: 0,\n      }}\n    >\n      <GridTile userIdByIdentity={userIdByIdentity} />\n    </GridLayout>\n  );\n}\n\nfunction ConnectionFeedback() {\n  const connectionState = useConnectionState();\n  if (connectionState === ConnectionState.Connected) return null;\n\n  // Only Disconnected is an actual loss. SignalReconnecting keeps media flowing\n  // while the signal link re-establishes, and Connecting is the initial\n  // handshake, so neither deserves the critical treatment.\n  const lost = connectionState === ConnectionState.Disconnected;\n  const label =\n    connectionState === ConnectionState.Connecting\n      ? 'Connecting…'\n      : lost\n        ? 'Connection lost'\n        : 'Reconnecting…';\n  return (\n    <Box\n      role={lost ? 'alert' : 'status'}\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      style={{\n        position: 'absolute',\n        top: toRem(16),\n        left: '50%',\n        transform: 'translateX(-50%)',\n        zIndex: 3,\n        padding: `${config.space.S100} ${config.space.S200}`,\n        borderRadius: config.radii.R500,\n        background: lost ? color.Critical.Container : color.Warning.Container,\n        color: lost ? color.Critical.OnContainer : color.Warning.OnContainer,\n        pointerEvents: 'none',\n      }}\n    >\n      <Text size=\"T200\">{label}</Text>\n    </Box>\n  );\n}\n\nconst deviceErrorMessages: Partial<Record<Track.Source, string>> = {\n  [Track.Source.Microphone]: 'Microphone unavailable. Check your browser permissions.',\n  [Track.Source.Camera]: 'Camera unavailable. Check your browser permissions.',\n  [Track.Source.ScreenShare]: 'Screen sharing was not started.',\n};\n\nfunction LivekitJsCallContent({\n  mediaReady,\n  initialMedia,\n  onHangup,\n}: {\n  mediaReady: boolean;\n  initialMedia: LivekitJsCallMedia;\n  onHangup: () => void;\n}) {\n  const tracks = useTracks(trackSources, trackOptions);\n  const screenShareSupported = typeof navigator?.mediaDevices?.getDisplayMedia === 'function';\n  const localScreenShare = tracks.some(\n    (track) => track.source === Track.Source.ScreenShare && track.participant.isLocal\n  );\n  const hasVideo = tracks.some((track) => track.publication !== undefined);\n  const matrixRoom = useRoom();\n  const callSession = useCallSession(matrixRoom);\n  const callMembers = useCallMembers(matrixRoom, callSession);\n  const userIdByIdentity = useMemo(() => buildRtcIdentityMap(callMembers), [callMembers]);\n  const [controlsVisible, setControlsVisible] = useState(true);\n  const [deviceError, setDeviceError] = useState<string | undefined>(undefined);\n  const hideTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const { localParticipant } = useLocalParticipant();\n  const [appliedInitialMedia, setAppliedInitialMedia] = useAtom(\n    livekitJsCallInitialMediaAppliedAtom\n  );\n\n  const handleDeviceError = useCallback(({ source }: { source: Track.Source }) => {\n    setDeviceError(deviceErrorMessages[source] ?? 'A media device is unavailable.');\n  }, []);\n\n  // In an encrypted room, publishing before the local key is imported would\n  // send frames in the clear, so the prescreen choice waits for `mediaReady`.\n  // An unencrypted room is ready straight away and never waits on Matrix keys.\n  useEffect(() => {\n    if (!mediaReady || appliedInitialMedia) return;\n    setAppliedInitialMedia(true);\n    localParticipant\n      .setMicrophoneEnabled(\n        initialMedia.microphone,\n        initialMedia.audioDeviceId ? { deviceId: initialMedia.audioDeviceId } : undefined\n      )\n      .catch(() => handleDeviceError({ source: Track.Source.Microphone }));\n    if (initialMedia.camera) {\n      localParticipant\n        .setCameraEnabled(\n          true,\n          initialMedia.videoDeviceId ? { deviceId: initialMedia.videoDeviceId } : undefined\n        )\n        .catch(() => handleDeviceError({ source: Track.Source.Camera }));\n    }\n  }, [\n    mediaReady,\n    initialMedia,\n    localParticipant,\n    handleDeviceError,\n    appliedInitialMedia,\n    setAppliedInitialMedia,\n  ]);\n\n  const revealControls = useCallback(() => {\n    setControlsVisible(true);\n    if (hideTimer.current) clearTimeout(hideTimer.current);\n    hideTimer.current = setTimeout(() => {\n      if (!document.activeElement?.closest('[data-livekit-controls]')) {\n        setControlsVisible(false);\n      }\n    }, controlIdleDelay);\n  }, []);\n\n  useEffect(() => {\n    revealControls();\n    return () => {\n      if (hideTimer.current) clearTimeout(hideTimer.current);\n    };\n  }, [revealControls]);\n\n  return (\n    <CallLayout\n      onKeyDown={revealControls}\n      callSurfaceMarker\n      className={css.CallSurface}\n      onPointerMove={revealControls}\n      onPointerDown={revealControls}\n      onFocusCapture={() => setControlsVisible(true)}\n    >\n      <Box style={{ position: 'absolute', inset: 0, padding: config.space.S200, minHeight: 0 }}>\n        {hasVideo ? (\n          <MediaLayout tracks={tracks} userIdByIdentity={userIdByIdentity} />\n        ) : (\n          <AudioCallLayout userIdByIdentity={userIdByIdentity} />\n        )}\n      </Box>\n      <ConnectionFeedback />\n      {deviceError && (\n        <Box\n          role=\"alert\"\n          alignItems=\"Center\"\n          justifyContent=\"Center\"\n          style={{\n            position: 'absolute',\n            top: toRem(56),\n            left: '50%',\n            transform: 'translateX(-50%)',\n            zIndex: 3,\n            padding: `${config.space.S100} ${config.space.S200}`,\n            borderRadius: config.radii.R500,\n            background: color.Critical.Container,\n            color: color.Critical.OnContainer,\n          }}\n        >\n          <Text size=\"T200\">{deviceError}</Text>\n          <Button\n            size=\"300\"\n            variant=\"Critical\"\n            fill=\"None\"\n            onClick={() => setDeviceError(undefined)}\n          >\n            <Text as=\"span\" size=\"B300\">\n              Dismiss\n            </Text>\n          </Button>\n        </Box>\n      )}\n      {localScreenShare && (\n        <Box\n          role=\"status\"\n          style={{\n            position: 'absolute',\n            top: config.space.S300,\n            right: config.space.S300,\n            zIndex: 3,\n            padding: `${config.space.S100} ${config.space.S300}`,\n            borderRadius: config.radii.R500,\n            background: 'rgba(9, 11, 16, 0.72)',\n            color: color.Surface.OnContainer,\n            pointerEvents: 'none',\n          }}\n        >\n          <Text size=\"T200\">Sharing your screen</Text>\n        </Box>\n      )}\n      <CallControlBar\n        layout=\"overlay\"\n        visible={controlsVisible}\n        onFocusCapture={() => setControlsVisible(true)}\n      >\n        {mediaReady ? (\n          <>\n            <ControlBar\n              variation=\"minimal\"\n              controls={{ leave: false, screenShare: false }}\n              onDeviceError={handleDeviceError}\n            />\n            {screenShareSupported && (\n              // ControlBar hardcodes selfBrowserSurface: 'include', which offers\n              // the window showing the call and hangs the browser on capturing\n              // itself.\n              <TrackToggle\n                source={Track.Source.ScreenShare}\n                // PipeWire portals reliably provide the selected video surface;\n                // requesting system audio can reject the whole capture request.\n                captureOptions={{ audio: false, selfBrowserSurface: 'exclude' }}\n                showIcon\n                aria-label=\"Share screen\"\n                onDeviceError={() => handleDeviceError({ source: Track.Source.ScreenShare })}\n              />\n            )}\n            <MediaDeviceMenu kind=\"audiooutput\" aria-label=\"Select speaker\">\n              {sizedIcon(SpeakerHigh, '300')}\n            </MediaDeviceMenu>\n          </>\n        ) : (\n          <Text size=\"T200\" style={{ padding: `0 ${config.space.S200}` }}>\n            Securing call…\n          </Text>\n        )}\n        <Button\n          size=\"300\"\n          variant=\"Critical\"\n          fill=\"Solid\"\n          radii=\"Pill\"\n          style={{\n            minHeight: toRem(44),\n            paddingRight: config.space.S400,\n            paddingLeft: config.space.S400,\n          }}\n          onClick={onHangup}\n        >\n          <Text as=\"span\" size=\"B300\">\n            End call\n          </Text>\n        </Button>\n      </CallControlBar>\n    </CallLayout>\n  );\n}\n\nexport function LivekitJsCallSurface({\n  room,\n  mediaReady,\n  initialMedia,\n  onHangup,\n}: {\n  room: Room;\n  mediaReady: boolean;\n  initialMedia: LivekitJsCallMedia;\n  onHangup: () => void;\n}) {\n  return (\n    <RoomContext.Provider value={room}>\n      <LivekitJsCallContent\n        mediaReady={mediaReady}\n        initialMedia={initialMedia}\n        onHangup={onHangup}\n      />\n    </RoomContext.Provider>\n  );\n}\n","import type { ComponentProps, CSSProperties, ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport { Box, OverlayBackdrop, OverlayCenter } from 'folds';\nimport { Overlay, PopOut, useOverlayLayer } from '$components/overlay-stack';\nimport FocusTrap from 'focus-trap-react';\nimport { useCompactLayout } from '$hooks/useScreenSize';\nimport { stopPropagation } from '$utils/keyboard';\nimport { useDismissOnBack } from '$utils/androidBack';\nimport { MobileSheetFocusTrap, MobileSwipeDownModal } from './MobileSwipeDownModal';\nimport * as css from './ResponsiveMenu.css';\n\ntype ComponentPosition = 'Top' | 'Right' | 'Bottom' | 'Left';\ntype ComponentAlign = 'Start' | 'Center' | 'End';\ntype FocusTrapOptions = NonNullable<ComponentProps<typeof FocusTrap>['focusTrapOptions']>;\n\ntype ResponsiveMenuProps = {\n  anchor: RectCords | undefined;\n  open?: boolean;\n  requestClose: () => void;\n  menu: ReactNode;\n  /** The element the menu hangs off on desktop. */\n  children?: ReactNode;\n  position?: ComponentPosition;\n  align?: ComponentAlign;\n  offset?: number;\n  alignOffset?: number;\n  /** Set true for menus whose trigger should regain focus when they close. */\n  returnFocusOnDeactivate?: boolean;\n  /** `both` also maps Left/Right, for menus laid out horizontally. */\n  arrowNavigation?: 'vertical' | 'both';\n  /** How the menu shows on mobile: a bottom sheet, or a centred dialog for\n   *  option pickers, which a sheet makes look like an action menu. */\n  mobile?: 'sheet' | 'dialog' | 'inline-dialog';\n  surfaceColor?: string;\n  overlayDragHandle?: boolean;\n};\n\nfunction MenuDialog({\n  requestClose,\n  focusTrapOptions,\n  children,\n}: {\n  requestClose: () => void;\n  focusTrapOptions: FocusTrapOptions;\n  children: ReactNode;\n}) {\n  // Android back closes the dialog instead of navigating away.\n  useDismissOnBack(requestClose);\n\n  return (\n    // The focus trap allows an outside tap on mobile but never deactivates on\n    // it. OverlayCenter, not the backdrop, is what the tap lands on: it fills\n    // the overlay and paints over it.\n    <Overlay open backdrop={<OverlayBackdrop />}>\n      <OverlayCenter role=\"presentation\" onClick={requestClose}>\n        <FocusTrap focusTrapOptions={focusTrapOptions}>\n          <Box\n            direction=\"Column\"\n            role=\"dialog\"\n            aria-modal=\"true\"\n            className={css.DialogContent}\n            onClick={(evt) => evt.stopPropagation()}\n          >\n            {children}\n          </Box>\n        </FocusTrap>\n      </OverlayCenter>\n    </Overlay>\n  );\n}\n\nfunction InlineMenuDialog({\n  anchor,\n  requestClose,\n  focusTrapOptions,\n  children,\n}: {\n  anchor: RectCords;\n  requestClose: () => void;\n  focusTrapOptions: FocusTrapOptions;\n  children: ReactNode;\n}) {\n  useDismissOnBack(requestClose);\n  const zIndex = useOverlayLayer();\n\n  const [viewport, setViewport] = useState(() => ({\n    width: window.innerWidth,\n    height: window.innerHeight,\n  }));\n  useEffect(() => {\n    const handleResize = () =>\n      setViewport({ width: window.innerWidth, height: window.innerHeight });\n    window.addEventListener('resize', handleResize);\n    return () => window.removeEventListener('resize', handleResize);\n  }, []);\n\n  const maxHeight = Math.round(viewport.height * 0.75);\n\n  return (\n    <FocusTrap focusTrapOptions={focusTrapOptions}>\n      <Box\n        style={{ position: 'fixed', inset: 0, zIndex, background: 'transparent' }}\n        onClick={requestClose}\n      >\n        <Box\n          direction=\"Column\"\n          role=\"dialog\"\n          aria-modal=\"true\"\n          style={{\n            width: 'fit-content',\n            maxWidth: `${viewport.width - 16}px`,\n            maxHeight: `${maxHeight}px`,\n            overflow: 'auto',\n            borderRadius: '20px',\n            position: 'absolute',\n            top: Math.min(\n              Math.max(8, anchor.y + anchor.height + 8),\n              Math.max(8, viewport.height - maxHeight - 8)\n            ),\n            right: Math.max(8, viewport.width - anchor.x - anchor.width),\n          }}\n          onClick={(event) => event.stopPropagation()}\n        >\n          {children}\n        </Box>\n      </Box>\n    </FocusTrap>\n  );\n}\n\n/**\n * A menu that hangs off its trigger on desktop and rises as a bottom sheet on\n * mobile, where a popout anchored to a tiny target is hard to hit and easy to\n * dismiss by accident.\n */\nexport function ResponsiveMenu({\n  anchor,\n  open,\n  requestClose,\n  menu,\n  children,\n  position = 'Bottom',\n  align = 'End',\n  offset,\n  alignOffset,\n  returnFocusOnDeactivate = false,\n  arrowNavigation = 'vertical',\n  mobile = 'sheet',\n  surfaceColor,\n  overlayDragHandle = false,\n}: ResponsiveMenuProps) {\n  const isMobile = useCompactLayout();\n  const isOpen = open ?? !!anchor;\n\n  const isKeyForward = (evt: KeyboardEvent) =>\n    evt.key === 'ArrowDown' || (arrowNavigation === 'both' && evt.key === 'ArrowRight');\n  const isKeyBackward = (evt: KeyboardEvent) =>\n    evt.key === 'ArrowUp' || (arrowNavigation === 'both' && evt.key === 'ArrowLeft');\n\n  const focusTrapOptions: FocusTrapOptions = {\n    initialFocus: false,\n    fallbackFocus: () => document.body,\n    returnFocusOnDeactivate,\n    onDeactivate: requestClose,\n    clickOutsideDeactivates: !isMobile,\n    allowOutsideClick: isMobile,\n    isKeyForward,\n    isKeyBackward,\n    escapeDeactivates: stopPropagation,\n  };\n\n  if (isMobile) {\n    if (mobile === 'inline-dialog') {\n      return (\n        <>\n          {children}\n          {isOpen && anchor && (\n            <InlineMenuDialog\n              anchor={anchor}\n              requestClose={requestClose}\n              focusTrapOptions={focusTrapOptions}\n            >\n              {menu}\n            </InlineMenuDialog>\n          )}\n        </>\n      );\n    }\n\n    const sheetStyle: CSSProperties | undefined = surfaceColor\n      ? { backgroundColor: surfaceColor }\n      : undefined;\n\n    return (\n      <>\n        {children}\n        {isOpen && mobile === 'dialog' && (\n          <MenuDialog requestClose={requestClose} focusTrapOptions={focusTrapOptions}>\n            {menu}\n          </MenuDialog>\n        )}\n        {isOpen && mobile === 'sheet' && (\n          <MobileSwipeDownModal\n            requestClose={requestClose}\n            sheetStyle={sheetStyle}\n            overlayDragHandle={overlayDragHandle}\n          >\n            {() => (\n              <MobileSheetFocusTrap\n                focusTrapOptions={{\n                  ...focusTrapOptions,\n                  // The backdrop owns tap-to-dismiss. Left to focus-trap, the\n                  // mousedown synthesised when a long press is released lands on\n                  // the backdrop and reads as a click outside.\n                  clickOutsideDeactivates: false,\n                  allowOutsideClick: true,\n                }}\n              >\n                <Box\n                  direction=\"Column\"\n                  role=\"dialog\"\n                  aria-modal=\"true\"\n                  className={css.SheetContent}\n                >\n                  {menu}\n                </Box>\n              </MobileSheetFocusTrap>\n            )}\n          </MobileSwipeDownModal>\n        )}\n      </>\n    );\n  }\n\n  return (\n    <PopOut\n      aria-expanded={!!anchor}\n      anchor={anchor}\n      position={position}\n      align={align}\n      offset={offset}\n      alignOffset={alignOffset}\n      content={\n        // Gated so a call site that builds its menu inline does that work on open,\n        // not on every render of the trigger.\n        anchor ? <FocusTrap focusTrapOptions={focusTrapOptions}>{menu}</FocusTrap> : null\n      }\n    >\n      {children}\n    </PopOut>\n  );\n}\n","import { useRef, useCallback, useEffect, useState } from 'react';\n\nconst MOVE_TOLERANCE = 16;\n\nexport function useMobileLongPress(callback: () => void, delay = 500) {\n  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const callbackRef = useRef(callback);\n  const firedRef = useRef(false);\n  const [isPressing, setIsPressing] = useState(false);\n  const startY = useRef<number | null>(null);\n  const startX = useRef<number | null>(null);\n\n  callbackRef.current = callback;\n\n  const clear = useCallback(() => {\n    if (timerRef.current !== null) {\n      clearTimeout(timerRef.current);\n      timerRef.current = null;\n    }\n    if (!firedRef.current) {\n      setIsPressing(false);\n    }\n    startY.current = null;\n    startX.current = null;\n  }, []);\n\n  useEffect(\n    () => () => {\n      if (timerRef.current !== null) clearTimeout(timerRef.current);\n    },\n    []\n  );\n\n  const onTouchStart = useCallback(\n    (e: React.TouchEvent | TouchEvent) => {\n      clear();\n      firedRef.current = false;\n      const touch = 'touches' in e && e.touches.length === 1 ? e.touches[0] : undefined;\n      if (!touch) return;\n\n      setIsPressing(true);\n      startY.current = touch.clientY;\n      startX.current = touch.clientX;\n\n      timerRef.current = setTimeout(() => {\n        timerRef.current = null;\n        firedRef.current = true;\n        setIsPressing(false);\n        callbackRef.current();\n      }, delay);\n    },\n    [clear, delay]\n  );\n\n  const onTouchEnd = useCallback(() => {\n    clear();\n  }, [clear]);\n\n  const onTouchMove = useCallback(\n    (e: React.TouchEvent | TouchEvent) => {\n      if (\n        startY.current === null ||\n        startX.current === null ||\n        !('touches' in e) ||\n        !e.touches[0]\n      ) {\n        clear();\n        return;\n      }\n      const diffY = Math.abs(e.touches[0].clientY - startY.current);\n      const diffX = Math.abs(e.touches[0].clientX - startX.current);\n\n      if (diffY > MOVE_TOLERANCE || diffX > MOVE_TOLERANCE) {\n        clear();\n      }\n    },\n    [clear]\n  );\n\n  const onTouchCancel = useCallback(() => clear(), [clear]);\n\n  return { onTouchStart, onTouchEnd, onTouchMove, onTouchCancel, firedRef, isPressing };\n}\n","import type { MouseEventHandler, TouchEvent as ReactTouchEvent } from 'react';\nimport { useCallback, useRef, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport { getMouseEventCords } from '$utils/dom';\nimport { useMobileLongPress } from './useMobileLongPress';\n\ntype TriggerProps<T extends HTMLElement> = {\n  onClick: MouseEventHandler<T>;\n  onContextMenu: MouseEventHandler<T>;\n  onTouchStart: (evt: ReactTouchEvent<T>) => void;\n  onTouchEnd: () => void;\n  onTouchMove: (evt: ReactTouchEvent<T>) => void;\n  onTouchCancel: () => void;\n};\n\nexport type MenuAnchor<T extends HTMLElement> = {\n  anchor: RectCords | undefined;\n  /** Drives the press-feedback highlight while a long press is in progress. */\n  isPressing: boolean;\n  close: () => void;\n  /** Toggles the menu on an element's box. Click semantics: press again to close. */\n  openAt: (element: HTMLElement) => void;\n  /** Anchors the menu to an element's box without ever closing it. */\n  open: (element: HTMLElement) => void;\n  /** Click, right-click and long-press wiring for the trigger element. */\n  triggerProps: TriggerProps<T>;\n  /** True once if a long press just fired, for callers that own their contextmenu handler. */\n  consumeLongPressFired: () => boolean;\n};\n\ntype MenuAnchorOptions = {\n  /** Replaces the default \"open at the trigger\", for triggers that show their own surface. */\n  onLongPress?: () => void;\n};\n\n/**\n * Owns the anchor state behind a menu and gives its trigger a touch path, so a\n * menu is never reachable by right-click alone.\n */\nexport function useMenuAnchor<T extends HTMLElement = HTMLElement>(\n  options?: MenuAnchorOptions\n): MenuAnchor<T> {\n  const [anchor, setAnchor] = useState<RectCords>();\n  const triggerRef = useRef<T | null>(null);\n  const onLongPress = options?.onLongPress;\n\n  const close = useCallback(() => setAnchor(undefined), []);\n\n  const openAt = useCallback((element: HTMLElement) => {\n    const cords = element.getBoundingClientRect();\n    setAnchor((current) => (current ? undefined : cords));\n  }, []);\n\n  const open = useCallback((element: HTMLElement) => {\n    setAnchor(element.getBoundingClientRect());\n  }, []);\n\n  const longPress = useMobileLongPress(() => {\n    if (onLongPress) {\n      onLongPress();\n      return;\n    }\n    // The platform fires its own contextmenu at roughly this delay, and whichever\n    // lands first opens the menu. Opening, not toggling: a toggle would shut the\n    // menu that contextmenu just opened.\n    if (triggerRef.current) open(triggerRef.current);\n  });\n\n  const consumeLongPressFired = useCallback(() => {\n    longPress.onTouchCancel();\n    if (!longPress.firedRef.current) return false;\n    longPress.firedRef.current = false;\n    return true;\n  }, [longPress]);\n\n  const onClick: MouseEventHandler<T> = useCallback(\n    (evt) => {\n      // The long-press timer already opened it; the synthetic click would toggle it shut.\n      // Clearing here matters on mouse input, where no further touchstart resets it.\n      if (longPress.firedRef.current) {\n        longPress.firedRef.current = false;\n        return;\n      }\n      openAt(evt.currentTarget);\n    },\n    [longPress, openAt]\n  );\n\n  const onContextMenu: MouseEventHandler<T> = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      longPress.onTouchCancel();\n      // The long-press timer already opened it; a synthetic contextmenu would toggle it shut.\n      if (longPress.firedRef.current) {\n        longPress.firedRef.current = false;\n        return;\n      }\n      // Call sites key align/offset on `width === 0` to lay out from the cursor.\n      // Assigning, not toggling: nested handlers fire this twice as the event bubbles.\n      setAnchor(getMouseEventCords(evt.nativeEvent));\n    },\n    [longPress]\n  );\n\n  const onTouchStart = useCallback(\n    (evt: ReactTouchEvent<T>) => {\n      triggerRef.current = evt.currentTarget;\n      longPress.onTouchStart(evt);\n    },\n    [longPress]\n  );\n\n  return {\n    anchor,\n    isPressing: longPress.isPressing,\n    consumeLongPressFired,\n    close,\n    openAt,\n    open,\n    triggerProps: {\n      onClick,\n      onContextMenu,\n      onTouchStart,\n      onTouchEnd: longPress.onTouchEnd,\n      onTouchMove: longPress.onTouchMove,\n      onTouchCancel: longPress.onTouchCancel,\n    },\n  };\n}\n","import { useEffect, useRef } from 'react';\nimport {\n  clearNativeCallLocalVideoOverlay,\n  clearNativeCallRemoteVideoOverlay,\n  setNativeCallLocalVideoOverlay,\n  setNativeCallRemoteVideoOverlay,\n} from '@sableclient/tauri-plugin-livekit-mobile';\n\nexport type OverlayTarget = {\n  participantIdentity: string;\n  trackId: string;\n};\n\n/** Detect overlays that do not change the slot's geometry. */\nexport function nativeSlotOccluded(slotNode: HTMLDivElement, rect: DOMRect): boolean {\n  const cx = rect.x + rect.width / 2;\n  const cy = rect.y + rect.height / 2;\n  if (cx < 0 || cy < 0 || cx > window.innerWidth || cy > window.innerHeight) return true;\n  const topElement = document.elementFromPoint(cx, cy);\n  return topElement === null || (topElement !== slotNode && !slotNode.contains(topElement));\n}\n\nexport type OverlayGeometry = {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  devicePixelRatio: number;\n};\n\nexport function useNativeVideoOverlay(\n  callId: string,\n  active: boolean,\n  slotNode: HTMLDivElement | null,\n  set: (callId: string, geometry: OverlayGeometry) => Promise<unknown>,\n  clear: (callId: string) => Promise<unknown>\n): void {\n  const bridgeRef = useRef({ set, clear });\n  bridgeRef.current = { set, clear };\n\n  useEffect(() => {\n    if (!active || !slotNode) return undefined;\n\n    let lastGeometryKey = '';\n    const report = () => {\n      // Never tear down the overlay while the page is hidden (e.g. PiP owns the\n      // layer during backgrounding).\n      if (document.visibilityState !== 'visible') return;\n      const rect = slotNode.getBoundingClientRect();\n      // Slot hidden, outside the viewport (display:none page, scrolled away), or\n      // occluded by an overlaying page/drawer: hide the native overlay too,\n      // otherwise it stays painted at a stale position over unrelated content.\n      const hidden =\n        rect.width <= 0 ||\n        rect.height <= 0 ||\n        rect.right < 0 ||\n        rect.bottom < 0 ||\n        rect.left > window.innerWidth ||\n        rect.top > window.innerHeight ||\n        nativeSlotOccluded(slotNode, rect);\n      if (hidden) {\n        if (lastGeometryKey !== '') {\n          lastGeometryKey = '';\n          void bridgeRef.current.clear(callId).catch(() => undefined);\n        }\n        return;\n      }\n      const geometryKey = `${Math.round(rect.x)},${Math.round(rect.y)},${Math.round(rect.width)},${Math.round(rect.height)}`;\n      if (geometryKey === lastGeometryKey) return;\n      lastGeometryKey = geometryKey;\n      void bridgeRef.current\n        .set(callId, {\n          x: rect.x,\n          y: rect.y,\n          width: rect.width,\n          height: rect.height,\n          devicePixelRatio: window.devicePixelRatio || 1,\n        })\n        .catch(() => undefined);\n    };\n\n    report();\n    const resizeObserver = new ResizeObserver(report);\n    resizeObserver.observe(slotNode);\n    // Fires during slide transitions (transforms move the slot without any\n    // scroll/resize event), which is how recovery after a room change works.\n    const intersectionObserver = new IntersectionObserver(report, {\n      threshold: [0, 0.25, 0.5, 0.75, 1],\n    });\n    intersectionObserver.observe(slotNode);\n    window.addEventListener('resize', report);\n    // Scroll is the dominant rect-changing event: any nested scroll container\n    // moves the slot without resizing it. Capture phase reaches scrolls from\n    // nested containers, which don't bubble.\n    document.addEventListener('scroll', report, { capture: true, passive: true });\n    const mutationObserver = new MutationObserver(report);\n    mutationObserver.observe(document.body, {\n      childList: true,\n      subtree: true,\n      attributes: true,\n      attributeFilter: ['class', 'style'],\n    });\n    return () => {\n      resizeObserver.disconnect();\n      intersectionObserver.disconnect();\n      window.removeEventListener('resize', report);\n      document.removeEventListener('scroll', report, { capture: true });\n      mutationObserver.disconnect();\n    };\n  }, [callId, active, slotNode]);\n\n  // No eligible target (camera muted/unpublished, reconnecting, error): the\n  // overlay must not linger over the tile grid.\n  useEffect(() => {\n    if (active) return;\n    void bridgeRef.current.clear(callId).catch(() => undefined);\n  }, [callId, active]);\n\n  useEffect(\n    () => () => {\n      // Unmount safety: a stale callId is a native no-op.\n      void bridgeRef.current.clear(callId).catch(() => undefined);\n    },\n    [callId]\n  );\n}\n\nexport const setRemoteOverlay = (\n  target: OverlayTarget,\n  callId: string,\n  geometry: OverlayGeometry\n): Promise<unknown> => setNativeCallRemoteVideoOverlay({ callId, ...target, ...geometry });\n\nexport const clearRemoteOverlay = (callId: string): Promise<unknown> =>\n  clearNativeCallRemoteVideoOverlay({ callId });\n\nexport const setLocalOverlay = (callId: string, geometry: OverlayGeometry): Promise<unknown> =>\n  setNativeCallLocalVideoOverlay({ callId, ...geometry });\n\nexport const clearLocalOverlay = (callId: string): Promise<unknown> =>\n  clearNativeCallLocalVideoOverlay({ callId });\n","import { useMemo } from 'react';\nimport { atom, useAtomValue } from 'jotai';\nimport { matchPath, useLocation, useParams } from 'react-router';\nimport { getCanonicalAliasRoomId, isRoomAlias } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { resolveSection } from '$pages/pathUtils';\nimport { lastVisitedRoomSectionAtom } from '$state/room/lastRoom';\n\nexport const useSelectedRoom = (): string | undefined => {\n  const mx = useMatrixClient();\n\n  const { roomIdOrAlias: encodedRoomIdOrAlias } = useParams();\n  const roomIdOrAlias = encodedRoomIdOrAlias && decodeURIComponent(encodedRoomIdOrAlias);\n  const roomId =\n    roomIdOrAlias && isRoomAlias(roomIdOrAlias)\n      ? getCanonicalAliasRoomId(mx, roomIdOrAlias)\n      : roomIdOrAlias;\n\n  return roomId;\n};\n\nconst emptyLastRoomAtom = atom<string | undefined>(undefined);\n\nexport const useSelectedOrLastRoom = (): string | undefined => {\n  const selectedRoomId = useSelectedRoom();\n  const location = useLocation();\n\n  const section = resolveSection(location.pathname);\n  const listMatch = section && matchPath({ path: section.listPath, end: true }, location.pathname);\n\n  const sectionKey = section?.key;\n  const sectionAtom = useMemo(\n    () => (sectionKey ? lastVisitedRoomSectionAtom(sectionKey) : emptyLastRoomAtom),\n    [sectionKey]\n  );\n  const lastRoomId = useAtomValue(sectionAtom);\n\n  if (selectedRoomId) return selectedRoomId;\n\n  return listMatch ? lastRoomId : undefined;\n};\n","import type {\n  LivekitJsControllerFailure,\n  LivekitJsControllerLifecycle,\n} from '@sableclient/matrixrtc';\nimport type { NativeCallLifecycle } from '$state/nativeCall';\n\ntype CallPhase = 'idle' | 'connecting' | 'connected' | 'reconnecting' | 'stopping' | 'failed';\n\nexport type CallStatusView = {\n  phase: CallPhase;\n  statusLabel: string;\n  error?: string;\n};\n\nconst livekitJsLifecycleLabels: Record<LivekitJsControllerLifecycle, string> = {\n  idle: 'Idle',\n  'joining-matrix': 'Joining call',\n  provisioning: 'Preparing call',\n  'connecting-livekit': 'Connecting',\n  active: 'Connected',\n  stopping: 'Ending call',\n  failed: 'Call failed',\n};\n\nconst livekitJsFailureMessages: Record<LivekitJsControllerFailure, string> = {\n  'e2ee-unsupported': 'Encrypted calls are not supported on this device.',\n  'e2ee-import-failed': 'Could not set up call encryption.',\n  'setup-failed': 'Could not connect to the call.',\n};\n\nexport const nativeCallLifecycleLabels: Record<NativeCallLifecycle, string> = {\n  starting: 'Starting call',\n  connecting: 'Connecting',\n  connected: 'Connected',\n  reconnecting: 'Reconnecting',\n  error: 'Call failed',\n};\n\nfunction livekitJsPhase(lifecycle: LivekitJsControllerLifecycle): CallPhase {\n  switch (lifecycle) {\n    case 'idle':\n      return 'idle';\n    case 'active':\n      return 'connected';\n    case 'stopping':\n      return 'stopping';\n    case 'failed':\n      return 'failed';\n    default:\n      // joining-matrix, provisioning, connecting-livekit are all \"connecting\".\n      return 'connecting';\n  }\n}\n\nfunction nativePhase(lifecycle: NativeCallLifecycle): CallPhase {\n  switch (lifecycle) {\n    case 'connected':\n      return 'connected';\n    case 'reconnecting':\n      return 'reconnecting';\n    case 'error':\n      return 'failed';\n    default:\n      // starting, connecting are both \"connecting\".\n      return 'connecting';\n  }\n}\n\nexport function livekitJsCallStatus(session: {\n  lifecycle: LivekitJsControllerLifecycle;\n  failure: LivekitJsControllerFailure | null;\n}): CallStatusView {\n  return {\n    phase: livekitJsPhase(session.lifecycle),\n    statusLabel: livekitJsLifecycleLabels[session.lifecycle],\n    error: session.failure ? livekitJsFailureMessages[session.failure] : undefined,\n  };\n}\n\nexport function nativeCallStatus(session: {\n  lifecycle: NativeCallLifecycle;\n  error?: string;\n}): CallStatusView {\n  return {\n    phase: nativePhase(session.lifecycle),\n    statusLabel: nativeCallLifecycleLabels[session.lifecycle],\n    error: session.error,\n  };\n}\n","import {\n  type CallParticipant,\n  type CallTrack,\n  type UserIdByRtcIdentity,\n  buildRtcIdentityMap,\n} from '@sableclient/matrixrtc';\nimport { type ReactNode, useEffect, useMemo, useState } from 'react';\nimport { Box, config, Menu, MenuItem, Text, toRem } from 'folds';\nimport type { NativeCallSession } from '$state/nativeCall';\nimport {\n  ArrowsClockwise,\n  Check,\n  MicrophoneSlash,\n  PhoneDisconnect,\n  ScreenShare,\n  SpeakerHigh,\n  VideoCameraSlash,\n  sizedIcon,\n} from '$components/icons/phosphor';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { type NativeCallAudioRoute } from '@sableclient/tauri-plugin-livekit-mobile';\nimport {\n  clearLocalOverlay,\n  clearRemoteOverlay,\n  setLocalOverlay,\n  setRemoteOverlay,\n  useNativeVideoOverlay,\n} from './nativeVideoOverlay';\nimport { useCallMembers, useCallSession } from '$hooks/useCall';\nimport { useRoom } from '$hooks/useRoom';\nimport { useSelectedRoom } from '$hooks/router/useSelectedRoom';\nimport { CallParticipantAvatar, useCallParticipantProfile } from './LivekitCallParticipant';\nimport { CallControlBar, CallLayout, CallMediaControls, CallStatusBar } from './callChrome';\nimport { controlButton } from './callChrome.css';\nimport { nativeCallLifecycleLabels, nativeCallStatus } from './callClient';\nimport * as css from './NativeCallSurface.css';\n\nexport type NativeCallSurfaceProps = {\n  session: NativeCallSession;\n  onHangup: () => void;\n};\n\nfunction LocalTile({\n  session,\n  userIdByIdentity,\n  slotRef,\n  fixed,\n}: {\n  session: NativeCallSession;\n  userIdByIdentity: UserIdByRtcIdentity;\n  slotRef?: (node: HTMLDivElement | null) => void;\n  fixed?: boolean;\n}) {\n  const profile = useCallParticipantProfile('', true, userIdByIdentity);\n\n  return (\n    <div\n      className={fixed ? `${css.Tile} ${css.TileFixed}` : css.Tile}\n      data-video-bound={session.cameraEnabled || undefined}\n    >\n      {/* When the camera is on, the native local preview renders over this\n          slot; the avatar stays mounted underneath as the placeholder. */}\n      <div className={css.TileSlot} ref={slotRef}>\n        <div className={css.InitialsBadge} aria-hidden>\n          <CallParticipantAvatar profile={profile} size=\"100%\" />\n        </div>\n      </div>\n      <div className={css.TileLabel}>\n        {!session.microphoneEnabled && (\n          <span aria-label=\"Microphone off\" style={{ display: 'inline-flex', flexShrink: 0 }}>\n            {sizedIcon(MicrophoneSlash, '200')}\n          </span>\n        )}\n        <span className={css.TileLabelName}>You</span>\n      </div>\n    </div>\n  );\n}\n\nconst isLive = (track: CallTrack | undefined): boolean =>\n  track !== undefined && track.subscribed && !track.muted;\n\nfunction MicrophoneOff() {\n  return (\n    <span aria-label=\"Microphone off\" style={{ display: 'inline-flex', flexShrink: 0 }}>\n      {sizedIcon(MicrophoneSlash, '200')}\n    </span>\n  );\n}\n\ntype RemoteTileProps = {\n  participant: CallParticipant;\n  userIdByIdentity: UserIdByRtcIdentity;\n  videoBound: boolean;\n  sharingScreen?: boolean;\n  slotRef?: (node: HTMLDivElement | null) => void;\n  fixed?: boolean;\n};\n\nfunction RemoteTile({\n  participant,\n  userIdByIdentity,\n  videoBound,\n  sharingScreen,\n  slotRef,\n  fixed,\n}: RemoteTileProps) {\n  const profile = useCallParticipantProfile(participant.identity, false, userIdByIdentity);\n  return (\n    <div\n      className={fixed ? `${css.Tile} ${css.TileFixed}` : css.Tile}\n      data-video-bound={videoBound || undefined}\n    >\n      {/* When video is bound, the native view renders exactly over this slot;\n          the avatar stays mounted underneath as the pre-video placeholder. */}\n      <div className={css.TileSlot} ref={slotRef}>\n        <div className={css.InitialsBadge} aria-hidden>\n          <CallParticipantAvatar profile={profile} size=\"100%\" />\n        </div>\n      </div>\n      <div className={css.TileLabel}>\n        <QualityDot quality={participant.connectionQuality} />\n        {participant.microphone?.muted && <MicrophoneOff />}\n        {participant.camera?.muted && (\n          <span aria-label=\"Camera off\" style={{ display: 'inline-flex', flexShrink: 0 }}>\n            {sizedIcon(VideoCameraSlash, '200')}\n          </span>\n        )}\n        <span className={css.TileLabelName}>\n          {sharingScreen ? `${profile.name}'s screen` : profile.name}\n        </span>\n      </div>\n    </div>\n  );\n}\n\n/** Output picker. Stays mounted on an empty list; unmounting on that took the\n * open menu down with it. */\nfunction AudioRouteControl({\n  session,\n  onMenuOpenChange,\n}: {\n  session: NativeCallSession;\n  onMenuOpenChange: (open: boolean) => void;\n}) {\n  const menu = useMenuAnchor<HTMLButtonElement>();\n  const [routes, setRoutes] = useState<NativeCallAudioRoute[]>([]);\n  const open = menu.anchor !== undefined;\n\n  useEffect(() => {\n    let disposed = false;\n    const load = async () => {\n      const next = await session.listAudioRoutes();\n      if (!disposed) setRoutes(next);\n    };\n    void load();\n    return () => {\n      disposed = true;\n    };\n  }, [session]);\n\n  // The native video view sits above the webview, so it would paint over this\n  // menu. Report the open state so the surface can drop the overlay while it is\n  // up, the same way an occluding drawer does.\n  useEffect(() => {\n    onMenuOpenChange(open);\n    return () => onMenuOpenChange(false);\n  }, [open, onMenuOpenChange]);\n\n  return (\n    <ResponsiveMenu\n      anchor={menu.anchor}\n      requestClose={menu.close}\n      position=\"Top\"\n      align=\"Center\"\n      mobile=\"dialog\"\n      menu={\n        <Menu>\n          <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n            {routes.length === 0 && (\n              <Box style={{ padding: config.space.S200 }}>\n                <Text size=\"T300\">No other audio outputs</Text>\n              </Box>\n            )}\n            {routes.map((route) => (\n              <MenuItem\n                key={route.id}\n                size=\"300\"\n                radii=\"300\"\n                variant=\"Surface\"\n                aria-checked={route.current}\n                before={\n                  route.current ? sizedIcon(Check, '200') : <span style={{ width: toRem(16) }} />\n                }\n                onClick={() => {\n                  void session.selectAudioRoute(route.id);\n                  menu.close();\n                }}\n              >\n                <Text size=\"T300\">{route.name}</Text>\n              </MenuItem>\n            ))}\n          </Box>\n        </Menu>\n      }\n    >\n      <button\n        type=\"button\"\n        className={controlButton}\n        data-on\n        aria-label=\"Audio output\"\n        title=\"Audio output\"\n        onClick={(evt) => {\n          // The native video layer sits above the webview; drop it before the\n          // menu paints, not after the open state commits.\n          onMenuOpenChange(true);\n          // Routes change when a headset is plugged in, so refresh on open.\n          const refresh = async () => setRoutes(await session.listAudioRoutes());\n          void refresh();\n          menu.openAt(evt.currentTarget);\n        }}\n      >\n        {sizedIcon(SpeakerHigh, '300')}\n      </button>\n    </ResponsiveMenu>\n  );\n}\n\nconst qualityLabels: Record<string, string> = {\n  excellent: 'Excellent connection',\n  good: 'Good connection',\n  poor: 'Poor connection',\n  lost: 'Connection lost',\n  unknown: 'Connection quality unknown',\n};\n\n/** The dot carries state through colour alone, so it needs its own label. */\nfunction QualityDot({ quality }: { quality: string | undefined }) {\n  const value = quality ?? 'unknown';\n  return (\n    <span\n      className={css.QualityDot}\n      data-quality={value}\n      role=\"img\"\n      aria-label={qualityLabels[value] ?? qualityLabels.unknown}\n    />\n  );\n}\n\nfunction RemoteDominantLabel({\n  participant,\n  userIdByIdentity,\n  sharingScreen,\n}: {\n  participant: CallParticipant;\n  userIdByIdentity: UserIdByRtcIdentity;\n  sharingScreen?: boolean;\n}) {\n  const profile = useCallParticipantProfile(participant.identity, false, userIdByIdentity);\n  return (\n    <>\n      <QualityDot quality={participant.connectionQuality} />\n      {participant.microphone?.muted && <MicrophoneOff />}\n      {participant.camera?.muted && (\n        <span aria-label=\"Camera off\" style={{ display: 'inline-flex', flexShrink: 0 }}>\n          {sizedIcon(VideoCameraSlash, '200')}\n        </span>\n      )}\n      <span className={css.TileLabelName}>\n        {sharingScreen ? `${profile.name}'s screen` : profile.name}\n      </span>\n    </>\n  );\n}\n\nfunction RemoteDominantPlaceholder({\n  participant,\n  userIdByIdentity,\n}: {\n  participant: CallParticipant;\n  userIdByIdentity: UserIdByRtcIdentity;\n}) {\n  const profile = useCallParticipantProfile(participant.identity, false, userIdByIdentity, 192);\n  return <CallParticipantAvatar profile={profile} size=\"100%\" />;\n}\n\n/** Full-stage tile for a lone participant. */\nfunction DominantTile({\n  slotRef,\n  videoBound,\n  placeholder,\n  label,\n}: {\n  slotRef?: (node: HTMLDivElement | null) => void;\n  videoBound?: boolean;\n  placeholder: ReactNode;\n  label: ReactNode;\n}) {\n  return (\n    <div className={css.DominantTile} data-video-bound={videoBound || undefined}>\n      {/* The slot's rect is what JS reports to the native video overlay; the\n          placeholder stays mounted underneath as the pre-video fallback. */}\n      <div className={css.TileSlot} ref={slotRef}>\n        <div className={css.InitialsBadge} aria-hidden>\n          {placeholder}\n        </div>\n      </div>\n      <div className={css.TileLabel}>{label}</div>\n    </div>\n  );\n}\n\nexport function NativeCallSurface({ session, onHangup }: NativeCallSurfaceProps) {\n  const capabilities = session.capabilities ?? {\n    camera: true,\n    screenShare: Boolean(session.setScreenShareEnabled),\n    pictureInPicture: true,\n    audioRoutes: true,\n  };\n  const { setScreenShareEnabled } = session;\n  const isError = session.lifecycle === 'error';\n  const connected = session.lifecycle === 'connected';\n  const remoteParticipants = session.participants;\n  const matrixRoom = useRoom();\n  const callSession = useCallSession(matrixRoom);\n  const callMembers = useCallMembers(matrixRoom, callSession);\n  const userIdByIdentity = useMemo(() => buildRtcIdentityMap(callMembers), [callMembers]);\n  const localProfile = useCallParticipantProfile('', true, userIdByIdentity, 192);\n\n  // A shared screen is the thing people are actually looking at, so it\n  // outranks any camera.\n  const sharing = useMemo(\n    () => remoteParticipants.find((participant) => isLive(participant.screenShare)),\n    [remoteParticipants]\n  );\n\n  const featured = useMemo(() => {\n    if (sharing?.screenShare) {\n      return { participantIdentity: sharing.identity, trackId: sharing.screenShare.id };\n    }\n    const onCamera = remoteParticipants.find((participant) => isLive(participant.camera));\n    if (!onCamera?.camera) return undefined;\n    return { participantIdentity: onCamera.identity, trackId: onCamera.camera.id };\n  }, [remoteParticipants, sharing]);\n\n  // The room page stays mounted for the whole mobile slide-out transition, so\n  // geometry alone leaves the native video painted over the outgoing page until\n  // the slot finally clears the viewport. Route selection flips when the\n  // transition starts, which is the earliest honest \"no longer on screen\".\n  const selectedRoom = useSelectedRoom();\n  const [routeMenuOpen, setRouteMenuOpen] = useState(false);\n  const overlayActive = connected && selectedRoom === session.roomId && !routeMenuOpen;\n\n  const [slotNode, setSlotNode] = useState<HTMLDivElement | null>(null);\n  useNativeVideoOverlay(\n    session.callId,\n    overlayActive && featured !== undefined,\n    slotNode,\n    (callId, geometry) =>\n      featured ? setRemoteOverlay(featured, callId, geometry) : Promise.resolve(),\n    clearRemoteOverlay\n  );\n\n  const [localSlotNode, setLocalSlotNode] = useState<HTMLDivElement | null>(null);\n  useNativeVideoOverlay(\n    session.callId,\n    overlayActive && session.cameraEnabled,\n    localSlotNode,\n    setLocalOverlay,\n    clearLocalOverlay\n  );\n\n  const remoteCount = remoteParticipants.length;\n  // Total tiles once the local self-tile joins the grid. 7+ switches the grid\n  // to its compact, scrollable three-column variant.\n  const tileCount = remoteCount + 1;\n  const compactGrid = tileCount > 6;\n\n  // Two-person layout: the remote owns the stage and is video-bound here\n  // whenever its camera is the featured track.\n  const duoRemote = remoteCount === 1 ? remoteParticipants[0] : undefined;\n  const duoLive =\n    duoRemote !== undefined && connected && featured?.participantIdentity === duoRemote.identity;\n\n  if (isError) {\n    return (\n      <CallLayout stack style={{ color: '#ffffff' }}>\n        <CallStatusBar status={nativeCallStatus(session)} onHangup={onHangup} />\n      </CallLayout>\n    );\n  }\n\n  return (\n    <CallLayout stack style={{ color: '#ffffff' }}>\n      {!connected && (\n        <div\n          className={css.StatusRow}\n          role={session.lifecycle === 'reconnecting' ? 'alert' : 'status'}\n        >\n          <Text as=\"span\" size=\"T300\" style={{ color: 'rgba(255, 255, 255, 0.72)' }}>\n            {nativeCallLifecycleLabels[session.lifecycle]}\n          </Text>\n        </div>\n      )}\n      {duoRemote ? (\n        <div className={css.DominantStage}>\n          <DominantTile\n            videoBound={duoLive}\n            slotRef={duoLive ? setSlotNode : undefined}\n            placeholder={\n              <RemoteDominantPlaceholder\n                participant={duoRemote}\n                userIdByIdentity={userIdByIdentity}\n              />\n            }\n            label={\n              <RemoteDominantLabel\n                participant={duoRemote}\n                userIdByIdentity={userIdByIdentity}\n                sharingScreen={duoLive && sharing?.identity === duoRemote.identity}\n              />\n            }\n          />\n          <div className={css.FloatingLocal} data-video-bound={session.cameraEnabled || undefined}>\n            <div\n              className={css.TileSlot}\n              ref={session.cameraEnabled ? setLocalSlotNode : undefined}\n            >\n              <div className={css.InitialsBadge} aria-hidden style={{ width: '60%' }}>\n                <CallParticipantAvatar profile={localProfile} size=\"100%\" />\n              </div>\n            </div>\n          </div>\n        </div>\n      ) : remoteCount === 0 ? (\n        <div className={css.DominantStage}>\n          <DominantTile\n            videoBound={connected && session.cameraEnabled}\n            slotRef={connected && session.cameraEnabled ? setLocalSlotNode : undefined}\n            placeholder={<CallParticipantAvatar profile={localProfile} size=\"100%\" />}\n            label={\n              <>\n                {!session.microphoneEnabled && (\n                  <span\n                    aria-label=\"Microphone off\"\n                    style={{ display: 'inline-flex', flexShrink: 0 }}\n                  >\n                    {sizedIcon(MicrophoneSlash, '200')}\n                  </span>\n                )}\n                <span className={css.TileLabelName}>You</span>\n              </>\n            }\n          />\n        </div>\n      ) : (\n        <div className={css.TileGrid} data-cols={compactGrid ? '3' : '2'}>\n          {remoteParticipants.map((participant) => {\n            const live = connected && featured?.participantIdentity === participant.identity;\n            return (\n              <RemoteTile\n                key={participant.identity}\n                participant={participant}\n                userIdByIdentity={userIdByIdentity}\n                videoBound={live}\n                sharingScreen={live && sharing?.identity === participant.identity}\n                slotRef={live ? setSlotNode : undefined}\n                fixed={compactGrid}\n              />\n            );\n          })}\n          <LocalTile\n            session={session}\n            userIdByIdentity={userIdByIdentity}\n            slotRef={connected && session.cameraEnabled ? setLocalSlotNode : undefined}\n            fixed={compactGrid}\n          />\n        </div>\n      )}\n      <CallControlBar layout=\"flow\">\n        <CallMediaControls\n          microphoneEnabled={session.microphoneEnabled}\n          cameraEnabled={session.cameraEnabled}\n          setMicrophoneEnabled={session.setMicrophoneEnabled}\n          setCameraEnabled={session.setCameraEnabled}\n          cameraAvailable={capabilities.camera}\n          // The native setters reject unless the room is connected, so staying\n          // enabled while reconnecting just makes the buttons silently do\n          // nothing.\n          disabled={!connected}\n        />\n        {connected && capabilities.audioRoutes && (\n          <AudioRouteControl session={session} onMenuOpenChange={setRouteMenuOpen} />\n        )}\n        {capabilities.camera && session.cameraEnabled && connected && (\n          <button\n            type=\"button\"\n            className={controlButton}\n            aria-label=\"Switch camera\"\n            title=\"Switch camera\"\n            onClick={() => void session.switchCamera()}\n          >\n            {sizedIcon(ArrowsClockwise, '300')}\n          </button>\n        )}\n        {setScreenShareEnabled && connected && (\n          <button\n            type=\"button\"\n            className={controlButton}\n            data-on={session.screenShareEnabled || undefined}\n            aria-pressed={session.screenShareEnabled}\n            aria-label={session.screenShareEnabled ? 'Stop sharing screen' : 'Share screen'}\n            title={session.screenShareEnabled ? 'Stop sharing screen' : 'Share screen'}\n            onClick={() => void setScreenShareEnabled(!session.screenShareEnabled)}\n          >\n            {sizedIcon(ScreenShare, '300', { filled: session.screenShareEnabled })}\n          </button>\n        )}\n        <button type=\"button\" className={css.HangupButton} aria-label=\"End call\" onClick={onHangup}>\n          {sizedIcon(PhoneDisconnect, '300')}\n        </button>\n      </CallControlBar>\n    </CallLayout>\n  );\n}\n","import { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\nimport { Badge, Box, color, Header, Scroll, Text, toRem } from 'folds';\nimport { useAtomValue } from 'jotai';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { useRoom } from '$hooks/useRoom';\nimport { useCallStartCapabilities } from './useCallStartCapabilities';\n\nimport { useCallMembers, useCallSession } from '$hooks/useCall';\nimport { useCallEmbed, useCallEmbedPlacementSync, useCallJoined } from '$hooks/useCallEmbed';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport * as css from './styles.css';\nimport { CallMemberRenderer } from './CallMemberCard';\nimport { PrescreenControls } from './PrescreenControls';\nimport { callEmbedAtom, callEmbedStartErrorAtom } from '$state/callEmbed';\nimport { canJoinCall } from '@sableclient/matrixrtc';\nimport type { LivekitJsCallSession } from '$state/livekitJsCall';\nimport { livekitJsCallAtom } from '$state/livekitJsCall';\nimport { nativeCallAtom } from '$state/nativeCall';\nimport { LivekitJsCallSurface } from './LivekitJsCallSurface';\nimport { NativeCallSurface } from './NativeCallSurface';\nimport { CallStatusBar } from './callChrome';\nimport { livekitJsCallStatus } from './callClient';\n\nfunction LivekitServerMissingMessage() {\n  return (\n    <Text style={{ margin: 'auto', color: color.Critical.Main }} size=\"L400\" align=\"Center\">\n      Your homeserver does not support calling. You can still join calls started by others.\n    </Text>\n  );\n}\n\nfunction WebRTCMissingError() {\n  return (\n    <Text style={{ margin: 'auto', color: color.Critical.Main }} size=\"L400\" align=\"Center\">\n      Your browser does not support WebRTC, which is required for calling.\n    </Text>\n  );\n}\n\nfunction JoinMessage({\n  hasParticipant,\n  livekitSupported,\n  rtcSupported,\n}: {\n  hasParticipant?: boolean;\n  livekitSupported?: boolean;\n  rtcSupported?: boolean;\n}) {\n  if (rtcSupported === false) {\n    return <WebRTCMissingError />;\n  }\n\n  if (hasParticipant) return null;\n\n  if (livekitSupported === false) {\n    return <LivekitServerMissingMessage />;\n  }\n\n  return (\n    <Text style={{ margin: 'auto' }} size=\"L400\" align=\"Center\">\n      Voice chat&apos;s empty - be the first to hop in!\n    </Text>\n  );\n}\n\nfunction NoPermissionMessage() {\n  return (\n    <Text style={{ margin: 'auto' }} size=\"L400\" align=\"Center\">\n      You don&apos;t have permission to join!\n    </Text>\n  );\n}\n\nfunction AlreadyInCallMessage() {\n  return (\n    <Text style={{ margin: 'auto', color: color.Warning.Main }} size=\"L400\" align=\"Center\">\n      Already in another call - end the current call to join.\n    </Text>\n  );\n}\n\nfunction WidgetPreparationErrorMessage({ message }: { message: string }) {\n  return (\n    <Text style={{ margin: 'auto', color: color.Critical.Main }} size=\"L400\" align=\"Center\">\n      {message}\n    </Text>\n  );\n}\n\nexport function LivekitJsCallStatus({\n  session,\n  onHangup,\n}: {\n  session: Pick<LivekitJsCallSession, 'lifecycle' | 'failure'>;\n  onHangup: () => void;\n}) {\n  return <CallStatusBar status={livekitJsCallStatus(session)} onHangup={onHangup} />;\n}\n\nfunction CallPrescreen() {\n  const room = useRoom();\n  const callEmbed = useAtomValue(callEmbedAtom);\n  const callEmbedStartError = useAtomValue(callEmbedStartErrorAtom);\n  const callJoined = useCallJoined(callEmbed);\n  const callStartCapabilities = useCallStartCapabilities(room);\n\n  const callSession = useCallSession(room);\n  const callMembers = useCallMembers(room, callSession);\n  const hasParticipant = callMembers.length > 0;\n  const showEmbedError =\n    callEmbed?.roomId === room.roomId && !callJoined && callEmbedStartError !== null;\n  const embedErrorMessage =\n    callEmbedStartError?.kind === 'capability'\n      ? 'Call setup failed because required call capabilities were rejected.'\n      : 'Call setup failed while preparing the embedded call app.';\n\n  const canJoin = canJoinCall(callStartCapabilities, hasParticipant);\n\n  return (\n    <Scroll variant=\"Surface\" hideTrack>\n      <Box className={css.CallViewContent} alignItems=\"Center\" justifyContent=\"Center\">\n        <Box style={{ maxWidth: toRem(382), width: '100%' }} direction=\"Column\" gap=\"100\">\n          {hasParticipant && (\n            <Header size=\"300\">\n              <Box grow=\"Yes\" alignItems=\"Center\">\n                <Text size=\"L400\">Participant</Text>\n              </Box>\n              <Badge variant=\"Critical\" fill=\"Solid\" size=\"400\">\n                <Text as=\"span\" size=\"L400\" truncate>\n                  {callMembers.length} Live\n                </Text>\n              </Badge>\n            </Header>\n          )}\n          <CallMemberRenderer members={callMembers} />\n          <PrescreenControls canJoin={canJoin} />\n          <Box className={css.PrescreenMessage} alignItems=\"Center\">\n            {!callStartCapabilities.inAnotherCall &&\n              (callStartCapabilities.hasCallMemberPermission ? (\n                <JoinMessage\n                  hasParticipant={hasParticipant}\n                  livekitSupported={callStartCapabilities.livekitSupported}\n                  rtcSupported={callStartCapabilities.webRTCSupported}\n                />\n              ) : (\n                <NoPermissionMessage />\n              ))}\n            {callStartCapabilities.inAnotherCall && <AlreadyInCallMessage />}\n            {showEmbedError && (\n              <WidgetPreparationErrorMessage\n                message={callEmbedStartError.message || embedErrorMessage}\n              />\n            )}\n          </Box>\n        </Box>\n      </Box>\n    </Scroll>\n  );\n}\n\ntype CallJoinedProps = {\n  containerRef: RefObject<HTMLDivElement | null>;\n};\n\nfunction CallJoined({ containerRef }: CallJoinedProps) {\n  return (\n    <Box grow=\"Yes\" direction=\"Column\" style={{ position: 'relative' }}>\n      <Box grow=\"Yes\" ref={containerRef} style={{ height: '100%', width: '100%' }} />\n    </Box>\n  );\n}\n\ninterface CallViewProps {\n  resizable?: boolean;\n}\n\nexport function CallView({ resizable }: CallViewProps) {\n  const room = useRoom();\n  const screenSize = useScreenSizeContext();\n  const isMobile = screenSize === ScreenSize.Mobile;\n\n  const callViewRef = useRef<HTMLDivElement>(null);\n  const callContainerRef = useRef<HTMLDivElement>(null);\n  useCallEmbedPlacementSync(callContainerRef);\n\n  const callEmbed = useCallEmbed();\n  const callJoined = useCallJoined(callEmbed);\n  const livekitJsCall = useAtomValue(livekitJsCallAtom);\n  const nativeCall = useAtomValue(nativeCallAtom);\n\n  const livekitJsCallForRoom = livekitJsCall?.roomId === room.roomId ? livekitJsCall : undefined;\n  const nativeCallForRoom = nativeCall?.roomId === room.roomId ? nativeCall : undefined;\n  const livekitJsRoom =\n    livekitJsCallForRoom?.lifecycle === 'active' ? livekitJsCallForRoom.room : undefined;\n  const currentJoined =\n    !livekitJsCallForRoom && !nativeCallForRoom && callEmbed?.roomId === room.roomId && callJoined;\n\n  // A native call renders video tiles and a control bar, which need most of the\n  // viewport; the 0.3 default is sized for the Element Call participant list.\n  const [heightRatio, setHeightRatio] = useState(isMobile ? 0.3 : 0.72);\n  const [availableHeight, setAvailableHeight] = useState(0);\n  const effectiveHeightRatio =\n    isMobile && nativeCallForRoom ? Math.max(heightRatio, 0.75) : heightRatio;\n\n  useEffect(() => {\n    if (!resizable || !callViewRef.current) return undefined;\n    const container = callViewRef.current.parentElement?.parentElement;\n    if (!container) return undefined;\n\n    const observer = new ResizeObserver((entries) => {\n      if (entries[0]) {\n        setAvailableHeight(entries[0].contentRect.height);\n      }\n    });\n    observer.observe(container);\n    setAvailableHeight(container.getBoundingClientRect().height);\n\n    return () => observer.disconnect();\n  }, [resizable]);\n\n  const [isDragging, setIsDragging] = useState(false);\n  const isResizing = useRef(false);\n  const previousBodyUserSelect = useRef<string | null>(null);\n\n  const handleMove = useCallback(\n    (clientY: number) => {\n      if (!isResizing.current || !callViewRef.current) return;\n      const { top } = callViewRef.current.getBoundingClientRect();\n      const newHeight = clientY - top;\n      const baseHeight = availableHeight || window.innerHeight;\n      const ratio = newHeight / baseHeight;\n      const clampedRatio = Math.max(0.2, Math.min(ratio, 0.8));\n      setHeightRatio(clampedRatio);\n    },\n    [availableHeight]\n  );\n\n  const handleMouseMove = useCallback((e: MouseEvent) => handleMove(e.clientY), [handleMove]);\n  const handleTouchMove = useCallback(\n    (e: TouchEvent) => {\n      if (e.cancelable) e.preventDefault();\n      if (e.touches[0]) handleMove(e.touches[0].clientY);\n    },\n    [handleMove]\n  );\n\n  const stopResizing = useCallback(() => {\n    isResizing.current = false;\n    setIsDragging(false);\n    document.removeEventListener('mousemove', handleMouseMove);\n    document.removeEventListener('mouseup', stopResizing);\n    document.removeEventListener('touchmove', handleTouchMove);\n    document.removeEventListener('touchend', stopResizing);\n    document.body.style.userSelect = previousBodyUserSelect.current ?? '';\n    previousBodyUserSelect.current = null;\n  }, [handleMouseMove, handleTouchMove]);\n\n  const startResizing = useCallback(() => {\n    isResizing.current = true;\n    setIsDragging(true);\n    if (previousBodyUserSelect.current === null) {\n      previousBodyUserSelect.current = document.body.style.userSelect;\n    }\n    document.addEventListener('mousemove', handleMouseMove);\n    document.addEventListener('mouseup', stopResizing);\n    document.addEventListener('touchmove', handleTouchMove, { passive: false });\n    document.addEventListener('touchend', stopResizing);\n    document.body.style.userSelect = 'none';\n  }, [handleMouseMove, handleTouchMove, stopResizing]);\n\n  useEffect(\n    () => () => {\n      isResizing.current = false;\n      document.removeEventListener('mousemove', handleMouseMove);\n      document.removeEventListener('mouseup', stopResizing);\n      document.removeEventListener('touchmove', handleTouchMove);\n      document.removeEventListener('touchend', stopResizing);\n      document.body.style.userSelect = previousBodyUserSelect.current ?? '';\n      previousBodyUserSelect.current = null;\n    },\n    [handleMouseMove, handleTouchMove, stopResizing]\n  );\n\n  return (\n    <Box\n      ref={callViewRef}\n      grow=\"Yes\"\n      className={ContainerColor({ variant: 'Surface' })}\n      style={{\n        position: 'relative',\n        minWidth: toRem(280),\n        height: resizable\n          ? availableHeight > 0\n            ? `${availableHeight * effectiveHeightRatio}px`\n            : `${effectiveHeightRatio * 100}dvh`\n          : undefined,\n        borderBottom: `1px solid var(--sable-surface-container-line)`,\n        zIndex: 20,\n        backgroundColor:\n          livekitJsRoom || nativeCallForRoom\n            ? color.Background.Container\n            : currentJoined\n              ? 'transparent'\n              : undefined,\n        overflow: livekitJsRoom || nativeCallForRoom ? 'hidden' : undefined,\n        pointerEvents: currentJoined ? 'none' : 'all',\n      }}\n    >\n      {isDragging && (\n        <div\n          style={{\n            position: 'absolute',\n            inset: 0,\n            zIndex: 50,\n            cursor: 'ns-resize',\n            pointerEvents: 'all',\n          }}\n        />\n      )}\n\n      {!currentJoined && !livekitJsCallForRoom && !nativeCallForRoom && <CallPrescreen />}\n      {livekitJsCallForRoom && livekitJsRoom ? (\n        <LivekitJsCallSurface\n          room={livekitJsRoom}\n          mediaReady={livekitJsCallForRoom.mediaReady}\n          initialMedia={livekitJsCallForRoom.initialMedia}\n          onHangup={() => void livekitJsCallForRoom.hangup()}\n        />\n      ) : livekitJsCallForRoom ? (\n        <LivekitJsCallStatus\n          session={livekitJsCallForRoom}\n          onHangup={() => void livekitJsCallForRoom.hangup()}\n        />\n      ) : nativeCallForRoom ? (\n        <NativeCallSurface\n          session={nativeCallForRoom}\n          onHangup={() => void nativeCallForRoom.hangup()}\n        />\n      ) : (\n        <CallJoined containerRef={callContainerRef} />\n      )}\n\n      {resizable && (\n        <button\n          type=\"button\"\n          onMouseDown={startResizing}\n          onTouchStart={startResizing}\n          aria-label=\"Resize call view\"\n          style={{\n            position: 'absolute',\n            bottom: '-20px',\n            left: 0,\n            right: 0,\n            height: '20px',\n            cursor: 'ns-resize',\n            zIndex: 100,\n            display: 'flex',\n            alignItems: 'flex-start',\n            justifyContent: 'center',\n            background: 'transparent',\n            border: 'none',\n            padding: 0,\n            outline: 'none',\n            pointerEvents: 'all',\n            touchAction: 'none',\n          }}\n        >\n          <div\n            style={{\n              width: '40px',\n              height: '4px',\n              marginTop: '2px',\n              borderRadius: '2px',\n              background: 'var(--sable-surface-container-line)',\n              opacity: 0.8,\n            }}\n          />\n        </button>\n      )}\n    </Box>\n  );\n}\n","import type { Room, MatrixEvent, MatrixClient } from '$types/matrix-sdk';\nimport { useCallback, useMemo } from 'react';\nimport type { IWidget } from 'matrix-widget-api';\n\nimport { getStateEvents } from '$utils/room/hierarchy';\nimport { useStateEventCallback } from './useStateEventCallback';\nimport { useForceUpdate } from './useForceUpdate';\nimport { CustomStateEvent } from '$types/matrix/room';\n\nexport interface RoomWidget extends IWidget {\n  eventId?: string;\n  sender?: string;\n}\n\nexport const resolveWidgetUrl = (\n  url: string,\n  roomId: string,\n  userId: string,\n  displayName: string,\n  avatarUrl: string,\n  widgetId: string,\n  mx?: MatrixClient\n): string => {\n  const deviceId = mx?.getDeviceId() ?? '';\n  const baseUrl = mx?.baseUrl ?? '';\n  const clientId = 'dev.nullptr.app';\n  const lang = navigator.language || 'en';\n  const theme = document.body.classList.contains('dark-theme') ? 'dark' : 'light';\n\n  let resolved = url\n    .replaceAll('$matrix_user_id', encodeURIComponent(userId))\n    .replaceAll('$matrix_room_id', encodeURIComponent(roomId))\n    .replaceAll('$matrix_display_name', encodeURIComponent(displayName))\n    .replaceAll('$matrix_avatar_url', encodeURIComponent(avatarUrl))\n    .replaceAll('$matrix_widget_id', encodeURIComponent(widgetId))\n    .replaceAll('$org.matrix.msc2873.client_id', encodeURIComponent(clientId))\n    .replaceAll('$org.matrix.msc2873.client_theme', encodeURIComponent(theme))\n    .replaceAll('$org.matrix.msc2873.client_language', encodeURIComponent(lang))\n    .replaceAll('$org.matrix.msc3819.matrix_device_id', encodeURIComponent(deviceId))\n    .replaceAll('$org.matrix.msc4039.matrix_base_url', encodeURIComponent(baseUrl));\n\n  try {\n    const u = new URL(resolved);\n    if (!u.searchParams.has('widgetId')) {\n      u.searchParams.set('widgetId', widgetId);\n    }\n    if (!u.searchParams.has('parentUrl')) {\n      u.searchParams.set('parentUrl', window.location.href);\n    }\n    resolved = u.toString();\n  } catch {\n    // URL parsing failed, return as-is\n  }\n\n  return resolved;\n};\n\n/**\n * Enrich a plain widget URL with standard Matrix template variables.\n * Used when storing the widget URL in room state so that resolveWidgetUrl\n * can substitute actual values at render time.\n */\nexport const enrichWidgetUrl = (rawUrl: string): string => {\n  if (rawUrl.includes('$matrix_') || rawUrl.includes('$org.matrix.')) {\n    return rawUrl;\n  }\n\n  const templateParams = [\n    'matrix_user_id=$matrix_user_id',\n    'matrix_display_name=$matrix_display_name',\n    'matrix_avatar_url=$matrix_avatar_url',\n    'matrix_room_id=$matrix_room_id',\n    'matrix_widget_id=$matrix_widget_id',\n    'theme=$org.matrix.msc2873.client_theme',\n    'matrix_client_id=$org.matrix.msc2873.client_id',\n    'matrix_client_language=$org.matrix.msc2873.client_language',\n    'matrix_device_id=$org.matrix.msc3819.matrix_device_id',\n    'matrix_base_url=$org.matrix.msc4039.matrix_base_url',\n  ].join('&');\n\n  try {\n    const u = new URL(rawUrl);\n    if (u.hash.includes('?')) {\n      return `${rawUrl}&${templateParams}`;\n    }\n    if (u.hash) {\n      return `${rawUrl}?${templateParams}`;\n    }\n    const separator = u.search ? '&' : '?';\n    return `${rawUrl}${separator}${templateParams}`;\n  } catch {\n    return rawUrl;\n  }\n};\n\nexport const useRoomWidgets = (room: Room): RoomWidget[] => {\n  const [updateCount, forceUpdate] = useForceUpdate();\n\n  useStateEventCallback(\n    room.client,\n    useCallback(\n      (event) => {\n        if (\n          event.getRoomId() === room.roomId &&\n          event.getType() === (CustomStateEvent.RoomWidget as string)\n        ) {\n          forceUpdate();\n        }\n      },\n      [room.roomId, forceUpdate]\n    )\n  );\n\n  return useMemo(() => {\n    // `updateCount` is a cache-busting key for state-event driven recomputation.\n    void updateCount;\n    const events: MatrixEvent[] = getStateEvents(room, CustomStateEvent.RoomWidget);\n\n    return events.reduce<RoomWidget[]>((widgets, event) => {\n      const content = event.getContent();\n      if (!content?.url || Object.keys(content).length === 0) return widgets;\n\n      const stateKey = event.getStateKey();\n      if (!stateKey) return widgets;\n\n      widgets.push({\n        id: content.id || stateKey,\n        creatorUserId: content.creatorUserId || event.getSender() || '',\n        type: content.type || 'm.custom',\n        url: content.url,\n        name: content.name || 'Widget',\n        data: content.data || {},\n        waitForIframeLoad: content.waitForIframeLoad ?? true,\n        eventId: event.getId(),\n        sender: event.getSender() || undefined,\n      });\n\n      return widgets;\n    }, []);\n  }, [room, updateCount]);\n};\n","import type { MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk';\nimport { useMemo } from 'react';\nimport type { IRoomCreateContent } from '$types/matrix/room';\nimport { getStateEvent } from '$utils/room/hierarchy';\nimport { creatorsSupported } from '$utils/roomSupport';\nimport { useStateEvent } from './useStateEvent';\nimport { EventType } from '$types/matrix-sdk';\n\nconst getRoomCreators = (createEvent: MatrixEvent): Set<string> => {\n  const createContent = createEvent.getContent<IRoomCreateContent>();\n\n  const creators: Set<string> = new Set();\n\n  if (!creatorsSupported(createContent.room_version)) return creators;\n\n  if (createEvent.event.sender) {\n    creators.add(createEvent.event.sender);\n  }\n\n  if ('additional_creators' in createContent && Array.isArray(createContent.additional_creators)) {\n    createContent.additional_creators.forEach((creator) => {\n      if (typeof creator === 'string') {\n        creators.add(creator);\n      }\n    });\n  }\n\n  return creators;\n};\n\nexport const useRoomCreators = (room: Room): Set<string> => {\n  const createEvent = useStateEvent(room, EventType.RoomCreate);\n\n  const creators = useMemo(\n    () => (createEvent ? getRoomCreators(createEvent) : new Set<string>()),\n    [createEvent]\n  );\n\n  return creators;\n};\n\nexport const getRoomCreatorsForRoomId = (mx: MatrixClient, roomId: string): Set<string> => {\n  const room = mx.getRoom(roomId);\n  if (!room) return new Set();\n\n  const createEvent = getStateEvent(room, EventType.RoomCreate);\n  if (!createEvent) return new Set();\n\n  return getRoomCreators(createEvent);\n};\n","import { useMemo } from 'react';\nimport { EventType } from '$types/matrix-sdk';\nimport type {\n  IPowerLevels,\n  PowerLevelActions,\n  PowerLevelNotificationsAction,\n} from './usePowerLevels';\nimport { readPowerLevel } from './usePowerLevels';\n\nexport type RoomPermissionsAPI = {\n  event: (type: string, userId: string) => boolean;\n  message: (encrypted: boolean, userId: string) => boolean;\n  stateEvent: (type: string, userId: string) => boolean;\n  action: (action: PowerLevelActions, userId: string) => boolean;\n  notificationAction: (action: PowerLevelNotificationsAction, userId: string) => boolean;\n};\n\nexport const getRoomPermissionsAPI = (\n  creators: Set<string>,\n  powerLevels: IPowerLevels\n): RoomPermissionsAPI => {\n  const api: RoomPermissionsAPI = {\n    event: (type, userId) => {\n      if (creators.has(userId)) return true;\n      const userPower = readPowerLevel.user(powerLevels, userId);\n      const requiredPL = readPowerLevel.event(powerLevels, type);\n      return userPower >= requiredPL;\n    },\n    message: (encrypted, userId) =>\n      api.event(\n        encrypted ? (EventType.RoomMessageEncrypted as string) : EventType.RoomMessage,\n        userId\n      ),\n    stateEvent: (type, userId) => {\n      if (creators.has(userId)) return true;\n      const userPower = readPowerLevel.user(powerLevels, userId);\n      const requiredPL = readPowerLevel.state(powerLevels, type);\n      return userPower >= requiredPL;\n    },\n    action: (action, userId) => {\n      if (creators.has(userId)) return true;\n      const userPower = readPowerLevel.user(powerLevels, userId);\n      const requiredPL = readPowerLevel.action(powerLevels, action);\n      return userPower >= requiredPL;\n    },\n    notificationAction: (action, userId) => {\n      if (creators.has(userId)) return true;\n      const userPower = readPowerLevel.user(powerLevels, userId);\n      const requiredPL = readPowerLevel.notification(powerLevels, action);\n      return userPower >= requiredPL;\n    },\n  };\n\n  return api;\n};\n\nexport const useRoomPermissions = (\n  creators: Set<string>,\n  powerLevels: IPowerLevels\n): RoomPermissionsAPI => {\n  const api: RoomPermissionsAPI = useMemo(\n    () => getRoomPermissionsAPI(creators, powerLevels),\n    [creators, powerLevels]\n  );\n\n  return api;\n};\n","import type { WidgetKind, SimpleObservable, IOpenIDUpdate } from 'matrix-widget-api';\nimport {\n  type Capability,\n  type ISendDelayedEventDetails,\n  type ISendEventDetails,\n  type IReadEventRelationsResult,\n  type IRoomEvent,\n  type Widget,\n  WidgetDriver,\n  type IWidgetApiErrorResponseDataDetails,\n  type ISearchUserDirectoryResult,\n  type IGetMediaConfigResult,\n  UpdateDelayedEventAction,\n  OpenIDRequestState,\n} from 'matrix-widget-api';\nimport type { MatrixClient, Room } from '$types/matrix-sdk';\nimport { uploadContentToServer } from '$utils/matrix';\nimport {\n  EventType,\n  type IContent,\n  MatrixError,\n  type MatrixEvent,\n  Direction,\n  type SendDelayedEventResponse,\n  type StateEvents,\n  type TimelineEvents,\n} from '$types/matrix-sdk';\n\nexport type CapabilityApprovalCallback = (requested: Set<Capability>) => Promise<Set<Capability>>;\n\n// Unlike CallWidgetDriver which auto-grants all capabilities for Element Call,\n// this driver provides a capability approval mechanism for untrusted widgets.\nexport class GenericWidgetDriver extends WidgetDriver {\n  private readonly mxClient: MatrixClient;\n\n  private readonly approveCapabilities: CapabilityApprovalCallback;\n\n  public constructor(\n    mx: MatrixClient,\n    private forWidget: Widget,\n    private forWidgetKind: WidgetKind,\n    private inRoomId?: string,\n    approveCapabilities?: CapabilityApprovalCallback\n  ) {\n    super();\n    this.mxClient = mx;\n    this.approveCapabilities = approveCapabilities ?? (async (caps) => caps);\n  }\n\n  public async validateCapabilities(requested: Set<Capability>): Promise<Set<Capability>> {\n    return this.approveCapabilities(requested);\n  }\n\n  public async sendEvent<K extends keyof StateEvents>(\n    eventType: K,\n    content: StateEvents[K],\n    stateKey: string | null,\n    targetRoomId: string | null\n  ): Promise<ISendEventDetails>;\n\n  public async sendEvent<K extends keyof TimelineEvents>(\n    eventType: K,\n    content: TimelineEvents[K],\n    stateKey: null,\n    targetRoomId: string | null\n  ): Promise<ISendEventDetails>;\n\n  public async sendEvent(\n    eventType: string,\n    content: IContent,\n    stateKey: string | null = null,\n    targetRoomId: string | null = null\n  ): Promise<ISendEventDetails> {\n    const client = this.mxClient;\n    const roomId = targetRoomId || this.inRoomId;\n    if (!client || !roomId) throw new Error('Not in a room or not attached to a client');\n\n    let r: { event_id: string } | null;\n    if (stateKey !== null) {\n      r = await client.sendStateEvent(\n        roomId,\n        eventType as keyof StateEvents,\n        content as StateEvents[keyof StateEvents],\n        stateKey\n      );\n    } else if (eventType === (EventType.RoomRedaction as string)) {\n      r = await client.redactEvent(roomId, content.redacts);\n    } else {\n      r = await client.sendEvent(\n        roomId,\n        eventType as keyof TimelineEvents,\n        content as TimelineEvents[keyof TimelineEvents]\n      );\n    }\n    return { roomId, eventId: r.event_id };\n  }\n\n  public async sendDelayedEvent<K extends keyof StateEvents>(\n    delay: number | null,\n    parentDelayId: string | null,\n    eventType: K,\n    content: StateEvents[K],\n    stateKey: string | null,\n    targetRoomId: string | null\n  ): Promise<ISendDelayedEventDetails>;\n\n  public async sendDelayedEvent<K extends keyof TimelineEvents>(\n    delay: number | null,\n    parentDelayId: string | null,\n    eventType: K,\n    content: TimelineEvents[K],\n    stateKey: null,\n    targetRoomId: string | null\n  ): Promise<ISendDelayedEventDetails>;\n\n  public async sendDelayedEvent(\n    delay: number | null,\n    parentDelayId: string | null,\n    eventType: string,\n    content: IContent,\n    stateKey: string | null = null,\n    targetRoomId: string | null = null\n  ): Promise<ISendDelayedEventDetails> {\n    const client = this.mxClient;\n    const roomId = targetRoomId || this.inRoomId;\n    if (!client || !roomId) throw new Error('Not in a room or not attached to a client');\n\n    let delayOpts;\n    if (delay !== null) {\n      delayOpts = {\n        delay,\n        ...(parentDelayId !== null && { parent_delay_id: parentDelayId }),\n      };\n    } else if (parentDelayId !== null) {\n      delayOpts = { parent_delay_id: parentDelayId };\n    } else {\n      throw new Error('Must provide at least one of delay or parentDelayId');\n    }\n\n    let r: SendDelayedEventResponse | null;\n    if (stateKey !== null) {\n      r = await client._unstable_sendDelayedStateEvent(\n        roomId,\n        delayOpts,\n        eventType as keyof StateEvents,\n        content as StateEvents[keyof StateEvents],\n        stateKey\n      );\n    } else {\n      r = await client._unstable_sendDelayedEvent(\n        roomId,\n        delayOpts,\n        null,\n        eventType as keyof TimelineEvents,\n        content as TimelineEvents[keyof TimelineEvents]\n      );\n    }\n    return { roomId, delayId: r.delay_id };\n  }\n\n  public async updateDelayedEvent(\n    delayId: string,\n    action: UpdateDelayedEventAction\n  ): Promise<void> {\n    await this.mxClient._unstable_updateDelayedEvent(delayId, action);\n  }\n\n  public async cancelScheduledDelayedEvent(delayId: string): Promise<void> {\n    await this.updateDelayedEvent(delayId, UpdateDelayedEventAction.Cancel);\n  }\n\n  public async restartScheduledDelayedEvent(delayId: string): Promise<void> {\n    await this.updateDelayedEvent(delayId, UpdateDelayedEventAction.Restart);\n  }\n\n  public async sendScheduledDelayedEvent(delayId: string): Promise<void> {\n    await this.updateDelayedEvent(delayId, UpdateDelayedEventAction.Send);\n  }\n\n  public async sendToDevice(\n    eventType: string,\n    encrypted: boolean,\n    contentMap: Record<string, Record<string, object>>\n  ): Promise<void> {\n    const client = this.mxClient;\n    if (encrypted) {\n      const crypto = client.getCrypto();\n      if (!crypto) throw new Error('E2EE not enabled');\n      const invertedContentMap: Record<string, { userId: string; deviceId: string }[]> = {};\n      Object.entries(contentMap).forEach(([userId, userContentMap]) => {\n        Object.entries(userContentMap).forEach(([deviceId, content]) => {\n          const key = JSON.stringify(content);\n          const recipients = invertedContentMap[key] ?? [];\n          recipients.push({ userId, deviceId });\n          invertedContentMap[key] = recipients;\n        });\n      });\n      await Promise.all(\n        Object.entries(invertedContentMap).map(async ([str, recipients]) => {\n          const batch = await crypto.encryptToDeviceMessages(\n            eventType,\n            recipients,\n            JSON.parse(str)\n          );\n          await client.queueToDevice(batch);\n        })\n      );\n    } else {\n      await client.queueToDevice({\n        eventType,\n        batch: Object.entries(contentMap).flatMap(([userId, userContentMap]) =>\n          Object.entries(userContentMap).map(([deviceId, content]) => ({\n            userId,\n            deviceId,\n            payload: content,\n          }))\n        ),\n      });\n    }\n  }\n\n  public async readRoomTimeline(\n    roomId: string,\n    eventType: string,\n    msgtype: string | undefined,\n    stateKey: string | undefined,\n    limit: number,\n    since: string | undefined\n  ): Promise<IRoomEvent[]> {\n    const eventLimit =\n      limit > 0 ? Math.min(limit, Number.MAX_SAFE_INTEGER) : Number.MAX_SAFE_INTEGER;\n    const room = this.mxClient.getRoom(roomId);\n    if (!room) return [];\n    const results: MatrixEvent[] = [];\n    const events = room.getLiveTimeline().getEvents();\n\n    for (let i = events.length - 1; i >= 0; i -= 1) {\n      const ev = events[i];\n      if (!ev) break;\n      const reachedLimit = results.length >= eventLimit;\n      const reachedSince = since !== undefined && ev.getId() === since;\n      if (reachedLimit || reachedSince) break;\n\n      const matchesEventType = ev.getType() === eventType && !ev.isState();\n      const matchesMsgType =\n        eventType !== (EventType.RoomMessage as string) ||\n        !msgtype ||\n        msgtype === ev.getContent().msgtype;\n      const eventStateKey = ev.getStateKey();\n      const matchesStateKey =\n        eventStateKey === undefined || stateKey === undefined || eventStateKey === stateKey;\n\n      if (matchesEventType && matchesMsgType && matchesStateKey) {\n        results.push(ev);\n      }\n    }\n\n    return results.map((ev) => ev.getEffectiveEvent() as IRoomEvent);\n  }\n\n  public async askOpenID(observer: SimpleObservable<IOpenIDUpdate>): Promise<void> {\n    return observer.update({\n      state: OpenIDRequestState.Allowed,\n      token: await this.mxClient.getOpenIdToken(),\n    });\n  }\n\n  public async readRoomState(\n    roomId: string,\n    eventType: string,\n    stateKey: string | undefined\n  ): Promise<IRoomEvent[]> {\n    const room = this.mxClient.getRoom(roomId);\n    if (!room) return [];\n    const state = room.getLiveTimeline().getState(Direction.Forward);\n    if (!state) return [];\n    if (stateKey === undefined)\n      return state\n        .getStateEvents(eventType)\n        .map((e: MatrixEvent) => e.getEffectiveEvent() as IRoomEvent);\n    const event = state.getStateEvents(eventType, stateKey);\n    return event === null ? [] : [event.getEffectiveEvent() as IRoomEvent];\n  }\n\n  public async readEventRelations(\n    eventId: string,\n    roomId?: string,\n    relationType?: string,\n    eventType?: string,\n    from?: string,\n    to?: string,\n    limit?: number,\n    direction?: 'f' | 'b'\n  ): Promise<IReadEventRelationsResult> {\n    const resolvedRoomId = roomId ?? this.inRoomId;\n    if (typeof resolvedRoomId !== 'string') throw new Error('Error while reading the current room');\n    const { events, nextBatch, prevBatch } = await this.mxClient.relations(\n      resolvedRoomId,\n      eventId,\n      relationType ?? null,\n      eventType ?? null,\n      { from, to, limit, dir: direction as Direction }\n    );\n    return {\n      chunk: events.map((e: MatrixEvent) => e.getEffectiveEvent() as IRoomEvent),\n      nextBatch: nextBatch ?? undefined,\n      prevBatch: prevBatch ?? undefined,\n    };\n  }\n\n  public async searchUserDirectory(\n    searchTerm: string,\n    limit?: number\n  ): Promise<ISearchUserDirectoryResult> {\n    const { limited, results } = await this.mxClient.searchUserDirectory({\n      term: searchTerm,\n      limit,\n    });\n    return {\n      limited,\n      results: results.map(\n        (r: { user_id: string; display_name?: string; avatar_url?: string }) => ({\n          userId: r.user_id,\n          displayName: r.display_name,\n          avatarUrl: r.avatar_url,\n        })\n      ),\n    };\n  }\n\n  public async getMediaConfig(): Promise<IGetMediaConfigResult> {\n    return this.mxClient.getMediaConfig();\n  }\n\n  public async uploadFile(file: XMLHttpRequestBodyInit): Promise<{ contentUri: string }> {\n    const uploadResult = await uploadContentToServer(this.mxClient, file);\n    return { contentUri: uploadResult.content_uri };\n  }\n\n  public getKnownRooms(): string[] {\n    return this.mxClient.getVisibleRooms().map((r: Room) => r.roomId);\n  }\n\n  public processError(error: unknown): IWidgetApiErrorResponseDataDetails | undefined {\n    return error instanceof MatrixError\n      ? { matrix_api_error: error.asWidgetApiErrorData() }\n      : undefined;\n  }\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { IWidget, IRoomEvent } from 'matrix-widget-api';\nimport { ClientWidgetApi, Widget, WidgetKind } from 'matrix-widget-api';\nimport type { IEvent, MatrixClient, MatrixEvent } from '$types/matrix-sdk';\nimport { ClientEvent, Direction, MatrixEventEvent } from '$types/matrix-sdk';\nimport { createLogger } from '$utils/debug';\nimport { resolveWidgetUrl } from '$hooks/useRoomWidgets';\nimport type { CapabilityApprovalCallback } from './GenericWidgetDriver';\nimport { GenericWidgetDriver } from './GenericWidgetDriver';\n\nconst log = createLogger('WidgetIframe');\n\ninterface WidgetIframeProps {\n  widget: IWidget;\n  roomId: string;\n  mx: MatrixClient;\n  onCapabilityRequest?: CapabilityApprovalCallback;\n}\n\nexport function WidgetIframe({ widget, roomId, mx, onCapabilityRequest }: WidgetIframeProps) {\n  const iframeRef = useRef<HTMLIFrameElement>(null);\n  const messagingRef = useRef<ClientWidgetApi | null>(null);\n  const [, setReady] = useState(false);\n\n  const userId = mx.getUserId() || '';\n  const displayName = mx.getUser(userId)?.displayName || userId;\n  const avatarUrl = mx.getUser(userId)?.avatarUrl || '';\n  const resolvedUrl = resolveWidgetUrl(\n    widget.url || '',\n    roomId,\n    userId,\n    displayName,\n    avatarUrl,\n    widget.id,\n    mx\n  );\n\n  useEffect(() => {\n    const iframe = iframeRef.current;\n    if (!iframe) return undefined;\n\n    const mockWidget = new Widget(widget);\n    const driver = new GenericWidgetDriver(\n      mx,\n      mockWidget,\n      WidgetKind.Room,\n      roomId,\n      onCapabilityRequest\n    );\n\n    const messaging = new ClientWidgetApi(mockWidget, iframe, driver);\n    messagingRef.current = messaging;\n    messaging.setViewedRoomId(roomId);\n\n    messaging.once('ready', () => setReady(true));\n\n    // Set iframe src after ClientWidgetApi is listening for the load event.\n    // This avoids a race condition where the iframe loads before the widget\n    // API transport is ready to perform the capability handshake.\n    iframe.src = resolvedUrl;\n\n    messaging.on('action:org.matrix.msc2876.read_events', (ev: CustomEvent) => {\n      const room = mx.getRoom(roomId);\n      const events: Partial<IEvent>[] = [];\n      const { type } = ev.detail.data;\n      ev.preventDefault();\n      if (room === null) {\n        messaging.transport.reply(ev.detail, { events });\n        return;\n      }\n      const state = room.getLiveTimeline().getState(Direction.Forward);\n      if (state === undefined) {\n        messaging.transport.reply(ev.detail, { events });\n        return;\n      }\n      const stateEvents = state.events?.get(type);\n      Array.from(stateEvents?.values() ?? []).forEach((eventObject: MatrixEvent) => {\n        events.push(eventObject.event);\n      });\n      messaging.transport.reply(ev.detail, { events });\n    });\n\n    const readUpToMap: Record<string, string> = {};\n    mx.getRooms().forEach((room) => {\n      const roomEvents = room.getLiveTimeline()?.getEvents() || [];\n      const last = roomEvents[roomEvents.length - 1];\n      if (last) {\n        const id = last.getId();\n        if (id) readUpToMap[room.roomId] = id;\n      }\n    });\n\n    const feedEvent = (ev: MatrixEvent): void => {\n      if (!messagingRef.current) return;\n      if (ev.isBeingDecrypted() || ev.isDecryptionFailure()) return;\n      const raw = ev.getEffectiveEvent();\n      messagingRef.current.feedEvent(raw as IRoomEvent).catch((err) => {\n        log.warn('Failed to feed widget iframe event:', err);\n      });\n    };\n\n    const onEvent = (ev: MatrixEvent): void => {\n      mx.decryptEventIfNeeded(ev);\n      feedEvent(ev);\n    };\n\n    const onDecrypted = (ev: MatrixEvent): void => {\n      feedEvent(ev);\n    };\n\n    const onToDevice = async (ev: MatrixEvent): Promise<void> => {\n      await mx.decryptEventIfNeeded(ev);\n      if (ev.isDecryptionFailure()) return;\n      await messagingRef.current?.feedToDevice(\n        ev.getEffectiveEvent() as IRoomEvent,\n        ev.isEncrypted()\n      );\n    };\n\n    mx.on(ClientEvent.Event, onEvent);\n    mx.on(MatrixEventEvent.Decrypted, onDecrypted);\n    mx.on(ClientEvent.ToDeviceEvent, onToDevice);\n\n    return () => {\n      mx.removeListener(ClientEvent.Event, onEvent);\n      mx.removeListener(MatrixEventEvent.Decrypted, onDecrypted);\n      mx.removeListener(ClientEvent.ToDeviceEvent, onToDevice);\n      messaging.stop();\n      messaging.removeAllListeners();\n      messagingRef.current = null;\n      setReady(false);\n    };\n  }, [widget, roomId, mx, onCapabilityRequest, resolvedUrl]);\n\n  const iframeTitle = widget.name ?? 'Widget';\n\n  return (\n    <iframe\n      ref={iframeRef}\n      title={iframeTitle}\n      sandbox=\"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-downloads\"\n      allow=\"camera;microphone;clipboard-write;display-capture;autoplay;encrypted-media\"\n      style={{\n        width: '100%',\n        height: '100%',\n        border: 'none',\n        display: 'block',\n        flexGrow: 1,\n      }}\n    />\n  );\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { fetch } from '$utils/fetch';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport interface IntegrationManager {\n  apiUrl: string;\n  uiUrl: string;\n}\n\nconst DEFAULT_MANAGERS: IntegrationManager[] = [\n  {\n    apiUrl: 'https://scalar.vector.im/api',\n    uiUrl: 'https://scalar.vector.im',\n  },\n];\n\nasync function discoverManagers(mx: MatrixClient): Promise<IntegrationManager[]> {\n  const managers: IntegrationManager[] = [];\n\n  try {\n    const baseUrl = mx.getHomeserverUrl();\n    const url = new URL(baseUrl);\n    const wellKnownUrl = `https://${url.hostname}/.well-known/matrix/client`;\n\n    const resp = await fetch(wellKnownUrl, { method: 'GET' });\n    if (resp.ok) {\n      const data = await resp.json();\n      const integrations = data?.['m.integrations'];\n      if (integrations?.managers && Array.isArray(integrations.managers)) {\n        integrations.managers.forEach((mgr: { api_url?: string; ui_url?: string }) => {\n          if (mgr.api_url && mgr.ui_url) {\n            managers.push({ apiUrl: mgr.api_url, uiUrl: mgr.ui_url });\n          }\n        });\n      }\n    }\n  } catch {\n    // ignore malformed or unavailable .well-known data\n  }\n\n  try {\n    const widgetsEvent = mx.getAccountData('m.widgets' as never);\n    if (widgetsEvent) {\n      const content = widgetsEvent.getContent();\n      Object.values(content).forEach(\n        (widget: { type?: string; url?: string; data?: { api_url?: string } }) => {\n          if (widget?.type === 'm.integration_manager' && widget?.url) {\n            const existing = managers.some((m) => m.uiUrl === widget.url);\n            if (!existing) {\n              managers.push({\n                apiUrl: widget.data?.api_url || widget.url,\n                uiUrl: widget.url,\n              });\n            }\n          }\n        }\n      );\n    }\n  } catch {\n    // ignore malformed widget account data\n  }\n\n  if (managers.length === 0) {\n    return DEFAULT_MANAGERS;\n  }\n\n  return managers;\n}\n\nasync function getScalarToken(mx: MatrixClient, apiUrl: string): Promise<string | null> {\n  try {\n    const openIdToken = await mx.getOpenIdToken();\n\n    const resp = await fetch(`${apiUrl}/register`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(openIdToken),\n    });\n\n    if (!resp.ok) return null;\n\n    const data = await resp.json();\n    return data?.scalar_token ?? null;\n  } catch {\n    return null;\n  }\n}\n\nexport function buildIntegrationManagerUrl(\n  uiUrl: string,\n  scalarToken: string | null,\n  roomId: string,\n  screen?: string,\n  integId?: string\n): string {\n  const url = new URL(uiUrl);\n  url.pathname = '/index.html';\n  if (scalarToken) url.searchParams.set('scalar_token', scalarToken);\n  url.searchParams.set('room_id', roomId);\n  if (screen) url.searchParams.set('screen', screen);\n  if (integId) url.searchParams.set('integ_id', integId);\n  return url.toString();\n}\n\nexport type IntegrationManagerState = {\n  managers: IntegrationManager[];\n  scalarToken: string | null;\n  loading: boolean;\n  error: string | null;\n};\n\nexport function useIntegrationManager(): IntegrationManagerState & {\n  refresh: () => void;\n} {\n  const mx = useMatrixClient();\n  const [state, setState] = useState<IntegrationManagerState>({\n    managers: [],\n    scalarToken: null,\n    loading: true,\n    error: null,\n  });\n\n  const loadManagers = useCallback(async () => {\n    setState((s) => ({ ...s, loading: true, error: null }));\n    try {\n      const managers = await discoverManagers(mx);\n      let scalarToken: string | null = null;\n\n      if (managers.length > 0 && managers[0]) {\n        scalarToken = await getScalarToken(mx, managers[0].apiUrl);\n      }\n\n      setState({\n        managers,\n        scalarToken,\n        loading: false,\n        error: null,\n      });\n    } catch (err) {\n      setState({\n        managers: [],\n        scalarToken: null,\n        loading: false,\n        error: err instanceof Error ? err.message : 'Failed to load integration managers',\n      });\n    }\n  }, [mx]);\n\n  useEffect(() => {\n    loadManagers();\n  }, [loadManagers]);\n\n  return { ...state, refresh: loadManagers };\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Box, Header, IconButton, Spinner, Text } from 'folds';\nimport { composerIcon, X } from '$components/icons/phosphor';\nimport type { Room } from '$types/matrix-sdk';\n\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { useIntegrationManager, buildIntegrationManagerUrl } from '$hooks/useIntegrationManager';\nimport * as css from './IntegrationManager.css';\n\ninterface IntegrationManagerProps {\n  room: Room;\n  open: boolean;\n  onClose: () => void;\n}\n\nexport function IntegrationManager({ room, open, onClose }: IntegrationManagerProps) {\n  const { managers, scalarToken, loading, error } = useIntegrationManager();\n  const iframeRef = useRef<HTMLIFrameElement>(null);\n  const [iframeLoaded, setIframeLoaded] = useState(false);\n\n  const manager = managers[0];\n\n  const iframeSrc = manager\n    ? buildIntegrationManagerUrl(manager.uiUrl, scalarToken, room.roomId)\n    : null;\n\n  useEffect(() => {\n    if (!open) return undefined;\n\n    const handleMessage = (event: MessageEvent) => {\n      if (!manager) return;\n\n      try {\n        const managerOrigin = new URL(manager.uiUrl).origin;\n        if (event.origin !== managerOrigin) return;\n      } catch {\n        return;\n      }\n\n      if (event.data?.action === 'close_scalar' || event.data?.action === 'close') {\n        onClose();\n      }\n    };\n\n    window.addEventListener('message', handleMessage);\n    return () => window.removeEventListener('message', handleMessage);\n  }, [open, manager, onClose]);\n\n  useEffect(() => {\n    if (!open) setIframeLoaded(false);\n  }, [open]);\n\n  return (\n    <ModalOverlay open={open} requestClose={onClose}>\n      <Box className={css.IntegrationManagerOverlay} direction=\"Column\">\n        <Header className={css.IntegrationManagerHeader} variant=\"Background\" size=\"600\">\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n              <Text size=\"H5\" truncate>\n                Integration Manager\n              </Text>\n            </Box>\n            <Box shrink=\"No\" alignItems=\"Center\">\n              <IconButton variant=\"Background\" onClick={onClose}>\n                {composerIcon(X)}\n              </IconButton>\n            </Box>\n          </Box>\n        </Header>\n\n        <Box grow=\"Yes\" direction=\"Column\" alignItems=\"Center\" justifyContent=\"Center\">\n          {loading && (\n            <Box direction=\"Column\" alignItems=\"Center\" gap=\"300\">\n              <Spinner size=\"400\" />\n              <Text size=\"T300\" priority=\"300\">\n                Connecting to integration manager...\n              </Text>\n            </Box>\n          )}\n\n          {error && (\n            <Box direction=\"Column\" alignItems=\"Center\" gap=\"300\">\n              <Text size=\"T300\" priority=\"300\">\n                Failed to connect: {error}\n              </Text>\n            </Box>\n          )}\n\n          {!loading && !error && !manager && (\n            <Box direction=\"Column\" alignItems=\"Center\" gap=\"300\">\n              <Text size=\"T300\" priority=\"300\">\n                No integration manager available for this homeserver.\n              </Text>\n            </Box>\n          )}\n\n          {!loading && !error && iframeSrc && (\n            <>\n              {!iframeLoaded && (\n                <Box\n                  direction=\"Column\"\n                  alignItems=\"Center\"\n                  gap=\"300\"\n                  style={{ position: 'absolute' }}\n                >\n                  <Spinner size=\"400\" />\n                  <Text size=\"T300\" priority=\"300\">\n                    Loading...\n                  </Text>\n                </Box>\n              )}\n              <iframe\n                ref={iframeRef}\n                className={css.IntegrationManagerIframe}\n                title=\"Integration Manager\"\n                src={iframeSrc}\n                sandbox=\"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n                allow=\"microphone; camera; encrypted-media; autoplay; clipboard-write; display-capture\"\n                onLoad={() => setIframeLoaded(true)}\n                style={{\n                  opacity: iframeLoaded ? 1 : 0,\n                }}\n              />\n            </>\n          )}\n        </Box>\n      </Box>\n    </ModalOverlay>\n  );\n}\n","// The disable is because the position should only update whenever the new one is updated\n// oxlint-disable eslint-plugin-react-hooks/exhaustive-deps\nimport { Box } from 'folds';\nimport * as css from '$pages/client/sidebar/SidebarResizer.css';\nimport type { Dispatch, SetStateAction } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function SidebarResizer({\n  sidebarWidth,\n  setSidebarWidth,\n  setCurWidth,\n  minValue,\n  maxValue,\n  instep,\n  outstep,\n  isReversed,\n  topSided,\n  setAnnouncement,\n}: {\n  sidebarWidth: number;\n  setSidebarWidth: (arg0: number) => void;\n  setCurWidth?: Dispatch<SetStateAction<number>>;\n  minValue: number;\n  maxValue: number;\n  instep?: number;\n  outstep?: number;\n  isReversed?: boolean;\n  topSided?: boolean;\n  setAnnouncement?: (announcement: boolean) => void;\n}) {\n  const [isPointerOver, setIsPointerOver] = useState(false);\n  const [isPointerDown, setIsPointerDown] = useState(false);\n  const [oldPos, setOldPos] = useState(0);\n  const [interimPos, setInterimPos] = useState(0);\n  const [newPos, setNewPos] = useState(0);\n\n  useEffect(() => {\n    const change = isReversed ? -(oldPos - newPos) : oldPos - newPos;\n    let newValue = Math.min(Math.max(sidebarWidth - change, minValue), maxValue);\n    if (instep && outstep && newValue > instep && newValue < outstep)\n      newValue = newValue > (instep + outstep) / 2 ? outstep : instep;\n\n    if (change) setSidebarWidth(newValue);\n  }, [newPos]);\n\n  useEffect(() => {\n    const change = isReversed ? -(oldPos - interimPos) : oldPos - interimPos;\n    let newValue = Math.min(Math.max(sidebarWidth - change, minValue), maxValue);\n    if (instep && outstep && newValue > instep && newValue < outstep)\n      newValue = newValue > (instep + outstep) / 2 ? outstep : instep;\n    if (change && setCurWidth) setCurWidth(newValue);\n  }, [interimPos]);\n\n  const onPointerMove = useCallback((e: PointerEvent) => {\n    e.preventDefault();\n    setInterimPos(topSided ? e.clientY : e.clientX);\n  }, []);\n  const onPointerUp = useCallback((e: PointerEvent) => {\n    e.preventDefault();\n    setNewPos(topSided ? e.clientY : e.clientX);\n    setIsPointerDown(false);\n    setAnnouncement?.(false);\n    releaseResizeListeners();\n  }, []);\n  const onPointerCancel = useCallback(() => {\n    setIsPointerDown(false);\n    setAnnouncement?.(false);\n    releaseResizeListeners();\n  }, []);\n\n  const releaseResizeListeners = useCallback(() => {\n    resizeReleaseRef.current = null;\n    window.removeEventListener('pointerup', onPointerUp);\n    window.removeEventListener('pointermove', onPointerMove);\n    window.removeEventListener('pointercancel', onPointerCancel);\n  }, [onPointerUp, onPointerMove, onPointerCancel]);\n\n  const resizeReleaseRef = useRef<(() => void) | null>(null);\n\n  useEffect(\n    () => () => {\n      resizeReleaseRef.current?.();\n    },\n    []\n  );\n\n  const onPointerDown = useCallback(\n    (e: React.PointerEvent) => {\n      e.preventDefault();\n      e.currentTarget.setPointerCapture(e.pointerId);\n      setOldPos(topSided ? e.clientY : e.clientX);\n      setIsPointerDown(true);\n      setAnnouncement?.(true);\n      window.addEventListener('pointerup', onPointerUp);\n      window.addEventListener('pointermove', onPointerMove);\n      window.addEventListener('pointercancel', onPointerCancel);\n      resizeReleaseRef.current = releaseResizeListeners;\n    },\n    [onPointerUp, onPointerMove, onPointerCancel, releaseResizeListeners]\n  );\n\n  const dockClass = topSided\n    ? css.SidebarResizerDockTop\n    : isReversed\n      ? css.SidebarResizerDockLeft\n      : css.SidebarResizerDockRight;\n\n  return (\n    <Box\n      className={`${css.SidebarResizer({ topSided: !!topSided })} ${dockClass} ${isPointerOver || isPointerDown ? css.SidebarResizerHover : ''}`}\n      onPointerEnter={() => setIsPointerOver(true)}\n      onPointerLeave={() => setIsPointerOver(false)}\n      onPointerDown={onPointerDown}\n      shrink=\"No\"\n    >\n      <Box\n        shrink=\"No\"\n        className={css.SideBarResizerAnimation}\n        style={{ opacity: isPointerOver || isPointerDown ? '100%' : '0%' }}\n      />\n    </Box>\n  );\n}\n","import type { FormEventHandler, MouseEventHandler } from 'react';\nimport { useEffect, useState } from 'react';\nimport {\n  Box,\n  Header,\n  IconButton,\n  Input,\n  MenuItem,\n  Scroll,\n  Text,\n  Tooltip,\n  config,\n  Button,\n  Line,\n  toRem,\n} from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport {\n  ArrowLeft,\n  composerIcon,\n  GridFour,\n  sizedIcon,\n  Plus,\n  Trash,\n  X,\n} from '$components/icons/phosphor';\nimport type { Room } from '$types/matrix-sdk';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { RoomWidget } from '$hooks/useRoomWidgets';\nimport { useRoomWidgets, enrichWidgetUrl } from '$hooks/useRoomWidgets';\nimport { useSetSetting, useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { usePowerLevelsContext } from '$hooks/usePowerLevels';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\n\nimport { createLogger } from '$utils/debug';\nimport { WidgetIframe } from './WidgetIframe';\nimport * as css from './WidgetsDrawer.css';\nimport { IntegrationManager } from './IntegrationManager';\nimport { CustomStateEvent } from '$types/matrix/room';\nimport { SidebarResizer } from '$pages/client/sidebar/SidebarResizer';\nimport { isMobileOrTablet } from '$utils/platform';\n\ntype WidgetsDrawerHeaderProps = {\n  activeWidget: RoomWidget | null;\n  onBack: () => void;\n};\n\nconst log = createLogger('WidgetsDrawer');\n\nfunction WidgetDrawerHeader({ activeWidget, onBack }: WidgetsDrawerHeaderProps) {\n  const setWidgetDrawer = useSetSetting(settingsAtom, 'isWidgetDrawer');\n\n  return (\n    <Header className={css.WidgetsDrawerHeader} variant=\"Background\" size=\"600\">\n      <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n        {activeWidget && (\n          <Box shrink=\"No\" alignItems=\"Center\">\n            <IconButton fill=\"None\" onClick={onBack}>\n              {composerIcon(ArrowLeft)}\n            </IconButton>\n          </Box>\n        )}\n        <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n          <Text size=\"H5\" truncate>\n            {activeWidget ? activeWidget.name || 'Widget' : 'Widgets'}\n          </Text>\n        </Box>\n        <Box shrink=\"No\" alignItems=\"Center\">\n          <TooltipProvider\n            position=\"Bottom\"\n            align=\"End\"\n            offset={4}\n            tooltip={\n              <Tooltip>\n                <Text>Close</Text>\n              </Tooltip>\n            }\n          >\n            {(triggerRef) => (\n              <IconButton\n                ref={triggerRef}\n                variant=\"Background\"\n                onClick={() => setWidgetDrawer(false)}\n              >\n                {composerIcon(X)}\n              </IconButton>\n            )}\n          </TooltipProvider>\n        </Box>\n      </Box>\n    </Header>\n  );\n}\n\ntype AddWidgetFormProps = {\n  room: Room;\n  onAdded: () => void;\n};\n\nfunction AddWidgetForm({ room, onAdded }: AddWidgetFormProps) {\n  const mx = useMatrixClient();\n  const [name, setName] = useState('');\n  const [url, setUrl] = useState('');\n  const [adding, setAdding] = useState(false);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = async (e) => {\n    e.preventDefault();\n    if (!name.trim() || !url.trim()) return;\n\n    setAdding(true);\n    try {\n      const widgetId = `${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n      await mx.sendStateEvent(\n        room.roomId,\n        CustomStateEvent.RoomWidget,\n        {\n          type: 'm.custom',\n          url: enrichWidgetUrl(url.trim()),\n          name: name.trim(),\n          id: widgetId,\n          creatorUserId: mx.getUserId(),\n        },\n        widgetId\n      );\n      setName('');\n      setUrl('');\n      onAdded();\n    } catch (err) {\n      log.error('Failed to add widget:', err);\n    } finally {\n      setAdding(false);\n    }\n  };\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <Box className={css.AddWidgetForm} direction=\"Column\" gap=\"200\">\n        <Text size=\"L400\" priority=\"300\">\n          Add Widget\n        </Text>\n        <Input\n          className={css.AddWidgetInput}\n          size=\"300\"\n          placeholder=\"Widget Name\"\n          value={name}\n          onChange={(e: React.ChangeEvent<HTMLInputElement>) => setName(e.target.value)}\n        />\n        <Input\n          className={css.AddWidgetInput}\n          size=\"300\"\n          placeholder=\"Widget URL (https://...)\"\n          value={url}\n          onChange={(e: React.ChangeEvent<HTMLInputElement>) => setUrl(e.target.value)}\n        />\n        <Button\n          type=\"submit\"\n          size=\"300\"\n          variant=\"Primary\"\n          disabled={adding || !name.trim() || !url.trim()}\n        >\n          <Text size=\"B300\">{adding ? 'Adding...' : 'Add Widget'}</Text>\n        </Button>\n      </Box>\n    </form>\n  );\n}\n\ntype WidgetListItemProps = {\n  widget: RoomWidget;\n  onSelect: (widget: RoomWidget) => void;\n  onRemove: (widget: RoomWidget) => void;\n  canRemove: boolean;\n};\n\nfunction WidgetListItemView({ widget, onSelect, onRemove, canRemove }: WidgetListItemProps) {\n  const handleRemove: MouseEventHandler<HTMLButtonElement> = (e) => {\n    e.stopPropagation();\n    onRemove(widget);\n  };\n\n  return (\n    <MenuItem\n      onClick={() => onSelect(widget)}\n      size=\"300\"\n      radii=\"300\"\n      after={\n        canRemove ? (\n          <TooltipProvider\n            position=\"Left\"\n            tooltip={\n              <Tooltip>\n                <Text>Remove Widget</Text>\n              </Tooltip>\n            }\n          >\n            {(triggerRef) => (\n              <IconButton\n                ref={triggerRef}\n                size=\"300\"\n                variant=\"Critical\"\n                fill=\"None\"\n                onClick={handleRemove}\n              >\n                {sizedIcon(Trash, '100')}\n              </IconButton>\n            )}\n          </TooltipProvider>\n        ) : undefined\n      }\n    >\n      <Box grow=\"Yes\" direction=\"Column\">\n        <Text size=\"T300\" truncate>\n          {widget.name || 'Unnamed Widget'}\n        </Text>\n        <Text size=\"T200\" priority=\"300\" truncate>\n          {widget.type || 'm.custom'}\n        </Text>\n      </Box>\n    </MenuItem>\n  );\n}\n\ntype WidgetsDrawerProps = {\n  room: Room;\n};\n\nexport function WidgetsDrawer({ room }: WidgetsDrawerProps) {\n  const mx = useMatrixClient();\n  const widgets = useRoomWidgets(room);\n  const [activeWidget, setActiveWidget] = useState<RoomWidget | null>(null);\n  const [showAddForm, setShowAddForm] = useState(false);\n  const [showIntegrationManager, setShowIntegrationManager] = useState(false);\n\n  const powerLevels = usePowerLevelsContext();\n  const creators = useRoomCreators(room);\n  const permissions = useRoomPermissions(creators, powerLevels);\n  const canManageWidgets = permissions.stateEvent(CustomStateEvent.RoomWidget, mx.getSafeUserId());\n\n  const [widgetSidebarWidth, setWidgetSidebarWidth] = useSetting(\n    settingsAtom,\n    'widgetSidebarWidth'\n  );\n  const [curWidth, setCurWidth] = useState(widgetSidebarWidth);\n  useEffect(() => {\n    setCurWidth(widgetSidebarWidth);\n  }, [widgetSidebarWidth]);\n\n  const handleRemoveWidget = async (widget: RoomWidget) => {\n    try {\n      await mx.sendStateEvent(room.roomId, CustomStateEvent.RoomWidget, {}, widget.id);\n      if (activeWidget?.id === widget.id) {\n        setActiveWidget(null);\n      }\n    } catch (err) {\n      log.error('Failed to remove widget:', err);\n    }\n  };\n\n  const handleBack = () => setActiveWidget(null);\n\n  return (\n    <Box\n      className={css.WidgetsDrawer}\n      shrink=\"No\"\n      direction=\"Column\"\n      style={{\n        position: 'relative',\n        width: !isMobileOrTablet() ? toRem(curWidth) : 'inherit',\n      }}\n    >\n      {!isMobileOrTablet() && (\n        <SidebarResizer\n          setCurWidth={setCurWidth}\n          sidebarWidth={widgetSidebarWidth}\n          setSidebarWidth={setWidgetSidebarWidth}\n          minValue={50}\n          maxValue={1200}\n          isReversed\n        />\n      )}\n      <WidgetDrawerHeader activeWidget={activeWidget} onBack={handleBack} />\n      {activeWidget ? (\n        <Box className={css.WidgetIframeContainer} grow=\"Yes\">\n          <WidgetIframe key={activeWidget.id} widget={activeWidget} roomId={room.roomId} mx={mx} />\n        </Box>\n      ) : (\n        <Scroll variant=\"Background\" visibility=\"Hover\">\n          <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S200 }}>\n            {widgets.length === 0 && !showAddForm && (\n              <Box style={{ padding: config.space.S300 }}>\n                <Text size=\"T300\" priority=\"300\">\n                  No widgets in this room.\n                </Text>\n              </Box>\n            )}\n            {widgets.map((widget) => (\n              <WidgetListItemView\n                key={widget.id}\n                widget={widget}\n                onSelect={setActiveWidget}\n                onRemove={handleRemoveWidget}\n                canRemove={canManageWidgets}\n              />\n            ))}\n            {canManageWidgets && (\n              <>\n                <Line variant=\"Surface\" size=\"300\" />\n                {showAddForm ? (\n                  <AddWidgetForm room={room} onAdded={() => setShowAddForm(false)} />\n                ) : (\n                  <Box\n                    direction=\"Column\"\n                    gap=\"100\"\n                    style={{\n                      padding: `${config.space.S100} ${config.space.S300}`,\n                    }}\n                  >\n                    <Button\n                      size=\"300\"\n                      variant=\"Primary\"\n                      fill=\"Soft\"\n                      onClick={() => setShowIntegrationManager(true)}\n                      before={sizedIcon(GridFour, '100')}\n                    >\n                      <Text size=\"B300\">Integration Manager</Text>\n                    </Button>\n                    <Button\n                      size=\"300\"\n                      variant=\"Secondary\"\n                      fill=\"Soft\"\n                      onClick={() => setShowAddForm(true)}\n                      before={sizedIcon(Plus, '100')}\n                    >\n                      <Text size=\"B300\">Add Custom Widget</Text>\n                    </Button>\n                  </Box>\n                )}\n              </>\n            )}\n          </Box>\n        </Scroll>\n      )}\n      <IntegrationManager\n        room={room}\n        open={showIntegrationManager}\n        onClose={() => setShowIntegrationManager(false)}\n      />\n    </Box>\n  );\n}\n","import { atom } from 'jotai';\nimport { atomFamily } from 'jotai/utils';\n\nconst createOpenThreadAtom = () => atom<string | undefined>(undefined);\ntype TOpenThreadAtom = ReturnType<typeof createOpenThreadAtom>;\n\n/**\n * Tracks the currently-open thread root event ID per room.\n * Key: roomId\n * Value: eventId of the thread root, or undefined if no thread is open.\n */\nexport const roomIdToOpenThreadAtomFamily = atomFamily<string, TOpenThreadAtom>(() =>\n  createOpenThreadAtom()\n);\n","import { atom } from 'jotai';\nimport { atomFamily } from 'jotai/utils';\n\nconst createThreadBrowserAtom = () => atom(false);\ntype TThreadBrowserAtom = ReturnType<typeof createThreadBrowserAtom>;\n\n/**\n * Tracks whether the thread browser panel is open per room.\n * Key: roomId\n */\nexport const roomIdToThreadBrowserAtomFamily = atomFamily<string, TThreadBrowserAtom>(() =>\n  createThreadBrowserAtom()\n);\n","export type AbbreviationEntry = {\n  term: string;\n  definition: string;\n};\n\nexport type RoomAbbreviationsContent = {\n  entries: AbbreviationEntry[];\n};\n\n/** Build a map of lowercase term → definition for O(1) lookup. */\nexport const buildAbbreviationsMap = (entries: AbbreviationEntry[]): Map<string, string> => {\n  const map = new Map<string, string>();\n  entries.forEach(({ term, definition }) => {\n    const t = term.trim();\n    if (t) map.set(t.toLowerCase(), definition);\n  });\n  return map;\n};\n\n/**\n * Split a plain-text string into alternating [plain, term, plain, term, …] segments.\n * Matched terms preserve their original casing from the source string.\n * Matching is whole-word and case-insensitive.\n *\n * Returns an array of `{ text, termKey }` objects where `termKey` is undefined for\n * plain segments and is the lowercase lookup key for abbreviation segments.\n */\nexport type TextSegment = {\n  id: string;\n  text: string;\n  /** Undefined for plain text; the lowercase map key for an abbreviation. */\n  termKey?: string;\n};\n\nexport const splitByAbbreviations = (text: string, abbrMap: Map<string, string>): TextSegment[] => {\n  if (abbrMap.size === 0) return [{ id: 'txt-0', text }];\n\n  // Build a regex that matches any of the terms at word boundaries.\n  // Sort longest first so \"HTTP/2\" matches before \"HTTP\".\n  const terms = [...abbrMap.keys()].toSorted((a, b) => b.length - a.length);\n  const escaped = terms.map((t) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n  const pattern = new RegExp(`\\\\b(${escaped.join('|')})\\\\b`, 'gi');\n\n  const segments: TextSegment[] = [];\n  let lastIndex = 0;\n\n  Array.from(text.matchAll(pattern)).forEach((match) => {\n    const matchIndex = match.index;\n    if (matchIndex > lastIndex) {\n      segments.push({\n        id: `txt-${segments.length}`,\n        text: text.slice(lastIndex, matchIndex),\n      });\n    }\n    segments.push({\n      id: `txt-${segments.length}`,\n      text: match[0],\n      termKey: match[0].toLowerCase(),\n    });\n    lastIndex = matchIndex + match[0].length;\n  });\n\n  if (lastIndex < text.length) {\n    segments.push({ id: `txt-${segments.length}`, text: text.slice(lastIndex) });\n  }\n\n  return segments.length > 0 ? segments : [{ id: 'txt-0', text }];\n};\n","import type { ClientEventHandlerMap, MatrixClient } from '$types/matrix-sdk';\nimport { ClientEvent } from '$types/matrix-sdk';\nimport { useEffect } from 'react';\n\nexport const useSyncState = (\n  mx: MatrixClient | undefined,\n  onChange: ClientEventHandlerMap[ClientEvent.Sync]\n): void => {\n  useEffect(() => {\n    if (!mx) return undefined;\n\n    mx.on(ClientEvent.Sync, onChange);\n\n    const currentState = mx.getSyncState();\n    if (currentState) onChange(currentState, null);\n\n    return () => {\n      mx?.removeListener(ClientEvent.Sync, onChange);\n    };\n  }, [mx, onChange]);\n};\n","import { produce } from 'immer';\nimport { atom, useSetAtom } from 'jotai';\nimport type { MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk';\nimport {\n  ClientEvent,\n  RoomEvent,\n  RoomStateEvent,\n  SyncState,\n  EventType,\n  KnownMembership,\n} from '$types/matrix-sdk';\nimport { useCallback, useEffect } from 'react';\nimport type { RoomToParents } from '$types/matrix/room';\n\nimport {\n  getRoomToParents,\n  getSpaceChildren,\n  isSpace,\n  isValidChild,\n  mapParentWithChildren,\n} from '$utils/room/hierarchy';\nimport { useSyncState } from '$hooks/useSyncState';\n\ntype RoomToParentsAction =\n  | {\n      type: 'INITIALIZE';\n      roomToParents: RoomToParents;\n    }\n  | {\n      type: 'PUT';\n      parent: string;\n      children: string[];\n    }\n  | {\n      type: 'REMOVE_CHILD';\n      parent: string;\n      child: string;\n    }\n  | {\n      type: 'DELETE';\n      roomId: string;\n    };\n\nconst baseRoomToParents = atom(new Map());\nexport const roomToParentsAtom = atom<RoomToParents, [RoomToParentsAction], undefined>(\n  (get) => get(baseRoomToParents),\n  (get, set, action) => {\n    if (action.type === 'INITIALIZE') {\n      set(baseRoomToParents, action.roomToParents);\n      return;\n    }\n    if (action.type === 'PUT') {\n      set(\n        baseRoomToParents,\n        produce(get(baseRoomToParents), (draftRoomToParents) => {\n          mapParentWithChildren(draftRoomToParents, action.parent, action.children);\n        })\n      );\n      return;\n    }\n    if (action.type === 'REMOVE_CHILD') {\n      set(\n        baseRoomToParents,\n        produce(get(baseRoomToParents), (draftRoomToParents) => {\n          const parents = draftRoomToParents.get(action.child);\n          if (!parents) return;\n          parents.delete(action.parent);\n          if (parents.size === 0) {\n            draftRoomToParents.delete(action.child);\n          } else {\n            draftRoomToParents.set(action.child, parents);\n          }\n        })\n      );\n      return;\n    }\n    if (action.type === 'DELETE') {\n      set(\n        baseRoomToParents,\n        produce(get(baseRoomToParents), (draftRoomToParents) => {\n          const noParentRooms: string[] = [];\n          draftRoomToParents.delete(action.roomId);\n          draftRoomToParents.forEach((parents, child) => {\n            parents.delete(action.roomId);\n            if (parents.size === 0) noParentRooms.push(child);\n          });\n          noParentRooms.forEach((room) => draftRoomToParents.delete(room));\n        })\n      );\n    }\n  }\n);\n\nexport const useBindRoomToParentsAtom = (\n  mx: MatrixClient,\n  roomToParents: typeof roomToParentsAtom\n) => {\n  const setRoomToParents = useSetAtom(roomToParents);\n  const resetRoomToParents = useCallback(\n    () => setRoomToParents({ type: 'INITIALIZE', roomToParents: getRoomToParents(mx) }),\n    [mx, setRoomToParents]\n  );\n\n  useSyncState(\n    mx,\n    useCallback(\n      (state, prevState) => {\n        if (\n          (state === SyncState.Prepared && prevState === null) ||\n          (state === SyncState.Syncing && prevState !== SyncState.Syncing)\n        ) {\n          resetRoomToParents();\n        }\n      },\n      [resetRoomToParents]\n    )\n  );\n\n  useEffect(() => {\n    resetRoomToParents();\n\n    const handleAddRoom = (room: Room) => {\n      if (isSpace(room) && room.getMyMembership() === (KnownMembership.Join as string)) {\n        setRoomToParents({\n          type: 'PUT',\n          parent: room.roomId,\n          children: getSpaceChildren(room),\n        });\n      }\n    };\n\n    const handleMembershipChange = (room: Room, membership: string) => {\n      if (isSpace(room) && membership !== (KnownMembership.Join as string)) {\n        setRoomToParents({ type: 'DELETE', roomId: room.roomId });\n        return;\n      }\n      if (isSpace(room) && membership === (KnownMembership.Join as string)) {\n        setRoomToParents({\n          type: 'PUT',\n          parent: room.roomId,\n          children: getSpaceChildren(room),\n        });\n      }\n    };\n\n    const handleStateChange = (mEvent: MatrixEvent) => {\n      if (mEvent.getType() === (EventType.SpaceChild as string)) {\n        const childId = mEvent.getStateKey();\n        const roomId = mEvent.getRoomId();\n        if (childId && roomId) {\n          const parentRoom = mx.getRoom(roomId);\n          if (!parentRoom || parentRoom.getMyMembership() !== (KnownMembership.Join as string))\n            return;\n          if (isValidChild(mEvent)) {\n            setRoomToParents({ type: 'PUT', parent: roomId, children: [childId] });\n          } else {\n            setRoomToParents({ type: 'REMOVE_CHILD', parent: roomId, child: childId });\n          }\n        }\n      }\n    };\n\n    const handleDeleteRoom = (roomId: string) => {\n      setRoomToParents({ type: 'DELETE', roomId });\n    };\n\n    mx.on(ClientEvent.Room, handleAddRoom);\n    mx.on(RoomEvent.MyMembership, handleMembershipChange);\n    mx.on(RoomStateEvent.Events, handleStateChange);\n    mx.on(ClientEvent.DeleteRoom, handleDeleteRoom);\n    return () => {\n      mx.removeListener(ClientEvent.Room, handleAddRoom);\n      mx.removeListener(RoomEvent.MyMembership, handleMembershipChange);\n      mx.removeListener(RoomStateEvent.Events, handleStateChange);\n      mx.removeListener(ClientEvent.DeleteRoom, handleDeleteRoom);\n    };\n  }, [mx, setRoomToParents, resetRoomToParents]);\n};\n","import { createContext, useContext, useCallback, useMemo } from 'react';\nimport { useAtomValue } from 'jotai';\nimport type { Room } from '$types/matrix-sdk';\n\nimport type { RoomAbbreviationsContent } from '$utils/abbreviations';\nimport { buildAbbreviationsMap } from '$utils/abbreviations';\nimport { getAllParents, getStateEvent } from '$utils/room/hierarchy';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useStateEvent } from './useStateEvent';\nimport { useStateEventCallback } from './useStateEventCallback';\nimport { useForceUpdate } from './useForceUpdate';\nimport { CustomStateEvent } from '$types/matrix/room';\n\nconst EMPTY_MAP: Map<string, string> = new Map();\n\nexport const RoomAbbreviationsContext = createContext(EMPTY_MAP);\n\nexport const useRoomAbbreviationsContext = () => useContext(RoomAbbreviationsContext);\n\n/** Read the room's abbreviations state event and return a term→definition map. */\nexport const useRoomAbbreviations = (room: Room): Map<string, string> => {\n  const stateEvent = useStateEvent(room, CustomStateEvent.RoomAbbreviations);\n  if (!stateEvent) return EMPTY_MAP;\n  const content = stateEvent.getContent<RoomAbbreviationsContent>();\n  if (!Array.isArray(content?.entries) || content.entries.length === 0) return EMPTY_MAP;\n  return buildAbbreviationsMap(content.entries);\n};\n\n/**\n * Return a merged map of abbreviations from ALL ancestor spaces and the room.\n * Nearest ancestor entries override farther ancestor entries; room entries override everything.\n * Subscribes to abbreviation state changes across the full space hierarchy.\n */\nexport const useMergedAbbreviations = (room: Room): Map<string, string> => {\n  const mx = useMatrixClient();\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const [updateCount, forceUpdate] = useForceUpdate();\n\n  useStateEventCallback(\n    mx,\n    useCallback(\n      (event) => {\n        if (event.getType() !== (CustomStateEvent.RoomAbbreviations as string)) return;\n        const eventRoomId = event.getRoomId();\n        if (!eventRoomId) return;\n        if (\n          eventRoomId === room.roomId ||\n          getAllParents(roomToParents, room.roomId).has(eventRoomId)\n        ) {\n          forceUpdate();\n        }\n      },\n      [room.roomId, roomToParents, forceUpdate]\n    )\n  );\n\n  return useMemo(() => {\n    // `updateCount` is a cache-busting key for state-event driven recomputation.\n    void updateCount;\n    const allParentIds = Array.from(getAllParents(roomToParents, room.roomId));\n    const ancestorEntries = allParentIds.flatMap((parentId) => {\n      const parentRoom = mx.getRoom(parentId);\n      if (!parentRoom) return [];\n      const content = getStateEvent(\n        parentRoom,\n        CustomStateEvent.RoomAbbreviations\n      )?.getContent<RoomAbbreviationsContent>();\n      return Array.isArray(content?.entries) ? content.entries : [];\n    });\n\n    const roomContent = getStateEvent(\n      room,\n      CustomStateEvent.RoomAbbreviations\n    )?.getContent<RoomAbbreviationsContent>();\n    const roomEntries = Array.isArray(roomContent?.entries) ? roomContent.entries : [];\n\n    if (ancestorEntries.length === 0 && roomEntries.length === 0) return EMPTY_MAP;\n    // Ancestor entries first; room entries appended so they override duplicates.\n    return buildAbbreviationsMap([...ancestorEntries, ...roomEntries]);\n  }, [mx, roomToParents, room, updateCount]);\n};\n","import { JoinRule, RoomType } from '$types/matrix-sdk';\nimport type { ComponentType } from 'react';\nimport type { IconProps } from '@phosphor-icons/react';\nimport { CustomRoomType } from '$types/matrix/room';\nimport { Chats, Globe, HashStraight, Lock, SpeakerHigh, SquaresFour } from './phosphor';\n\nexport type RoomPhosphorIcon = ComponentType<IconProps>;\n\nexport type RoomIconOverlay = 'globe' | 'lock';\n\nconst isRegularRoom = (roomType?: string): boolean =>\n  roomType !== RoomType.Space && roomType !== RoomType.UnstableCall;\n\nexport function getRoomIconOverlay(\n  roomType?: string,\n  joinRule?: JoinRule\n): RoomIconOverlay | undefined {\n  if (!isRegularRoom(roomType)) return undefined;\n\n  if (joinRule === JoinRule.Public) return 'globe';\n  if (\n    joinRule === JoinRule.Invite ||\n    joinRule === JoinRule.Knock ||\n    joinRule === JoinRule.Private\n  ) {\n    return 'lock';\n  }\n  return undefined;\n}\n\nexport function getRoomIconOverlayComponent(overlay: RoomIconOverlay): RoomPhosphorIcon {\n  return overlay === 'globe' ? Globe : Lock;\n}\n\nexport function getRoomStandaloneIconComponent(\n  roomType?: string,\n  joinRule?: JoinRule\n): RoomPhosphorIcon {\n  if (roomType === RoomType.Space) {\n    if (joinRule === JoinRule.Public) return Globe;\n    if (\n      joinRule === JoinRule.Invite ||\n      joinRule === JoinRule.Knock ||\n      joinRule === JoinRule.Private\n    ) {\n      return Lock;\n    }\n    return SquaresFour;\n  }\n\n  if (roomType === RoomType.UnstableCall) {\n    if (joinRule === JoinRule.Public) return Globe;\n    if (\n      joinRule === JoinRule.Invite ||\n      joinRule === JoinRule.Knock ||\n      joinRule === JoinRule.Private\n    ) {\n      return Lock;\n    }\n    return SpeakerHigh;\n  }\n\n  if (roomType === CustomRoomType.Forum) {\n    if (\n      joinRule === JoinRule.Invite ||\n      joinRule === JoinRule.Knock ||\n      joinRule === JoinRule.Private\n    ) {\n      return Lock;\n    }\n    return Chats;\n  }\n\n  if (joinRule === JoinRule.Public) return Globe;\n  if (\n    joinRule === JoinRule.Invite ||\n    joinRule === JoinRule.Knock ||\n    joinRule === JoinRule.Private\n  ) {\n    return Lock;\n  }\n  return HashStraight;\n}\n\nexport function getRoomIconComponent(roomType?: string, joinRule?: JoinRule): RoomPhosphorIcon {\n  if (roomType === RoomType.Space) {\n    if (joinRule === JoinRule.Public) return Globe;\n    if (\n      joinRule === JoinRule.Invite ||\n      joinRule === JoinRule.Knock ||\n      joinRule === JoinRule.Private\n    ) {\n      return Lock;\n    }\n    return SquaresFour;\n  }\n\n  if (roomType === RoomType.UnstableCall) {\n    if (joinRule === JoinRule.Public) return Globe;\n    if (\n      joinRule === JoinRule.Invite ||\n      joinRule === JoinRule.Knock ||\n      joinRule === JoinRule.Private\n    ) {\n      return Lock;\n    }\n    return SpeakerHigh;\n  }\n\n  if (roomType === CustomRoomType.Forum) {\n    if (\n      joinRule === JoinRule.Invite ||\n      joinRule === JoinRule.Knock ||\n      joinRule === JoinRule.Private\n    ) {\n      return Lock;\n    }\n    return Chats;\n  }\n\n  return HashStraight;\n}\n","// Getting a dominant color from an IMG source,\n// and darkening it a bit afterwards for contrast\nexport default function bgColorImg(img) {\n  const size = 32;\n  const darken = 0.8;\n  const canvas = document.createElement('canvas');\n  canvas.width = size;\n  canvas.height = size;\n  const ctx = canvas.getContext('2d', { willReadFrequently: true });\n  ctx.drawImage(img, 0, 0, size, size);\n  const px = ctx.getImageData(0, 0, size, size).data;\n\n  const counts = new Uint16Array(4096);\n  const totals = new Uint32Array(4096 * 3);\n\n  for (let i = 0, len = px.length; i < len; i += 4) {\n    if (px[i + 3] >= 16) {\n      const rq = Math.trunc(px[i] / 16);\n      const gq = Math.trunc(px[i + 1] / 16);\n      const bq = Math.trunc(px[i + 2] / 16);\n      const key = rq * 256 + gq * 16 + bq;\n      const j = key * 3;\n      counts[key] += 1;\n      totals[j] += px[i];\n      totals[j + 1] += px[i + 1];\n      totals[j + 2] += px[i + 2];\n    }\n  }\n\n  let bestScore = -1;\n  let bestKey = 0;\n\n  for (let key = 0; key < 4096; key += 1) {\n    const count = counts[key];\n    if (count > 0) {\n      const j = key * 3;\n      const avgR = totals[j] / count;\n      const avgG = totals[j + 1] / count;\n      const avgB = totals[j + 2] / count;\n\n      const max = Math.max(avgR, avgG, avgB);\n      const min = Math.min(avgR, avgG, avgB);\n      const chromaNorm = (max - min) / 255;\n      const luma = (avgR * 0.2126 + avgG * 0.7152 + avgB * 0.0722) / 255;\n      const midW = Math.max(0.2, 1 - Math.abs(luma - 0.5) * 1.2);\n      const score = count * (1 + chromaNorm * 2) * midW;\n\n      if (score > bestScore) {\n        bestScore = score;\n        bestKey = key;\n      }\n    }\n  }\n\n  const rRaw = Math.trunc(bestKey / 256) * 16 + 8;\n  const gRaw = (Math.trunc(bestKey / 16) % 16) * 16 + 8;\n  const bRaw = (bestKey % 16) * 16 + 8;\n\n  // Convert to HSL, scale lightness, convert back\n  const rN = rRaw / 255;\n  const gN = gRaw / 255;\n  const bN = bRaw / 255;\n  const max = Math.max(rN, gN, bN);\n  const min = Math.min(rN, gN, bN);\n  const delta = max - min;\n\n  let h = 0;\n  let s = 0;\n  const l = (max + min) / 2;\n\n  if (delta > 0) {\n    s = delta / (1 - Math.abs(2 * l - 1));\n    if (max === rN) {\n      h = ((gN - bN) / delta) % 6;\n    } else if (max === gN) {\n      h = (bN - rN) / delta + 2;\n    } else {\n      h = (rN - gN) / delta + 4;\n    }\n    h = Math.round(h * 60);\n    if (h < 0) h += 360;\n  }\n\n  // Darken: reduce lightness by 20%,\n  // keep hue & saturation intact\n  const lDark = l * darken;\n\n  const c = (1 - Math.abs(2 * lDark - 1)) * s;\n  const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n  const m = lDark - c / 2;\n\n  let r1 = 0;\n  let g1 = 0;\n  let b1 = 0;\n\n  if (h < 60) {\n    r1 = c;\n    g1 = x;\n  } else if (h < 120) {\n    r1 = x;\n    g1 = c;\n  } else if (h < 180) {\n    g1 = c;\n    b1 = x;\n  } else if (h < 240) {\n    g1 = x;\n    b1 = c;\n  } else if (h < 300) {\n    r1 = x;\n    b1 = c;\n  } else {\n    r1 = c;\n    b1 = x;\n  }\n\n  const r = Math.round((r1 + m) * 255);\n  const g = Math.round((g1 + m) * 255);\n  const b = Math.round((b1 + m) * 255);\n\n  return `rgb(${r}, ${g}, ${b})`;\n}\n","import { AvatarImage as FoldsAvatarImage } from 'folds';\nimport type { ReactEventHandler } from 'react';\nimport { useState } from 'react';\nimport bgColorImg from '$utils/bgColorImg';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport * as css from './RoomAvatar.css';\n\ntype AvatarImageProps = {\n  src: string;\n  alt?: string;\n  uniformIcons?: boolean;\n  onError: () => void;\n};\n\nexport function AvatarImage({ src, alt, uniformIcons, onError }: AvatarImageProps) {\n  const [uniformIconsSetting] = useSetting(settingsAtom, 'uniformIcons');\n  const [image, setImage] = useState<HTMLImageElement | undefined>(undefined);\n\n  const useUniformIcons = uniformIconsSetting && uniformIcons === true;\n  const normalizedBg = useUniformIcons && image ? bgColorImg(image) : undefined;\n\n  const handleLoad: ReactEventHandler<HTMLImageElement> = (evt) => {\n    evt.currentTarget.setAttribute('data-image-loaded', 'true');\n    setImage(evt.currentTarget);\n  };\n\n  const isBlobUrl = src.startsWith('blob:');\n\n  return (\n    <FoldsAvatarImage\n      className={css.RoomAvatar}\n      style={{ backgroundColor: useUniformIcons ? normalizedBg : undefined }}\n      src={src}\n      crossOrigin={isBlobUrl ? undefined : 'anonymous'}\n      alt={alt}\n      loading=\"lazy\"\n      decoding=\"async\"\n      onError={() => {\n        setImage(undefined);\n        onError();\n      }}\n      onLoad={handleLoad}\n      draggable={false}\n    />\n  );\n}\n","import type { JoinRule } from '$types/matrix-sdk';\nimport { AvatarFallback, color } from 'folds';\nimport type { ReactNode } from 'react';\nimport { forwardRef } from 'react';\nimport type { IconProps } from '@phosphor-icons/react';\nimport classNames from 'classnames';\nimport { sizedIcon, type IconSizeToken } from '$components/icons/phosphor';\nimport {\n  getRoomIconComponent,\n  getRoomIconOverlay,\n  getRoomIconOverlayComponent,\n  getRoomStandaloneIconComponent,\n} from '$components/icons/roomIcons';\nimport colorMXID from '$utils/colorMXID';\nimport { useAvatarMediaSource } from '$hooks/useRenderableMediaUrl';\nimport * as css from './RoomAvatar.css';\nimport { AvatarImage } from './AvatarImage';\n\ntype RoomAvatarProps = {\n  roomId: string;\n  src?: string;\n  alt?: string;\n  renderFallback: () => ReactNode;\n  uniformIcons?: boolean;\n};\n\nexport function RoomAvatar({ roomId, src, alt, renderFallback, uniformIcons }: RoomAvatarProps) {\n  const { mediaSrc, error, onError } = useAvatarMediaSource(src);\n\n  if (!mediaSrc || error) {\n    return (\n      <AvatarFallback\n        style={{ backgroundColor: colorMXID(roomId ?? ''), color: color.Surface.Container }}\n        className={css.RoomAvatar}\n      >\n        {renderFallback()}\n      </AvatarFallback>\n    );\n  }\n\n  return <AvatarImage src={mediaSrc} alt={alt} uniformIcons={uniformIcons} onError={onError} />;\n}\n\nexport const RoomIcon = forwardRef<\n  HTMLSpanElement,\n  Omit<IconProps, 'ref'> & {\n    joinRule?: JoinRule;\n    roomType?: string;\n    size?: IconSizeToken;\n    filled?: boolean;\n    withOverlay?: boolean;\n  }\n>(\n  (\n    { joinRule, roomType, size = '200', filled, withOverlay = true, className, style, ...props },\n    ref\n  ) => {\n    const Icon = withOverlay\n      ? getRoomIconComponent(roomType, joinRule)\n      : getRoomStandaloneIconComponent(roomType, joinRule);\n    const overlay = withOverlay ? getRoomIconOverlay(roomType, joinRule) : undefined;\n\n    if (overlay) {\n      const OverlayIcon = getRoomIconOverlayComponent(overlay);\n      return (\n        <span ref={ref} className={classNames(css.RoomIconRoot, className)} style={style}>\n          <span className={css.RoomIconComposite}>\n            {sizedIcon(Icon, size, { ...props, filled })}\n            <span\n              className={classNames(css.RoomIconBadge, css.RoomIconBadgeShape[overlay])}\n              aria-hidden\n            >\n              <span className={css.RoomIconBadgeIcon}>\n                <OverlayIcon size=\"100%\" weight=\"regular\" color={props.color} />\n              </span>\n            </span>\n          </span>\n        </span>\n      );\n    }\n\n    return (\n      <span ref={ref} className={classNames(css.RoomIconRoot, className)} style={style}>\n        {sizedIcon(Icon, size, { ...props, filled })}\n      </span>\n    );\n  }\n);\n","// THIS FILE IS AUTOMATICALLY GENERATED DO NOT EDIT DIRECTLY\n// See update-tlds.js for encoding/decoding format\n// https://data.iana.org/TLD/tlds-alpha-by-domain.txt\nconst encodedTlds = 'aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2';\n// Internationalized domain names containing non-ASCII\nconst encodedUtlds = 'ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2';\n\n/**\n * Finite State Machine generation utilities\n */\n\n/**\n * @template T\n * @typedef {{ [group: string]: T[] }} Collections\n */\n\n/**\n * @typedef {{ [group: string]: true }} Flags\n */\n\n// Keys in scanner Collections instances\nconst numeric = 'numeric';\nconst ascii = 'ascii';\nconst alpha = 'alpha';\nconst asciinumeric = 'asciinumeric';\nconst alphanumeric = 'alphanumeric';\nconst domain = 'domain';\nconst emoji = 'emoji';\nconst scheme = 'scheme';\nconst slashscheme = 'slashscheme';\nconst whitespace = 'whitespace';\n\n/**\n * @template T\n * @param {string} name\n * @param {Collections<T>} groups to register in\n * @returns {T[]} Current list of tokens in the given collection\n */\nfunction registerGroup(name, groups) {\n  if (!(name in groups)) {\n    groups[name] = [];\n  }\n  return groups[name];\n}\n\n/**\n * @template T\n * @param {T} t token to add\n * @param {Collections<T>} groups\n * @param {Flags} flags\n */\nfunction addToGroups(t, flags, groups) {\n  if (flags[numeric]) {\n    flags[asciinumeric] = true;\n    flags[alphanumeric] = true;\n  }\n  if (flags[ascii]) {\n    flags[asciinumeric] = true;\n    flags[alpha] = true;\n  }\n  if (flags[asciinumeric]) {\n    flags[alphanumeric] = true;\n  }\n  if (flags[alpha]) {\n    flags[alphanumeric] = true;\n  }\n  if (flags[alphanumeric]) {\n    flags[domain] = true;\n  }\n  if (flags[emoji]) {\n    flags[domain] = true;\n  }\n  for (const k in flags) {\n    const group = registerGroup(k, groups);\n    if (group.indexOf(t) < 0) {\n      group.push(t);\n    }\n  }\n}\n\n/**\n * @template T\n * @param {T} t token to check\n * @param {Collections<T>} groups\n * @returns {Flags} group flags that contain this token\n */\nfunction flagsForToken(t, groups) {\n  const result = {};\n  for (const c in groups) {\n    if (groups[c].indexOf(t) >= 0) {\n      result[c] = true;\n    }\n  }\n  return result;\n}\n\n/**\n * @template T\n * @typedef {null | T } Transition\n */\n\n/**\n * Define a basic state machine state. j is the list of character transitions,\n * jr is the list of regex-match transitions, jd is the default state to\n * transition to t is the accepting token type, if any. If this is the terminal\n * state, then it does not emit a token.\n *\n * The template type T represents the type of the token this state accepts. This\n * should be a string (such as of the token exports in `text.js`) or a\n * MultiToken subclass (from `multi.js`)\n *\n * @template T\n * @param {T} [token] Token that this state emits\n */\nfunction State(token = null) {\n  // this.n = null; // DEBUG: State name\n  /** @type {{ [input: string]: State<T> }} j */\n  this.j = {}; // IMPLEMENTATION 1\n  // this.j = []; // IMPLEMENTATION 2\n  /** @type {[RegExp, State<T>][]} jr */\n  this.jr = [];\n  /** @type {?State<T>} jd */\n  this.jd = null;\n  /** @type {?T} t */\n  this.t = token;\n}\n\n/**\n * Scanner token groups\n * @type Collections<string>\n */\nState.groups = {};\nState.prototype = {\n  accepts() {\n    return !!this.t;\n  },\n  /**\n   * Follow an existing transition from the given input to the next state.\n   * Does not mutate.\n   * @param {string} input character or token type to transition on\n   * @returns {?State<T>} the next state, if any\n   */\n  go(input) {\n    const state = this;\n    const nextState = state.j[input];\n    if (nextState) {\n      return nextState;\n    }\n    for (let i = 0; i < state.jr.length; i++) {\n      const regex = state.jr[i][0];\n      const nextState = state.jr[i][1]; // note: might be empty to prevent default jump\n      if (nextState && regex.test(input)) {\n        return nextState;\n      }\n    }\n    // Nowhere left to jump! Return default, if any\n    return state.jd;\n  },\n  /**\n   * Whether the state has a transition for the given input. Set the second\n   * argument to true to only look for an exact match (and not a default or\n   * regular-expression-based transition)\n   * @param {string} input\n   * @param {boolean} exactOnly\n   */\n  has(input, exactOnly = false) {\n    return exactOnly ? input in this.j : !!this.go(input);\n  },\n  /**\n   * Short for \"transition all\"; create a transition from the array of items\n   * in the given list to the same final resulting state.\n   * @param {string | string[]} inputs Group of inputs to transition on\n   * @param {Transition<T> | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   */\n  ta(inputs, next, flags, groups) {\n    for (let i = 0; i < inputs.length; i++) {\n      this.tt(inputs[i], next, flags, groups);\n    }\n  },\n  /**\n   * Short for \"take regexp transition\"; defines a transition for this state\n   * when it encounters a token which matches the given regular expression\n   * @param {RegExp} regexp Regular expression transition (populate first)\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   * @returns {State<T>} taken after the given input\n   */\n  tr(regexp, next, flags, groups) {\n    groups = groups || State.groups;\n    let nextState;\n    if (next && next.j) {\n      nextState = next;\n    } else {\n      // Token with maybe token groups\n      nextState = new State(next);\n      if (flags && groups) {\n        addToGroups(next, flags, groups);\n      }\n    }\n    this.jr.push([regexp, nextState]);\n    return nextState;\n  },\n  /**\n   * Short for \"take transitions\", will take as many sequential transitions as\n   * the length of the given input and returns the\n   * resulting final state.\n   * @param {string | string[]} input\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   * @returns {State<T>} taken after the given input\n   */\n  ts(input, next, flags, groups) {\n    let state = this;\n    const len = input.length;\n    if (!len) {\n      return state;\n    }\n    for (let i = 0; i < len - 1; i++) {\n      state = state.tt(input[i]);\n    }\n    return state.tt(input[len - 1], next, flags, groups);\n  },\n  /**\n   * Short for \"take transition\", this is a method for building/working with\n   * state machines.\n   *\n   * If a state already exists for the given input, returns it.\n   *\n   * If a token is specified, that state will emit that token when reached by\n   * the linkify engine.\n   *\n   * If no state exists, it will be initialized with some default transitions\n   * that resemble existing default transitions.\n   *\n   * If a state is given for the second argument, that state will be\n   * transitioned to on the given input regardless of what that input\n   * previously did.\n   *\n   * Specify a token group flags to define groups that this token belongs to.\n   * The token will be added to corresponding entires in the given groups\n   * object.\n   *\n   * @param {string} input character, token type to transition on\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of groups\n   * @returns {State<T>} taken after the given input\n   */\n  tt(input, next, flags, groups) {\n    groups = groups || State.groups;\n    const state = this;\n\n    // Check if existing state given, just a basic transition\n    if (next && next.j) {\n      state.j[input] = next;\n      return next;\n    }\n    const t = next;\n\n    // Take the transition with the usual default mechanisms and use that as\n    // a template for creating the next state\n    let nextState,\n      templateState = state.go(input);\n    if (templateState) {\n      nextState = new State();\n      Object.assign(nextState.j, templateState.j);\n      nextState.jr.push.apply(nextState.jr, templateState.jr);\n      nextState.jd = templateState.jd;\n      nextState.t = templateState.t;\n    } else {\n      nextState = new State();\n    }\n    if (t) {\n      // Ensure newly token is in the same groups as the old token\n      if (groups) {\n        if (nextState.t && typeof nextState.t === 'string') {\n          const allFlags = Object.assign(flagsForToken(nextState.t, groups), flags);\n          addToGroups(t, allFlags, groups);\n        } else if (flags) {\n          addToGroups(t, flags, groups);\n        }\n      }\n      nextState.t = t; // overwrite anything that was previously there\n    }\n    state.j[input] = nextState;\n    return nextState;\n  }\n};\n\n// Helper functions to improve minification (not exported outside linkifyjs module)\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string | string[]} input\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {RegExp} regexp\n * @param {T | State<T>} [next]\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string | string[]} input\n * @param {T | State<T>} [next]\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string} input\n * @param {T | State<T>} [next]\n * @param {Collections<T>} [groups]\n * @param {Flags} [flags]\n */\nconst tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups);\n\n/******************************************************************************\nText Tokens\nIdentifiers for token outputs from the regexp scanner\n******************************************************************************/\n\n// A valid web domain token\nconst WORD = 'WORD'; // only contains a-z\nconst UWORD = 'UWORD'; // contains letters other than a-z, used for IDN\nconst ASCIINUMERICAL = 'ASCIINUMERICAL'; // contains a-z, 0-9\nconst ALPHANUMERICAL = 'ALPHANUMERICAL'; // contains numbers and letters other than a-z, used for IDN\n\n// Special case of word\nconst LOCALHOST = 'LOCALHOST';\n\n// Valid top-level domain, special case of WORD (see tlds.js)\nconst TLD = 'TLD';\n\n// Valid IDN TLD, special case of UWORD (see tlds.js)\nconst UTLD = 'UTLD';\n\n// The scheme portion of a web URI protocol. Supported types include: `mailto`,\n// `file`, and user-defined custom protocols. Limited to schemes that contain\n// only letters\nconst SCHEME = 'SCHEME';\n\n// Similar to SCHEME, except makes distinction for schemes that must always be\n// followed by `://`, not just `:`. Supported types include `http`, `https`,\n// `ftp`, `ftps`\nconst SLASH_SCHEME = 'SLASH_SCHEME';\n\n// Any sequence of digits 0-9\nconst NUM = 'NUM';\n\n// Any number of consecutive whitespace characters that are not newline\nconst WS = 'WS';\n\n// New line (unix style)\nconst NL = 'NL'; // \\n\n\n// Opening/closing bracket classes\n// TODO: Rename OPEN -> LEFT and CLOSE -> RIGHT in v5 to fit with Unicode names\n// Also rename angle brackes to LESSTHAN and GREATER THAN\nconst OPENBRACE = 'OPENBRACE'; // {\nconst CLOSEBRACE = 'CLOSEBRACE'; // }\nconst OPENBRACKET = 'OPENBRACKET'; // [\nconst CLOSEBRACKET = 'CLOSEBRACKET'; // ]\nconst OPENPAREN = 'OPENPAREN'; // (\nconst CLOSEPAREN = 'CLOSEPAREN'; // )\nconst OPENANGLEBRACKET = 'OPENANGLEBRACKET'; // <\nconst CLOSEANGLEBRACKET = 'CLOSEANGLEBRACKET'; // >\nconst FULLWIDTHLEFTPAREN = 'FULLWIDTHLEFTPAREN'; // （\nconst FULLWIDTHRIGHTPAREN = 'FULLWIDTHRIGHTPAREN'; // ）\nconst LEFTCORNERBRACKET = 'LEFTCORNERBRACKET'; // 「\nconst RIGHTCORNERBRACKET = 'RIGHTCORNERBRACKET'; // 」\nconst LEFTWHITECORNERBRACKET = 'LEFTWHITECORNERBRACKET'; // 『\nconst RIGHTWHITECORNERBRACKET = 'RIGHTWHITECORNERBRACKET'; // 』\nconst FULLWIDTHLESSTHAN = 'FULLWIDTHLESSTHAN'; // ＜\nconst FULLWIDTHGREATERTHAN = 'FULLWIDTHGREATERTHAN'; // ＞\n\n// Various symbols\nconst AMPERSAND = 'AMPERSAND'; // &\nconst APOSTROPHE = 'APOSTROPHE'; // '\nconst ASTERISK = 'ASTERISK'; // *\nconst AT = 'AT'; // @\nconst BACKSLASH = 'BACKSLASH'; // \\\nconst BACKTICK = 'BACKTICK'; // `\nconst CARET = 'CARET'; // ^\nconst COLON = 'COLON'; // :\nconst COMMA = 'COMMA'; // ,\nconst DOLLAR = 'DOLLAR'; // $\nconst DOT = 'DOT'; // .\nconst EQUALS = 'EQUALS'; // =\nconst EXCLAMATION = 'EXCLAMATION'; // !\nconst HYPHEN = 'HYPHEN'; // -\nconst PERCENT = 'PERCENT'; // %\nconst PIPE = 'PIPE'; // |\nconst PLUS = 'PLUS'; // +\nconst POUND = 'POUND'; // #\nconst QUERY = 'QUERY'; // ?\nconst QUOTE = 'QUOTE'; // \"\nconst FULLWIDTHMIDDLEDOT = 'FULLWIDTHMIDDLEDOT'; // ・\n\nconst SEMI = 'SEMI'; // ;\nconst SLASH = 'SLASH'; // /\nconst TILDE = 'TILDE'; // ~\nconst UNDERSCORE = 'UNDERSCORE'; // _\n\n// Emoji symbol\nconst EMOJI$1 = 'EMOJI';\n\n// Default token - anything that is not one of the above\nconst SYM = 'SYM';\n\nvar tk = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tALPHANUMERICAL: ALPHANUMERICAL,\n\tAMPERSAND: AMPERSAND,\n\tAPOSTROPHE: APOSTROPHE,\n\tASCIINUMERICAL: ASCIINUMERICAL,\n\tASTERISK: ASTERISK,\n\tAT: AT,\n\tBACKSLASH: BACKSLASH,\n\tBACKTICK: BACKTICK,\n\tCARET: CARET,\n\tCLOSEANGLEBRACKET: CLOSEANGLEBRACKET,\n\tCLOSEBRACE: CLOSEBRACE,\n\tCLOSEBRACKET: CLOSEBRACKET,\n\tCLOSEPAREN: CLOSEPAREN,\n\tCOLON: COLON,\n\tCOMMA: COMMA,\n\tDOLLAR: DOLLAR,\n\tDOT: DOT,\n\tEMOJI: EMOJI$1,\n\tEQUALS: EQUALS,\n\tEXCLAMATION: EXCLAMATION,\n\tFULLWIDTHGREATERTHAN: FULLWIDTHGREATERTHAN,\n\tFULLWIDTHLEFTPAREN: FULLWIDTHLEFTPAREN,\n\tFULLWIDTHLESSTHAN: FULLWIDTHLESSTHAN,\n\tFULLWIDTHMIDDLEDOT: FULLWIDTHMIDDLEDOT,\n\tFULLWIDTHRIGHTPAREN: FULLWIDTHRIGHTPAREN,\n\tHYPHEN: HYPHEN,\n\tLEFTCORNERBRACKET: LEFTCORNERBRACKET,\n\tLEFTWHITECORNERBRACKET: LEFTWHITECORNERBRACKET,\n\tLOCALHOST: LOCALHOST,\n\tNL: NL,\n\tNUM: NUM,\n\tOPENANGLEBRACKET: OPENANGLEBRACKET,\n\tOPENBRACE: OPENBRACE,\n\tOPENBRACKET: OPENBRACKET,\n\tOPENPAREN: OPENPAREN,\n\tPERCENT: PERCENT,\n\tPIPE: PIPE,\n\tPLUS: PLUS,\n\tPOUND: POUND,\n\tQUERY: QUERY,\n\tQUOTE: QUOTE,\n\tRIGHTCORNERBRACKET: RIGHTCORNERBRACKET,\n\tRIGHTWHITECORNERBRACKET: RIGHTWHITECORNERBRACKET,\n\tSCHEME: SCHEME,\n\tSEMI: SEMI,\n\tSLASH: SLASH,\n\tSLASH_SCHEME: SLASH_SCHEME,\n\tSYM: SYM,\n\tTILDE: TILDE,\n\tTLD: TLD,\n\tUNDERSCORE: UNDERSCORE,\n\tUTLD: UTLD,\n\tUWORD: UWORD,\n\tWORD: WORD,\n\tWS: WS\n});\n\n// Note that these two Unicode ones expand into a really big one with Babel\nconst ASCII_LETTER = /[a-z]/;\nconst LETTER = /\\p{L}/u; // Any Unicode character with letter data type\nconst EMOJI = /\\p{Emoji}/u; // Any Unicode emoji character\nconst EMOJI_VARIATION$1 = /\\ufe0f/;\nconst DIGIT = /\\d/;\nconst SPACE = /\\s/;\n\nvar regexp = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tASCII_LETTER: ASCII_LETTER,\n\tDIGIT: DIGIT,\n\tEMOJI: EMOJI,\n\tEMOJI_VARIATION: EMOJI_VARIATION$1,\n\tLETTER: LETTER,\n\tSPACE: SPACE\n});\n\n/**\n\tThe scanner provides an interface that takes a string of text as input, and\n\toutputs an array of tokens instances that can be used for easy URL parsing.\n*/\n\nconst CR = '\\r'; // carriage-return character\nconst LF = '\\n'; // line-feed character\nconst EMOJI_VARIATION = '\\ufe0f'; // Variation selector, follows heart and others\nconst EMOJI_JOINER = '\\u200d'; // zero-width joiner\nconst OBJECT_REPLACEMENT = '\\ufffc'; // whitespace placeholder that sometimes appears in rich text editors\n\nlet tlds = null,\n  utlds = null; // don't change so only have to be computed once\n\n/**\n * Scanner output token:\n * - `t` is the token name (e.g., 'NUM', 'EMOJI', 'TLD')\n * - `v` is the value of the token (e.g., '123', '❤️', 'com')\n * - `s` is the start index of the token in the original string\n * - `e` is the end index of the token in the original string\n * @typedef {{t: string, v: string, s: number, e: number}} Token\n */\n\n/**\n * @template T\n * @typedef {{ [collection: string]: T[] }} Collections\n */\n\n/**\n * Initialize the scanner character-based state machine for the given start\n * state\n * @param {[string, boolean][]} customSchemes List of custom schemes, where each\n * item is a length-2 tuple with the first element set to the string scheme, and\n * the second element set to `true` if the `://` after the scheme is optional\n */\nfunction init$2(customSchemes = []) {\n  // Frequently used states (name argument removed during minification)\n  /** @type Collections<string> */\n  const groups = {}; // of tokens\n  State.groups = groups;\n  /** @type State<string> */\n  const Start = new State();\n  if (tlds == null) {\n    tlds = decodeTlds(encodedTlds);\n  }\n  if (utlds == null) {\n    utlds = decodeTlds(encodedUtlds);\n  }\n\n  // States for special URL symbols that accept immediately after start\n  tt(Start, \"'\", APOSTROPHE);\n  tt(Start, '{', OPENBRACE);\n  tt(Start, '}', CLOSEBRACE);\n  tt(Start, '[', OPENBRACKET);\n  tt(Start, ']', CLOSEBRACKET);\n  tt(Start, '(', OPENPAREN);\n  tt(Start, ')', CLOSEPAREN);\n  tt(Start, '<', OPENANGLEBRACKET);\n  tt(Start, '>', CLOSEANGLEBRACKET);\n  tt(Start, '（', FULLWIDTHLEFTPAREN);\n  tt(Start, '）', FULLWIDTHRIGHTPAREN);\n  tt(Start, '「', LEFTCORNERBRACKET);\n  tt(Start, '」', RIGHTCORNERBRACKET);\n  tt(Start, '『', LEFTWHITECORNERBRACKET);\n  tt(Start, '』', RIGHTWHITECORNERBRACKET);\n  tt(Start, '＜', FULLWIDTHLESSTHAN);\n  tt(Start, '＞', FULLWIDTHGREATERTHAN);\n  tt(Start, '&', AMPERSAND);\n  tt(Start, '*', ASTERISK);\n  tt(Start, '@', AT);\n  tt(Start, '`', BACKTICK);\n  tt(Start, '^', CARET);\n  tt(Start, ':', COLON);\n  tt(Start, ',', COMMA);\n  tt(Start, '$', DOLLAR);\n  tt(Start, '.', DOT);\n  tt(Start, '=', EQUALS);\n  tt(Start, '!', EXCLAMATION);\n  tt(Start, '-', HYPHEN);\n  tt(Start, '%', PERCENT);\n  tt(Start, '|', PIPE);\n  tt(Start, '+', PLUS);\n  tt(Start, '#', POUND);\n  tt(Start, '?', QUERY);\n  tt(Start, '\"', QUOTE);\n  tt(Start, '/', SLASH);\n  tt(Start, ';', SEMI);\n  tt(Start, '~', TILDE);\n  tt(Start, '_', UNDERSCORE);\n  tt(Start, '\\\\', BACKSLASH);\n  tt(Start, '・', FULLWIDTHMIDDLEDOT);\n  const Num = tr(Start, DIGIT, NUM, {\n    [numeric]: true\n  });\n  tr(Num, DIGIT, Num);\n  const Asciinumeric = tr(Num, ASCII_LETTER, ASCIINUMERICAL, {\n    [asciinumeric]: true\n  });\n  const Alphanumeric = tr(Num, LETTER, ALPHANUMERICAL, {\n    [alphanumeric]: true\n  });\n\n  // State which emits a word token\n  const Word = tr(Start, ASCII_LETTER, WORD, {\n    [ascii]: true\n  });\n  tr(Word, DIGIT, Asciinumeric);\n  tr(Word, ASCII_LETTER, Word);\n  tr(Asciinumeric, DIGIT, Asciinumeric);\n  tr(Asciinumeric, ASCII_LETTER, Asciinumeric);\n\n  // Same as previous, but specific to non-fsm.ascii alphabet words\n  const UWord = tr(Start, LETTER, UWORD, {\n    [alpha]: true\n  });\n  tr(UWord, ASCII_LETTER); // Non-accepting\n  tr(UWord, DIGIT, Alphanumeric);\n  tr(UWord, LETTER, UWord);\n  tr(Alphanumeric, DIGIT, Alphanumeric);\n  tr(Alphanumeric, ASCII_LETTER); // Non-accepting\n  tr(Alphanumeric, LETTER, Alphanumeric); // Non-accepting\n\n  // Whitespace jumps\n  // Tokens of only non-newline whitespace are arbitrarily long\n  // If any whitespace except newline, more whitespace!\n  const Nl = tt(Start, LF, NL, {\n    [whitespace]: true\n  });\n  const Cr = tt(Start, CR, WS, {\n    [whitespace]: true\n  });\n  const Ws = tr(Start, SPACE, WS, {\n    [whitespace]: true\n  });\n  tt(Start, OBJECT_REPLACEMENT, Ws);\n  tt(Cr, LF, Nl); // \\r\\n\n  tt(Cr, OBJECT_REPLACEMENT, Ws);\n  tr(Cr, SPACE, Ws);\n  tt(Ws, CR); // non-accepting state to avoid mixing whitespaces\n  tt(Ws, LF); // non-accepting state to avoid mixing whitespaces\n  tr(Ws, SPACE, Ws);\n  tt(Ws, OBJECT_REPLACEMENT, Ws);\n\n  // Emoji tokens. They are not grouped by the scanner except in cases where a\n  // zero-width joiner is present\n  const Emoji = tr(Start, EMOJI, EMOJI$1, {\n    [emoji]: true\n  });\n  tt(Emoji, '#'); // no transition, emoji regex seems to match #\n  tr(Emoji, EMOJI, Emoji);\n  tt(Emoji, EMOJI_VARIATION, Emoji);\n  // tt(Start, EMOJI_VARIATION, Emoji); // This one is sketchy\n\n  const EmojiJoiner = tt(Emoji, EMOJI_JOINER);\n  tt(EmojiJoiner, '#');\n  tr(EmojiJoiner, EMOJI, Emoji);\n  // tt(EmojiJoiner, EMOJI_VARIATION, Emoji); // also sketchy\n\n  // Generates states for top-level domains\n  // Note that this is most accurate when tlds are in alphabetical order\n  const wordjr = [[ASCII_LETTER, Word], [DIGIT, Asciinumeric]];\n  const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord], [DIGIT, Alphanumeric]];\n  for (let i = 0; i < tlds.length; i++) {\n    fastts(Start, tlds[i], TLD, WORD, wordjr);\n  }\n  for (let i = 0; i < utlds.length; i++) {\n    fastts(Start, utlds[i], UTLD, UWORD, uwordjr);\n  }\n  addToGroups(TLD, {\n    tld: true,\n    ascii: true\n  }, groups);\n  addToGroups(UTLD, {\n    utld: true,\n    alpha: true\n  }, groups);\n\n  // Collect the states generated by different protocols. NOTE: If any new TLDs\n  // get added that are also protocols, set the token to be the same as the\n  // protocol to ensure parsing works as expected.\n  fastts(Start, 'file', SCHEME, WORD, wordjr);\n  fastts(Start, 'mailto', SCHEME, WORD, wordjr);\n  fastts(Start, 'http', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'https', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'ftp', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'ftps', SLASH_SCHEME, WORD, wordjr);\n  addToGroups(SCHEME, {\n    scheme: true,\n    ascii: true\n  }, groups);\n  addToGroups(SLASH_SCHEME, {\n    slashscheme: true,\n    ascii: true\n  }, groups);\n\n  // Register custom schemes. Assumes each scheme is asciinumeric with hyphens\n  customSchemes = customSchemes.sort((a, b) => a[0] > b[0] ? 1 : -1);\n  for (let i = 0; i < customSchemes.length; i++) {\n    const sch = customSchemes[i][0];\n    const optionalSlashSlash = customSchemes[i][1];\n    const flags = optionalSlashSlash ? {\n      [scheme]: true\n    } : {\n      [slashscheme]: true\n    };\n    if (sch.indexOf('-') >= 0) {\n      flags[domain] = true;\n    } else if (!ASCII_LETTER.test(sch)) {\n      flags[numeric] = true; // numbers only\n    } else if (DIGIT.test(sch)) {\n      flags[asciinumeric] = true;\n    } else {\n      flags[ascii] = true;\n    }\n    ts(Start, sch, sch, flags);\n  }\n\n  // Localhost token\n  ts(Start, 'localhost', LOCALHOST, {\n    ascii: true\n  });\n\n  // Set default transition for start state (some symbol)\n  Start.jd = new State(SYM);\n  return {\n    start: Start,\n    tokens: Object.assign({\n      groups\n    }, tk)\n  };\n}\n\n/**\n\tGiven a string, returns an array of TOKEN instances representing the\n\tcomposition of that string.\n\n\t@method run\n\t@param {State<string>} start scanner starting state\n\t@param {string} str input string to scan\n\t@return {Token[]} list of tokens, each with a type and value\n*/\nfunction run$1(start, str) {\n  // State machine is not case sensitive, so input is tokenized in lowercased\n  // form (still returns regular case). Uses selective `toLowerCase` because\n  // lowercasing the entire string causes the length and character position to\n  // vary in some non-English strings with V8-based runtimes.\n  const iterable = stringToArray(str.replace(/[A-Z]/g, c => c.toLowerCase()));\n  const charCount = iterable.length; // <= len if there are emojis, etc\n  const tokens = []; // return value\n\n  // cursor through the string itself, accounting for characters that have\n  // width with length 2 such as emojis\n  let cursor = 0;\n\n  // Cursor through the array-representation of the string\n  let charCursor = 0;\n\n  // Tokenize the string\n  while (charCursor < charCount) {\n    let state = start;\n    let nextState = null;\n    let tokenLength = 0;\n    let latestAccepting = null;\n    let sinceAccepts = -1;\n    let charsSinceAccepts = -1;\n    while (charCursor < charCount && (nextState = state.go(iterable[charCursor]))) {\n      state = nextState;\n\n      // Keep track of the latest accepting state\n      if (state.accepts()) {\n        sinceAccepts = 0;\n        charsSinceAccepts = 0;\n        latestAccepting = state;\n      } else if (sinceAccepts >= 0) {\n        sinceAccepts += iterable[charCursor].length;\n        charsSinceAccepts++;\n      }\n      tokenLength += iterable[charCursor].length;\n      cursor += iterable[charCursor].length;\n      charCursor++;\n    }\n\n    // Roll back to the latest accepting state\n    cursor -= sinceAccepts;\n    charCursor -= charsSinceAccepts;\n    tokenLength -= sinceAccepts;\n\n    // No more jumps, just make a new token from the last accepting one\n    tokens.push({\n      t: latestAccepting.t,\n      // token type/name\n      v: str.slice(cursor - tokenLength, cursor),\n      // string value\n      s: cursor - tokenLength,\n      // start index\n      e: cursor // end index (excluding)\n    });\n  }\n  return tokens;\n}\n\n/**\n * Convert a String to an Array of characters, taking into account that some\n * characters like emojis take up two string indexes.\n *\n * Adapted from core-js (MIT license)\n * https://github.com/zloirock/core-js/blob/2d69cf5f99ab3ea3463c395df81e5a15b68f49d9/packages/core-js/internals/string-multibyte.js\n *\n * @function stringToArray\n * @param {string} str\n * @returns {string[]}\n */\nfunction stringToArray(str) {\n  const result = [];\n  const len = str.length;\n  let index = 0;\n  while (index < len) {\n    let first = str.charCodeAt(index);\n    let second;\n    let char = first < 0xd800 || first > 0xdbff || index + 1 === len || (second = str.charCodeAt(index + 1)) < 0xdc00 || second > 0xdfff ? str[index] // single character\n    : str.slice(index, index + 2); // two-index characters\n    result.push(char);\n    index += char.length;\n  }\n  return result;\n}\n\n/**\n * Fast version of ts function for when transition defaults are well known\n * @param {State<string>} state\n * @param {string} input\n * @param {string} t\n * @param {string} defaultt\n * @param {[RegExp, State<string>][]} jr\n * @returns {State<string>}\n */\nfunction fastts(state, input, t, defaultt, jr) {\n  let next;\n  const len = input.length;\n  for (let i = 0; i < len - 1; i++) {\n    const char = input[i];\n    if (state.j[char]) {\n      next = state.j[char];\n    } else {\n      next = new State(defaultt);\n      next.jr = jr.slice();\n      state.j[char] = next;\n    }\n    state = next;\n  }\n  next = new State(t);\n  next.jr = jr.slice();\n  state.j[input[len - 1]] = next;\n  return next;\n}\n\n/**\n * Converts a string of Top-Level Domain names encoded in update-tlds.js back\n * into a list of strings.\n * @param {str} encoded encoded TLDs string\n * @returns {str[]} original TLDs list\n */\nfunction decodeTlds(encoded) {\n  const words = [];\n  const stack = [];\n  let i = 0;\n  let digits = '0123456789';\n  while (i < encoded.length) {\n    let popDigitCount = 0;\n    while (digits.indexOf(encoded[i + popDigitCount]) >= 0) {\n      popDigitCount++; // encountered some digits, have to pop to go one level up trie\n    }\n    if (popDigitCount > 0) {\n      words.push(stack.join('')); // whatever preceded the pop digits must be a word\n      for (let popCount = parseInt(encoded.substring(i, i + popDigitCount), 10); popCount > 0; popCount--) {\n        stack.pop();\n      }\n      i += popDigitCount;\n    } else {\n      stack.push(encoded[i]); // drop down a level into the trie\n      i++;\n    }\n  }\n  return words;\n}\n\n/**\n * An object where each key is a valid DOM Event Name such as `click` or `focus`\n * and each value is an event handler function.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element#events\n * @typedef {?{ [event: string]: Function }} EventListeners\n */\n\n/**\n * All formatted properties required to render a link, including `tagName`,\n * `attributes`, `content` and `eventListeners`.\n * @typedef {{ tagName: any, attributes: {[attr: string]: any}, content: string,\n * eventListeners: EventListeners }} IntermediateRepresentation\n */\n\n/**\n * Specify either an object described by the template type `O` or a function.\n *\n * The function takes a string value (usually the link's href attribute), the\n * link type (`'url'`, `'hashtag`', etc.) and an internal token representation\n * of the link. It should return an object of the template type `O`\n * @template O\n * @typedef {O | ((value: string, type: string, token: MultiToken) => O)} OptObj\n */\n\n/**\n * Specify either a function described by template type `F` or an object.\n *\n * Each key in the object should be a link type (`'url'`, `'hashtag`', etc.). Each\n * value should be a function with template type `F` that is called when the\n * corresponding link type is encountered.\n * @template F\n * @typedef {F | { [type: string]: F}} OptFn\n */\n\n/**\n * Specify either a value with template type `V`, a function that returns `V` or\n * an object where each value resolves to `V`.\n *\n * The function takes a string value (usually the link's href attribute), the\n * link type (`'url'`, `'hashtag`', etc.) and an internal token representation\n * of the link. It should return an object of the template type `V`\n *\n * For the object, each key should be a link type (`'url'`, `'hashtag`', etc.).\n * Each value should either have type `V` or a function that returns V. This\n * function similarly takes a string value and a token.\n *\n * Example valid types for `Opt<string>`:\n *\n * ```js\n * 'hello'\n * (value, type, token) => 'world'\n * { url: 'hello', email: (value, token) => 'world'}\n * ```\n * @template V\n * @typedef {V | ((value: string, type: string, token: MultiToken) => V) | { [type: string]: V | ((value: string, token: MultiToken) => V) }} Opt\n */\n\n/**\n * See available options: https://linkify.js.org/docs/options.html\n * @typedef {{\n * \tdefaultProtocol?: string,\n *  events?: OptObj<EventListeners>,\n * \tformat?: Opt<string>,\n * \tformatHref?: Opt<string>,\n * \tnl2br?: boolean,\n * \ttagName?: Opt<any>,\n * \ttarget?: Opt<string>,\n * \trel?: Opt<string>,\n * \tvalidate?: Opt<boolean>,\n * \ttruncate?: Opt<number>,\n * \tclassName?: Opt<string>,\n * \tattributes?: OptObj<({ [attr: string]: any })>,\n *  ignoreTags?: string[],\n * \trender?: OptFn<((ir: IntermediateRepresentation) => any)>\n * }} Opts\n */\n\n/**\n * @type Required<Opts>\n */\nconst defaults = {\n  defaultProtocol: 'http',\n  events: null,\n  format: noop,\n  formatHref: noop,\n  nl2br: false,\n  tagName: 'a',\n  target: null,\n  rel: null,\n  validate: true,\n  truncate: Infinity,\n  className: null,\n  attributes: null,\n  ignoreTags: [],\n  render: null\n};\n\n/**\n * Utility class for linkify interfaces to apply specified\n * {@link Opts formatting and rendering options}.\n *\n * @param {Opts | Options} [opts] Option value overrides.\n * @param {(ir: IntermediateRepresentation) => any} [defaultRender] (For\n *   internal use) default render function that determines how to generate an\n *   HTML element based on a link token's derived tagName, attributes and HTML.\n *   Similar to render option\n */\nfunction Options(opts, defaultRender = null) {\n  let o = Object.assign({}, defaults);\n  if (opts) {\n    o = Object.assign(o, opts instanceof Options ? opts.o : opts);\n  }\n\n  // Ensure all ignored tags are uppercase\n  const ignoredTags = o.ignoreTags;\n  const uppercaseIgnoredTags = [];\n  for (let i = 0; i < ignoredTags.length; i++) {\n    uppercaseIgnoredTags.push(ignoredTags[i].toUpperCase());\n  }\n  /** @protected */\n  this.o = o;\n  if (defaultRender) {\n    this.defaultRender = defaultRender;\n  }\n  this.ignoreTags = uppercaseIgnoredTags;\n}\nOptions.prototype = {\n  o: defaults,\n  /**\n   * @type string[]\n   */\n  ignoreTags: [],\n  /**\n   * @param {IntermediateRepresentation} ir\n   * @returns {any}\n   */\n  defaultRender(ir) {\n    return ir;\n  },\n  /**\n   * Returns true or false based on whether a token should be displayed as a\n   * link based on the user options.\n   * @param {MultiToken} token\n   * @returns {boolean}\n   */\n  check(token) {\n    return this.get('validate', token.toString(), token);\n  },\n  // Private methods\n\n  /**\n   * Resolve an option's value based on the value of the option and the given\n   * params. If operator and token are specified and the target option is\n   * callable, automatically calls the function with the given argument.\n   * @template {keyof Opts} K\n   * @param {K} key Name of option to use\n   * @param {string} [operator] will be passed to the target option if it's a\n   * function. If not specified, RAW function value gets returned\n   * @param {MultiToken} [token] The token from linkify.tokenize\n   * @returns {Opts[K] | any}\n   */\n  get(key, operator, token) {\n    const isCallable = operator != null;\n    let option = this.o[key];\n    if (!option) {\n      return option;\n    }\n    if (typeof option === 'object') {\n      option = token.t in option ? option[token.t] : defaults[key];\n      if (typeof option === 'function' && isCallable) {\n        option = option(operator, token);\n      }\n    } else if (typeof option === 'function' && isCallable) {\n      option = option(operator, token.t, token);\n    }\n    return option;\n  },\n  /**\n   * @template {keyof Opts} L\n   * @param {L} key Name of options object to use\n   * @param {string} [operator]\n   * @param {MultiToken} [token]\n   * @returns {Opts[L] | any}\n   */\n  getObj(key, operator, token) {\n    let obj = this.o[key];\n    if (typeof obj === 'function' && operator != null) {\n      obj = obj(operator, token.t, token);\n    }\n    return obj;\n  },\n  /**\n   * Convert the given token to a rendered element that may be added to the\n   * calling-interface's DOM\n   * @param {MultiToken} token Token to render to an HTML element\n   * @returns {any} Render result; e.g., HTML string, DOM element, React\n   *   Component, etc.\n   */\n  render(token) {\n    const ir = token.render(this); // intermediate representation\n    const renderFn = this.get('render', null, token) || this.defaultRender;\n    return renderFn(ir, token.t, token);\n  }\n};\nfunction noop(val) {\n  return val;\n}\n\nvar options = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tOptions: Options,\n\tdefaults: defaults\n});\n\n/******************************************************************************\n\tMulti-Tokens\n\tTokens composed of arrays of TextTokens\n******************************************************************************/\n\n/**\n * @param {string} value\n * @param {Token[]} tokens\n */\nfunction MultiToken(value, tokens) {\n  this.t = 'token';\n  this.v = value;\n  this.tk = tokens;\n}\n\n/**\n * Abstract class used for manufacturing tokens of text tokens. That is rather\n * than the value for a token being a small string of text, it's value an array\n * of text tokens.\n *\n * Used for grouping together URLs, emails, hashtags, and other potential\n * creations.\n * @class MultiToken\n * @property {string} t\n * @property {string} v\n * @property {Token[]} tk\n * @abstract\n */\nMultiToken.prototype = {\n  isLink: false,\n  /**\n   * Return the string this token represents.\n   * @return {string}\n   */\n  toString() {\n    return this.v;\n  },\n  /**\n   * What should the value for this token be in the `href` HTML attribute?\n   * Returns the `.toString` value by default.\n   * @param {string} [scheme]\n   * @return {string}\n   */\n  toHref(scheme) {\n    return this.toString();\n  },\n  /**\n   * @param {Options} options Formatting options\n   * @returns {string}\n   */\n  toFormattedString(options) {\n    const val = this.toString();\n    const truncate = options.get('truncate', val, this);\n    const formatted = options.get('format', val, this);\n    return truncate && formatted.length > truncate ? formatted.substring(0, truncate) + '…' : formatted;\n  },\n  /**\n   *\n   * @param {Options} options\n   * @returns {string}\n   */\n  toFormattedHref(options) {\n    return options.get('formatHref', this.toHref(options.get('defaultProtocol')), this);\n  },\n  /**\n   * The start index of this token in the original input string\n   * @returns {number}\n   */\n  startIndex() {\n    return this.tk[0].s;\n  },\n  /**\n   * The end index of this token in the original input string (up to this\n   * index but not including it)\n   * @returns {number}\n   */\n  endIndex() {\n    return this.tk[this.tk.length - 1].e;\n  },\n  /**\n  \tReturns an object  of relevant values for this token, which includes keys\n  \t* type - Kind of token ('url', 'email', etc.)\n  \t* value - Original text\n  \t* href - The value that should be added to the anchor tag's href\n  \t\tattribute\n  \t\t@method toObject\n  \t@param {string} [protocol] `'http'` by default\n  */\n  toObject(protocol = defaults.defaultProtocol) {\n    return {\n      type: this.t,\n      value: this.toString(),\n      isLink: this.isLink,\n      href: this.toHref(protocol),\n      start: this.startIndex(),\n      end: this.endIndex()\n    };\n  },\n  /**\n   *\n   * @param {Options} options Formatting option\n   */\n  toFormattedObject(options) {\n    return {\n      type: this.t,\n      value: this.toFormattedString(options),\n      isLink: this.isLink,\n      href: this.toFormattedHref(options),\n      start: this.startIndex(),\n      end: this.endIndex()\n    };\n  },\n  /**\n   * Whether this token should be rendered as a link according to the given options\n   * @param {Options} options\n   * @returns {boolean}\n   */\n  validate(options) {\n    return options.get('validate', this.toString(), this);\n  },\n  /**\n   * Return an object that represents how this link should be rendered.\n   * @param {Options} options Formattinng options\n   */\n  render(options) {\n    const token = this;\n    const href = this.toHref(options.get('defaultProtocol'));\n    const formattedHref = options.get('formatHref', href, this);\n    const tagName = options.get('tagName', href, token);\n    const content = this.toFormattedString(options);\n    const attributes = {};\n    const className = options.get('className', href, token);\n    const target = options.get('target', href, token);\n    const rel = options.get('rel', href, token);\n    const attrs = options.getObj('attributes', href, token);\n    const eventListeners = options.getObj('events', href, token);\n    attributes.href = formattedHref;\n    if (className) {\n      attributes.class = className;\n    }\n    if (target) {\n      attributes.target = target;\n    }\n    if (rel) {\n      attributes.rel = rel;\n    }\n    if (attrs) {\n      Object.assign(attributes, attrs);\n    }\n    return {\n      tagName,\n      attributes,\n      content,\n      eventListeners\n    };\n  }\n};\n\n/**\n * Create a new token that can be emitted by the parser state machine\n * @param {string} type readable type of the token\n * @param {object} props properties to assign or override, including isLink = true or false\n * @returns {new (value: string, tokens: Token[]) => MultiToken} new token class\n */\nfunction createTokenClass(type, props) {\n  class Token extends MultiToken {\n    constructor(value, tokens) {\n      super(value, tokens);\n      this.t = type;\n    }\n  }\n  for (const p in props) {\n    Token.prototype[p] = props[p];\n  }\n  Token.t = type;\n  return Token;\n}\n\n/**\n\tRepresents a list of tokens making up a valid email address\n*/\nconst Email = createTokenClass('email', {\n  isLink: true,\n  toHref() {\n    return 'mailto:' + this.toString();\n  }\n});\n\n/**\n\tRepresents some plain text\n*/\nconst Text = createTokenClass('text');\n\n/**\n\tMulti-linebreak token - represents a line break\n\t@class Nl\n*/\nconst Nl = createTokenClass('nl');\n\n/**\n\tRepresents a list of text tokens making up a valid URL\n\t@class Url\n*/\nconst Url = createTokenClass('url', {\n  isLink: true,\n  /**\n  \tLowercases relevant parts of the domain and adds the protocol if\n  \trequired. Note that this will not escape unsafe HTML characters in the\n  \tURL.\n  \t\t@param {string} [scheme] default scheme (e.g., 'https')\n  \t@return {string} the full href\n  */\n  toHref(scheme = defaults.defaultProtocol) {\n    // Check if already has a prefix scheme\n    return this.hasProtocol() ? this.v : `${scheme}://${this.v}`;\n  },\n  /**\n   * Check whether this URL token has a protocol\n   * @return {boolean}\n   */\n  hasProtocol() {\n    const tokens = this.tk;\n    return tokens.length >= 2 && tokens[0].t !== LOCALHOST && tokens[1].t === COLON;\n  }\n});\n\nvar multi = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBase: MultiToken,\n\tEmail: Email,\n\tMultiToken: MultiToken,\n\tNl: Nl,\n\tText: Text,\n\tUrl: Url,\n\tcreateTokenClass: createTokenClass\n});\n\n/**\n\tNot exactly parser, more like the second-stage scanner (although we can\n\ttheoretically hotswap the code here with a real parser in the future... but\n\tfor a little URL-finding utility abstract syntax trees may be a little\n\toverkill).\n\n\tURL format: http://en.wikipedia.org/wiki/URI_scheme\n\tEmail format: http://en.wikipedia.org/wiki/EmailAddress (links to RFC in\n\treference)\n\n\t@module linkify\n\t@submodule parser\n\t@main run\n*/\n\nconst makeState = arg => new State(arg);\n\n/**\n * Generate the parser multi token-based state machine\n * @param {{ groups: Collections<string> }} tokens\n */\nfunction init$1({\n  groups\n}) {\n  // Types of characters the URL can definitely end in\n  const qsAccepting = groups.domain.concat([AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, NUM, PERCENT, PIPE, PLUS, POUND, SLASH, SYM, TILDE, UNDERSCORE]);\n\n  // Types of tokens that can follow a URL and be part of the query string\n  // but cannot be the very last characters\n  // Characters that cannot appear in the URL at all should be excluded\n  const qsNonAccepting = [APOSTROPHE, COLON, COMMA, DOT, EXCLAMATION, PERCENT, QUERY, QUOTE, SEMI, OPENANGLEBRACKET, CLOSEANGLEBRACKET, OPENBRACE, CLOSEBRACE, CLOSEBRACKET, OPENBRACKET, OPENPAREN, CLOSEPAREN, FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN, LEFTCORNERBRACKET, RIGHTCORNERBRACKET, LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET, FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN];\n\n  // For addresses without the mailto prefix\n  // Tokens allowed in the localpart of the email\n  const localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, OPENBRACE, CLOSEBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, UNDERSCORE];\n\n  // The universal starting state.\n  /**\n   * @type State<Token>\n   */\n  const Start = makeState();\n  const Localpart = tt(Start, TILDE); // Local part of the email address\n  ta(Localpart, localpartAccepting, Localpart);\n  ta(Localpart, groups.domain, Localpart);\n  const Domain = makeState(),\n    Scheme = makeState(),\n    SlashScheme = makeState();\n  ta(Start, groups.domain, Domain); // parsed string ends with a potential domain name (A)\n  ta(Start, groups.scheme, Scheme); // e.g., 'mailto'\n  ta(Start, groups.slashscheme, SlashScheme); // e.g., 'http'\n\n  ta(Domain, localpartAccepting, Localpart);\n  ta(Domain, groups.domain, Domain);\n  const LocalpartAt = tt(Domain, AT); // Local part of the email address plus @\n\n  tt(Localpart, AT, LocalpartAt); // close to an email address now\n\n  // Local part of an email address can be e.g. 'http' or 'mailto'\n  tt(Scheme, AT, LocalpartAt);\n  tt(SlashScheme, AT, LocalpartAt);\n  const LocalpartDot = tt(Localpart, DOT); // Local part of the email address plus '.' (localpart cannot end in .)\n  ta(LocalpartDot, localpartAccepting, Localpart);\n  ta(LocalpartDot, groups.domain, Localpart);\n  const EmailDomain = makeState();\n  ta(LocalpartAt, groups.domain, EmailDomain); // parsed string starts with local email info + @ with a potential domain name\n  ta(EmailDomain, groups.domain, EmailDomain);\n  const EmailDomainDot = tt(EmailDomain, DOT); // domain followed by DOT\n  ta(EmailDomainDot, groups.domain, EmailDomain);\n  const Email$1 = makeState(Email); // Possible email address (could have more tlds)\n  ta(EmailDomainDot, groups.tld, Email$1);\n  ta(EmailDomainDot, groups.utld, Email$1);\n  tt(LocalpartAt, LOCALHOST, Email$1);\n\n  // Hyphen can jump back to a domain name\n  const EmailDomainHyphen = tt(EmailDomain, HYPHEN); // parsed string starts with local email info + @ with a potential domain name\n  tt(EmailDomainHyphen, HYPHEN, EmailDomainHyphen);\n  ta(EmailDomainHyphen, groups.domain, EmailDomain);\n  ta(Email$1, groups.domain, EmailDomain);\n  tt(Email$1, DOT, EmailDomainDot);\n  tt(Email$1, HYPHEN, EmailDomainHyphen);\n\n  // Account for dots and hyphens. Hyphens are usually parts of domain names\n  // (but not TLDs)\n  const DomainHyphen = tt(Domain, HYPHEN); // domain followed by hyphen\n  const DomainDot = tt(Domain, DOT); // domain followed by DOT\n  tt(DomainHyphen, HYPHEN, DomainHyphen);\n  ta(DomainHyphen, groups.domain, Domain);\n  ta(DomainDot, localpartAccepting, Localpart);\n  ta(DomainDot, groups.domain, Domain);\n  const DomainDotTld = makeState(Url); // Simplest possible URL with no query string\n  ta(DomainDot, groups.tld, DomainDotTld);\n  ta(DomainDot, groups.utld, DomainDotTld);\n  ta(DomainDotTld, groups.domain, Domain);\n  ta(DomainDotTld, localpartAccepting, Localpart);\n  tt(DomainDotTld, DOT, DomainDot);\n  tt(DomainDotTld, HYPHEN, DomainHyphen);\n  tt(DomainDotTld, AT, LocalpartAt);\n  const DomainDotTldColon = tt(DomainDotTld, COLON); // URL followed by colon (potential port number here)\n  const DomainDotTldColonPort = makeState(Url); // TLD followed by a port number\n  ta(DomainDotTldColon, groups.numeric, DomainDotTldColonPort);\n\n  // Long URL with optional port and maybe query string\n  const Url$1 = makeState(Url);\n\n  // URL with extra symbols at the end, followed by an opening bracket\n  const UrlNonaccept = makeState(); // URL followed by some symbols (will not be part of the final URL)\n\n  // Query strings\n  ta(Url$1, qsAccepting, Url$1);\n  ta(Url$1, qsNonAccepting, UrlNonaccept);\n  ta(UrlNonaccept, qsAccepting, Url$1);\n  ta(UrlNonaccept, qsNonAccepting, UrlNonaccept);\n\n  // Become real URLs after `SLASH` or `COLON NUM SLASH`\n  // Here works with or without scheme:// prefix\n  tt(DomainDotTld, SLASH, Url$1);\n  tt(DomainDotTldColonPort, SLASH, Url$1);\n\n  // Note that domains that begin with schemes are treated slighly differently\n  const SchemeColon = tt(Scheme, COLON); // e.g., 'mailto:'\n  const SlashSchemeColon = tt(SlashScheme, COLON); // e.g., 'http:'\n  const SlashSchemeColonSlash = tt(SlashSchemeColon, SLASH); // e.g., 'http:/'\n\n  const UriPrefix = tt(SlashSchemeColonSlash, SLASH); // e.g., 'http://'\n\n  // Scheme states can transition to domain states\n  ta(Scheme, groups.domain, Domain);\n  tt(Scheme, DOT, DomainDot);\n  tt(Scheme, HYPHEN, DomainHyphen);\n  ta(SlashScheme, groups.domain, Domain);\n  tt(SlashScheme, DOT, DomainDot);\n  tt(SlashScheme, HYPHEN, DomainHyphen);\n\n  // Force URL with scheme prefix followed by anything sane\n  ta(SchemeColon, groups.domain, Url$1);\n  tt(SchemeColon, SLASH, Url$1);\n  tt(SchemeColon, QUERY, Url$1);\n  ta(UriPrefix, groups.domain, Url$1);\n  ta(UriPrefix, qsAccepting, Url$1);\n  tt(UriPrefix, SLASH, Url$1);\n  const bracketPairs = [[OPENBRACE, CLOSEBRACE],\n  // {}\n  [OPENBRACKET, CLOSEBRACKET],\n  // []\n  [OPENPAREN, CLOSEPAREN],\n  // ()\n  [OPENANGLEBRACKET, CLOSEANGLEBRACKET],\n  // <>\n  [FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN],\n  // （）\n  [LEFTCORNERBRACKET, RIGHTCORNERBRACKET],\n  // 「」\n  [LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET],\n  // 『』\n  [FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN] // ＜＞\n  ];\n  for (let i = 0; i < bracketPairs.length; i++) {\n    const [OPEN, CLOSE] = bracketPairs[i];\n    const UrlOpen = tt(Url$1, OPEN); // URL followed by open bracket\n\n    // Continue not accepting for open brackets\n    tt(UrlNonaccept, OPEN, UrlOpen);\n\n    // URL that begins with an opening bracket, followed by a symbols.\n    // Note that the final state can still be `UrlOpen` (if the URL has a\n    // single opening bracket for some reason).\n    const UrlOpenQ = makeState(Url);\n    ta(UrlOpen, qsAccepting, UrlOpenQ);\n    const UrlOpenSyms = makeState(); // UrlOpen followed by some symbols it cannot end it\n    ta(UrlOpen, qsNonAccepting, UrlOpenSyms);\n\n    // Closing bracket component. This character WILL be included in the URL.\n    // Must come after qsNonAccepting (which includes all close-bracket tokens)\n    // so that CLOSE -> Url wins over CLOSE -> UrlOpenSyms.\n    tt(UrlOpen, CLOSE, Url$1);\n\n    // URL that begins with an opening bracket, followed by some symbols\n    ta(UrlOpenQ, qsAccepting, UrlOpenQ);\n    ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);\n    ta(UrlOpenSyms, qsAccepting, UrlOpenQ);\n    ta(UrlOpenSyms, qsNonAccepting, UrlOpenSyms);\n\n    // Close brace/bracket to become regular URL\n    tt(UrlOpenQ, CLOSE, Url$1);\n    tt(UrlOpenSyms, CLOSE, Url$1);\n  }\n  tt(Start, LOCALHOST, DomainDotTld); // localhost is a valid URL state\n  tt(Start, NL, Nl); // single new line\n\n  return {\n    start: Start,\n    tokens: tk\n  };\n}\n\n/**\n * Run the parser state machine on a list of scanned string-based tokens to\n * create a list of multi tokens, each of which represents a URL, email address,\n * plain text, etc.\n *\n * @param {State<MultiToken>} start parser start state\n * @param {string} input the original input used to generate the given tokens\n * @param {Token[]} tokens list of scanned tokens\n * @returns {MultiToken[]}\n */\nfunction run(start, input, tokens) {\n  let len = tokens.length;\n  let cursor = 0;\n  let multis = [];\n  let textTokens = [];\n  while (cursor < len) {\n    let state = start;\n    let secondState = null;\n    let nextState = null;\n    let multiLength = 0;\n    let latestAccepting = null;\n    let sinceAccepts = -1;\n    while (cursor < len && !(secondState = state.go(tokens[cursor].t))) {\n      // Starting tokens with nowhere to jump to.\n      // Consider these to be just plain text\n      textTokens.push(tokens[cursor++]);\n    }\n    while (cursor < len && (nextState = secondState || state.go(tokens[cursor].t))) {\n      // Get the next state\n      secondState = null;\n      state = nextState;\n\n      // Keep track of the latest accepting state\n      if (state.accepts()) {\n        sinceAccepts = 0;\n        latestAccepting = state;\n      } else if (sinceAccepts >= 0) {\n        sinceAccepts++;\n      }\n      cursor++;\n      multiLength++;\n    }\n    if (sinceAccepts < 0) {\n      // No accepting state was found, part of a regular text token add\n      // the first text token to the text tokens array and try again from\n      // the next\n      cursor -= multiLength;\n      if (cursor < len) {\n        textTokens.push(tokens[cursor]);\n        cursor++;\n      }\n    } else {\n      // Accepting state!\n      // First close off the textTokens (if available)\n      if (textTokens.length > 0) {\n        multis.push(initMultiToken(Text, input, textTokens));\n        textTokens = [];\n      }\n\n      // Roll back to the latest accepting state\n      cursor -= sinceAccepts;\n      multiLength -= sinceAccepts;\n\n      // Create a new multitoken\n      const Multi = latestAccepting.t;\n      const subtokens = tokens.slice(cursor - multiLength, cursor);\n      multis.push(initMultiToken(Multi, input, subtokens));\n    }\n  }\n\n  // Finally close off the textTokens (if available)\n  if (textTokens.length > 0) {\n    multis.push(initMultiToken(Text, input, textTokens));\n  }\n  return multis;\n}\n\n/**\n * Utility function for instantiating a new multitoken with all the relevant\n * fields during parsing.\n * @param {new (value: string, tokens: Token[]) => MultiToken} Multi class to instantiate\n * @param {string} input original input string\n * @param {Token[]} tokens consecutive tokens scanned from input string\n * @returns {MultiToken}\n */\nfunction initMultiToken(Multi, input, tokens) {\n  const startIdx = tokens[0].s;\n  const endIdx = tokens[tokens.length - 1].e;\n  const value = input.slice(startIdx, endIdx);\n  return new Multi(value, tokens);\n}\n\nconst warn = typeof console !== 'undefined' && console && console.warn || (() => {});\nconst warnAdvice = 'until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.';\n\n// Side-effect initialization state\nconst INIT = {\n  scanner: null,\n  parser: null,\n  tokenQueue: [],\n  pluginQueue: [],\n  customSchemes: [],\n  initialized: false\n};\n\n/**\n * @typedef {{\n * \tstart: State<string>,\n * \ttokens: { groups: Collections<string> } & typeof tk\n * }} ScannerInit\n */\n\n/**\n * @typedef {{\n * \tstart: State<MultiToken>,\n * \ttokens: typeof multi\n * }} ParserInit\n */\n\n/**\n * @typedef {(arg: { scanner: ScannerInit }) => void} TokenPlugin\n */\n\n/**\n * @typedef {(arg: { scanner: ScannerInit, parser: ParserInit }) => void} Plugin\n */\n\n/**\n * De-register all plugins and reset the internal state-machine. Used for\n * testing; not required in practice.\n * @private\n */\nfunction reset() {\n  State.groups = {};\n  INIT.scanner = null;\n  INIT.parser = null;\n  INIT.tokenQueue = [];\n  INIT.pluginQueue = [];\n  INIT.customSchemes = [];\n  INIT.initialized = false;\n  return INIT;\n}\n\n/**\n * Register a token plugin to allow the scanner to recognize additional token\n * types before the parser state machine is constructed from the results.\n * @param {string} name of plugin to register\n * @param {TokenPlugin} plugin function that accepts the scanner state machine\n * and available scanner tokens and collections and extends the state machine to\n * recognize additional tokens or groups.\n */\nfunction registerTokenPlugin(name, plugin) {\n  if (typeof plugin !== 'function') {\n    throw new Error(`linkifyjs: Invalid token plugin ${plugin} (expects function)`);\n  }\n  for (let i = 0; i < INIT.tokenQueue.length; i++) {\n    if (name === INIT.tokenQueue[i][0]) {\n      warn(`linkifyjs: token plugin \"${name}\" already registered - will be overwritten`);\n      INIT.tokenQueue[i] = [name, plugin];\n      return;\n    }\n  }\n  INIT.tokenQueue.push([name, plugin]);\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register token plugin \"${name}\" ${warnAdvice}`);\n  }\n}\n\n/**\n * Register a linkify plugin\n * @param {string} name of plugin to register\n * @param {Plugin} plugin function that accepts the parser state machine and\n * extends the parser to recognize additional link types\n */\nfunction registerPlugin(name, plugin) {\n  if (typeof plugin !== 'function') {\n    throw new Error(`linkifyjs: Invalid plugin ${plugin} (expects function)`);\n  }\n  for (let i = 0; i < INIT.pluginQueue.length; i++) {\n    if (name === INIT.pluginQueue[i][0]) {\n      warn(`linkifyjs: plugin \"${name}\" already registered - will be overwritten`);\n      INIT.pluginQueue[i] = [name, plugin];\n      return;\n    }\n  }\n  INIT.pluginQueue.push([name, plugin]);\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register plugin \"${name}\" ${warnAdvice}`);\n  }\n}\n\n/**\n * Detect URLs with the following additional protocol. Anything with format\n * \"protocol://...\" will be considered a link. If `optionalSlashSlash` is set to\n * `true`, anything with format \"protocol:...\" will be considered a link.\n * @param {string} scheme\n * @param {boolean} [optionalSlashSlash]\n */\nfunction registerCustomProtocol(scheme, optionalSlashSlash = false) {\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register custom scheme \"${scheme}\" ${warnAdvice}`);\n  }\n  if (!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(scheme)) {\n    throw new Error(`linkifyjs: incorrect scheme format.\n1. Must only contain digits, lowercase ASCII letters or \"-\"\n2. Cannot start or end with \"-\"\n3. \"-\" cannot repeat`);\n  }\n  INIT.customSchemes.push([scheme, optionalSlashSlash]);\n}\n\n/**\n * Initialize the linkify state machine. Called automatically the first time\n * linkify is called on a string, but may be called manually as well.\n */\nfunction init() {\n  // Initialize scanner state machine and plugins\n  INIT.scanner = init$2(INIT.customSchemes);\n  for (let i = 0; i < INIT.tokenQueue.length; i++) {\n    INIT.tokenQueue[i][1]({\n      scanner: INIT.scanner\n    });\n  }\n\n  // Initialize parser state machine and plugins\n  INIT.parser = init$1(INIT.scanner.tokens);\n  for (let i = 0; i < INIT.pluginQueue.length; i++) {\n    INIT.pluginQueue[i][1]({\n      scanner: INIT.scanner,\n      parser: INIT.parser\n    });\n  }\n  INIT.initialized = true;\n  return INIT;\n}\n\n/**\n * Parse a string into tokens that represent linkable and non-linkable sub-components\n * @param {string} str\n * @return {MultiToken[]} tokens\n */\nfunction tokenize(str) {\n  if (!INIT.initialized) {\n    init();\n  }\n  return run(INIT.parser.start, str, run$1(INIT.scanner.start, str));\n}\ntokenize.scan = run$1; // for testing\n\n/**\n * Find a list of linkable items in the given string.\n * @param {string} str string to find links in\n * @param {string | Opts} [type] either formatting options or specific type of\n * links to find, e.g., 'url' or 'email'\n * @param {Opts} [opts] formatting options for final output. Cannot be specified\n * if opts already provided in `type` argument\n */\nfunction find(str, type = null, opts = null) {\n  if (type && typeof type === 'object') {\n    if (opts) {\n      throw Error(`linkifyjs: Invalid link type ${type}; must be a string`);\n    }\n    opts = type;\n    type = null;\n  }\n  const options = new Options(opts);\n  const tokens = tokenize(str);\n  const filtered = [];\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i];\n    if (token.isLink && (!type || token.t === type) && options.check(token)) {\n      filtered.push(token.toFormattedObject(options));\n    }\n  }\n  return filtered;\n}\n\n/**\n * Is the given string valid linkable text of some sort. Note that this does not\n * trim the text for you.\n *\n * Optionally pass in a second `type` param, which is the type of link to test\n * for.\n *\n * For example,\n *\n *     linkify.test(str, 'email');\n *\n * Returns `true` if str is a valid email.\n * @param {string} str string to test for links\n * @param {string} [type] optional specific link type to look for\n * @returns boolean true/false\n */\nfunction test(str, type = null) {\n  const tokens = tokenize(str);\n  return tokens.length === 1 && tokens[0].isLink && (!type || tokens[0].t === type);\n}\n\nexport { MultiToken, Options, State, createTokenClass, find, init, multi, options, regexp, registerCustomProtocol, registerPlugin, registerTokenPlugin, reset, stringToArray, test, multi as text, tokenize };\n","import * as React from 'react';\nimport { Options, tokenize } from 'linkifyjs';\n\n/**\n * Given a string, converts to an array of valid React components\n * (which may include strings)\n * @param {string} str\n * @param {Options} opts\n * @param {{ [elementId: string]: number }} meta\n * @returns {React.ReactNodeArray}\n */\nfunction stringToElements(str, opts, meta) {\n  const tokens = tokenize(str);\n  const elements = [];\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i];\n    if (token.t === 'nl' && opts.get('nl2br')) {\n      const key = `__linkify-el-${meta.elementId++}`;\n      elements.push(React.createElement('br', {\n        key\n      }));\n    } else if (!token.isLink || !opts.check(token)) {\n      // Regular text\n      elements.push(token.toString());\n    } else {\n      let rendered = opts.render(token);\n      if (!('key' in rendered.props)) {\n        // Ensure generated element has unique key\n        const key = `__linkify-el-${meta.elementId++}`;\n        const props = Object.assign({\n          key\n        }, rendered.props);\n        rendered = React.cloneElement(rendered, props);\n      }\n      elements.push(rendered);\n    }\n  }\n  return elements;\n}\n\n// Recursively linkify the contents of the given React Element instance\n/**\n * @template P\n * @template {string | React.JSXElementConstructor<P>} T\n * @param {React.ReactElement<P, T>} element\n * @param {Options} opts\n * @param {{ [elementId: string]: number }} meta\n * @returns {React.ReactElement<P, T>}\n */\nfunction linkifyReactElement(element, opts, meta) {\n  if (React.Children.count(element.props.children) === 0) {\n    // No need to clone if the element had no children\n    return element;\n  }\n  const children = [];\n  React.Children.forEach(element.props.children, child => {\n    if (typeof child === 'string') {\n      // ensure that we always generate unique element IDs for keys\n      children.push.apply(children, stringToElements(child, opts, meta));\n    } else if (React.isValidElement(child)) {\n      if (typeof child.type === 'string' && opts.ignoreTags.indexOf(child.type.toUpperCase()) >= 0) {\n        // Don't linkify this element\n        children.push(child);\n      } else {\n        children.push(linkifyReactElement(child, opts, meta));\n      }\n    } else {\n      // Unknown element type, just push\n      children.push(child);\n    }\n  });\n\n  // Set a default unique key, copy over remaining props\n  const key = `__linkify-el-${meta.elementId++}`;\n  const newProps = Object.assign({\n    key\n  }, element.props);\n  return React.cloneElement(element, newProps, children);\n}\n\n/**\n * @template P\n * @template {string | React.JSXElementConstructor<P>} T\n * @param {P & { as?: T, tagName?: T, options?: import('linkifyjs').Opts, children?: React.ReactNode}} props\n * @returns {React.ReactElement<P, T>}\n */\nconst Linkify = props => {\n  // Copy over all non-linkify-specific props\n  let linkId = 0;\n  const defaultLinkRender = ({\n    tagName,\n    attributes,\n    content\n  }) => {\n    attributes.key = `__linkify-lnk-${linkId++}`;\n    if (attributes.class) {\n      attributes.className = attributes.class;\n      delete attributes.class;\n    }\n    return React.createElement(tagName, attributes, content);\n  };\n  const newProps = {\n    key: '__linkify-wrapper'\n  };\n  for (const prop in props) {\n    if (prop !== 'options' && prop !== 'as' && prop !== 'tagName' && prop !== 'children') {\n      newProps[prop] = props[prop];\n    }\n  }\n  const opts = new Options(props.options, defaultLinkRender);\n  const as = props.as || props.tagName || React.Fragment || 'span';\n  const children = props.children;\n  const element = React.createElement(as, newProps, children);\n  return linkifyReactElement(element, opts, {\n    elementId: 0\n  });\n};\n\nexport { Linkify as default };\n","const CASE_SENSITIVE_TAG_NAMES_MAP = [\n\t\"animateMotion\",\n\t\"animateTransform\",\n\t\"clipPath\",\n\t\"feBlend\",\n\t\"feColorMatrix\",\n\t\"feComponentTransfer\",\n\t\"feComposite\",\n\t\"feConvolveMatrix\",\n\t\"feDiffuseLighting\",\n\t\"feDisplacementMap\",\n\t\"feDropShadow\",\n\t\"feFlood\",\n\t\"feFuncA\",\n\t\"feFuncB\",\n\t\"feFuncG\",\n\t\"feFuncR\",\n\t\"feGaussianBlur\",\n\t\"feImage\",\n\t\"feMerge\",\n\t\"feMergeNode\",\n\t\"feMorphology\",\n\t\"feOffset\",\n\t\"fePointLight\",\n\t\"feSpecularLighting\",\n\t\"feSpotLight\",\n\t\"feTile\",\n\t\"feTurbulence\",\n\t\"foreignObject\",\n\t\"linearGradient\",\n\t\"radialGradient\",\n\t\"textPath\"\n].reduce((accumulator, tagName) => {\n\taccumulator[tagName.toLowerCase()] = tagName;\n\treturn accumulator;\n}, {});\n//#endregion\nexports.CASE_SENSITIVE_TAG_NAMES_MAP = CASE_SENSITIVE_TAG_NAMES_MAP;\n\n//# sourceMappingURL=constants.js.map","/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n    /** Type for the root element of a document */\n    ElementType[\"Root\"] = \"root\";\n    /** Type for Text */\n    ElementType[\"Text\"] = \"text\";\n    /** Type for <? ... ?> */\n    ElementType[\"Directive\"] = \"directive\";\n    /** Type for <!-- ... --> */\n    ElementType[\"Comment\"] = \"comment\";\n    /** Type for <script> tags */\n    ElementType[\"Script\"] = \"script\";\n    /** Type for <style> tags */\n    ElementType[\"Style\"] = \"style\";\n    /** Type for Any tag */\n    ElementType[\"Tag\"] = \"tag\";\n    /** Type for <![CDATA[ ... ]]> */\n    ElementType[\"CDATA\"] = \"cdata\";\n    /** Type for <!doctype ...> */\n    ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n * @param element Element to test\n * @param element.type Node type discriminator to check.\n */\nexport function isTag(element) {\n    return (element.type === ElementType.Tag ||\n        element.type === ElementType.Script ||\n        element.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\n// eslint-disable-next-line prefer-destructuring\nexport const Root = ElementType.Root;\n/** Type for Text */\n// eslint-disable-next-line prefer-destructuring\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\n// eslint-disable-next-line prefer-destructuring\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\n// eslint-disable-next-line prefer-destructuring\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Style = ElementType.Style;\n/** Type for Any tag */\n// eslint-disable-next-line prefer-destructuring\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\n// eslint-disable-next-line prefer-destructuring\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\n// eslint-disable-next-line prefer-destructuring\nexport const Doctype = ElementType.Doctype;\n","import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n    /** Parent of the node */\n    parent = null;\n    /** Previous sibling */\n    prev = null;\n    /** Next sibling */\n    next = null;\n    /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n    startIndex = null;\n    /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n    endIndex = null;\n    // Read-write aliases for properties\n    /**\n     * Same as {@link parent}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get parentNode() {\n        return this.parent;\n    }\n    set parentNode(parent) {\n        this.parent = parent;\n    }\n    /**\n     * Same as {@link prev}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get previousSibling() {\n        return this.prev;\n    }\n    set previousSibling(previous) {\n        this.prev = previous;\n    }\n    /**\n     * Same as {@link next}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get nextSibling() {\n        return this.next;\n    }\n    set nextSibling(next) {\n        this.next = next;\n    }\n    /**\n     * Clone this node, and optionally its children.\n     * @param recursive Clone child nodes as well.\n     * @returns A clone of the node.\n     */\n    cloneNode(recursive = false) {\n        return cloneNode(this, recursive);\n    }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n    data;\n    /**\n     * @param data The content of the data node\n     */\n    constructor(data) {\n        super();\n        this.data = data;\n    }\n    /**\n     * Same as {@link data}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get nodeValue() {\n        return this.data;\n    }\n    set nodeValue(data) {\n        this.data = data;\n    }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n    type = ElementType.Text;\n    get nodeType() {\n        return 3;\n    }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n    type = ElementType.Comment;\n    get nodeType() {\n        return 8;\n    }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n    type = ElementType.Directive;\n    name;\n    constructor(name, data) {\n        super(data);\n        this.name = name;\n    }\n    get nodeType() {\n        return 1;\n    }\n    /** If this is a doctype, the document type name (parse5 only). */\n    \"x-name\";\n    /** If this is a doctype, the document type public identifier (parse5 only). */\n    \"x-publicId\";\n    /** If this is a doctype, the document type system identifier (parse5 only). */\n    \"x-systemId\";\n}\n/**\n * A node that can have children.\n */\nexport class NodeWithChildren extends Node {\n    children;\n    /**\n     * @param children Children of the node. Only certain node types can have children.\n     */\n    constructor(children) {\n        super();\n        this.children = children;\n    }\n    // Aliases\n    /** First child of the node. */\n    get firstChild() {\n        return this.children[0] ?? null;\n    }\n    /** Last child of the node. */\n    get lastChild() {\n        return this.children.length > 0\n            ? this.children[this.children.length - 1]\n            : null;\n    }\n    /**\n     * Same as {@link children}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get childNodes() {\n        return this.children;\n    }\n    set childNodes(children) {\n        this.children = children;\n    }\n}\n/**\n * CDATA nodes.\n */\nexport class CDATA extends NodeWithChildren {\n    type = ElementType.CDATA;\n    get nodeType() {\n        return 4;\n    }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n    type = ElementType.Root;\n    get nodeType() {\n        return 9;\n    }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n    name;\n    attribs;\n    type;\n    /**\n     * @param name Name of the tag, eg. `div`, `span`.\n     * @param attribs Object mapping attribute names to attribute values.\n     * @param children Children of the node.\n     * @param type Node type used for the new node instance.\n     */\n    constructor(name, attribs, children = [], type = name === \"script\"\n        ? ElementType.Script\n        : name === \"style\"\n            ? ElementType.Style\n            : ElementType.Tag) {\n        super(children);\n        this.name = name;\n        this.attribs = attribs;\n        this.type = type;\n    }\n    get nodeType() {\n        return 1;\n    }\n    // DOM Level 1 aliases\n    /**\n     * Same as {@link name}.\n     * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n     */\n    get tagName() {\n        return this.name;\n    }\n    set tagName(name) {\n        this.name = name;\n    }\n    get attributes() {\n        return Object.keys(this.attribs).map((name) => ({\n            name,\n            value: this.attribs[name],\n            namespace: this[\"x-attribsNamespace\"]?.[name],\n            prefix: this[\"x-attribsPrefix\"]?.[name],\n        }));\n    }\n    /** Element namespace (parse5 only). */\n    namespace;\n    /** Element attribute namespaces (parse5 only). */\n    \"x-attribsNamespace\";\n    /** Element attribute namespace-related prefixes (parse5 only). */\n    \"x-attribsPrefix\";\n}\n/**\n * Checks if `node` is an element node.\n * @param node Node to check.\n * @returns `true` if the node is an element node.\n */\nexport function isTag(node) {\n    return isTagRaw(node);\n}\n/**\n * Checks if `node` is a CDATA node.\n * @param node Node to check.\n * @returns `true` if the node is a CDATA node.\n */\nexport function isCDATA(node) {\n    return node.type === ElementType.CDATA;\n}\n/**\n * Checks if `node` is a text node.\n * @param node Node to check.\n * @returns `true` if the node is a text node.\n */\nexport function isText(node) {\n    return node.type === ElementType.Text;\n}\n/**\n * Checks if `node` is a comment node.\n * @param node Node to check.\n * @returns `true` if the node is a comment node.\n */\nexport function isComment(node) {\n    return node.type === ElementType.Comment;\n}\n/**\n * Checks if `node` is a directive node.\n * @param node Node to check.\n * @returns `true` if the node is a directive node.\n */\nexport function isDirective(node) {\n    return node.type === ElementType.Directive;\n}\n/**\n * Checks if `node` is a document node.\n * @param node Node to check.\n * @returns `true` if the node is a document node.\n */\nexport function isDocument(node) {\n    return node.type === ElementType.Root;\n}\n/**\n * Checks if `node` has children.\n * @param node Node to check.\n * @returns `true` if the node has children.\n */\nexport function hasChildren(node) {\n    return Object.hasOwn(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n * @param node Node to clone.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n    let result;\n    if (isText(node)) {\n        result = new Text(node.data);\n    }\n    else if (isComment(node)) {\n        result = new Comment(node.data);\n    }\n    else if (isTag(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new Element(node.name, { ...node.attribs }, children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        if (node.namespace != null) {\n            clone.namespace = node.namespace;\n        }\n        if (node[\"x-attribsNamespace\"]) {\n            clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n        }\n        if (node[\"x-attribsPrefix\"]) {\n            clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n        }\n        result = clone;\n    }\n    else if (isCDATA(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new CDATA(children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        result = clone;\n    }\n    else if (isDocument(node)) {\n        const children = recursive ? cloneChildren(node.children) : [];\n        const clone = new Document(children);\n        for (const child of children) {\n            child.parent = clone;\n        }\n        if (node[\"x-mode\"]) {\n            clone[\"x-mode\"] = node[\"x-mode\"];\n        }\n        result = clone;\n    }\n    else if (isDirective(node)) {\n        const instruction = new ProcessingInstruction(node.name, node.data);\n        if (node[\"x-name\"] != null) {\n            instruction[\"x-name\"] = node[\"x-name\"];\n            instruction[\"x-publicId\"] = node[\"x-publicId\"];\n            instruction[\"x-systemId\"] = node[\"x-systemId\"];\n        }\n        result = instruction;\n    }\n    else {\n        throw new Error(`Not implemented yet: ${node.type}`);\n    }\n    result.startIndex = node.startIndex;\n    result.endIndex = node.endIndex;\n    if (node.sourceCodeLocation != null) {\n        result.sourceCodeLocation = node.sourceCodeLocation;\n    }\n    return result;\n}\n/**\n * Clone a list of child nodes.\n * @param childs The child nodes to clone.\n * @returns A list of cloned child nodes.\n */\nfunction cloneChildren(childs) {\n    const children = childs.map((child) => cloneNode(child, true));\n    for (let index = 1; index < children.length; index++) {\n        children[index].prev = children[index - 1];\n        children[index - 1].next = children[index];\n    }\n    return children;\n}\n","import { ElementType } from \"domelementtype\";\nimport { CDATA, Comment, Document, Element, ProcessingInstruction, Text, } from \"./node.js\";\nexport * from \"./node.js\";\n// Default options\nconst defaultOptions = {\n    withStartIndices: false,\n    withEndIndices: false,\n    xmlMode: false,\n};\n/**\n * Event-based handler that builds a DOM tree from parser callbacks.\n */\nexport class DomHandler {\n    /** The elements of the DOM */\n    dom = [];\n    /** The root element for the DOM */\n    root = new Document(this.dom);\n    /** Called once parsing has completed. */\n    callback;\n    /** Settings for the handler. */\n    options;\n    /** Callback whenever a tag is closed. */\n    elementCB;\n    /** Indicated whether parsing has been completed. */\n    done = false;\n    /** Stack of open tags. */\n    tagStack = [this.root];\n    /** A data node that is still being written to. */\n    lastNode = null;\n    /** Reference to the parser instance. Used for location information. */\n    parser = null;\n    /**\n     * @param callback Called once parsing has completed.\n     * @param options Settings for the handler.\n     * @param elementCB Callback whenever a tag is closed.\n     */\n    constructor(callback, options, elementCB) {\n        // Make it possible to skip arguments, for backwards-compatibility\n        if (typeof options === \"function\") {\n            elementCB = options;\n            options = defaultOptions;\n        }\n        if (typeof callback === \"object\") {\n            options = callback;\n            callback = undefined;\n        }\n        this.callback = callback ?? null;\n        this.options = options ?? defaultOptions;\n        this.elementCB = elementCB ?? null;\n    }\n    onparserinit(parser) {\n        this.parser = parser;\n    }\n    // Resets the handler back to starting state\n    onreset() {\n        this.dom = [];\n        this.root = new Document(this.dom);\n        this.done = false;\n        this.tagStack = [this.root];\n        this.lastNode = null;\n        this.parser = null;\n    }\n    // Signals the handler that parsing is done\n    onend() {\n        if (this.done)\n            return;\n        this.done = true;\n        this.parser = null;\n        this.handleCallback(null);\n    }\n    onerror(error) {\n        this.handleCallback(error);\n    }\n    onclosetag() {\n        this.lastNode = null;\n        const element = this.tagStack.pop();\n        if (this.options.withEndIndices && this.parser) {\n            element.endIndex = this.parser.endIndex;\n        }\n        if (this.elementCB)\n            this.elementCB(element);\n    }\n    onopentag(name, attribs) {\n        const type = this.options.xmlMode ? ElementType.Tag : undefined;\n        const element = new Element(name, attribs, undefined, type);\n        this.addNode(element);\n        this.tagStack.push(element);\n    }\n    ontext(data) {\n        const { lastNode } = this;\n        if (lastNode && lastNode.type === ElementType.Text) {\n            lastNode.data += data;\n            if (this.options.withEndIndices && this.parser) {\n                lastNode.endIndex = this.parser.endIndex;\n            }\n        }\n        else {\n            const node = new Text(data);\n            this.addNode(node);\n            this.lastNode = node;\n        }\n    }\n    oncomment(data) {\n        if (this.lastNode && this.lastNode.type === ElementType.Comment) {\n            this.lastNode.data += data;\n            return;\n        }\n        const node = new Comment(data);\n        this.addNode(node);\n        this.lastNode = node;\n    }\n    oncommentend() {\n        this.lastNode = null;\n    }\n    oncdatastart() {\n        const text = new Text(\"\");\n        const node = new CDATA([text]);\n        this.addNode(node);\n        text.parent = node;\n        this.lastNode = text;\n    }\n    oncdataend() {\n        this.lastNode = null;\n    }\n    onprocessinginstruction(name, data) {\n        const node = new ProcessingInstruction(name, data);\n        this.addNode(node);\n    }\n    handleCallback(error) {\n        if (typeof this.callback === \"function\") {\n            this.callback(error, this.dom);\n        }\n        else if (error) {\n            throw error;\n        }\n    }\n    addNode(node) {\n        const parent = this.tagStack[this.tagStack.length - 1];\n        const previousSibling = parent.children[parent.children.length - 1];\n        if (this.options.withStartIndices && this.parser) {\n            node.startIndex = this.parser.startIndex;\n        }\n        if (this.options.withEndIndices && this.parser) {\n            node.endIndex = this.parser.endIndex;\n        }\n        parent.children.push(node);\n        if (previousSibling) {\n            node.prev = previousSibling;\n            previousSibling.next = node;\n        }\n        node.parent = parent;\n        this.lastNode = null;\n    }\n}\nexport default DomHandler;\n","const require_constants = require(\"./constants.js\");\nlet domhandler = require(\"domhandler\");\n//#region src/client/utilities.ts\nconst CARRIAGE_RETURN = \"\\r\";\nconst CARRIAGE_RETURN_REGEX = new RegExp(CARRIAGE_RETURN, \"g\");\nconst CARRIAGE_RETURN_PLACEHOLDER = `__HTML_DOM_PARSER_CARRIAGE_RETURN_PLACEHOLDER_${Date.now().toString()}__`;\nconst CARRIAGE_RETURN_PLACEHOLDER_REGEX = new RegExp(CARRIAGE_RETURN_PLACEHOLDER, \"g\");\n/**\n* Gets case-sensitive tag name.\n*\n* @param tagName - Tag name in lowercase.\n* @returns - Case-sensitive tag name.\n*/\nfunction getCaseSensitiveTagName(tagName) {\n\treturn require_constants.CASE_SENSITIVE_TAG_NAMES_MAP[tagName];\n}\n/**\n* Formats DOM attributes to a hash map.\n*\n* @param attributes - List of attributes.\n* @returns - Map of attribute name to value.\n*/\nfunction formatAttributes(attributes) {\n\tconst map = {};\n\tlet index = 0;\n\tconst attributesLength = attributes.length;\n\tfor (; index < attributesLength; index++) {\n\t\tconst attribute = attributes[index];\n\t\tmap[attribute.name] = attribute.value;\n\t}\n\treturn map;\n}\n/**\n* Corrects the tag name if it is case-sensitive (SVG).\n* Otherwise, returns the lowercase tag name (HTML).\n*\n* @param tagName - Lowercase tag name.\n* @returns - Formatted tag name.\n*/\nfunction formatTagName(tagName) {\n\ttagName = tagName.toLowerCase();\n\tconst caseSensitiveTagName = getCaseSensitiveTagName(tagName);\n\tif (caseSensitiveTagName) return caseSensitiveTagName;\n\treturn tagName;\n}\n/**\n* Checks if an HTML string contains an opening tag (case-insensitive).\n*\n* @param html - HTML string.\n* @param tagName - Tag name to search for (e.g., 'head' or 'body').\n* @returns - Whether the tag is found.\n*/\nfunction hasOpenTag(html, tagName) {\n\tconst openTag = \"<\" + tagName;\n\tconst index = html.toLowerCase().indexOf(openTag);\n\tif (index === -1) return false;\n\tconst char = html[index + openTag.length];\n\treturn char === \">\" || char === \" \" || char === \"\t\" || char === \"\\n\" || char === \"\\r\" || char === \"/\";\n}\n/**\n* Escapes special characters before parsing.\n*\n* @param html - The HTML string.\n* @returns - HTML string with escaped special characters.\n*/\nfunction escapeSpecialCharacters(html) {\n\treturn html.replace(CARRIAGE_RETURN_REGEX, CARRIAGE_RETURN_PLACEHOLDER);\n}\n/**\n* Reverts escaped special characters back to actual characters.\n*\n* @param text - The text with escaped characters.\n* @returns - Text with escaped characters reverted.\n*/\nfunction revertEscapedCharacters(text) {\n\treturn text.replace(CARRIAGE_RETURN_PLACEHOLDER_REGEX, CARRIAGE_RETURN);\n}\n/**\n* Transforms DOM nodes to `domhandler` nodes.\n*\n* @param nodes - DOM nodes.\n* @param parent - Parent node.\n* @param directive - Directive.\n* @returns - Nodes.\n*/\nfunction formatDOM(nodes, parent = null, directive) {\n\tconst domNodes = [];\n\tlet current;\n\tlet index = 0;\n\tconst nodesLength = nodes.length;\n\tfor (; index < nodesLength; index++) {\n\t\tconst node = nodes[index];\n\t\tswitch (node.nodeType) {\n\t\t\tcase 1: {\n\t\t\t\tconst tagName = formatTagName(node.nodeName);\n\t\t\t\tcurrent = new domhandler.Element(tagName, formatAttributes(node.attributes));\n\t\t\t\tcurrent.children = formatDOM(tagName === \"template\" ? node.content.childNodes : node.childNodes, current);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/* v8 ignore start */\n\t\t\tcase 3:\n\t\t\t\tcurrent = new domhandler.Text(revertEscapedCharacters(node.nodeValue ?? \"\"));\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\t\tcurrent = new domhandler.Comment(node.nodeValue ?? \"\");\n\t\t\t\tbreak;\n\t\t\t/* v8 ignore stop */\n\t\t\tdefault: continue;\n\t\t}\n\t\tconst prev = domNodes[index - 1] ?? null;\n\t\tif (prev) prev.next = current;\n\t\tcurrent.parent = parent;\n\t\tcurrent.prev = prev;\n\t\tcurrent.next = null;\n\t\tdomNodes.push(current);\n\t}\n\tif (directive) {\n\t\tcurrent = new domhandler.ProcessingInstruction(directive.substring(0, directive.indexOf(\" \")).toLowerCase(), directive);\n\t\tcurrent.next = domNodes[0] ?? null;\n\t\tcurrent.parent = parent;\n\t\tdomNodes.unshift(current);\n\t\tif (domNodes[1]) domNodes[1].prev = domNodes[0];\n\t}\n\treturn domNodes;\n}\n//#endregion\nexports.escapeSpecialCharacters = escapeSpecialCharacters;\nexports.formatDOM = formatDOM;\nexports.hasOpenTag = hasOpenTag;\n\n//# sourceMappingURL=utilities.js.map","const require_utilities = require(\"./utilities.js\");\n//#region src/client/domparser.ts\nconst HTML = \"html\";\nconst HEAD = \"head\";\nconst BODY = \"body\";\nconst FIRST_TAG_REGEX = /<([a-zA-Z]+[0-9]?)/;\nfunction getHTMLForInnerHTML(html, trustedTypePolicy) {\n\treturn trustedTypePolicy ? trustedTypePolicy.createHTML(html) : html;\n}\n/* v8 ignore start */\nlet parseFromDocument = (html, tagName, trustedTypePolicy) => {\n\tthrow new Error(\"This browser does not support `document.implementation.createHTMLDocument`\");\n};\nlet parseFromString = (html, tagName, trustedTypePolicy) => {\n\tthrow new Error(\"This browser does not support `DOMParser.prototype.parseFromString`\");\n};\nconst DOMParser = typeof window === \"object\" && window.DOMParser;\n/**\n* DOMParser (performance: slow).\n*\n* @see https://developer.mozilla.org/docs/Web/API/DOMParser#Parsing_an_SVG_or_HTML_document\n*/\nif (typeof DOMParser === \"function\") {\n\tconst domParser = new DOMParser();\n\tconst mimeType = \"text/html\";\n\t/**\n\t* Creates an HTML document using `DOMParser.parseFromString`.\n\t*\n\t* @param html - The HTML string.\n\t* @param tagName - The element to render the HTML (with 'body' as fallback).\n\t* @returns - Document.\n\t*/\n\tparseFromString = (html, tagName, trustedTypePolicy) => {\n\t\tif (tagName) html = `<${tagName}>${html}</${tagName}>`;\n\t\treturn domParser.parseFromString(html, mimeType);\n\t};\n\tparseFromDocument = parseFromString;\n}\n/**\n* DOMImplementation (performance: fair).\n*\n* @see https://developer.mozilla.org/docs/Web/API/DOMImplementation/createHTMLDocument\n*/\nif (typeof document === \"object\" && document.implementation) {\n\tconst htmlDocument = document.implementation.createHTMLDocument();\n\t/**\n\t* Use HTML document created by `document.implementation.createHTMLDocument`.\n\t*\n\t* @param html - The HTML string.\n\t* @param tagName - The element to render the HTML (with 'body' as fallback).\n\t* @returns - Document\n\t*/\n\tparseFromDocument = function(html, tagName, trustedTypePolicy) {\n\t\tif (tagName) {\n\t\t\tconst element = htmlDocument.documentElement.querySelector(tagName);\n\t\t\tif (element) element.innerHTML = getHTMLForInnerHTML(html, trustedTypePolicy);\n\t\t\treturn htmlDocument;\n\t\t}\n\t\thtmlDocument.documentElement.innerHTML = getHTMLForInnerHTML(html, trustedTypePolicy);\n\t\treturn htmlDocument;\n\t};\n}\n/**\n* Template (performance: fast).\n*\n* @see https://developer.mozilla.org/docs/Web/HTML/Element/template\n*/\nconst template = typeof document === \"object\" && document.createElement(\"template\");\nlet parseFromTemplate;\nif (template && template.content)\n /**\n* Uses a template element (content fragment) to parse HTML.\n*\n* @param html - HTML string.\n* @returns - Nodes.\n*/\nparseFromTemplate = (html, trustedTypePolicy) => {\n\ttemplate.innerHTML = getHTMLForInnerHTML(html, trustedTypePolicy);\n\treturn template.content.childNodes;\n};\nconst createNodeList = () => document.createDocumentFragment().childNodes;\n/* v8 ignore stop */\n/**\n* Parses HTML string to DOM nodes.\n*\n* @param html - HTML markup.\n* @param trustedTypePolicy - Trusted Types policy.\n* @returns - DOM nodes.\n*/\nfunction domparser(html, trustedTypePolicy) {\n\thtml = require_utilities.escapeSpecialCharacters(html);\n\tconst firstTagName = FIRST_TAG_REGEX.exec(html)?.[1]?.toLowerCase();\n\tswitch (firstTagName) {\n\t\tcase HTML: {\n\t\t\tconst doc = parseFromString(html);\n\t\t\tif (!require_utilities.hasOpenTag(html, HEAD)) {\n\t\t\t\tconst element = doc.querySelector(HEAD);\n\t\t\t\telement?.parentNode?.removeChild(element);\n\t\t\t}\n\t\t\tif (!require_utilities.hasOpenTag(html, BODY)) {\n\t\t\t\tconst element = doc.querySelector(BODY);\n\t\t\t\telement?.parentNode?.removeChild(element);\n\t\t\t}\n\t\t\treturn doc.querySelectorAll(HTML);\n\t\t}\n\t\tcase HEAD:\n\t\tcase BODY: {\n\t\t\tconst elements = parseFromDocument(html, void 0, trustedTypePolicy).querySelectorAll(firstTagName);\n\t\t\t/* v8 ignore next */\n\t\t\tif (require_utilities.hasOpenTag(html, BODY) && require_utilities.hasOpenTag(html, HEAD)) return elements[0].parentNode?.childNodes ?? createNodeList();\n\t\t\treturn elements;\n\t\t}\n\t\t/* v8 ignore start */\n\t\tdefault:\n\t\t\tif (parseFromTemplate) return parseFromTemplate(html, trustedTypePolicy);\n\t\t\treturn parseFromDocument(html, BODY, trustedTypePolicy).querySelector(BODY)?.childNodes ?? createNodeList();\n\t}\n}\n//#endregion\nexports.default = domparser;\n\n//# sourceMappingURL=domparser.js.map","Object.defineProperties(exports, {\n\t__esModule: { value: true },\n\t[Symbol.toStringTag]: { value: \"Module\" }\n});\nconst require_utilities = require(\"./utilities.js\");\nconst require_domparser = require(\"./domparser.js\");\n//#region src/client/html-to-dom.ts\nconst DIRECTIVE_REGEX = /<(![a-zA-Z\\s]+)>/;\n/**\n* Parses HTML string to DOM nodes in browser.\n*\n* @param html - HTML markup.\n* @param options - Parser options.\n* @returns - DOM elements.\n*/\nfunction HTMLDOMParser(html, options) {\n\tif (typeof html !== \"string\") throw new TypeError(\"First argument must be a string\");\n\tif (!html) return [];\n\tconst match = DIRECTIVE_REGEX.exec(html);\n\tconst directive = match ? match[1] : void 0;\n\treturn require_utilities.formatDOM(require_domparser.default(html, options?.trustedTypePolicy), null, directive);\n}\n//#endregion\nexports.default = HTMLDOMParser;\n\n//# sourceMappingURL=html-to-dom.js.map","// An attribute in which the DOM/SVG standard name is the same as the React prop name (e.g., 'accept').\nvar SAME = 0;\nexports.SAME = SAME;\n\n// An attribute in which the React prop name is the camelcased version of the DOM/SVG standard name (e.g., 'acceptCharset').\nvar CAMELCASE = 1;\nexports.CAMELCASE = CAMELCASE;\n\nexports.possibleStandardNames = {\n  accept: 0,\n  acceptCharset: 1,\n  'accept-charset': 'acceptCharset',\n  accessKey: 1,\n  action: 0,\n  allowFullScreen: 1,\n  alt: 0,\n  as: 0,\n  async: 0,\n  autoCapitalize: 1,\n  autoComplete: 1,\n  autoCorrect: 1,\n  autoFocus: 1,\n  autoPlay: 1,\n  autoSave: 1,\n  capture: 0,\n  cellPadding: 1,\n  cellSpacing: 1,\n  challenge: 0,\n  charSet: 1,\n  checked: 0,\n  children: 0,\n  cite: 0,\n  class: 'className',\n  classID: 1,\n  className: 1,\n  cols: 0,\n  colSpan: 1,\n  content: 0,\n  contentEditable: 1,\n  contextMenu: 1,\n  controls: 0,\n  controlsList: 1,\n  coords: 0,\n  crossOrigin: 1,\n  dangerouslySetInnerHTML: 1,\n  data: 0,\n  dateTime: 1,\n  default: 0,\n  defaultChecked: 1,\n  defaultValue: 1,\n  defer: 0,\n  dir: 0,\n  disabled: 0,\n  disablePictureInPicture: 1,\n  disableRemotePlayback: 1,\n  download: 0,\n  draggable: 0,\n  encType: 1,\n  enterKeyHint: 1,\n  for: 'htmlFor',\n  form: 0,\n  formMethod: 1,\n  formAction: 1,\n  formEncType: 1,\n  formNoValidate: 1,\n  formTarget: 1,\n  frameBorder: 1,\n  headers: 0,\n  height: 0,\n  hidden: 0,\n  high: 0,\n  href: 0,\n  hrefLang: 1,\n  htmlFor: 1,\n  httpEquiv: 1,\n  'http-equiv': 'httpEquiv',\n  icon: 0,\n  id: 0,\n  innerHTML: 1,\n  inputMode: 1,\n  integrity: 0,\n  is: 0,\n  itemID: 1,\n  itemProp: 1,\n  itemRef: 1,\n  itemScope: 1,\n  itemType: 1,\n  keyParams: 1,\n  keyType: 1,\n  kind: 0,\n  label: 0,\n  lang: 0,\n  list: 0,\n  loop: 0,\n  low: 0,\n  manifest: 0,\n  marginWidth: 1,\n  marginHeight: 1,\n  max: 0,\n  maxLength: 1,\n  media: 0,\n  mediaGroup: 1,\n  method: 0,\n  min: 0,\n  minLength: 1,\n  multiple: 0,\n  muted: 0,\n  name: 0,\n  noModule: 1,\n  nonce: 0,\n  noValidate: 1,\n  open: 0,\n  optimum: 0,\n  pattern: 0,\n  placeholder: 0,\n  playsInline: 1,\n  poster: 0,\n  preload: 0,\n  profile: 0,\n  radioGroup: 1,\n  readOnly: 1,\n  referrerPolicy: 1,\n  rel: 0,\n  required: 0,\n  reversed: 0,\n  role: 0,\n  rows: 0,\n  rowSpan: 1,\n  sandbox: 0,\n  scope: 0,\n  scoped: 0,\n  scrolling: 0,\n  seamless: 0,\n  selected: 0,\n  shape: 0,\n  size: 0,\n  sizes: 0,\n  span: 0,\n  spellCheck: 1,\n  src: 0,\n  srcDoc: 1,\n  srcLang: 1,\n  srcSet: 1,\n  start: 0,\n  step: 0,\n  style: 0,\n  summary: 0,\n  tabIndex: 1,\n  target: 0,\n  title: 0,\n  type: 0,\n  useMap: 1,\n  value: 0,\n  width: 0,\n  wmode: 0,\n  wrap: 0,\n  about: 0,\n  accentHeight: 1,\n  'accent-height': 'accentHeight',\n  accumulate: 0,\n  additive: 0,\n  alignmentBaseline: 1,\n  'alignment-baseline': 'alignmentBaseline',\n  allowReorder: 1,\n  alphabetic: 0,\n  amplitude: 0,\n  arabicForm: 1,\n  'arabic-form': 'arabicForm',\n  ascent: 0,\n  attributeName: 1,\n  attributeType: 1,\n  autoReverse: 1,\n  azimuth: 0,\n  baseFrequency: 1,\n  baselineShift: 1,\n  'baseline-shift': 'baselineShift',\n  baseProfile: 1,\n  bbox: 0,\n  begin: 0,\n  bias: 0,\n  by: 0,\n  calcMode: 1,\n  capHeight: 1,\n  'cap-height': 'capHeight',\n  clip: 0,\n  clipPath: 1,\n  'clip-path': 'clipPath',\n  clipPathUnits: 1,\n  clipRule: 1,\n  'clip-rule': 'clipRule',\n  color: 0,\n  colorInterpolation: 1,\n  'color-interpolation': 'colorInterpolation',\n  colorInterpolationFilters: 1,\n  'color-interpolation-filters': 'colorInterpolationFilters',\n  colorProfile: 1,\n  'color-profile': 'colorProfile',\n  colorRendering: 1,\n  'color-rendering': 'colorRendering',\n  contentScriptType: 1,\n  contentStyleType: 1,\n  cursor: 0,\n  cx: 0,\n  cy: 0,\n  d: 0,\n  datatype: 0,\n  decelerate: 0,\n  descent: 0,\n  diffuseConstant: 1,\n  direction: 0,\n  display: 0,\n  divisor: 0,\n  dominantBaseline: 1,\n  'dominant-baseline': 'dominantBaseline',\n  dur: 0,\n  dx: 0,\n  dy: 0,\n  edgeMode: 1,\n  elevation: 0,\n  enableBackground: 1,\n  'enable-background': 'enableBackground',\n  end: 0,\n  exponent: 0,\n  externalResourcesRequired: 1,\n  fill: 0,\n  fillOpacity: 1,\n  'fill-opacity': 'fillOpacity',\n  fillRule: 1,\n  'fill-rule': 'fillRule',\n  filter: 0,\n  filterRes: 1,\n  filterUnits: 1,\n  floodOpacity: 1,\n  'flood-opacity': 'floodOpacity',\n  floodColor: 1,\n  'flood-color': 'floodColor',\n  focusable: 0,\n  fontFamily: 1,\n  'font-family': 'fontFamily',\n  fontSize: 1,\n  'font-size': 'fontSize',\n  fontSizeAdjust: 1,\n  'font-size-adjust': 'fontSizeAdjust',\n  fontStretch: 1,\n  'font-stretch': 'fontStretch',\n  fontStyle: 1,\n  'font-style': 'fontStyle',\n  fontVariant: 1,\n  'font-variant': 'fontVariant',\n  fontWeight: 1,\n  'font-weight': 'fontWeight',\n  format: 0,\n  from: 0,\n  fx: 0,\n  fy: 0,\n  g1: 0,\n  g2: 0,\n  glyphName: 1,\n  'glyph-name': 'glyphName',\n  glyphOrientationHorizontal: 1,\n  'glyph-orientation-horizontal': 'glyphOrientationHorizontal',\n  glyphOrientationVertical: 1,\n  'glyph-orientation-vertical': 'glyphOrientationVertical',\n  glyphRef: 1,\n  gradientTransform: 1,\n  gradientUnits: 1,\n  hanging: 0,\n  horizAdvX: 1,\n  'horiz-adv-x': 'horizAdvX',\n  horizOriginX: 1,\n  'horiz-origin-x': 'horizOriginX',\n  ideographic: 0,\n  imageRendering: 1,\n  'image-rendering': 'imageRendering',\n  in2: 0,\n  in: 0,\n  inlist: 0,\n  intercept: 0,\n  k1: 0,\n  k2: 0,\n  k3: 0,\n  k4: 0,\n  k: 0,\n  kernelMatrix: 1,\n  kernelUnitLength: 1,\n  kerning: 0,\n  keyPoints: 1,\n  keySplines: 1,\n  keyTimes: 1,\n  lengthAdjust: 1,\n  letterSpacing: 1,\n  'letter-spacing': 'letterSpacing',\n  lightingColor: 1,\n  'lighting-color': 'lightingColor',\n  limitingConeAngle: 1,\n  local: 0,\n  markerEnd: 1,\n  'marker-end': 'markerEnd',\n  markerHeight: 1,\n  markerMid: 1,\n  'marker-mid': 'markerMid',\n  markerStart: 1,\n  'marker-start': 'markerStart',\n  markerUnits: 1,\n  markerWidth: 1,\n  mask: 0,\n  maskContentUnits: 1,\n  maskUnits: 1,\n  mathematical: 0,\n  mode: 0,\n  numOctaves: 1,\n  offset: 0,\n  opacity: 0,\n  operator: 0,\n  order: 0,\n  orient: 0,\n  orientation: 0,\n  origin: 0,\n  overflow: 0,\n  overlinePosition: 1,\n  'overline-position': 'overlinePosition',\n  overlineThickness: 1,\n  'overline-thickness': 'overlineThickness',\n  paintOrder: 1,\n  'paint-order': 'paintOrder',\n  panose1: 0,\n  'panose-1': 'panose1',\n  pathLength: 1,\n  patternContentUnits: 1,\n  patternTransform: 1,\n  patternUnits: 1,\n  pointerEvents: 1,\n  'pointer-events': 'pointerEvents',\n  points: 0,\n  pointsAtX: 1,\n  pointsAtY: 1,\n  pointsAtZ: 1,\n  prefix: 0,\n  preserveAlpha: 1,\n  preserveAspectRatio: 1,\n  primitiveUnits: 1,\n  property: 0,\n  r: 0,\n  radius: 0,\n  refX: 1,\n  refY: 1,\n  renderingIntent: 1,\n  'rendering-intent': 'renderingIntent',\n  repeatCount: 1,\n  repeatDur: 1,\n  requiredExtensions: 1,\n  requiredFeatures: 1,\n  resource: 0,\n  restart: 0,\n  result: 0,\n  results: 0,\n  rotate: 0,\n  rx: 0,\n  ry: 0,\n  scale: 0,\n  security: 0,\n  seed: 0,\n  shapeRendering: 1,\n  'shape-rendering': 'shapeRendering',\n  slope: 0,\n  spacing: 0,\n  specularConstant: 1,\n  specularExponent: 1,\n  speed: 0,\n  spreadMethod: 1,\n  startOffset: 1,\n  stdDeviation: 1,\n  stemh: 0,\n  stemv: 0,\n  stitchTiles: 1,\n  stopColor: 1,\n  'stop-color': 'stopColor',\n  stopOpacity: 1,\n  'stop-opacity': 'stopOpacity',\n  strikethroughPosition: 1,\n  'strikethrough-position': 'strikethroughPosition',\n  strikethroughThickness: 1,\n  'strikethrough-thickness': 'strikethroughThickness',\n  string: 0,\n  stroke: 0,\n  strokeDasharray: 1,\n  'stroke-dasharray': 'strokeDasharray',\n  strokeDashoffset: 1,\n  'stroke-dashoffset': 'strokeDashoffset',\n  strokeLinecap: 1,\n  'stroke-linecap': 'strokeLinecap',\n  strokeLinejoin: 1,\n  'stroke-linejoin': 'strokeLinejoin',\n  strokeMiterlimit: 1,\n  'stroke-miterlimit': 'strokeMiterlimit',\n  strokeWidth: 1,\n  'stroke-width': 'strokeWidth',\n  strokeOpacity: 1,\n  'stroke-opacity': 'strokeOpacity',\n  suppressContentEditableWarning: 1,\n  suppressHydrationWarning: 1,\n  surfaceScale: 1,\n  systemLanguage: 1,\n  tableValues: 1,\n  targetX: 1,\n  targetY: 1,\n  textAnchor: 1,\n  'text-anchor': 'textAnchor',\n  textDecoration: 1,\n  'text-decoration': 'textDecoration',\n  textLength: 1,\n  textRendering: 1,\n  'text-rendering': 'textRendering',\n  to: 0,\n  transform: 0,\n  typeof: 0,\n  u1: 0,\n  u2: 0,\n  underlinePosition: 1,\n  'underline-position': 'underlinePosition',\n  underlineThickness: 1,\n  'underline-thickness': 'underlineThickness',\n  unicode: 0,\n  unicodeBidi: 1,\n  'unicode-bidi': 'unicodeBidi',\n  unicodeRange: 1,\n  'unicode-range': 'unicodeRange',\n  unitsPerEm: 1,\n  'units-per-em': 'unitsPerEm',\n  unselectable: 0,\n  vAlphabetic: 1,\n  'v-alphabetic': 'vAlphabetic',\n  values: 0,\n  vectorEffect: 1,\n  'vector-effect': 'vectorEffect',\n  version: 0,\n  vertAdvY: 1,\n  'vert-adv-y': 'vertAdvY',\n  vertOriginX: 1,\n  'vert-origin-x': 'vertOriginX',\n  vertOriginY: 1,\n  'vert-origin-y': 'vertOriginY',\n  vHanging: 1,\n  'v-hanging': 'vHanging',\n  vIdeographic: 1,\n  'v-ideographic': 'vIdeographic',\n  viewBox: 1,\n  viewTarget: 1,\n  visibility: 0,\n  vMathematical: 1,\n  'v-mathematical': 'vMathematical',\n  vocab: 0,\n  widths: 0,\n  wordSpacing: 1,\n  'word-spacing': 'wordSpacing',\n  writingMode: 1,\n  'writing-mode': 'writingMode',\n  x1: 0,\n  x2: 0,\n  x: 0,\n  xChannelSelector: 1,\n  xHeight: 1,\n  'x-height': 'xHeight',\n  xlinkActuate: 1,\n  'xlink:actuate': 'xlinkActuate',\n  xlinkArcrole: 1,\n  'xlink:arcrole': 'xlinkArcrole',\n  xlinkHref: 1,\n  'xlink:href': 'xlinkHref',\n  xlinkRole: 1,\n  'xlink:role': 'xlinkRole',\n  xlinkShow: 1,\n  'xlink:show': 'xlinkShow',\n  xlinkTitle: 1,\n  'xlink:title': 'xlinkTitle',\n  xlinkType: 1,\n  'xlink:type': 'xlinkType',\n  xmlBase: 1,\n  'xml:base': 'xmlBase',\n  xmlLang: 1,\n  'xml:lang': 'xmlLang',\n  xmlns: 0,\n  'xml:space': 'xmlSpace',\n  xmlnsXlink: 1,\n  'xmlns:xlink': 'xmlnsXlink',\n  xmlSpace: 1,\n  y1: 0,\n  y2: 0,\n  y: 0,\n  yChannelSelector: 1,\n  z: 0,\n  zoomAndPan: 1\n};\n","'use strict';\n\n/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\n\n\n\n// A reserved attribute.\n// It is handled by React separately and shouldn't be written to the DOM.\nconst RESERVED = 0;\n\n// A simple string attribute.\n// Attributes that aren't in the filter are presumed to have this type.\nconst STRING = 1;\n\n// A string attribute that accepts booleans in React. In HTML, these are called\n// \"enumerated\" attributes with \"true\" and \"false\" as possible values.\n// When true, it should be set to a \"true\" string.\n// When false, it should be set to a \"false\" string.\nconst BOOLEANISH_STRING = 2;\n\n// A real boolean attribute.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\nconst BOOLEAN = 3;\n\n// An attribute that can be used as a flag as well as with a value.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n// For any other value, should be present with that value.\nconst OVERLOADED_BOOLEAN = 4;\n\n// An attribute that must be numeric or parse as a numeric.\n// When falsy, it should be removed.\nconst NUMERIC = 5;\n\n// An attribute that must be positive numeric or parse as a positive numeric.\n// When falsy, it should be removed.\nconst POSITIVE_NUMERIC = 6;\n\nfunction getPropertyInfo(name) {\n  return properties.hasOwnProperty(name) ? properties[name] : null;\n}\n\nfunction PropertyInfoRecord(\n  name,\n  type,\n  mustUseProperty,\n  attributeName,\n  attributeNamespace,\n  sanitizeURL,\n  removeEmptyString,\n) {\n  this.acceptsBooleans =\n    type === BOOLEANISH_STRING ||\n    type === BOOLEAN ||\n    type === OVERLOADED_BOOLEAN;\n  this.attributeName = attributeName;\n  this.attributeNamespace = attributeNamespace;\n  this.mustUseProperty = mustUseProperty;\n  this.propertyName = name;\n  this.type = type;\n  this.sanitizeURL = sanitizeURL;\n  this.removeEmptyString = removeEmptyString;\n}\n\n// When adding attributes to this list, be sure to also add them to\n// the `possibleStandardNames` module to ensure casing and incorrect\n// name warnings.\nconst properties = {};\n\n// These props are reserved by React. They shouldn't be written to the DOM.\nconst reservedProps = [\n  'children',\n  'dangerouslySetInnerHTML',\n  // TODO: This prevents the assignment of defaultValue to regular\n  // elements (not just inputs). Now that ReactDOMInput assigns to the\n  // defaultValue property -- do we need this?\n  'defaultValue',\n  'defaultChecked',\n  'innerHTML',\n  'suppressContentEditableWarning',\n  'suppressHydrationWarning',\n  'style',\n];\n\nreservedProps.forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    RESERVED,\n    false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// A few React string attributes have a different name.\n// This is a mapping from React prop names to the attribute names.\n[\n  ['acceptCharset', 'accept-charset'],\n  ['className', 'class'],\n  ['htmlFor', 'for'],\n  ['httpEquiv', 'http-equiv'],\n].forEach(([name, attributeName]) => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    STRING,\n    false, // mustUseProperty\n    attributeName, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are \"enumerated\" HTML attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    BOOLEANISH_STRING,\n    false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are \"enumerated\" SVG attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n// Since these are SVG attributes, their attribute names are case-sensitive.\n[\n  'autoReverse',\n  'externalResourcesRequired',\n  'focusable',\n  'preserveAlpha',\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    BOOLEANISH_STRING,\n    false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are HTML boolean attributes.\n[\n  'allowFullScreen',\n  'async',\n  // Note: there is a special case that prevents it from being written to the DOM\n  // on the client side because the browsers are inconsistent. Instead we call focus().\n  'autoFocus',\n  'autoPlay',\n  'controls',\n  'default',\n  'defer',\n  'disabled',\n  'disablePictureInPicture',\n  'disableRemotePlayback',\n  'formNoValidate',\n  'hidden',\n  'loop',\n  'noModule',\n  'noValidate',\n  'open',\n  'playsInline',\n  'readOnly',\n  'required',\n  'reversed',\n  'scoped',\n  'seamless',\n  // Microdata\n  'itemScope',\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    BOOLEAN,\n    false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are the few React props that we set as DOM properties\n// rather than attributes. These are all booleans.\n[\n  'checked',\n  // Note: `option.selected` is not updated if `select.multiple` is\n  // disabled with `removeAttribute`. We have special logic for handling this.\n  'multiple',\n  'muted',\n  'selected',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    BOOLEAN,\n    true, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are HTML attributes that are \"overloaded booleans\": they behave like\n// booleans, but can also accept a string value.\n[\n  'capture',\n  'download',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    OVERLOADED_BOOLEAN,\n    false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are HTML attributes that must be positive numbers.\n[\n  'cols',\n  'rows',\n  'size',\n  'span',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    POSITIVE_NUMERIC,\n    false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These are HTML attributes that must be numbers.\n['rowSpan', 'start'].forEach(name => {\n  properties[name] = new PropertyInfoRecord(\n    name,\n    NUMERIC,\n    false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\nconst CAMELIZE = /[\\-\\:]([a-z])/g;\nconst capitalize = token => token[1].toUpperCase();\n\n// This is a list of all SVG attributes that need special casing, namespacing,\n// or boolean value assignment. Regular attributes that just accept strings\n// and have the same names are omitted, just like in the HTML attribute filter.\n// Some of these attributes can be hard to find. This list was created by\n// scraping the MDN documentation.\n[\n  'accent-height',\n  'alignment-baseline',\n  'arabic-form',\n  'baseline-shift',\n  'cap-height',\n  'clip-path',\n  'clip-rule',\n  'color-interpolation',\n  'color-interpolation-filters',\n  'color-profile',\n  'color-rendering',\n  'dominant-baseline',\n  'enable-background',\n  'fill-opacity',\n  'fill-rule',\n  'flood-color',\n  'flood-opacity',\n  'font-family',\n  'font-size',\n  'font-size-adjust',\n  'font-stretch',\n  'font-style',\n  'font-variant',\n  'font-weight',\n  'glyph-name',\n  'glyph-orientation-horizontal',\n  'glyph-orientation-vertical',\n  'horiz-adv-x',\n  'horiz-origin-x',\n  'image-rendering',\n  'letter-spacing',\n  'lighting-color',\n  'marker-end',\n  'marker-mid',\n  'marker-start',\n  'overline-position',\n  'overline-thickness',\n  'paint-order',\n  'panose-1',\n  'pointer-events',\n  'rendering-intent',\n  'shape-rendering',\n  'stop-color',\n  'stop-opacity',\n  'strikethrough-position',\n  'strikethrough-thickness',\n  'stroke-dasharray',\n  'stroke-dashoffset',\n  'stroke-linecap',\n  'stroke-linejoin',\n  'stroke-miterlimit',\n  'stroke-opacity',\n  'stroke-width',\n  'text-anchor',\n  'text-decoration',\n  'text-rendering',\n  'underline-position',\n  'underline-thickness',\n  'unicode-bidi',\n  'unicode-range',\n  'units-per-em',\n  'v-alphabetic',\n  'v-hanging',\n  'v-ideographic',\n  'v-mathematical',\n  'vector-effect',\n  'vert-adv-y',\n  'vert-origin-x',\n  'vert-origin-y',\n  'word-spacing',\n  'writing-mode',\n  'xmlns:xlink',\n  'x-height',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(attributeName => {\n  const name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(\n    name,\n    STRING,\n    false, // mustUseProperty\n    attributeName,\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// String SVG attributes with the xlink namespace.\n[\n  'xlink:actuate',\n  'xlink:arcrole',\n  'xlink:role',\n  'xlink:show',\n  'xlink:title',\n  'xlink:type',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(attributeName => {\n  const name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(\n    name,\n    STRING,\n    false, // mustUseProperty\n    attributeName,\n    'http://www.w3.org/1999/xlink',\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// String SVG attributes with the xml namespace.\n[\n  'xml:base',\n  'xml:lang',\n  'xml:space',\n\n  // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n].forEach(attributeName => {\n  const name = attributeName.replace(CAMELIZE, capitalize);\n  properties[name] = new PropertyInfoRecord(\n    name,\n    STRING,\n    false, // mustUseProperty\n    attributeName,\n    'http://www.w3.org/XML/1998/namespace',\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These attribute exists both in HTML and SVG.\n// The attribute name is case-sensitive in SVG so we can't just use\n// the React name like we do for attributes that exist only in HTML.\n['tabIndex', 'crossOrigin'].forEach(attributeName => {\n  properties[attributeName] = new PropertyInfoRecord(\n    attributeName,\n    STRING,\n    false, // mustUseProperty\n    attributeName.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false, // sanitizeURL\n    false, // removeEmptyString\n  );\n});\n\n// These attributes accept URLs. These must not allow javascript: URLS.\n// These will also need to accept Trusted Types object in the future.\nconst xlinkHref = 'xlinkHref';\nproperties[xlinkHref] = new PropertyInfoRecord(\n  'xlinkHref',\n  STRING,\n  false, // mustUseProperty\n  'xlink:href',\n  'http://www.w3.org/1999/xlink',\n  true, // sanitizeURL\n  false, // removeEmptyString\n);\n\n['src', 'href', 'action', 'formAction'].forEach(attributeName => {\n  properties[attributeName] = new PropertyInfoRecord(\n    attributeName,\n    STRING,\n    false, // mustUseProperty\n    attributeName.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    true, // sanitizeURL\n    true, // removeEmptyString\n  );\n});\n\n// \nconst {\n  CAMELCASE,\n  SAME,\n  possibleStandardNames: possibleStandardNamesOptimized\n} = require('../lib/possibleStandardNamesOptimized');\n\nconst ATTRIBUTE_NAME_START_CHAR =\n  ':A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\n\nconst ATTRIBUTE_NAME_CHAR =\n  ATTRIBUTE_NAME_START_CHAR + '\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\n\n/**\n * Checks whether a property name is a custom attribute.\n *\n * @see https://github.com/facebook/react/blob/15-stable/src/renderers/dom/shared/HTMLDOMPropertyConfig.js#L23-L25\n *\n * @type {(attribute: string) => boolean}\n */\nconst isCustomAttribute =\n  RegExp.prototype.test.bind(\n    // eslint-disable-next-line no-misleading-character-class\n    new RegExp('^(data|aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$')\n  );\n\n/**\n * @type {Record<string, string>}\n */\nconst possibleStandardNames = Object.keys(\n  possibleStandardNamesOptimized\n).reduce((accumulator, standardName) => {\n  const propName = possibleStandardNamesOptimized[standardName];\n  if (propName === SAME) {\n    accumulator[standardName] = standardName;\n  } else if (propName === CAMELCASE) {\n    accumulator[standardName.toLowerCase()] = standardName;\n  } else {\n    accumulator[standardName] = propName;\n  }\n  return accumulator;\n}, {});\n\nexports.BOOLEAN = BOOLEAN;\nexports.BOOLEANISH_STRING = BOOLEANISH_STRING;\nexports.NUMERIC = NUMERIC;\nexports.OVERLOADED_BOOLEAN = OVERLOADED_BOOLEAN;\nexports.POSITIVE_NUMERIC = POSITIVE_NUMERIC;\nexports.RESERVED = RESERVED;\nexports.STRING = STRING;\nexports.getPropertyInfo = getPropertyInfo;\nexports.isCustomAttribute = isCustomAttribute;\nexports.possibleStandardNames = possibleStandardNames;\n","'use strict';\n\n// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nvar COMMENT_REGEX = /\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\//g;\n\nvar NEWLINE_REGEX = /\\n/g;\nvar WHITESPACE_REGEX = /^\\s*/;\n\n// declaration\nvar PROPERTY_REGEX = /^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/;\nvar COLON_REGEX = /^:\\s*/;\nvar VALUE_REGEX =\n  /^((?:'(?:\\\\.|[^'\\\\])*'|\"(?:\\\\.|[^\"\\\\])*\"|url\\((?:'(?:\\\\.|[^'\\\\])*'|\"(?:\\\\.|[^\"\\\\])*\"|[^)]*)\\)|[^};])+)/;\nvar SEMICOLON_REGEX = /^[;\\s]*/;\n\n// strings\nvar NEWLINE = '\\n';\nvar FORWARD_SLASH = '/';\nvar ASTERISK = '*';\nvar EMPTY_STRING = '';\n\n// types\nvar TYPE_COMMENT = 'comment';\nvar TYPE_DECLARATION = 'declaration';\n\n/**\n * @param {String} style\n * @param {Object} [options]\n * @return {Object[]}\n * @throws {TypeError}\n * @throws {Error}\n */\nfunction index (style, options) {\n  if (typeof style !== 'string') {\n    throw new TypeError('First argument must be a string');\n  }\n\n  if (!style) return [];\n\n  options = options || {};\n\n  /**\n   * Positional.\n   */\n  var lineno = 1;\n  var column = 1;\n\n  /**\n   * Update lineno and column based on `str`.\n   *\n   * @param {String} str\n   */\n  function updatePosition(str) {\n    var lines = str.match(NEWLINE_REGEX);\n    if (lines) lineno += lines.length;\n    var i = str.lastIndexOf(NEWLINE);\n    column = ~i ? str.length - i : column + str.length;\n  }\n\n  /**\n   * Mark position and patch `node.position`.\n   *\n   * @return {Function}\n   */\n  function position() {\n    var start = { line: lineno, column: column };\n    return function (node) {\n      node.position = new Position(start);\n      whitespace();\n      return node;\n    };\n  }\n\n  /**\n   * Store position information for a node.\n   *\n   * @constructor\n   * @property {Object} start\n   * @property {Object} end\n   * @property {undefined|String} source\n   */\n  function Position(start) {\n    this.start = start;\n    this.end = { line: lineno, column: column };\n    this.source = options.source;\n  }\n\n  /**\n   * Non-enumerable source string.\n   */\n  Position.prototype.content = style;\n\n  /**\n   * Error `msg`.\n   *\n   * @param {String} msg\n   * @throws {Error}\n   */\n  function error(msg) {\n    var err = new Error(\n      options.source + ':' + lineno + ':' + column + ': ' + msg\n    );\n    err.reason = msg;\n    err.filename = options.source;\n    err.line = lineno;\n    err.column = column;\n    err.source = style;\n\n    if (options.silent) ; else {\n      throw err;\n    }\n  }\n\n  /**\n   * Match `re` and return captures.\n   *\n   * @param {RegExp} re\n   * @return {undefined|Array}\n   */\n  function match(re) {\n    var m = re.exec(style);\n    if (!m) return;\n    var str = m[0];\n    updatePosition(str);\n    style = style.slice(str.length);\n    return m;\n  }\n\n  /**\n   * Parse whitespace.\n   */\n  function whitespace() {\n    match(WHITESPACE_REGEX);\n  }\n\n  /**\n   * Parse comments.\n   *\n   * @param {Object[]} rules\n   * @return {Object[]}\n   */\n  function comments(rules) {\n    var c;\n    while ((c = comment())) {\n      rules.push(c);\n    }\n    return rules;\n  }\n\n  /**\n   * Parse comment.\n   *\n   * @return {Object}\n   * @throws {Error}\n   */\n  function comment() {\n    var pos = position();\n    if (FORWARD_SLASH != style.charAt(0) || ASTERISK != style.charAt(1)) return;\n\n    var i = 2;\n    while (\n      EMPTY_STRING != style.charAt(i) &&\n      (ASTERISK != style.charAt(i) || FORWARD_SLASH != style.charAt(i + 1))\n    ) {\n      ++i;\n    }\n    i += 2;\n\n    if (EMPTY_STRING === style.charAt(i - 1)) {\n      return error('End of comment missing');\n    }\n\n    var str = style.slice(2, i - 2);\n    column += 2;\n    updatePosition(str);\n    style = style.slice(i);\n    column += 2;\n\n    return pos({\n      type: TYPE_COMMENT,\n      comment: str\n    });\n  }\n\n  /**\n   * Parse declaration.\n   *\n   * @return {Object}\n   * @throws {Error}\n   */\n  function declaration() {\n    var pos = position();\n\n    // prop\n    var prop = match(PROPERTY_REGEX);\n    if (!prop) return;\n    comment();\n\n    // :\n    if (!match(COLON_REGEX)) return error(\"property missing ':'\");\n\n    // val\n    var val = match(VALUE_REGEX);\n\n    var ret = pos({\n      type: TYPE_DECLARATION,\n      property: prop[0].replace(COMMENT_REGEX, EMPTY_STRING).trim(),\n      value: val\n        ? val[0].replace(COMMENT_REGEX, EMPTY_STRING).trim()\n        : EMPTY_STRING\n    });\n\n    // ;\n    match(SEMICOLON_REGEX);\n\n    return ret;\n  }\n\n  /**\n   * Parse declarations.\n   *\n   * @return {Object[]}\n   */\n  function declarations() {\n    var decls = [];\n\n    comments(decls);\n\n    // declarations\n    var decl;\n    while ((decl = declaration())) {\n      decls.push(decl);\n      comments(decls);\n    }\n\n    return decls;\n  }\n\n  whitespace();\n  return declarations();\n}\n\nmodule.exports = index;\n//# sourceMappingURL=index.js.map\n","//#region \\0rolldown/runtime.js\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __copyProps = (to, from, except, desc) => {\n\tif (from && typeof from === \"object\" || typeof from === \"function\") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {\n\t\tkey = keys[i];\n\t\tif (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n\t\t\tget: ((k) => from[k]).bind(null, key),\n\t\t\tenumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n\t\t});\n\t}\n\treturn to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n\tvalue: mod,\n\tenumerable: true\n}) : target, mod));\n//#endregion\nlet inline_style_parser = require(\"inline-style-parser\");\ninline_style_parser = __toESM(inline_style_parser);\n//#region src/index.ts\n/**\n* Parses inline style to object.\n*\n* @param style - Inline style.\n* @param iterator - Iterator.\n* @returns - Style object or null.\n*\n* @example Parsing inline style to object:\n*\n* ```js\n* import parse from 'style-to-object';\n* parse('line-height: 42;'); // { 'line-height': '42' }\n* ```\n*/\nfunction StyleToObject(style, iterator) {\n\tlet styleObject = null;\n\tif (!style || typeof style !== \"string\") return styleObject;\n\tconst declarations = (0, inline_style_parser.default)(style);\n\tconst hasIterator = typeof iterator === \"function\";\n\tdeclarations.forEach((declaration) => {\n\t\tif (declaration.type !== \"declaration\") return;\n\t\tconst { property, value } = declaration;\n\t\tif (hasIterator) iterator(property, value, declaration);\n\t\telse if (value) {\n\t\t\tstyleObject = styleObject ?? {};\n\t\t\tstyleObject[property] = value;\n\t\t}\n\t});\n\treturn styleObject;\n}\n//#endregion\nmodule.exports = StyleToObject;\n\n//# sourceMappingURL=index.js.map","//#region \\0rolldown/runtime.js\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __copyProps = (to, from, except, desc) => {\n\tif (from && typeof from === \"object\" || typeof from === \"function\") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {\n\t\tkey = keys[i];\n\t\tif (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n\t\t\tget: ((k) => from[k]).bind(null, key),\n\t\t\tenumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n\t\t});\n\t}\n\treturn to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n\tvalue: mod,\n\tenumerable: true\n}) : target, mod));\n//#endregion\nlet style_to_object = require(\"style-to-object\");\nstyle_to_object = __toESM(style_to_object);\n//#region src/utilities.ts\nconst CUSTOM_PROPERTY_REGEX = /^--[a-zA-Z0-9_-]+$/;\nconst HYPHEN_REGEX = /-([a-z])/g;\nconst NO_HYPHEN_REGEX = /^[^-]+$/;\nconst VENDOR_PREFIX_REGEX = /^-(webkit|moz|ms|o|khtml)-/;\nconst MS_VENDOR_PREFIX_REGEX = /^-(ms)-/;\n/**\n* Checks whether to skip camelCase.\n*/\nconst skipCamelCase = (property) => !property || NO_HYPHEN_REGEX.test(property) || CUSTOM_PROPERTY_REGEX.test(property);\n/**\n* Replacer that capitalizes first character.\n*/\nconst capitalize = (match, character) => character.toUpperCase();\n/**\n* Replacer that removes beginning hyphen of vendor prefix property.\n*/\nconst trimHyphen = (match, prefix) => `${prefix}-`;\n/**\n* CamelCases a CSS property.\n*/\nconst camelCase = (property, options = {}) => {\n\tif (skipCamelCase(property)) return property;\n\tproperty = property.toLowerCase();\n\tif (options.reactCompat) property = property.replace(MS_VENDOR_PREFIX_REGEX, trimHyphen);\n\telse property = property.replace(VENDOR_PREFIX_REGEX, trimHyphen);\n\treturn property.replace(HYPHEN_REGEX, capitalize);\n};\n//#endregion\n//#region src/index.ts\n/**\n* Parses CSS inline style to JavaScript object (camelCased).\n*/\nfunction StyleToJS(style, options) {\n\tconst output = {};\n\tif (!style || typeof style !== \"string\") return output;\n\t(0, style_to_object.default)(style, (property, value) => {\n\t\tif (property && value) output[camelCase(property, options)] = value;\n\t});\n\treturn output;\n}\n//#endregion\nmodule.exports = StyleToJS;\n\n//# sourceMappingURL=index.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.returnFirstArg = exports.canTextBeChildOfNode = exports.ELEMENTS_WITH_NO_TEXT_CHILDREN = exports.PRESERVE_CUSTOM_ATTRIBUTES = void 0;\nexports.isCustomComponent = isCustomComponent;\nexports.setStyleProp = setStyleProp;\nconst react_1 = require(\"react\");\nconst style_to_js_1 = __importDefault(require(\"style-to-js\"));\nconst RESERVED_SVG_MATHML_ELEMENTS = new Set([\n    'annotation-xml',\n    'color-profile',\n    'font-face',\n    'font-face-src',\n    'font-face-uri',\n    'font-face-format',\n    'font-face-name',\n    'missing-glyph',\n]);\n/**\n * Check if a tag is a custom component.\n *\n * @see {@link https://github.com/facebook/react/blob/v16.6.3/packages/react-dom/src/shared/isCustomComponent.js}\n *\n * @param tagName - Tag name.\n * @param props - Props passed to the element.\n * @returns - Whether the tag is custom component.\n */\nfunction isCustomComponent(tagName, props) {\n    if (!tagName.includes('-')) {\n        return Boolean(props && typeof props.is === 'string');\n    }\n    // These are reserved SVG and MathML elements.\n    // We don't mind this whitelist too much because we expect it to never grow.\n    // The alternative is to track the namespace in a few places which is convoluted.\n    // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts\n    if (RESERVED_SVG_MATHML_ELEMENTS.has(tagName)) {\n        return false;\n    }\n    return true;\n}\nconst styleOptions = {\n    reactCompat: true,\n};\n/**\n * Sets style prop.\n *\n * @param style - Inline style.\n * @param props - Props object.\n */\nfunction setStyleProp(style, props) {\n    if (typeof style !== 'string') {\n        return;\n    }\n    if (!style.trim()) {\n        props.style = {};\n        return;\n    }\n    try {\n        props.style = (0, style_to_js_1.default)(style, styleOptions);\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    }\n    catch (error) {\n        props.style = {};\n    }\n}\n/**\n * @see https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html\n */\nexports.PRESERVE_CUSTOM_ATTRIBUTES = Number(react_1.version.split('.')[0]) >= 16;\n/**\n * @see https://github.com/facebook/react/blob/cae635054e17a6f107a39d328649137b83f25972/packages/react-dom/src/client/validateDOMNesting.js#L213\n */\nexports.ELEMENTS_WITH_NO_TEXT_CHILDREN = new Set([\n    'tr',\n    'tbody',\n    'thead',\n    'tfoot',\n    'colgroup',\n    'table',\n    'head',\n    'html',\n    'frameset',\n]);\n/**\n * Checks if the given node can contain text nodes\n *\n * @param node - Element node.\n * @returns - Whether the node can contain text nodes.\n */\nconst canTextBeChildOfNode = (node) => !exports.ELEMENTS_WITH_NO_TEXT_CHILDREN.has(node.name);\nexports.canTextBeChildOfNode = canTextBeChildOfNode;\n/**\n * Returns the first argument as is.\n *\n * @param arg - The argument to be returned.\n * @returns - The input argument `arg`.\n */\nconst returnFirstArg = (arg) => arg;\nexports.returnFirstArg = returnFirstArg;\n//# sourceMappingURL=utilities.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = attributesToProps;\nconst react_property_1 = require(\"react-property\");\nconst utilities_1 = require(\"./utilities\");\n// https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components\n// https://developer.mozilla.org/docs/Web/HTML/Attributes\nconst UNCONTROLLED_COMPONENT_ATTRIBUTES = ['checked', 'value'];\nconst UNCONTROLLED_COMPONENT_NAMES = ['input', 'select', 'textarea'];\nconst valueOnlyInputs = {\n    reset: true,\n    submit: true,\n};\n/**\n * Converts HTML/SVG DOM attributes to React props.\n *\n * @param attributes - HTML/SVG DOM attributes.\n * @param nodeName - DOM node name.\n * @returns - React props.\n */\nfunction attributesToProps(attributes = {}, nodeName) {\n    const props = {};\n    const isInputValueOnly = Boolean(attributes.type && valueOnlyInputs[attributes.type]);\n    for (const attributeName in attributes) {\n        const attributeValue = attributes[attributeName];\n        // ARIA (aria-*) or custom data (data-*) attribute\n        if ((0, react_property_1.isCustomAttribute)(attributeName)) {\n            props[attributeName] = attributeValue;\n            continue;\n        }\n        // convert HTML/SVG attribute to React prop\n        const attributeNameLowerCased = attributeName.toLowerCase();\n        let propName = getPropName(attributeNameLowerCased);\n        if (propName) {\n            const propertyInfo = (0, react_property_1.getPropertyInfo)(propName);\n            // convert attribute to uncontrolled component prop (e.g., `value` to `defaultValue`)\n            if (UNCONTROLLED_COMPONENT_ATTRIBUTES.includes(propName) &&\n                UNCONTROLLED_COMPONENT_NAMES.includes(nodeName) &&\n                !isInputValueOnly) {\n                propName = getPropName('default' + attributeNameLowerCased);\n            }\n            props[propName] = attributeValue;\n            switch (propertyInfo === null || propertyInfo === void 0 ? void 0 : propertyInfo.type) {\n                case react_property_1.BOOLEAN:\n                    props[propName] = true;\n                    break;\n                case react_property_1.OVERLOADED_BOOLEAN:\n                    if (attributeValue === '') {\n                        props[propName] = true;\n                    }\n                    break;\n            }\n            continue;\n        }\n        // preserve custom attribute if React >=16\n        if (utilities_1.PRESERVE_CUSTOM_ATTRIBUTES) {\n            props[attributeName] = attributeValue;\n        }\n    }\n    // transform inline style to object\n    (0, utilities_1.setStyleProp)(attributes.style, props);\n    return props;\n}\n/**\n * Gets prop name from lowercased attribute name.\n *\n * @param attributeName - Lowercased attribute name.\n * @returns - Prop name.\n */\nfunction getPropName(attributeName) {\n    return react_property_1.possibleStandardNames[attributeName];\n}\n//# sourceMappingURL=attributes-to-props.js.map","\"use strict\";\n/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = domToReact;\nconst domhandler_1 = require(\"domhandler\");\nconst react_1 = require(\"react\");\nconst attributes_to_props_1 = __importDefault(require(\"./attributes-to-props\"));\nconst utilities_1 = require(\"./utilities\");\nconst React = {\n    cloneElement: react_1.cloneElement,\n    createElement: react_1.createElement,\n    isValidElement: react_1.isValidElement,\n};\n/**\n * Converts DOM nodes to JSX element(s).\n *\n * @param nodes - DOM nodes.\n * @param options - Options.\n * @returns - String or JSX element(s).\n */\nfunction domToReact(nodes, options = {}) {\n    var _a, _b, _c, _d, _e;\n    const reactElements = [];\n    const hasReplace = typeof options.replace === 'function';\n    const transform = (_a = options.transform) !== null && _a !== void 0 ? _a : utilities_1.returnFirstArg;\n    const { cloneElement, createElement, isValidElement } = (_b = options.library) !== null && _b !== void 0 ? _b : React;\n    const nodesLength = nodes.length;\n    normalizeDOMNodes(nodes);\n    for (let index = 0; index < nodesLength; index++) {\n        const node = nodes[index];\n        // replace with custom React element (if present)\n        if (hasReplace) {\n            let replaceElement = (_c = options.replace) === null || _c === void 0 ? void 0 : _c.call(options, node, index);\n            if (isValidElement(replaceElement)) {\n                // set \"key\" prop for sibling elements\n                // https://react.dev/learn/rendering-lists#rules-of-keys\n                if (nodesLength > 1) {\n                    replaceElement = cloneElement(replaceElement, {\n                        key: (_d = replaceElement.key) !== null && _d !== void 0 ? _d : index,\n                    });\n                }\n                reactElements.push(transform(replaceElement, node, index));\n                continue;\n            }\n        }\n        if (node.type === 'text') {\n            const isWhitespace = !node.data.trim().length;\n            // We have a whitespace node that can't be nested in its parent\n            // so skip it\n            if (isWhitespace &&\n                node.parent &&\n                !(0, utilities_1.canTextBeChildOfNode)(node.parent)) {\n                continue;\n            }\n            // Trim is enabled and we have a whitespace node\n            // so skip it\n            if (options.trim && isWhitespace) {\n                continue;\n            }\n            // We have a text node that's not whitespace and it can be nested\n            // in its parent so add it to the results\n            reactElements.push(transform(node.data, node, index));\n            continue;\n        }\n        const element = node;\n        let props = {};\n        if (skipAttributesToProps(element)) {\n            (0, utilities_1.setStyleProp)(element.attribs.style, element.attribs);\n            props = element.attribs;\n            // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n        }\n        else if (element.attribs) {\n            props = (0, attributes_to_props_1.default)(element.attribs, element.name);\n        }\n        let children;\n        switch (node.type) {\n            case 'script':\n            case 'style':\n                // prevent text in <script> or <style> from being escaped\n                // https://react.dev/reference/react-dom/components/common#dangerously-setting-the-inner-html\n                if (node.children[0]) {\n                    props.dangerouslySetInnerHTML = {\n                        __html: node.children[0].data,\n                    };\n                }\n                break;\n            case 'tag':\n                // setting textarea value in children is an antipattern in React\n                // https://react.dev/reference/react-dom/components/textarea#caveats\n                if (node.name === 'textarea' && node.children[0]) {\n                    props.defaultValue = node.children[0].data;\n                    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n                }\n                else if ((_e = node.children) === null || _e === void 0 ? void 0 : _e.length) {\n                    // continue recursion of creating React elements (if applicable)\n                    children = domToReact(node.children, options);\n                }\n                break;\n            // skip all other cases (e.g., comment)\n            default:\n                continue;\n        }\n        // set \"key\" prop for sibling elements\n        // https://react.dev/learn/rendering-lists#rules-of-keys\n        if (nodesLength > 1) {\n            props.key = index;\n        }\n        reactElements.push(transform(createElement(node.name, props, children), node, index));\n    }\n    return reactElements.length === 1 ? reactElements[0] : reactElements;\n}\nfunction normalizeDOMNodes(nodes) {\n    for (const node of nodes) {\n        if (node.type === 'tag' ||\n            node.type === 'script' ||\n            node.type === 'style') {\n            Object.setPrototypeOf(node, domhandler_1.Element.prototype);\n            normalizeDOMNodes(node.children);\n        }\n    }\n}\n/**\n * Determines whether DOM element attributes should be transformed to props.\n * Web Components should not have their attributes transformed except for `style`.\n *\n * @param node - Element node.\n * @returns - Whether the node attributes should be converted to props.\n */\nfunction skipAttributesToProps(node) {\n    return (utilities_1.PRESERVE_CUSTOM_ATTRIBUTES &&\n        node.type === 'tag' &&\n        (0, utilities_1.isCustomComponent)(node.name, node.attribs));\n}\n//# sourceMappingURL=dom-to-react.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.htmlToDOM = exports.domToReact = exports.attributesToProps = exports.Text = exports.ProcessingInstruction = exports.Element = exports.Comment = void 0;\nexports.default = HTMLReactParser;\nconst html_dom_parser_1 = __importDefault(require(\"html-dom-parser\"));\nexports.htmlToDOM = html_dom_parser_1.default;\nconst attributes_to_props_1 = __importDefault(require(\"./attributes-to-props\"));\nexports.attributesToProps = attributes_to_props_1.default;\nconst dom_to_react_1 = __importDefault(require(\"./dom-to-react\"));\nexports.domToReact = dom_to_react_1.default;\nvar domhandler_1 = require(\"domhandler\");\nObject.defineProperty(exports, \"Comment\", { enumerable: true, get: function () { return domhandler_1.Comment; } });\nObject.defineProperty(exports, \"Element\", { enumerable: true, get: function () { return domhandler_1.Element; } });\nObject.defineProperty(exports, \"ProcessingInstruction\", { enumerable: true, get: function () { return domhandler_1.ProcessingInstruction; } });\nObject.defineProperty(exports, \"Text\", { enumerable: true, get: function () { return domhandler_1.Text; } });\nconst domParserOptions = { lowerCaseAttributeNames: false };\n/**\n * Converts HTML string to React elements.\n *\n * @param html - HTML string.\n * @param options - Parser options.\n * @returns - React element(s), empty array, or string.\n */\nfunction HTMLReactParser(html, options) {\n    var _a;\n    if (typeof html !== 'string') {\n        throw new TypeError('First argument must be a string');\n    }\n    if (!html) {\n        return [];\n    }\n    const htmlToDOMOptions = Object.assign(Object.assign({}, ((_a = options === null || options === void 0 ? void 0 : options.htmlparser2) !== null && _a !== void 0 ? _a : domParserOptions)), { trustedTypePolicy: options === null || options === void 0 ? void 0 : options.trustedTypePolicy });\n    return (0, dom_to_react_1.default)((0, html_dom_parser_1.default)(html, htmlToDOMOptions), options);\n}\n//# sourceMappingURL=index.js.map","import HTMLReactParser from '../lib/index.js';\n\nexport {\n  attributesToProps,\n  Comment,\n  domToReact,\n  Element,\n  htmlToDOM,\n  ProcessingInstruction,\n  Text,\n} from '../lib/index.js';\n\nexport default HTMLReactParser.default || HTMLReactParser;\n","/**\n * Emoji detection works on grapheme clusters, not raw code points.\n * Intl.Segmenter keeps ZWJ sequences, flags, and keycaps intact as single user-visible units.\n * Each grapheme is treated as emoji-like if it is a keycap sequence, an emoji forced by Variation Selector-16, or contains Emoji_Presentation, Extended_Pictographic, or Regional_Indicator.\n * This is intentionally broader than `\\p{RGI_Emoji}` because browsers can lag on that property for newer emojis like `🫪`.\n * The goal here is UI rendering, so broad emoji-like detection is more useful than strict Unicode interchange validation.\n */\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n\nconst SHORTCODE_TOKEN_REG = /^:[^:\\s]+:/u;\nconst EMOJI_GRAPHEME_REG =\n  /[#*0-9]\\uFE0F?\\u20E3|\\p{Emoji}\\uFE0F|[\\p{Emoji_Presentation}\\p{Extended_Pictographic}\\p{Regional_Indicator}]/u;\n\nexport type EmojiTextPart =\n  | {\n      type: 'text';\n      value: string;\n    }\n  | {\n      type: 'emoji';\n      value: string;\n    };\n\nconst getFirstGrapheme = (text: string): string => {\n  const first = graphemeSegmenter.segment(text)[Symbol.iterator]().next();\n  return first.done ? '' : first.value.segment;\n};\n\nexport const isEmojiGrapheme = (segment: string): boolean => {\n  if (!segment) return false;\n  return EMOJI_GRAPHEME_REG.test(segment);\n};\n\nexport const splitEmojiText = (text: string): EmojiTextPart[] => {\n  const parts: EmojiTextPart[] = [];\n  let buffer = '';\n  let foundEmoji = false;\n\n  [...graphemeSegmenter.segment(text)].forEach(({ segment }) => {\n    if (isEmojiGrapheme(segment)) {\n      foundEmoji = true;\n      parts.push({ type: 'text', value: buffer });\n      buffer = '';\n      parts.push({ type: 'emoji', value: segment });\n    } else {\n      buffer += segment;\n    }\n  });\n\n  if (!foundEmoji) {\n    return [{ type: 'text', value: buffer }];\n  }\n\n  parts.push({ type: 'text', value: buffer });\n  return parts;\n};\n\nexport const isJumboEmojiText = (text: string, maxTokens = 10): boolean => {\n  if (!text) return false;\n\n  let tokenCount = 0;\n  let index = 0;\n\n  while (index < text.length) {\n    const remainder = text.slice(index);\n    const whitespaceMatch = /^\\s+/u.exec(remainder);\n    if (whitespaceMatch) {\n      index += whitespaceMatch[0].length;\n    } else {\n      const shortcodeMatch = SHORTCODE_TOKEN_REG.exec(remainder);\n      if (shortcodeMatch) {\n        tokenCount += 1;\n        if (tokenCount > maxTokens) return false;\n        index += shortcodeMatch[0].length;\n      } else {\n        const grapheme = getFirstGrapheme(remainder);\n        if (!isEmojiGrapheme(grapheme)) return false;\n\n        tokenCount += 1;\n        if (tokenCount > maxTokens) return false;\n        index += grapheme.length;\n      }\n    }\n  }\n\n  return tokenCount > 0;\n};\n","export type ReplaceCallback<R> = (\n  match: RegExpExecArray | RegExpMatchArray,\n  pushIndex: number\n) => R;\nexport type ConvertPartCallback<R> = (text: string, pushIndex: number) => R;\n\nexport const findAndReplace = <ReplaceReturnType, ConvertReturnType>(\n  text: string,\n  regex: RegExp,\n  replace: ReplaceCallback<ReplaceReturnType>,\n  convertPart: ConvertPartCallback<ConvertReturnType>\n): Array<ReplaceReturnType | ConvertReturnType> => {\n  const result: Array<ReplaceReturnType | ConvertReturnType> = [];\n  let lastEnd = 0;\n\n  let match: RegExpExecArray | RegExpMatchArray | null = regex.exec(text);\n  while (match !== null && typeof match.index === 'number') {\n    result.push(convertPart(text.slice(lastEnd, match.index), result.length));\n    result.push(replace(match, result.length));\n\n    lastEnd = match.index + match[0].length;\n    if (regex.global) match = regex.exec(text);\n    else match = null;\n  }\n\n  result.push(convertPart(text.slice(lastEnd), result.length));\n\n  return result;\n};\n","export const MATRIX_HEX_COLOR_REGEX = /^#[0-9a-fA-F]{6}$/;\n\nexport function isMatrixHexColor(value: string): boolean {\n  return MATRIX_HEX_COLOR_REGEX.test(value);\n}\n\n/** MFM / composer input: optional `#` then exactly 3 or 6 hex digits (no alpha). */\nexport const MFM_HEX_INPUT_REGEX = /^#?(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/;\n\n/** One `fg.color=` / `bg.color=` value in a `$[…]` block (no alpha). */\nexport const MFM_HEX_COLOR_VALUE_PATTERN = '[#]?(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})(?![0-9a-fA-F])';\n\n/**\n * Normalizes MFM-style hex (3 or 6 digits, optional `#`) to Matrix `#RRGGBB`.\n */\nexport function normalizeMfmHexToMatrixColor(hex: string): string | undefined {\n  const trimmed = hex.trim();\n  if (!MFM_HEX_INPUT_REGEX.test(trimmed)) return undefined;\n\n  const digits = trimmed.replace(/^#/, '').toLowerCase();\n  if (digits.length === 3) {\n    const expanded = `${digits[0]}${digits[0]}${digits[1]}${digits[1]}${digits[2]}${digits[2]}`;\n    const color = `#${expanded}`;\n    return isMatrixHexColor(color) ? color : undefined;\n  }\n\n  const color = `#${digits}`;\n  return isMatrixHexColor(color) ? color : undefined;\n}\n\n/** Strips `#` for MFM `fg.color=` / `bg.color=` round-trip. */\nexport function matrixColorToMfmHex(value: string): string | undefined {\n  if (!isMatrixHexColor(value)) return undefined;\n  return value.slice(1).toLowerCase();\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * Temporarily sets a boolean state.\n *\n * @param duration - Duration in milliseconds before resetting (default: 1500)\n * @param initial - Initial value (default: false)\n */\nexport function useTimeoutToggle(duration = 1500, initial = false): [boolean, () => void] {\n  const [active, setActive] = useState(initial);\n  const timeoutRef = useRef<number | null>(null);\n\n  const clear = () => {\n    if (timeoutRef.current !== null) {\n      clearTimeout(timeoutRef.current);\n      timeoutRef.current = null;\n    }\n  };\n\n  const trigger = useCallback(() => {\n    setActive(!initial);\n    clear();\n    timeoutRef.current = window.setTimeout(() => {\n      setActive(initial);\n      timeoutRef.current = null;\n    }, duration);\n  }, [duration, initial]);\n\n  useEffect(\n    () => () => {\n      clear();\n    },\n    []\n  );\n\n  return [active, trigger];\n}\n","export type SettingsSectionId =\n  | 'general'\n  | 'account'\n  | 'persona'\n  | 'appearance'\n  | 'accessibility'\n  | 'notifications'\n  | 'devices'\n  | 'desktop'\n  | 'emojis'\n  | 'developer-tools'\n  | 'experimental'\n  | 'about'\n  | 'keyboard-shortcuts';\n\nexport type SettingsSection = {\n  id: SettingsSectionId;\n  label: string;\n};\n\nexport const settingsSections = [\n  { id: 'general', label: 'General' },\n  { id: 'account', label: 'Account' },\n  { id: 'persona', label: 'Persona' },\n  { id: 'appearance', label: 'Appearance' },\n  { id: 'accessibility', label: 'Accessibility' },\n  { id: 'notifications', label: 'Notifications' },\n  { id: 'devices', label: 'Devices' },\n  { id: 'desktop', label: 'Desktop' },\n  { id: 'emojis', label: 'Emojis & Stickers' },\n  { id: 'developer-tools', label: 'Developer Tools' },\n  { id: 'experimental', label: 'Experimental' },\n  { id: 'about', label: 'About' },\n  { id: 'keyboard-shortcuts', label: 'Keyboard Shortcuts' },\n] as const satisfies readonly SettingsSection[];\n\nexport const isSettingsSectionId = (value?: string): value is SettingsSectionId =>\n  settingsSections.some((section) => section.id === value);\n","import { getAppPathFromHref, getSettingsPath, withOriginBaseUrl } from '$pages/pathUtils';\nimport { isSettingsSectionId, settingsSections, type SettingsSectionId } from './routes';\n\nexport type SettingsLink = {\n  section: SettingsSectionId;\n  focus?: string;\n};\n\nexport const SETTINGS_LINK_ACTION_PARAM = 'moe.sable.client.action';\nexport const SETTINGS_LINK_ACTION_SETTINGS = 'settings';\nconst SETTINGS_FOCUS_ID_PATTERN = /^[a-z0-9-]+$/;\nconst SETTINGS_LINK_FORBIDDEN_QUERY_VALUE_PATTERN = /[\"<>]/;\n\nconst settingsSectionLabel = Object.fromEntries(\n  settingsSections.map((section) => [section.id, section.label])\n) as Record<SettingsSectionId, string>;\n\nexport const settingsLinkFocusIdsBySection: Record<SettingsSectionId, readonly string[]> = {\n  general: [\n    'show-interactive-map',\n    'show-interactive-map-enc',\n    'client-side-embeds',\n    'composer-formatting-toolbar',\n    'hide-add-menu',\n    'custom-date-format',\n    'date-format',\n    'disable-media-auto-load',\n    'display-bundled-embeds',\n    'display-multiple-embeds',\n    'enable-gif-picker',\n    'embed-youtube-links',\n    'emoji-selector-threshold',\n    'enable-swiping',\n    'encrypted-room-embeds',\n    'encrypted-room-url-preview',\n    'external-gif-auto-load-encrypted',\n    'enter-for-newline',\n    'error-reporting',\n    'export-diagnostics',\n    'file-description-placement',\n    'hide-member-events-read-only-rooms',\n    'hide-membership-change',\n    'hide-profile-change',\n    'hide-read-receipts',\n    'hide-typing-indicators',\n    'large-room-call-button',\n    'markdown-formatting',\n    'message-layout',\n    'message-spacing',\n    'presence-status',\n    'reply-notifications',\n    'right-aligned-bubbles',\n    'right-swipe-action',\n    'session-replay',\n    'capture-diagnostics',\n    'show-hidden-events',\n    'hidden-event-edits',\n    'show-redacted-message-tombstones',\n    'hidden-event-redaction-timeline',\n    'hidden-event-reactions',\n    'hidden-event-reaction-tombstones',\n    'hidden-event-reaction-redaction-timeline',\n    'hidden-event-other',\n    'sync-across-devices',\n    'sync-status',\n    'twenty-four-hour-time-format',\n    'url-preview',\n    'use-sliding-sync',\n    'join-on-click-voicecalls',\n    'incoming-call-sound',\n    'notify-voice-rooms',\n    'outgoing-ringback-sound',\n    'call-ringtone',\n    'call-ringback-tone',\n    'call-ringtone-volume',\n    'always-play-call-sound',\n    'custom-call-ringtone',\n    'custom-call-ringback',\n    'always-inline-editor',\n    'composer-button-order',\n    'show-emoji-button',\n    'show-gif-button',\n    'gif-provider',\n    'show-sticker-button',\n    'show-voice-recording-button',\n  ],\n  account: [\n    'about-you',\n    'avatar',\n    'banner',\n    'blocked-users',\n    'display-name',\n    'email-address',\n    'has-animal',\n    'is-animal',\n    'animal-requires',\n    'user-hero-color',\n    'matrix-id',\n    'name-color',\n    'name-color-dark-theme',\n    'name-color-light-theme',\n    'pronouns',\n    'render-animals',\n    'status',\n    'timezone',\n    'has-cats',\n    'profile-change-propagation',\n  ],\n  persona: [\n    'enable-pk-commands',\n    'enable-pk-shorthands',\n    'enable-pk-latching',\n    'prevent-sending-pmp-fallback',\n    'create-pmp',\n    'enable-pmp-picker',\n    'pmp-pk-import',\n    'pmp-list-export',\n  ],\n  appearance: [\n    'app-icon',\n    'old-sidebar',\n    'blur-avatars',\n    'blur-emotes',\n    'blur-media',\n    'code-block-dark-theme',\n    'code-block-light-theme',\n    'code-block-manual-theme',\n    'code-block-system-theme',\n    'collapse-folders-by-default',\n    'colorful-names',\n    'consistent-icon-style',\n    'icon-compact-size',\n    'icon-empty-size',\n    'icon-inline-size',\n    'icon-toolbar-size',\n    'browse-remote-catalog',\n    'customize-dm-cards',\n    'custom-profile-cards',\n    'dark-theme',\n    'display-room-banners',\n    'jumbo-emoji-size',\n    'light-theme',\n    'manual-theme',\n    'message-link-preview',\n    'page-zoom',\n    'pixelated-image-rendering',\n    'catalog-themes',\n    'catalog-tweaks',\n    'theme-browse-remote',\n    'theme-chat-sable-widgets',\n    'theme-chat-auto-approved',\n    'theme-chat-auto-any',\n    'theme-import-open',\n    'theme-local-sync-system',\n    'pronoun-pill-max-count',\n    'pronoun-pill-max-length',\n    'pronoun-pills-for-all',\n    'selected-language-for-pronouns',\n    'show-easter-eggs',\n    'show-pronoun-pills',\n    'show-pronouns-only-in-selected-language',\n    'subspace-hierarchy-limit',\n    'system-theme',\n    'twitter-emoji',\n    'show-room-icons',\n    'room-icon-overlay',\n    'show-room-home-icons',\n    'sidebar-size',\n    'incoming-inline-images-default-height',\n    'incoming-inline-images-max-height',\n    'link-preview-image-max-height',\n  ],\n  accessibility: [\n    'autoplay-emojis',\n    'autoplay-gifs',\n    'autoplay-stickers',\n    'saturation',\n    'underline-links',\n    'reduced-motion',\n    'render-global-username-colors',\n    'render-space-room-fonts',\n    'render-space-room-username-colors',\n    'render-persona-username-colors',\n    'name-color-lightness-correction',\n  ],\n  notifications: [\n    'background-push-notifications',\n    'clear-notifications-when-read-elsewhere',\n    'contains-display-name',\n    'contains-username',\n    'direct-messages',\n    'direct-messages-encrypted',\n    'email-notification',\n    'favicon-dot-mentions-only',\n    'highlight-mentions',\n    'in-app-notification-sound',\n    'background-notification-sound',\n    'in-app-notifications',\n    'mention-room',\n    'mention-user-id',\n    'reset-all-push-notifications',\n    'rooms',\n    'rooms-encrypted',\n    'select-keyword',\n    'show-dm-counts',\n    'show-encrypted-message-content',\n    'show-mention-counts',\n    'show-message-content',\n    'show-room-counts',\n    'system-notifications',\n    'background-push-transport-mode',\n    'rich-push-payloads',\n    'unified-push-app-id',\n    'unified-push-distributor',\n    'unified-push-gateway-url',\n  ],\n  devices: [\n    'device-dashboard',\n    'device-verification',\n    'export-messages-data',\n    'import-messages-data',\n  ],\n  desktop: [\n    'auto-update-check',\n    'close-to-background-on-close',\n    'show-system-tray-icon',\n    'spellcheck',\n    'use-custom-title-bar',\n  ],\n  emojis: ['default-pack', 'select-pack'],\n  'developer-tools': [\n    'access-token',\n    'enable-developer-tools',\n    'export-debug-logs',\n    'global-account-data',\n    'sentry-category-call',\n    'sentry-category-error',\n    'sentry-category-general',\n    'sentry-category-message',\n    'sentry-category-network',\n    'sentry-category-notification',\n    'sentry-category-sync',\n    'sentry-category-timeline',\n    'sentry-category-ui',\n    'session-activity',\n    'session-error-budget',\n    'session-replay',\n    'traces-profiles',\n  ],\n  experimental: [\n    'bandwidth-saving-emojis',\n    'sharehistory-command',\n    'show-personas-tab',\n    'new-calls',\n    'media-galleries',\n  ],\n  about: [\n    'base-url',\n    'check-for-updates',\n    'clear-cache-and-reload',\n    'domain',\n    'federation-url',\n    'homeserver-compiler',\n    'homeserver-name',\n    'homeserver-version',\n    'report-an-issue',\n  ],\n  'keyboard-shortcuts': [],\n};\n\nconst settingsLinkFocusIdsBySectionSet = settingsSections.reduce(\n  (acc, section) => {\n    acc[section.id] = new Set(settingsLinkFocusIdsBySection[section.id]);\n    return acc;\n  },\n  {} as Record<SettingsSectionId, ReadonlySet<string>>\n);\n\nexport const normalizeSettingsFocusId = (focus?: string): string | undefined => {\n  if (!focus || !SETTINGS_FOCUS_ID_PATTERN.test(focus)) {\n    return undefined;\n  }\n\n  return focus;\n};\n\nconst isShareableSettingsFocusId = (section: SettingsSectionId, focus: string): boolean =>\n  settingsLinkFocusIdsBySectionSet[section].has(focus);\n\n// Focus ids may live under a different section than the link claims when\n// settings get reorganized; redirect to the owning section.\nconst settingsSectionByFocusId = settingsSections.reduce((acc, section) => {\n  for (const focusId of settingsLinkFocusIdsBySection[section.id]) {\n    acc.set(focusId, section.id);\n  }\n  return acc;\n}, new Map<string, SettingsSectionId>());\n\nconst parseSettingsLinkQuery = (\n  search: string\n): { focus?: string; hasActionMarker: boolean } | undefined => {\n  const params = new URLSearchParams(search);\n\n  if (\n    Array.from(params.entries()).some(\n      ([key, value]) =>\n        SETTINGS_LINK_FORBIDDEN_QUERY_VALUE_PATTERN.test(key) ||\n        SETTINGS_LINK_FORBIDDEN_QUERY_VALUE_PATTERN.test(value)\n    )\n  ) {\n    return undefined;\n  }\n\n  const focusValues = params.getAll('focus');\n  if (focusValues.length > 1) {\n    return undefined;\n  }\n\n  const focus = focusValues[0];\n  if (focus !== undefined && normalizeSettingsFocusId(focus) === undefined) {\n    return undefined;\n  }\n\n  const actionValues = params.getAll(SETTINGS_LINK_ACTION_PARAM);\n  if (actionValues.length > 1) {\n    return undefined;\n  }\n\n  const action = actionValues[0];\n  if (action !== undefined && action !== SETTINGS_LINK_ACTION_SETTINGS) {\n    return undefined;\n  }\n\n  return {\n    focus,\n    hasActionMarker: action === SETTINGS_LINK_ACTION_SETTINGS,\n  };\n};\n\nconst withSettingsLinkAction = (path: string): string => {\n  const [pathname, search = ''] = path.split('?');\n  const params = new URLSearchParams(search);\n  params.set(SETTINGS_LINK_ACTION_PARAM, SETTINGS_LINK_ACTION_SETTINGS);\n\n  return `${pathname}?${params.toString()}`;\n};\n\nconst parseSettingsAppPath = (appPath: string): SettingsLink | undefined => {\n  if (!appPath.startsWith('/settings/')) return undefined;\n\n  const [pathname = '', search = ''] = appPath.split('?');\n  const sectionMatch = pathname.match(/^\\/settings\\/([^/]+)\\/?$/);\n  if (!sectionMatch) return undefined;\n\n  const section = sectionMatch[1];\n  if (!isSettingsSectionId(section)) return undefined;\n\n  const query = parseSettingsLinkQuery(search);\n  if (!query) return undefined;\n\n  if (query.focus && !isShareableSettingsFocusId(section, query.focus)) {\n    const owningSection = settingsSectionByFocusId.get(query.focus);\n    if (!owningSection) return undefined;\n    return { section: owningSection, focus: query.focus };\n  }\n\n  return { section, focus: query.focus };\n};\n\nconst hasSettingsLinkAction = (search: string): boolean =>\n  parseSettingsLinkQuery(search)?.hasActionMarker === true;\n\nconst getCrossBaseSettingsPathname = (pathname: string): string | undefined =>\n  pathname.match(/(\\/settings\\/[^/]+\\/?)$/)?.[1];\n\nconst getCrossBaseSettingsAppPath = (pathname: string, search: string): string | undefined => {\n  if (!hasSettingsLinkAction(search)) return undefined;\n\n  const settingsPathname = getCrossBaseSettingsPathname(pathname);\n  if (!settingsPathname) return undefined;\n\n  const appPath = search ? `${settingsPathname}?${search}` : settingsPathname;\n  return parseSettingsAppPath(appPath) ? appPath : undefined;\n};\n\nconst getSameBaseSettingsAppPath = (baseUrl: string, href: string): string | undefined => {\n  const base = new URL(baseUrl);\n  const target = new URL(href);\n\n  if (base.origin !== target.origin) return undefined;\n\n  if (base.hash) {\n    const baseHash = base.hash.replace(/\\/+$/, '');\n    if (!(target.hash === baseHash || target.hash.startsWith(`${baseHash}/`))) {\n      return undefined;\n    }\n  }\n\n  return getAppPathFromHref(baseUrl, href);\n};\n\nconst getCrossBaseSettingsAppPathFromHref = (href: string): string | undefined => {\n  const target = new URL(href);\n\n  const directAppPath = getCrossBaseSettingsAppPath(\n    target.pathname,\n    target.search.replace(/^\\?/, '')\n  );\n  if (directAppPath) {\n    return directAppPath;\n  }\n\n  const hashPath = target.hash.startsWith('#') ? target.hash.slice(1) : target.hash;\n  if (!hashPath) return undefined;\n\n  const [hashPathname = '', hashSearch = ''] = hashPath.split('?');\n  return getCrossBaseSettingsAppPath(hashPathname, hashSearch);\n};\n\nexport const buildSettingsLink = (\n  baseUrl: string,\n  section: SettingsSectionId,\n  focus?: string\n): string => withOriginBaseUrl(baseUrl, withSettingsLinkAction(getSettingsPath(section, focus)));\n\nexport const humanizeSettingsLinkPart = (value: string): string =>\n  value\n    .split(/[^a-zA-Z0-9]+/)\n    .filter(Boolean)\n    .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n    .join(' ');\n\nexport const getSettingsLinkLabel = (section: SettingsSectionId, focus?: string): string => {\n  const sectionLabel = settingsSectionLabel[section];\n  const focusLabel = focus ? humanizeSettingsLinkPart(focus) : undefined;\n\n  return focusLabel ? `Settings > ${sectionLabel} > ${focusLabel}` : `Settings > ${sectionLabel}`;\n};\n\nexport const getSettingsLinkChipLabel = (section: SettingsSectionId, focus?: string): string => {\n  const sectionLabel = settingsSectionLabel[section];\n  const focusLabel = focus ? humanizeSettingsLinkPart(focus) : undefined;\n\n  return focusLabel ? `${sectionLabel} / ${focusLabel}` : sectionLabel;\n};\n\nexport const parseSettingsLink = (baseUrl: string, href: string): SettingsLink | undefined => {\n  try {\n    const sameBaseAppPath = getSameBaseSettingsAppPath(baseUrl, href);\n    if (sameBaseAppPath) {\n      return parseSettingsAppPath(sameBaseAppPath);\n    }\n\n    const crossBaseAppPath = getCrossBaseSettingsAppPathFromHref(href);\n    if (crossBaseAppPath) {\n      return parseSettingsAppPath(crossBaseAppPath);\n    }\n    return undefined;\n  } catch {\n    return undefined;\n  }\n};\n\nexport const toSettingsFocusIdPart = (value: string): string =>\n  value\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '');\n","import { useEffect, useRef, useState } from 'react';\n\nexport function ClientSideHoverFreeze({\n  children,\n  src,\n  className,\n}: {\n  children: React.ReactNode;\n  src: string;\n  className?: string;\n}) {\n  const [isHovered, setIsHovered] = useState(false);\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n  const [isCanvasReady, setIsCanvasReady] = useState(false);\n  useEffect(() => {\n    let isMounted = true;\n    const img = new window.Image();\n    img.crossOrigin = 'anonymous';\n    img.src = src;\n\n    const handleLoad = () => {\n      if (isMounted && canvasRef.current) {\n        canvasRef.current.width = img.naturalWidth || img.width;\n        canvasRef.current.height = img.naturalHeight || img.height;\n        const ctx = canvasRef.current.getContext('2d');\n        ctx?.drawImage(img, 0, 0);\n        setIsCanvasReady(true);\n      }\n    };\n    img.addEventListener('load', handleLoad);\n    return () => {\n      isMounted = false;\n      img.removeEventListener('load', handleLoad);\n    };\n  }, [src]);\n\n  return (\n    <div\n      onMouseEnter={() => setIsHovered(true)}\n      onMouseLeave={() => setIsHovered(false)}\n      onFocus={() => setIsHovered(true)}\n      onBlur={() => setIsHovered(false)}\n      className={className}\n      style={{\n        position: 'relative',\n        display: 'inline-flex',\n        cursor: 'pointer',\n        verticalAlign: 'middle',\n        overflow: 'hidden',\n        borderRadius: 'inherit',\n      }}\n    >\n      <div\n        style={{\n          opacity: isHovered || !isCanvasReady ? 1 : 0,\n          display: 'flex',\n          width: '100%',\n        }}\n      >\n        {children}\n      </div>\n      <canvas\n        ref={canvasRef}\n        style={{\n          position: 'absolute',\n          top: 0,\n          left: 0,\n          width: '100%',\n          height: '100%',\n          objectFit: 'inherit',\n          opacity: !isHovered && isCanvasReady ? 1 : 0,\n          pointerEvents: 'none',\n          display: 'block',\n        }}\n      />\n    </div>\n  );\n}\n","import type * as ArboriumModule from '@arborium/arborium';\n\ntype ArboriumModuleType = typeof ArboriumModule;\ntype ArboriumModuleWithAvailability = ArboriumModuleType & {\n  availableLanguages?: string[];\n  isLanguageAvailable?: (language: string) => boolean | Promise<boolean>;\n};\n\nconst LANGUAGE_COMPATIBILITY: Record<string, string> = {\n  jsx: 'tsx',\n  markup: 'html',\n};\n\nexport interface HighlightCodeInput {\n  code: string;\n  language?: string | null;\n  allowDetect?: boolean;\n}\n\nexport type HighlightResult =\n  | { mode: 'plain'; html: string; language?: string }\n  | { mode: 'highlighted'; html: string; language: string };\n\nexport interface HighlightCodeDeps {\n  loadModule?: () => Promise<ArboriumModuleType>;\n}\n\nlet arboriumModulePromise: Promise<ArboriumModuleType | null> | null = null;\n\nfunction escapeHtml(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;');\n}\n\nfunction plainResult(code: string, language?: string): HighlightResult {\n  const result: HighlightResult = {\n    mode: 'plain',\n    html: escapeHtml(code),\n  };\n\n  if (language !== undefined) {\n    result.language = language;\n  }\n\n  return result;\n}\n\nfunction resolveCompatibleLanguage(language: string): string {\n  return LANGUAGE_COMPATIBILITY[language.toLowerCase()] ?? language;\n}\n\nasync function isLanguageAvailable(\n  arborium: ArboriumModuleWithAvailability,\n  language: string\n): Promise<boolean> {\n  if (Array.isArray(arborium.availableLanguages)) {\n    return arborium.availableLanguages.includes(language);\n  }\n\n  if (typeof arborium.isLanguageAvailable === 'function') {\n    try {\n      return await arborium.isLanguageAvailable(language);\n    } catch {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nasync function loadArborium(\n  loadModule?: () => Promise<ArboriumModuleType>\n): Promise<ArboriumModuleType | null> {\n  if (loadModule) {\n    try {\n      return await loadModule();\n    } catch {\n      return null;\n    }\n  }\n\n  if (!arboriumModulePromise) {\n    arboriumModulePromise = import('@arborium/arborium').then((m) => m).catch(() => null);\n  }\n\n  return arboriumModulePromise;\n}\n\nexport async function highlightCode(\n  { code, language, allowDetect = false }: HighlightCodeInput,\n  deps?: HighlightCodeDeps\n): Promise<HighlightResult> {\n  const { loadModule } = deps ?? {};\n  if (language) {\n    const compatibleLanguage = resolveCompatibleLanguage(language);\n    const arborium = await loadArborium(loadModule);\n    if (!arborium) {\n      return plainResult(code, language);\n    }\n\n    let resolvedLanguage: string;\n    try {\n      resolvedLanguage = arborium.normalizeLanguage(compatibleLanguage);\n    } catch {\n      return plainResult(code, language);\n    }\n\n    if (!(await isLanguageAvailable(arborium, resolvedLanguage))) {\n      return plainResult(code, language);\n    }\n\n    try {\n      const html = await arborium.highlight(resolvedLanguage, code);\n      if (html === escapeHtml(code)) {\n        return plainResult(code, resolvedLanguage);\n      }\n      return {\n        mode: 'highlighted',\n        html,\n        language: resolvedLanguage,\n      };\n    } catch {\n      return plainResult(code, resolvedLanguage);\n    }\n  }\n\n  const arborium = await loadArborium(loadModule);\n  if (!arborium) {\n    return plainResult(code, language ?? undefined);\n  }\n\n  let resolvedLanguage: string | null = null;\n\n  if (allowDetect) {\n    try {\n      const detectedLanguage = arborium.detectLanguage(code);\n      if (detectedLanguage) {\n        resolvedLanguage = arborium.normalizeLanguage(detectedLanguage);\n      }\n    } catch {\n      return plainResult(code, language ?? undefined);\n    }\n  }\n\n  if (!resolvedLanguage) {\n    return plainResult(code, language ?? undefined);\n  }\n\n  if (!(await isLanguageAvailable(arborium, resolvedLanguage))) {\n    return plainResult(code, language ?? undefined);\n  }\n\n  try {\n    const html = await arborium.highlight(resolvedLanguage, code);\n    if (html === escapeHtml(code)) {\n      return plainResult(code, resolvedLanguage);\n    }\n    return {\n      mode: 'highlighted',\n      html,\n      language: resolvedLanguage,\n    };\n  } catch {\n    return plainResult(code, resolvedLanguage);\n  }\n}\n","export type ArboriumThemeKind = 'light' | 'dark';\n\n// Keep this literal aligned with the installed package. The theme test compares it with\n// Arborium's runtime export without pulling the syntax highlighter into the startup bundle.\nexport const ARBORIUM_CDN_VERSION = '2.18.1';\n\nconst ARBORIUM_THEME_DEFINITIONS = [\n  { id: 'alabaster', label: 'Alabaster', kind: 'light' },\n  { id: 'ayu-light', label: 'Ayu Light', kind: 'light' },\n  { id: 'catppuccin-latte', label: 'Catppuccin Latte', kind: 'light' },\n  { id: 'dayfox', label: 'Dayfox', kind: 'light' },\n  { id: 'desert256', label: 'Desert 256', kind: 'light' },\n  { id: 'github-light', label: 'GitHub Light', kind: 'light' },\n  { id: 'gruvbox-light', label: 'Gruvbox Light', kind: 'light' },\n  { id: 'light-owl', label: 'Light Owl', kind: 'light' },\n  { id: 'lucius-light', label: 'Lucius Light', kind: 'light' },\n  { id: 'melange-light', label: 'Melange Light', kind: 'light' },\n  { id: 'solarized-light', label: 'Solarized Light', kind: 'light' },\n  { id: 'rustdoc-light', label: 'Rustdoc Light', kind: 'light' },\n  { id: 'github-dark', label: 'GitHub Dark', kind: 'dark' },\n  { id: 'one-dark', label: 'One Dark', kind: 'dark' },\n  { id: 'nord', label: 'Nord', kind: 'dark' },\n  { id: 'dracula', label: 'Dracula', kind: 'dark' },\n  { id: 'tokyo-night', label: 'Tokyo Night', kind: 'dark' },\n  { id: 'catppuccin-mocha', label: 'Catppuccin Mocha', kind: 'dark' },\n  { id: 'catppuccin-macchiato', label: 'Catppuccin Macchiato', kind: 'dark' },\n  { id: 'catppuccin-frappe', label: 'Catppuccin Frappe', kind: 'dark' },\n  { id: 'rose-pine-moon', label: 'Rose Pine Moon', kind: 'dark' },\n  { id: 'gruvbox-dark', label: 'Gruvbox Dark', kind: 'dark' },\n  { id: 'ayu-dark', label: 'Ayu Dark', kind: 'dark' },\n  { id: 'kanagawa-dragon', label: 'Kanagawa Dragon', kind: 'dark' },\n  { id: 'solarized-dark', label: 'Solarized Dark', kind: 'dark' },\n  { id: 'melange-dark', label: 'Melange Dark', kind: 'dark' },\n  { id: 'monokai', label: 'Monokai', kind: 'dark' },\n  { id: 'zenburn', label: 'Zenburn', kind: 'dark' },\n  { id: 'cobalt2', label: 'Cobalt2', kind: 'dark' },\n  { id: 'ef-melissa-dark', label: 'Ef Melissa Dark', kind: 'dark' },\n  { id: 'evergarden-fall', label: 'Evergarden Fall', kind: 'dark' },\n  { id: 'rustdoc-dark', label: 'Rustdoc Dark', kind: 'dark' },\n  { id: 'rustdoc-ayu', label: 'Rustdoc Ayu', kind: 'dark' },\n] as const;\n\ntype ArboriumThemeDefinition = (typeof ARBORIUM_THEME_DEFINITIONS)[number];\n\nexport type ArboriumThemeId = ArboriumThemeDefinition['id'];\n\nexport type ArboriumTheme = {\n  id: ArboriumThemeId;\n  label: string;\n  kind: ArboriumThemeKind;\n};\n\nexport const DEFAULT_ARBORIUM_LIGHT_THEME: ArboriumThemeId = 'github-light';\nexport const DEFAULT_ARBORIUM_DARK_THEME: ArboriumThemeId = 'dracula';\n\nconst ARBORIUM_THEMES: ArboriumTheme[] = [...ARBORIUM_THEME_DEFINITIONS];\n\nconst ARBORIUM_THEME_IDS = new Set<ArboriumThemeId>(ARBORIUM_THEMES.map((theme) => theme.id));\n\nexport const getArboriumThemeOptions = (kind: ArboriumThemeKind): ArboriumTheme[] =>\n  ARBORIUM_THEMES.filter((theme) => theme.kind === kind);\n\nexport const isArboriumThemeId = (themeId: string): themeId is ArboriumThemeId =>\n  ARBORIUM_THEME_IDS.has(themeId as ArboriumThemeId);\n\nexport const getArboriumThemeLabel = (themeId: ArboriumThemeId): string =>\n  ARBORIUM_THEMES.find((theme) => theme.id === themeId)?.label ?? themeId;\n\nexport const getArboriumThemeHref = (themeId: ArboriumThemeId): string =>\n  `https://cdn.jsdelivr.net/npm/@arborium/arborium@${ARBORIUM_CDN_VERSION}/dist/themes/${themeId}.css`;\n","import { createContext, type ReactNode, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { ThemeKind } from '$hooks/useTheme';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\n\nimport {\n  ARBORIUM_CDN_VERSION,\n  DEFAULT_ARBORIUM_DARK_THEME,\n  DEFAULT_ARBORIUM_LIGHT_THEME,\n  getArboriumThemeHref,\n  isArboriumThemeId,\n} from './themes';\n\ntype ArboriumThemeStatus = {\n  ready: boolean;\n};\n\nconst ArboriumThemeStatusContext = createContext<ArboriumThemeStatus | null>(null);\n\nexport const useArboriumThemeStatus = (): ArboriumThemeStatus => {\n  const status = useContext(ArboriumThemeStatusContext);\n  if (!status) {\n    throw new Error('No Arborium theme status provided!');\n  }\n\n  return status;\n};\n\ntype ArboriumThemeBridgeProps = {\n  kind: ThemeKind;\n  children?: ReactNode;\n};\n\nconst baseHref = `https://cdn.jsdelivr.net/npm/@arborium/arborium@${ARBORIUM_CDN_VERSION}/dist/themes/base-rustdoc.css`;\n\nconst baseLinkId = 'arborium-base';\nconst themeLinkId = 'arborium-theme';\n\nconst getOrCreateLink = (id: string): HTMLLinkElement => {\n  const existingLink = document.getElementById(id);\n  if (existingLink instanceof HTMLLinkElement) {\n    return existingLink;\n  }\n\n  const link = document.createElement('link');\n  link.setAttribute('id', id);\n  link.setAttribute('rel', 'stylesheet');\n  link.setAttribute('type', 'text/css');\n  document.head.append(link);\n  return link;\n};\n\nconst setLinkHref = (link: HTMLLinkElement, href: string) => {\n  if (link.getAttribute('href') !== href) {\n    link.setAttribute('href', href);\n  }\n};\n\nconst markLinkLoaded = (link: HTMLLinkElement) => {\n  link.setAttribute('data-arborium-loaded', 'true');\n};\n\nconst clearLinkLoaded = (link: HTMLLinkElement) => {\n  link.removeAttribute('data-arborium-loaded');\n};\n\nexport function ArboriumThemeBridge({ kind, children }: ArboriumThemeBridgeProps) {\n  const [useSystemArboriumTheme] = useSetting(settingsAtom, 'useSystemArboriumTheme');\n  const [arboriumThemeId] = useSetting(settingsAtom, 'arboriumThemeId');\n  const [arboriumLightTheme] = useSetting(settingsAtom, 'arboriumLightTheme');\n  const [arboriumDarkTheme] = useSetting(settingsAtom, 'arboriumDarkTheme');\n  const [baseReady, setBaseReady] = useState(false);\n  const [themeReady, setThemeReady] = useState(false);\n  const selectedSystemThemeId = kind === ThemeKind.Dark ? arboriumDarkTheme : arboriumLightTheme;\n  let resolvedSystemThemeId = DEFAULT_ARBORIUM_LIGHT_THEME;\n  if (kind === ThemeKind.Dark) {\n    resolvedSystemThemeId = DEFAULT_ARBORIUM_DARK_THEME;\n  }\n  if (selectedSystemThemeId && isArboriumThemeId(selectedSystemThemeId)) {\n    resolvedSystemThemeId = selectedSystemThemeId;\n  }\n  const themeId =\n    !useSystemArboriumTheme && arboriumThemeId && isArboriumThemeId(arboriumThemeId)\n      ? arboriumThemeId\n      : resolvedSystemThemeId;\n  const themeHref = getArboriumThemeHref(themeId);\n\n  useEffect(() => {\n    const baseLink = getOrCreateLink(baseLinkId);\n    setLinkHref(baseLink, baseHref);\n    setBaseReady(baseLink.dataset.arboriumLoaded === 'true');\n\n    const handleBaseLoad = () => {\n      markLinkLoaded(baseLink);\n      setBaseReady(true);\n    };\n    const handleBaseError = () => {\n      clearLinkLoaded(baseLink);\n      setBaseReady(false);\n    };\n\n    baseLink.addEventListener('load', handleBaseLoad);\n    baseLink.addEventListener('error', handleBaseError);\n\n    return () => {\n      baseLink.removeEventListener('load', handleBaseLoad);\n      baseLink.removeEventListener('error', handleBaseError);\n    };\n  }, []);\n\n  useEffect(() => {\n    const themeLink = getOrCreateLink(themeLinkId);\n    const hrefChanged = themeLink.getAttribute('href') !== themeHref;\n    setLinkHref(themeLink, themeHref);\n    if (hrefChanged) {\n      clearLinkLoaded(themeLink);\n    }\n    setThemeReady(!hrefChanged && themeLink.dataset.arboriumLoaded === 'true');\n\n    const handleThemeLoad = () => {\n      markLinkLoaded(themeLink);\n      setThemeReady(true);\n    };\n    const handleThemeError = () => {\n      clearLinkLoaded(themeLink);\n      setThemeReady(false);\n    };\n\n    themeLink.addEventListener('load', handleThemeLoad);\n    themeLink.addEventListener('error', handleThemeError);\n\n    return () => {\n      themeLink.removeEventListener('load', handleThemeLoad);\n      themeLink.removeEventListener('error', handleThemeError);\n    };\n  }, [themeHref]);\n\n  const status = useMemo(() => ({ ready: baseReady && themeReady }), [baseReady, themeReady]);\n\n  return (\n    <ArboriumThemeStatusContext.Provider value={status}>\n      {children}\n    </ArboriumThemeStatusContext.Provider>\n  );\n}\n","import { useEffect, useState } from 'react';\n\nimport { highlightCode, type HighlightResult, useArboriumThemeStatus } from '$plugins/arborium';\nimport * as css from './CodeHighlightRenderer.css';\n\ntype CodeHighlightRendererProps = {\n  code: string;\n  language?: string;\n  allowDetect?: boolean;\n  className?: string;\n};\n\ntype RenderState = {\n  key: string;\n  result: HighlightResult;\n};\n\nconst createRequestKey = (code: string, language?: string, allowDetect = false) =>\n  JSON.stringify([code, language ?? null, allowDetect]);\n\nconst createPlainResult = (code: string, language?: string): HighlightResult => {\n  const result: HighlightResult = {\n    mode: 'plain',\n    html: code,\n  };\n\n  if (language !== undefined) {\n    result.language = language;\n  }\n\n  return result;\n};\n\nexport function CodeHighlightRenderer({\n  code,\n  language,\n  allowDetect = false,\n  className,\n}: CodeHighlightRendererProps) {\n  const { ready } = useArboriumThemeStatus();\n  const requestKey = createRequestKey(code, language, allowDetect);\n  const [state, setState] = useState<RenderState>(() => ({\n    key: requestKey,\n    result: createPlainResult(code, language),\n  }));\n\n  useEffect(() => {\n    let cancelled = false;\n\n    setState({\n      key: requestKey,\n      result: createPlainResult(code, language),\n    });\n\n    highlightCode({ code, language, allowDetect }).then((next) => {\n      if (!cancelled) {\n        setState({\n          key: requestKey,\n          result: next,\n        });\n      }\n    });\n\n    return () => {\n      cancelled = true;\n    };\n  }, [code, language, allowDetect, requestKey]);\n\n  const currentResult = state.key === requestKey ? state.result : createPlainResult(code, language);\n  const codeClassName = [css.CodeHighlightCode, className].filter(Boolean).join(' ');\n\n  if (!ready || currentResult.mode === 'plain') {\n    return <code className={codeClassName}>{code}</code>;\n  }\n\n  return (\n    <code className={codeClassName} dangerouslySetInnerHTML={{ __html: currentResult.html }} />\n  );\n}\n","import type { ComponentProps, ForwardedRef, ImgHTMLAttributes, PointerEventHandler } from 'react';\nimport { forwardRef, lazy, Suspense, useCallback, useEffect, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport type { DotLottieReact as DotLottieReactComponent } from '@lottiefiles/dotlottie-react';\nimport { useSetting } from '$state/hooks/settings';\nimport { isPixelatedRendering, settingsAtom } from '$state/settings';\nimport * as css from './media.css';\nimport type { IImageInfo } from '$types/matrix/common';\n\ntype ImageProps = Omit<ImgHTMLAttributes<HTMLImageElement>, 'onPointerDown'> & {\n  info?: IImageInfo;\n  mimeType?: string;\n  disableDefaultSizing?: boolean;\n  disablePixelation?: boolean;\n  pixelated?: boolean;\n  onLottieLoad?: (canvas?: HTMLCanvasElement) => void;\n  onLottieError?: () => void;\n  onPointerDown?: PointerEventHandler<HTMLElement>;\n};\n\ntype LottieDotProps = Omit<\n  ComponentProps<typeof DotLottieReactComponent>,\n  'src' | 'data' | 'alt' | 'loading' | 'onPointerDown'\n>;\ntype DotLottieInstance = Parameters<\n  NonNullable<ComponentProps<typeof DotLottieReactComponent>['dotLottieRefCallback']>\n>[0];\n\nconst DotLottieReact = lazy(() =>\n  Promise.all([\n    import('@lottiefiles/dotlottie-react'),\n    import('@lottiefiles/dotlottie-web/dotlottie-player.wasm?url'),\n  ]).then(([module, wasm]) => {\n    module.setWasmUrl(wasm.default);\n    return { default: module.DotLottieReact };\n  })\n) as typeof DotLottieReactComponent;\n\nconst GZIPPED_LOTTIE_MIME = /^application\\/(?:(?:x-)?gzip|x-tgsticker)(?:;|$)/i;\nconst MAX_COMPRESSED_LOTTIE_BYTES = 1024 * 1024;\nconst MAX_DECOMPRESSED_LOTTIE_BYTES = 8 * 1024 * 1024;\nconst MAX_LOTTIE_DIMENSION = 4096;\nconst MAX_LOTTIE_FRAMES = 10_000;\nconst MAX_LOTTIE_LAYERS = 1_000;\nconst MAX_LOTTIE_NODES = 50_000;\nconst MAX_LOTTIE_DEPTH = 64;\nconst LOTTIE_PROBE_TIMEOUT_MS = 5_000;\nconst MAX_LOTTIE_CACHE_ENTRIES = 32;\nconst MAX_CACHED_LOTTIE_JSON_LENGTH = 2 * 1024 * 1024;\nconst UNSAFE_LOTTIE_KEYS = new Set([\n  'expression',\n  'expressions',\n  'script',\n  'scripts',\n  'javascript',\n  'onload',\n  'onclick',\n]);\n\nexport function processAndSanitizeLottie(root: unknown): string | null {\n  if (!root || typeof root !== 'object' || Array.isArray(root)) return null;\n  const lottie = root as Record<string, unknown>;\n\n  if (!('v' in lottie)) return null;\n  const width = Number(lottie.w);\n  const height = Number(lottie.h);\n  const firstFrame = Number(lottie.ip);\n  const lastFrame = Number(lottie.op);\n  if (\n    (Number.isFinite(width) && (width <= 0 || width > MAX_LOTTIE_DIMENSION)) ||\n    (Number.isFinite(height) && (height <= 0 || height > MAX_LOTTIE_DIMENSION)) ||\n    (Number.isFinite(firstFrame) &&\n      Number.isFinite(lastFrame) &&\n      (lastFrame <= firstFrame || lastFrame - firstFrame > MAX_LOTTIE_FRAMES))\n  ) {\n    return null;\n  }\n\n  let totalNodes = 0;\n  let layerCount = 0;\n\n  const rootClone = Object.create(null) as Record<string, unknown>;\n  const stack: {\n    parent: Record<string, unknown> | unknown[];\n    key: string | number;\n    value: unknown;\n    depth: number;\n  }[] = [{ parent: rootClone, key: 'root', value: root, depth: 0 }];\n\n  const canEnqueue = (count: number): boolean =>\n    totalNodes + stack.length + count <= MAX_LOTTIE_NODES;\n\n  while (stack.length > 0) {\n    const item = stack.pop();\n    if (!item) continue;\n    const { parent, key, value, depth } = item;\n\n    totalNodes++;\n    if (totalNodes > MAX_LOTTIE_NODES || depth > MAX_LOTTIE_DEPTH) return null;\n\n    if (Array.isArray(value)) {\n      if (!canEnqueue(value.length)) return null;\n\n      const newArray: unknown[] = [];\n      if (Array.isArray(parent)) {\n        parent[key as number] = newArray;\n      } else {\n        (parent as Record<string, unknown>)[key as string] = newArray;\n      }\n      for (let i = value.length - 1; i >= 0; i--) {\n        stack.push({ parent: newArray, key: i, value: value[i], depth: depth + 1 });\n      }\n    } else if (value && typeof value === 'object') {\n      const entries = Object.entries(value as Record<string, unknown>).filter(\n        ([k, child]) => !UNSAFE_LOTTIE_KEYS.has(k) && !(k === 'x' && typeof child === 'string')\n      );\n\n      for (const [k, child] of entries) {\n        if (k === 'layers' && Array.isArray(child)) {\n          layerCount += child.length;\n          if (layerCount > MAX_LOTTIE_LAYERS) return null;\n        }\n      }\n\n      if (!canEnqueue(entries.length)) return null;\n\n      const newObj = Object.create(null) as Record<string, unknown>;\n      if (Array.isArray(parent)) {\n        parent[key as number] = newObj;\n      } else {\n        (parent as Record<string, unknown>)[key as string] = newObj;\n      }\n\n      for (let i = entries.length - 1; i >= 0; i--) {\n        const entry = entries[i];\n        if (!entry) continue;\n        const [k, child] = entry;\n        stack.push({ parent: newObj, key: k, value: child, depth: depth + 1 });\n      }\n    } else {\n      if (Array.isArray(parent)) {\n        parent[key as number] = value;\n      } else {\n        (parent as Record<string, unknown>)[key as string] = value;\n      }\n    }\n  }\n\n  const sanitized = rootClone.root;\n  return JSON.stringify(sanitized);\n}\n\nfunction isGzippedLottieCandidate(\n  src: string | undefined,\n  mimeType: string | undefined,\n  name: string | undefined\n): src is string {\n  if (!src) return false;\n  return (\n    GZIPPED_LOTTIE_MIME.test(mimeType ?? '') ||\n    /^data:application\\/(?:(?:x-)?gzip|x-tgsticker);base64,/i.test(src) ||\n    [name, src].some((value) => value?.toLowerCase().split(/[?#]/, 1)[0]?.endsWith('.tgs'))\n  );\n}\n\nasync function readBytes(\n  stream: ReadableStream<Uint8Array>,\n  limit: number,\n  signal: AbortSignal\n): Promise<Uint8Array> {\n  const reader = stream.getReader();\n  const chunks: Uint8Array[] = [];\n  let size = 0;\n  let completed = false;\n\n  try {\n    while (true) {\n      if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\n      // Stream chunks must be consumed sequentially to enforce the running byte limit.\n      // eslint-disable-next-line no-await-in-loop\n      const { done, value } = await reader.read();\n      if (done) {\n        completed = true;\n        break;\n      }\n      size += value.byteLength;\n      if (size > limit) throw new Error('Lottie data exceeds the size limit');\n      chunks.push(value);\n    }\n  } finally {\n    if (!completed) await reader.cancel().catch(() => {});\n    reader.releaseLock();\n  }\n\n  const bytes = new Uint8Array(size);\n  let offset = 0;\n  chunks.forEach((chunk) => {\n    bytes.set(chunk, offset);\n    offset += chunk.byteLength;\n  });\n  return bytes;\n}\n\nasync function loadBytes(src: string, signal: AbortSignal): Promise<Uint8Array | null> {\n  const encoded = src.match(/^data:[^;,]*;base64,(.+)$/i)?.[1];\n  if (encoded) {\n    if (encoded.length > Math.ceil((MAX_COMPRESSED_LOTTIE_BYTES * 4) / 3) + 4) return null;\n    return Uint8Array.from(atob(encoded), (char) => char.charCodeAt(0));\n  }\n\n  const response = await fetch(src, { credentials: 'include', signal });\n  if (!response.ok || !response.body) return null;\n  const contentLength = Number(response.headers.get('content-length'));\n  if (Number.isFinite(contentLength) && contentLength > MAX_COMPRESSED_LOTTIE_BYTES) return null;\n  return readBytes(response.body, MAX_COMPRESSED_LOTTIE_BYTES, signal);\n}\n\nasync function resolveLottieJson(src: string, signal: AbortSignal): Promise<string | null> {\n  try {\n    const bytes = await loadBytes(src, signal);\n    if (!bytes || bytes[0] !== 0x1f || bytes[1] !== 0x8b) return null;\n\n    const buffer = new ArrayBuffer(bytes.byteLength);\n    new Uint8Array(buffer).set(bytes);\n    const stream = new Blob([buffer]).stream().pipeThrough(new DecompressionStream('gzip'));\n    const decompressed = await readBytes(stream, MAX_DECOMPRESSED_LOTTIE_BYTES, signal);\n    const parsed = JSON.parse(new TextDecoder().decode(decompressed));\n    return processAndSanitizeLottie(parsed);\n  } catch {\n    return null;\n  }\n}\n\nconst resolvedLottieCache = new Map<string, string>();\nconst inFlightLottieLoads = new Map<string, Promise<string | null>>();\n\nfunction trimResolvedCache(): void {\n  while (resolvedLottieCache.size > MAX_LOTTIE_CACHE_ENTRIES) {\n    const oldest = resolvedLottieCache.keys().next().value;\n    if (oldest !== undefined) {\n      resolvedLottieCache.delete(oldest);\n    } else {\n      break;\n    }\n  }\n}\n\nfunction resolveCachedLottieJson(src: string): Promise<string | null> {\n  const cached = resolvedLottieCache.get(src);\n  if (cached !== undefined) {\n    resolvedLottieCache.delete(src);\n    resolvedLottieCache.set(src, cached);\n    return Promise.resolve(cached);\n  }\n\n  const existing = inFlightLottieLoads.get(src);\n  if (existing) return existing;\n\n  const controller = new AbortController();\n  const timeout = window.setTimeout(() => controller.abort(), LOTTIE_PROBE_TIMEOUT_MS);\n\n  const promise = resolveLottieJson(src, controller.signal)\n    .then((result) => {\n      if (result !== null && result.length <= MAX_CACHED_LOTTIE_JSON_LENGTH) {\n        resolvedLottieCache.set(src, result);\n        trimResolvedCache();\n      }\n      return result;\n    })\n    .finally(() => {\n      window.clearTimeout(timeout);\n      inFlightLottieLoads.delete(src);\n    });\n\n  inFlightLottieLoads.set(src, promise);\n  return promise;\n}\n\ntype LottieImageProps = LottieDotProps & {\n  data: string;\n  alt?: string;\n  emoticon?: boolean;\n  onLottieLoad?: (canvas?: HTMLCanvasElement) => void;\n  onLottieError?: () => void;\n  pixelated?: boolean;\n  forwardedRef?: ForwardedRef<HTMLImageElement | HTMLCanvasElement>;\n  onPointerDown?: PointerEventHandler<HTMLElement>;\n};\n\nfunction LottieImage({\n  data,\n  alt,\n  emoticon,\n  className,\n  style,\n  onLottieLoad,\n  onLottieError,\n  pixelated,\n  forwardedRef,\n  onPointerDown,\n  ...props\n}: Readonly<LottieImageProps>) {\n  const [player, setPlayer] = useState<DotLottieInstance>(null);\n  const callbacks = useRef({ onLottieLoad, onLottieError });\n  const pixelation = useRef(pixelated);\n  callbacks.current = { onLottieLoad, onLottieError };\n  pixelation.current = pixelated;\n\n  const setForwardedRef = useCallback(\n    (canvas: HTMLCanvasElement | null) => {\n      if (typeof forwardedRef === 'function') forwardedRef(canvas);\n      else if (forwardedRef) forwardedRef.current = canvas;\n    },\n    [forwardedRef]\n  );\n\n  useEffect((): (() => void) | undefined => {\n    if (!player) {\n      setForwardedRef(null);\n      return undefined;\n    }\n\n    const canvas = player.canvas as HTMLCanvasElement;\n    if (canvas) {\n      setForwardedRef(canvas);\n    }\n\n    const handleLoad = () => {\n      if (canvas) {\n        canvas.style.imageRendering = pixelation.current ? 'pixelated' : 'auto';\n      }\n      callbacks.current.onLottieLoad?.(canvas);\n    };\n\n    const handleError = () => {\n      callbacks.current.onLottieError?.();\n    };\n\n    player.addEventListener('load', handleLoad);\n    player.addEventListener('loadError', handleError);\n\n    if (player.isLoaded) {\n      handleLoad();\n    }\n\n    return () => {\n      player.removeEventListener('load', handleLoad);\n      player.removeEventListener('loadError', handleError);\n      setForwardedRef(null);\n    };\n  }, [player, setForwardedRef]);\n\n  useEffect(() => {\n    if (player?.canvas) {\n      (player.canvas as HTMLCanvasElement).style.imageRendering = pixelated ? 'pixelated' : 'auto';\n    }\n  }, [player, pixelated]);\n\n  return (\n    <Suspense fallback={null}>\n      <div\n        className={className}\n        style={{\n          width: '100%',\n          height: '100%',\n          ...style,\n          ...(emoticon ? { width: '1em', height: '1em' } : undefined),\n        }}\n        onPointerDown={onPointerDown}\n      >\n        <DotLottieReact\n          {...props}\n          data={data}\n          style={{\n            width: '100%',\n            height: '100%',\n            ...(emoticon ? { width: '1em', height: '1em' } : undefined),\n          }}\n          aria-label={props['aria-label'] ?? alt}\n          backgroundColor=\"#00000000\"\n          dotLottieRefCallback={setPlayer}\n        />\n      </div>\n    </Suspense>\n  );\n}\n\nexport const Image = forwardRef<HTMLImageElement | HTMLCanvasElement, ImageProps>(\n  (\n    {\n      className,\n      alt,\n      info,\n      mimeType,\n      disableDefaultSizing,\n      disablePixelation,\n      loading = 'lazy',\n      decoding = 'async',\n      onLoad,\n      onPointerDown,\n      src,\n      style,\n      onError,\n      onLottieLoad,\n      onLottieError,\n      pixelated,\n      ...props\n    },\n    ref\n  ) => {\n    const [pixelatedImageRendering] = useSetting(settingsAtom, 'pixelatedImageRendering');\n    const [lottieResolution, setLottieResolution] = useState<{\n      source: string;\n      resolved: string | null;\n    }>();\n    const [fallbackSource, setFallbackSource] = useState<string>();\n\n    const lottieProps = props as LottieDotProps;\n    const emoticon = 'data-mx-emoticon' in props;\n    const declaredLottieCandidate = isGzippedLottieCandidate(\n      src,\n      mimeType ?? info?.mimetype,\n      typeof props.title === 'string' ? props.title : alt\n    );\n    const isLottieCandidate = declaredLottieCandidate || fallbackSource === src;\n    const resolvedLottieJson =\n      isLottieCandidate && lottieResolution?.source === src\n        ? (lottieResolution?.resolved ?? null)\n        : isLottieCandidate\n          ? undefined\n          : null;\n    const imageClass = classNames(\n      !disableDefaultSizing && css.Image,\n      !disablePixelation &&\n        (pixelated ?? isPixelatedRendering(pixelatedImageRendering, info)) &&\n        css.ImagePixelated,\n      className\n    );\n\n    useEffect(() => {\n      let active = true;\n\n      if (isLottieCandidate && src) {\n        void resolveCachedLottieJson(src).then((result) => {\n          if (active) {\n            setLottieResolution({ source: src, resolved: result });\n          }\n        });\n      }\n\n      return () => {\n        active = false;\n      };\n    }, [isLottieCandidate, src]);\n\n    useEffect(() => {\n      setFallbackSource(undefined);\n    }, [src]);\n\n    // A lottie candidate is not an image request until it resolves to non-animation data.\n    const renderedSrc = resolvedLottieJson === null ? src : undefined;\n    const pending = src !== undefined && renderedSrc === undefined;\n\n    const shouldRenderLottie = typeof resolvedLottieJson === 'string';\n\n    if (shouldRenderLottie) {\n      return (\n        <LottieImage\n          {...lottieProps}\n          className={imageClass}\n          style={style}\n          data={resolvedLottieJson}\n          emoticon={emoticon}\n          alt={alt}\n          onLottieLoad={onLottieLoad}\n          onLottieError={onLottieError}\n          forwardedRef={ref}\n          onPointerDown={onPointerDown}\n          pixelated={\n            !disablePixelation && (pixelated ?? isPixelatedRendering(pixelatedImageRendering, info))\n          }\n          loop\n          autoplay\n        />\n      );\n    }\n\n    return (\n      <img\n        className={imageClass}\n        alt={alt}\n        loading={loading}\n        decoding={decoding}\n        src={renderedSrc}\n        aria-busy={pending ? true : undefined}\n        style={pending ? { ...style, visibility: 'hidden' } : style}\n        onLoad={onLoad}\n        onPointerDown={onPointerDown}\n        onError={(event) => {\n          if (!declaredLottieCandidate && fallbackSource !== src) {\n            setFallbackSource(src);\n            return;\n          }\n          onError?.(event);\n        }}\n        {...props}\n        ref={ref as ForwardedRef<HTMLImageElement>}\n      />\n    );\n  }\n);\n","import type { VideoHTMLAttributes } from 'react';\nimport { forwardRef, useEffect, useRef } from 'react';\nimport classNames from 'classnames';\nimport * as css from './media.css';\n\nexport const Video = forwardRef<HTMLVideoElement, VideoHTMLAttributes<HTMLVideoElement>>(\n  ({ className, ...props }, ref) => (\n    // oxlint-disable-next-line jsx-a11y/media-has-caption\n    <video className={classNames(css.Video, className)} {...props} ref={ref} />\n  )\n);\n\nexport const MEDIA_VOLUME_KEY = 'mediaVolume';\n\nexport function PersistedVolumeVideo({\n  onVolumeChange,\n  ...props\n}: VideoHTMLAttributes<HTMLVideoElement>) {\n  const innerRef = useRef<HTMLVideoElement>(null);\n\n  useEffect(() => {\n    const stored = localStorage.getItem(MEDIA_VOLUME_KEY);\n    if (innerRef.current && stored !== null) {\n      const parsed = parseFloat(stored);\n      if (!Number.isNaN(parsed)) innerRef.current.volume = parsed;\n    }\n  }, []);\n\n  return (\n    <Video\n      {...props}\n      ref={innerRef}\n      onVolumeChange={(e) => {\n        localStorage.setItem(MEDIA_VOLUME_KEY, String((e.target as HTMLVideoElement).volume));\n        onVolumeChange?.(e);\n      }}\n    />\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Box, as } from 'folds';\n\nexport type MediaControlProps = {\n  before?: ReactNode;\n  after?: ReactNode;\n  leftControl?: ReactNode;\n  rightControl?: ReactNode;\n};\nexport const MediaControl = as<'div', MediaControlProps>(\n  ({ before, after, leftControl, rightControl, children, ...props }, ref) => (\n    <Box grow=\"Yes\" direction=\"Column\" gap=\"300\" {...props} ref={ref}>\n      {before && <Box direction=\"Column\">{before}</Box>}\n      <Box alignItems=\"Center\" gap=\"200\">\n        <Box alignItems=\"Center\" grow=\"Yes\" gap=\"Inherit\">\n          {leftControl}\n        </Box>\n\n        <Box justifyItems=\"End\" alignItems=\"Center\" gap=\"Inherit\">\n          {rightControl}\n        </Box>\n      </Box>\n      {after && <Box direction=\"Column\">{after}</Box>}\n      {children}\n    </Box>\n  )\n);\n","import { registerCustomProtocol } from 'linkifyjs';\nimport type { MatrixToRoom, MatrixToRoomEvent } from './matrix-to';\n\n/**\n * Parser for the `matrix:` URI scheme\n *   matrix:[//{authority}/]{type}/{id-without-sigil}[/{type}/{id}...][?{query}][#{fragment}]\n */\n\nconst SIGIL_BY_TYPE: Record<string, string> = {\n  u: '@',\n  user: '@',\n  r: '#',\n  room: '#',\n  roomid: '!',\n  e: '$',\n  event: '$',\n};\n\nconst isRoomType = (type: string): boolean => type === 'r' || type === 'room' || type === 'roomid';\n\nconst isEventType = (type: string): boolean => type === 'e' || type === 'event';\n\nconst isUserType = (type: string): boolean => type === 'u' || type === 'user';\n\nexport type MatrixUriEntity =\n  | { kind: 'user'; userId: string }\n  | { kind: 'room'; room: MatrixToRoom }\n  | { kind: 'event'; event: MatrixToRoomEvent };\n\nconst tryDecodeSegment = (segment: string): string => {\n  try {\n    return decodeURIComponent(segment);\n  } catch {\n    return segment;\n  }\n};\n\nexport const parseMatrixUri = (href: string): MatrixUriEntity | undefined => {\n  const trimmed = href.trim();\n  if (!/^matrix:/i.test(trimmed)) return undefined;\n\n  let url: URL;\n  try {\n    url = new URL(trimmed);\n  } catch {\n    return undefined;\n  }\n\n  if (url.protocol !== 'matrix:') return undefined;\n\n  const path = url.pathname.replace(/^\\/+/, '');\n  if (!path) return undefined;\n\n  const rawSegments = path.split('/');\n  if (rawSegments.length < 2) return undefined;\n\n  const type1 = rawSegments[0]!.toLowerCase();\n  const id1 = tryDecodeSegment(rawSegments[1]!);\n  const sigil1 = SIGIL_BY_TYPE[type1];\n  if (!sigil1 || !id1) return undefined;\n\n  const viaServers = url.searchParams.getAll('via');\n  const via = viaServers.length > 0 ? viaServers : undefined;\n\n  if (isUserType(type1)) {\n    if (rawSegments.length > 2) return undefined;\n    return { kind: 'user', userId: `${sigil1}${id1}` };\n  }\n\n  if (!isRoomType(type1)) return undefined;\n\n  const roomIdOrAlias = `${sigil1}${id1}`;\n\n  if (rawSegments.length >= 4) {\n    const type2 = rawSegments[2]!.toLowerCase();\n    const id2 = tryDecodeSegment(rawSegments[3]!);\n    if (!isEventType(type2) || !id2) return undefined;\n    return {\n      kind: 'event',\n      event: { roomIdOrAlias, eventId: `$${id2}`, viaServers: via },\n    };\n  }\n\n  if (rawSegments.length !== 2) return undefined;\n\n  return { kind: 'room', room: { roomIdOrAlias, viaServers: via } };\n};\n\nexport const testMatrixUri = (href: string): boolean => parseMatrixUri(href) !== undefined;\n\nexport const matrixUriKey = (href: string): string | undefined => {\n  const entity = parseMatrixUri(href);\n  if (!entity) return undefined;\n  if (entity.kind === 'user') return `u:${entity.userId.toLowerCase()}`;\n  if (entity.kind === 'room') return `r:${entity.room.roomIdOrAlias.toLowerCase()}`;\n  return `e:${entity.event.roomIdOrAlias.toLowerCase()}/${entity.event.eventId.toLowerCase()}`;\n};\n\nexport const isRedundantMatrixUriAnchorText = (\n  href: string,\n  anchorText: string | undefined\n): boolean => {\n  if (anchorText == null || anchorText.trim() === '') return true;\n  const keyHref = matrixUriKey(href);\n  if (!keyHref) return false;\n  const keyText = matrixUriKey(anchorText.trim());\n  if (!keyText) return false;\n  return keyHref === keyText;\n};\n\nlet matrixProtocolRegistered = false;\n\nexport const registerMatrixUriProtocol = (): void => {\n  if (matrixProtocolRegistered) return;\n  try {\n    registerCustomProtocol('matrix', true);\n    matrixProtocolRegistered = true;\n  } catch {\n    matrixProtocolRegistered = true;\n  }\n};\n","const _excluded = [\"local\", \"version\", \"cdnUrl\"],\n  _excluded2 = [\"skins\"],\n  _excluded3 = [\"compact\", \"flat\", \"shortcodes\"];\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], t.indexOf(o) >= 0 || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.indexOf(n) >= 0) continue; t[n] = r[n]; } return t; }\n// Bundled with Packemon: https://packemon.dev\n// Platform: browser, Support: stable, Format: esm\n\n/**\n * Append a skin tone index (number) to the end of a shortcode.\n */\nfunction appendSkinToneIndex(shortcode, emoji, prefix = '') {\n  return `${shortcode}_${prefix}${Array.isArray(emoji.tone) ? emoji.tone.join('-') : emoji.tone}`;\n}\nconst SEQUENCE_REMOVAL_PATTERN = /200D|FE0E|FE0F/g;\n\n// Use numbers instead of string values, as the filesize is greatly reduced.\n\nconst TEXT = 0;\nconst EMOJI = 1;\nconst FEMALE = 0;\nconst MALE = 1;\nconst FULLY_QUALIFIED = 0;\nconst MINIMALLY_QUALIFIED = 1;\nconst UNQUALIFIED = 2;\nconst LIGHT_SKIN = 1;\nconst MEDIUM_LIGHT_SKIN = 2;\nconst MEDIUM_SKIN = 3;\nconst MEDIUM_DARK_SKIN = 4;\nconst DARK_SKIN = 5;\nconst GROUP_KEY_SMILEYS_EMOTION = 'smileys-emotion';\nconst GROUP_KEY_PEOPLE_BODY = 'people-body';\nconst GROUP_KEY_ANIMALS_NATURE = 'animals-nature';\nconst GROUP_KEY_FOOD_DRINK = 'food-drink';\nconst GROUP_KEY_TRAVEL_PLACES = 'travel-places';\nconst GROUP_KEY_ACTIVITIES = 'activities';\nconst GROUP_KEY_OBJECTS = 'objects';\nconst GROUP_KEY_SYMBOLS = 'symbols';\nconst GROUP_KEY_FLAGS = 'flags';\nconst GROUP_KEY_COMPONENT = 'component';\nconst SKIN_KEY_LIGHT = 'light';\nconst SKIN_KEY_MEDIUM_LIGHT = 'medium-light';\nconst SKIN_KEY_MEDIUM = 'medium';\nconst SKIN_KEY_MEDIUM_DARK = 'medium-dark';\nconst SKIN_KEY_DARK = 'dark';\n\n// Important release versions and locales in generating accurate data.\n\nconst LATEST_EMOJI_VERSION = '17.0';\nconst LATEST_UNICODE_VERSION = '17.0.0';\nconst LATEST_CLDR_VERSION = '48';\nconst FIRST_UNICODE_EMOJI_VERSION = '6.0.0';\nconst EMOJI_VERSIONS = ['1.0', '2.0', '3.0', '4.0', '5.0', '11.0', '12.0', '12.1', '13.0', '13.1', '14.0', '15.0', '15.1', '16.0', '17.0'];\nconst UNICODE_VERSIONS = ['6.0', '6.1', '6.2', '6.3', '7.0', '8.0', '9.0', '10.0', '11.0', '12.0', '12.1', '13.0', '14.0', '15.0', '15.1', '16.0', '17.0'];\nconst SUPPORTED_LOCALES = ['bn',\n// Bangla\n'da',\n// Danish\n'de',\n// German\n'en',\n// English\n'en-gb',\n// English (Great Britain)\n'es',\n// Spanish\n'es-mx',\n// Spanish (Mexico)\n'et',\n// Estonian\n'fi',\n// Finnish\n'fr',\n// French\n'hi',\n// Hindi\n'hu',\n// Hungarian\n'it',\n// Italian\n'ja',\n// Japanese\n'ko',\n// Korean\n'lt',\n// Lithuanian\n'ms',\n// Malay\n'nb',\n// Norwegian\n'nl',\n// Dutch\n'pl',\n// Polish\n'pt',\n// Portuguese\n'ru',\n// Russian\n'sv',\n// Swedish\n'th',\n// Thai\n'uk',\n// Ukrainian\n'vi',\n// Vietnamese\n'zh',\n// Chinese\n'zh-hant' // Chinese (Traditional)\n];\n\n// Special options for emoticon permutations.\n\nconst EMOTICON_OPTIONS = {\n  // 🧙‍♂️ man mage\n  ':{>': {\n    withNose: false\n  },\n  // 💔 broken heart\n  '</3': {\n    isFace: false\n  },\n  // ❤️ red heart\n  '<3': {\n    isFace: false\n  },\n  // 🤘 sign of the horns\n  '\\\\m/': {\n    isFace: false\n  },\n  '\\\\M/': {\n    isFace: false\n  },\n  // 👹 ogre\n  '0)': {\n    withNose: false\n  }\n};\nfunction getFetchUrl(path, version, cdnUrl) {\n  let fetchUrl = `https://cdn.jsdelivr.net/npm/emojibase-data@${version}/${path}`;\n  if (typeof cdnUrl === 'function') {\n    fetchUrl = cdnUrl(path, version);\n  } else if (typeof cdnUrl === 'string') {\n    fetchUrl = `${cdnUrl}/${path}`;\n  }\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!path?.endsWith('.json')) {\n      throw new Error('A valid JSON dataset is required to fetch.');\n    }\n    if (!fetchUrl || !/^https?:\\/\\//.test(fetchUrl) || !fetchUrl.endsWith('.json')) {\n      throw new Error('A valid CDN url is required to fetch.');\n    }\n    if (!version) {\n      throw new Error('A valid release version is required.');\n    }\n  }\n  return fetchUrl;\n}\n\n/**\n * This function will fetch `emojibase-data` JSON files from our CDN, parse them,\n * and return the response. It requires a file path relative to the `emojibase-data` package\n * as the 1st argument and an optional object of options as the 2rd argument.\n *\n * ```ts\n * import { fetchFromCDN } from 'emojibase';\n *\n * await fetchFromCDN('ja/compact.json', { version: '2.1.3' });\n * await fetchFromCDN('ja/compact.json', { cdnUrl: 'https://example.com/cdn/emojidata/latest' });\n * await fetchFromCDN('ja/compact.json', {\n *     cdnUrl: (path: string, version: string) => {\n *         return `https://example.com/cdn/emojidata/${version}/${path}`;\n *     }\n * });\n * ```\n */\nasync function fetchFromCDN(path, options = {}) {\n  const _options$local = options.local,\n    local = _options$local === void 0 ? false : _options$local,\n    _options$version = options.version,\n    version = _options$version === void 0 ? 'latest' : _options$version,\n    cdnUrl = options.cdnUrl,\n    opts = _objectWithoutProperties(options, _excluded);\n  const fetchUrl = getFetchUrl(path, version, cdnUrl);\n  const storage = local ? localStorage : sessionStorage;\n  const cacheKey = `emojibase/${version}/${path}`;\n  const cachedData = storage.getItem(cacheKey);\n\n  // Check the cache first\n  if (cachedData) {\n    return JSON.parse(cachedData);\n  }\n\n  // eslint-disable-next-line compat/compat\n  const response = await fetch(fetchUrl, _objectSpread({\n    credentials: 'omit',\n    mode: 'cors',\n    redirect: 'error'\n  }, opts));\n  if (!response.ok) {\n    throw new Error('Failed to load Emojibase dataset.');\n  }\n  const data = await response.json();\n  try {\n    storage.setItem(cacheKey, JSON.stringify(data));\n  } catch {\n    // Do not allow quota errors to break the app\n  }\n  return data;\n}\nconst ALIASES = {\n  discord: 'joypixels',\n  slack: 'iamcal'\n};\n\n/**\n * Fetches and returns localized shortcodes for the defined preset from our CDN.\n * The response is a mapping of emoji hexcodes to shortcodes (either a string or array of strings).\n * Uses `fetchFromCDN` under the hood.\n *\n * ```ts\n * import { fetchShortcodes } from 'emojibase';\n *\n * await fetchShortcodes('ja', 'cldr', { version: '2.1.3' });\n * ```\n */\nasync function fetchShortcodes(locale, preset, options) {\n  return fetchFromCDN(`${locale}/shortcodes/${ALIASES[preset] ?? preset}.json`, options);\n}\n\n/**\n * Will join shortcodes from multiple shortcode datasets into a single emoji object\n * using its hexcode. Will remove duplicates in the process.\n */\n\nfunction joinShortcodesToEmoji(emoji, shortcodeDatasets) {\n  if (shortcodeDatasets.length === 0) {\n    return emoji;\n  }\n  const list = new Set(emoji.shortcodes);\n  shortcodeDatasets.forEach(dataset => {\n    const shortcodes = dataset[emoji.hexcode];\n    if (Array.isArray(shortcodes)) {\n      shortcodes.forEach(code => list.add(code));\n    } else if (shortcodes) {\n      list.add(shortcodes);\n    }\n  });\n\n  // eslint-disable-next-line no-param-reassign\n  emoji.shortcodes = [...list];\n  if (emoji.skins) {\n    emoji.skins.forEach(skin => {\n      joinShortcodesToEmoji(skin, shortcodeDatasets);\n    });\n  }\n  return emoji;\n}\n\n/**\n * By default, emoji skin modifications are nested under the base neutral skin tone emoji.\n * To flatten the data into a single dimension array, use the `flattenEmojiData` function.\n *\n * If `shortcodeDatasets` is defined, it will join the shortcodes to the emoji object using\n * `joinShortcodesToEmoji`.\n *\n * > Tags from the parent emoji will be passed down to the skin modifications.\n */\n\nfunction flattenEmojiData(data, shortcodeDatasets = []) {\n  const emojis = [];\n  data.forEach(emoji => {\n    if (emoji.skins) {\n      // Dont include nested skins array\n      const skins = emoji.skins,\n        baseEmoji = _objectWithoutProperties(emoji, _excluded2);\n      emojis.push(joinShortcodesToEmoji(baseEmoji, shortcodeDatasets));\n\n      // Push each skin modification into the root list\n      skins.forEach(skin => {\n        const skinEmoji = _objectSpread({}, skin);\n\n        // Inherit tags from parent if they exist\n        if (baseEmoji.tags) {\n          skinEmoji.tags = [...baseEmoji.tags];\n        }\n        emojis.push(joinShortcodesToEmoji(skinEmoji, shortcodeDatasets));\n      });\n    } else {\n      emojis.push(joinShortcodesToEmoji(emoji, shortcodeDatasets));\n    }\n  });\n  return emojis;\n}\n\n/**\n * Like `joinShortcodesToEmoji` but joins shortcodes to a list of emoji objects.\n */\n\nfunction joinShortcodes(emojis, shortcodeDatasets) {\n  if (shortcodeDatasets.length === 0) {\n    return emojis;\n  }\n  emojis.forEach(emoji => {\n    joinShortcodesToEmoji(emoji, shortcodeDatasets);\n  });\n  return emojis;\n}\n\n/**\n * Fetches and returns a localized list of emojis (and optional shortcodes) from our CDN.\n * Uses `fetchFromCDN` and `fetchShortcodes` under the hood.\n *\n * ```ts\n * import { fetchEmojis } from 'emojibase';\n *\n * await fetchEmojis('ja', {\n * \tcompact: true,\n * \tshortcodes: ['cldr'],\n * \tversion: '2.1.3',\n * });\n * ```\n *\n * It's also possible to load shortcodes from other languages by prefixing the shortcode preset with\n * the chosen locale. This is useful if you want to support English and Japanese in parallel, for\n * example.\n *\n * ```ts\n * await fetchEmojis('ja', {\n * \tshortcodes: ['cldr', 'en/cldr'],\n * });\n * ```\n */\n\nasync function fetchEmojis(locale, options = {}) {\n  const _options$compact = options.compact,\n    compact = _options$compact === void 0 ? false : _options$compact,\n    _options$flat = options.flat,\n    flat = _options$flat === void 0 ? false : _options$flat,\n    _options$shortcodes = options.shortcodes,\n    presets = _options$shortcodes === void 0 ? [] : _options$shortcodes,\n    opts = _objectWithoutProperties(options, _excluded3);\n  const emojis = await fetchFromCDN(`${locale}/${compact ? 'compact' : 'data'}.json`, opts);\n  let shortcodes = [];\n  if (presets.length > 0) {\n    shortcodes = await Promise.all(presets.map(preset => {\n      let promise;\n      if (preset.includes('/')) {\n        const _preset$split = preset.split('/'),\n          _preset$split2 = _slicedToArray(_preset$split, 2),\n          customLocale = _preset$split2[0],\n          customPreset = _preset$split2[1];\n        promise = fetchShortcodes(customLocale, customPreset, opts);\n      } else {\n        promise = fetchShortcodes(locale, preset, opts);\n      }\n\n      // Ignore as the primary dataset should still load\n      return promise.catch(() => ({}));\n    }));\n  }\n  return flat ? flattenEmojiData(emojis, shortcodes) : joinShortcodes(emojis, shortcodes);\n}\n\n/**\n * Fetches and returns localized messages for emoji related information like groups and sub-groups.\n * Uses `fetchFromCDN` under the hood.\n *\n * ```ts\n * import { fetchMessages } from 'emojibase';\n *\n * await fetchMessages('zh', { version: '2.1.3' });\n * ```\n */\nasync function fetchMessages(locale, options) {\n  return fetchFromCDN(`${locale}/messages.json`, options);\n}\n\n/**\n * This function will convert an array of numerical codepoints to a literal emoji Unicode character.\n *\n * ```ts\n * import { fromCodepointToUnicode } from 'emojibase';\n *\n * fromCodepointToUnicode([128104, 8205, 128105, 8205, 128103, 8205, 128102]); // 👨‍👩‍👧‍👦\n * ```\n */\nfunction fromCodepointToUnicode(codepoint) {\n  return String.fromCodePoint(...codepoint);\n}\n\n/**\n * This function will convert a hexadecimal codepoint to an array of numerical codepoints.\n * By default, it will split the hexcode using a dash, but can be customized with the 2nd argument.\n *\n * ```ts\n * import { fromHexcodeToCodepoint } from 'emojibase';\n *\n * fromHexcodeToCodepoint('270A-1F3FC'); // [9994, 127996]\n * fromHexcodeToCodepoint('270A 1F3FC', ' '); // [9994, 127996]\n * ```\n */\nfunction fromHexcodeToCodepoint(code, joiner = '-') {\n  return code.split(joiner).map(point => Number.parseInt(point, 16));\n}\n\n/**\n * This function will convert a literal emoji Unicode character into a dash separated\n * hexadecimal codepoint. Unless `false` is passed as the 2nd argument, zero width\n * joiner's and variation selectors are removed.\n *\n * ```ts\n * import { fromUnicodeToHexcode } from 'emojibase';\n *\n * fromUnicodeToHexcode('👨‍👩‍👧‍👦'); // 1F468-1F469-1F467-1F466\n * fromUnicodeToHexcode('👨‍👩‍👧‍👦', false); // 1F468-200D-1F469-200D-1F467-200D-1F466\n * ```\n */\nfunction fromUnicodeToHexcode(unicode, strip = true) {\n  const hexcode = [];\n  [...unicode].forEach(codepoint => {\n    let hex = codepoint.codePointAt(0)?.toString(16).toUpperCase() ?? '';\n    while (hex.length < 4) {\n      hex = `0${hex}`;\n    }\n    if (!strip || strip && !hex.match(SEQUENCE_REMOVAL_PATTERN)) {\n      hexcode.push(hex);\n    }\n  });\n  return hexcode.join('-');\n}\n\n/**\n * This function will generate multiple permutations of a base emoticon character.\n * The following permutations will occur:\n *\n * - `)` mouth will be replaced with `]` and `}`. The same applies to sad/frowning mouths.\n * - `/` mouth will be replaced with `\\`.\n * - `:` eyes will be replaced with `=`.\n * - Supports a `-` nose, by injecting between the eyes and mouth.\n * - Supports both uppercase and lowercase variants.\n *\n * ```ts\n * import { generateEmoticonPermutations } from 'emojibase';\n *\n * generateEmoticonPermutations(':)'); // =-), =-}, :-], =-], :-}, :-), =}, =], =), :}, :], :)\n * ```\n *\n * > The base emoticon must follow a set of naming guidelines to work properly.\n *\n * Furthermore, this function accepts an options object as the 2nd argument, as a means to customize\n * the output.\n *\n * - `isFace` (bool) - Toggles face permutations (mouth and eye variants). Defaults to `true`.\n * - `withNose` (bool) - Toggles nose inclusion. Defaults to `true`.\n *\n * ```ts\n * generateEmoticonPermutations(':)', { withNose: false }); // =}, =], =), :}, :], :)\n * generateEmoticonPermutations('\\\\m/', { isFace: false }); // \\m/, \\M/\n * ```\n */\nfunction generateEmoticonPermutations(emoticon, options = {}) {\n  const _options$isFace = options.isFace,\n    isFace = _options$isFace === void 0 ? true : _options$isFace,\n    _options$withNose = options.withNose,\n    withNose = _options$withNose === void 0 ? true : _options$withNose;\n  const list = [emoticon];\n\n  // Uppercase variant\n  if (emoticon.toUpperCase() !== emoticon) {\n    list.push(...generateEmoticonPermutations(emoticon.toUpperCase(), options));\n  }\n  if (isFace) {\n    // Backwards slash mouth variant\n    if (emoticon.includes('/')) {\n      list.push(...generateEmoticonPermutations(emoticon.replace('/', '\\\\'), options));\n    }\n\n    // Bracket and curly brace mouth variants\n    if (emoticon.includes(')')) {\n      list.push(...generateEmoticonPermutations(emoticon.replace(')', ']'), options), ...generateEmoticonPermutations(emoticon.replace(')', '}'), options));\n    }\n    if (emoticon.includes('(')) {\n      list.push(...generateEmoticonPermutations(emoticon.replace('(', '['), options), ...generateEmoticonPermutations(emoticon.replace('(', '{'), options));\n    }\n\n    // Eye variant\n    if (emoticon.includes(':')) {\n      list.push(...generateEmoticonPermutations(emoticon.replace(':', '='), options));\n    }\n\n    // Nose variant for ALL\n    if (withNose) {\n      list.forEach(emo => {\n        if (!emo.includes('-')) {\n          list.push(`${emo.slice(0, -1)}-${emo.slice(-1)}`);\n        }\n      });\n    }\n  }\n\n  // Sort from longest to shortest\n  list.sort((a, b) => b.length - a.length);\n  return [...new Set(list)];\n}\nconst STRIP_PATTERN = new RegExp(`(-| )?(${SEQUENCE_REMOVAL_PATTERN.source})`, 'g');\n\n/**\n * This function will strip zero width joiners (`200D`) and variation selectors\n * (`FE0E`, `FE0F`) from a hexadecimal codepoint.\n *\n * ```ts\n * import { stripHexcode } from 'emojibase';\n *\n * stripHexcode('1F468-200D-2695-FE0F'); // 1F468-2695\n * ```\n */\nfunction stripHexcode(hexcode) {\n  return hexcode.replace(STRIP_PATTERN, '');\n}\nexport { DARK_SKIN, EMOJI, EMOJI_VERSIONS, EMOTICON_OPTIONS, FEMALE, FIRST_UNICODE_EMOJI_VERSION, FULLY_QUALIFIED, GROUP_KEY_ACTIVITIES, GROUP_KEY_ANIMALS_NATURE, GROUP_KEY_COMPONENT, GROUP_KEY_FLAGS, GROUP_KEY_FOOD_DRINK, GROUP_KEY_OBJECTS, GROUP_KEY_PEOPLE_BODY, GROUP_KEY_SMILEYS_EMOTION, GROUP_KEY_SYMBOLS, GROUP_KEY_TRAVEL_PLACES, LATEST_CLDR_VERSION, LATEST_EMOJI_VERSION, LATEST_UNICODE_VERSION, LIGHT_SKIN, MALE, MEDIUM_DARK_SKIN, MEDIUM_LIGHT_SKIN, MEDIUM_SKIN, MINIMALLY_QUALIFIED, SEQUENCE_REMOVAL_PATTERN, SKIN_KEY_DARK, SKIN_KEY_LIGHT, SKIN_KEY_MEDIUM, SKIN_KEY_MEDIUM_DARK, SKIN_KEY_MEDIUM_LIGHT, SUPPORTED_LOCALES, TEXT, UNICODE_VERSIONS, UNQUALIFIED, appendSkinToneIndex, fetchEmojis, fetchFromCDN, fetchMessages, fetchShortcodes, flattenEmojiData, fromCodepointToUnicode, fromHexcodeToCodepoint, fromUnicodeToHexcode, generateEmoticonPermutations, joinShortcodes, joinShortcodesToEmoji, stripHexcode };\n//# sourceMappingURL=index.js.map\n","import type { CompactEmoji } from 'emojibase';\nimport { fromUnicodeToHexcode } from 'emojibase';\nimport emojisData from 'emojibase-data/en/compact.json';\nimport joypixels from 'emojibase-data/en/shortcodes/joypixels.json';\nimport emojibase from 'emojibase-data/en/shortcodes/emojibase.json';\n\nexport type IEmoji = CompactEmoji & {\n  shortcode: string;\n};\n\nexport enum EmojiGroupId {\n  People = 'People',\n  Nature = 'Nature',\n  Food = 'Food',\n  Activity = 'Activity',\n  Travel = 'Travel',\n  Object = 'Object',\n  Symbol = 'Symbol',\n  Flag = 'Flag',\n}\n\nexport type IEmojiGroup = {\n  id: EmojiGroupId;\n  order: number;\n  emojis: IEmoji[];\n};\n\nconst getShortcodesFor = (hexcode: string): string[] | string | undefined =>\n  joypixels[hexcode] || emojibase[hexcode];\n\nexport const getShortcodeFor = (hexcode: string): string | undefined => {\n  const shortcode = joypixels[hexcode] || emojibase[hexcode];\n  return Array.isArray(shortcode) ? shortcode[0] : shortcode;\n};\n\nexport const getHexcodeForEmoji = fromUnicodeToHexcode;\n\nexport const emojiGroups: IEmojiGroup[] = [\n  {\n    id: EmojiGroupId.People,\n    order: 0,\n    emojis: [],\n  },\n  {\n    id: EmojiGroupId.Nature,\n    order: 1,\n    emojis: [],\n  },\n  {\n    id: EmojiGroupId.Food,\n    order: 2,\n    emojis: [],\n  },\n  {\n    id: EmojiGroupId.Activity,\n    order: 3,\n    emojis: [],\n  },\n  {\n    id: EmojiGroupId.Travel,\n    order: 4,\n    emojis: [],\n  },\n  {\n    id: EmojiGroupId.Object,\n    order: 5,\n    emojis: [],\n  },\n  {\n    id: EmojiGroupId.Symbol,\n    order: 6,\n    emojis: [],\n  },\n  {\n    id: EmojiGroupId.Flag,\n    order: 7,\n    emojis: [],\n  },\n];\n\nexport const emojis: IEmoji[] = [];\n\nfunction addEmojiToGroup(groupIndex: number, emoji: IEmoji) {\n  const group = emojiGroups[groupIndex];\n  if (!group) return;\n  group.emojis.push(emoji);\n}\n\nfunction getGroupIndex(emoji: IEmoji): number | undefined {\n  if (emoji.group === 0 || emoji.group === 1) return 0;\n  if (emoji.group === 3) return 1;\n  if (emoji.group === 4) return 2;\n  if (emoji.group === 6) return 3;\n  if (emoji.group === 5) return 4;\n  if (emoji.group === 7) return 5;\n  if (emoji.group === 8 || typeof emoji.group === 'undefined') return 6;\n  if (emoji.group === 9) return 7;\n  return undefined;\n}\n\nemojisData.forEach((emoji) => {\n  const myShortCodes = getShortcodesFor(emoji.hexcode);\n  if (!myShortCodes) return;\n  if (Array.isArray(myShortCodes) && myShortCodes.length === 0) return;\n\n  const em: IEmoji = {\n    ...emoji,\n    shortcode: Array.isArray(myShortCodes) ? (myShortCodes[0] ?? '') : (myShortCodes ?? ''),\n    shortcodes: Array.isArray(myShortCodes) ? myShortCodes : emoji.shortcodes,\n  };\n\n  const groupIndex = getGroupIndex(em);\n  if (groupIndex !== undefined) {\n    addEmojiToGroup(groupIndex, em);\n    emojis.push(em);\n  }\n});\n","/* oxlint-disable jsx-a11y/alt-text */\nimport type {\n  CSSProperties,\n  ComponentPropsWithoutRef,\n  JSX,\n  ReactEventHandler,\n  ReactNode,\n} from 'react';\nimport { Fragment, useEffect, useMemo, useState } from 'react';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport { attributesToProps, domToReact, Element, Text as DOMText } from 'html-react-parser';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport classNames from 'classnames';\nimport { Box, Chip, config, Header, IconButton, Scroll, Text, toRem } from 'folds';\nimport {\n  CaretDown,\n  CaretUp,\n  ChatCircle,\n  Check,\n  GearSix,\n  sizedIcon,\n} from '$components/icons/phosphor';\nimport type { IntermediateRepresentation, OptFn, Opts as LinkifyOpts } from 'linkifyjs';\nimport Linkify from 'linkify-react';\nimport type { ChildNode } from 'domhandler';\nimport * as css from '$styles/CustomHtml.css';\nimport {\n  getCanonicalAliasRoomId,\n  getMxIdLocalPart,\n  isRoomAlias,\n  mxcUrlToHttp,\n} from '$utils/matrix';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { type Nicknames } from '$state/nicknames';\nimport { sanitizeForRegex, URL_REG } from '$utils/regex';\nimport { splitEmojiText } from '$utils/emojiDetection';\nimport { findAndReplace } from '$utils/findAndReplace';\nimport { onEnterOrSpace } from '$utils/keyboard';\nimport { copyToClipboard } from '$utils/dom';\nimport { isMatrixHexColor } from '$utils/matrixHtml';\nimport { useTimeoutToggle } from '$hooks/useTimeoutToggle';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport { getSettingsLinkChipLabel, parseSettingsLink } from '$features/settings/settingsLink';\nimport { ClientSideHoverFreeze } from '$components/ClientSideHoverFreeze';\nimport { CodeHighlightRenderer } from '$components/code-highlight';\nimport { Image as MediaImage } from '$components/media';\nimport {\n  isRedundantMatrixToAnchorText,\n  parseMatrixToRoom,\n  parseMatrixToRoomEvent,\n  parseMatrixToUser,\n  testMatrixTo,\n} from './matrix-to';\nimport { isRedundantMatrixUriAnchorText, parseMatrixUri, testMatrixUri } from './matrix-uri';\nimport { getHexcodeForEmoji, getShortcodeFor } from './emoji';\n\nconst shouldLinkifyDomText = (domNode: DOMText): boolean =>\n  !(domNode.parent && 'name' in domNode.parent && domNode.parent.name === 'code') &&\n  !(domNode.parent && 'name' in domNode.parent && domNode.parent.name === 'a');\nexport const LINKIFY_OPTS: LinkifyOpts = {\n  attributes: {\n    target: '_blank',\n    rel: 'noreferrer noopener',\n  },\n  validate: {\n    url: (value) => {\n      if (/^matrix:/i.test(value)) return testMatrixUri(value);\n      return /^(https|http|ftp|mailto|magnet)?:/.test(value);\n    },\n  },\n  ignoreTags: ['span'],\n};\n\nexport const safeDecodeUrl = (url: string) => {\n  try {\n    return decodeURIComponent(url);\n  } catch {\n    return url;\n  }\n};\n\nconst getMatrixColorStyle = (attribs: Record<string, string>): CSSProperties | undefined => {\n  const color = attribs['data-mx-color'];\n  const backgroundColor = attribs['data-mx-bg-color'];\n\n  const style: CSSProperties = {};\n\n  if (typeof color === 'string' && isMatrixHexColor(color)) {\n    style.color = color;\n  }\n\n  if (typeof backgroundColor === 'string' && isMatrixHexColor(backgroundColor)) {\n    style.backgroundColor = backgroundColor;\n  }\n\n  return Object.keys(style).length > 0 ? style : undefined;\n};\n\nconst stripIncomingStyle = (\n  attribs: Record<string, string>\n): Omit<ReturnType<typeof attributesToProps>, 'style'> => {\n  const { style, ...props } = attributesToProps(attribs);\n\n  return props;\n};\n\nconst attrString = (value: unknown): string | undefined =>\n  typeof value === 'string' ? value : undefined;\n\nconst ensureNoopenerRel = (rel: unknown): string => {\n  if (typeof rel !== 'string') return 'noopener';\n\n  const parts = rel.split(/\\s+/).filter(Boolean);\n  if (!parts.includes('noopener')) {\n    parts.push('noopener');\n  }\n\n  return parts.join(' ');\n};\n\nfunction KatexRenderer({\n  math,\n  displayMode,\n  style,\n}: {\n  math: string;\n  displayMode: boolean;\n  style?: CSSProperties;\n}) {\n  const [html, setHtml] = useState<string | null>(null);\n\n  useEffect(() => {\n    let mounted = true;\n    void import('katex').then((katex) => {\n      if (mounted) {\n        setHtml(katex.default.renderToString(math, { throwOnError: false, displayMode }));\n      }\n    });\n    return () => {\n      mounted = false;\n    };\n  }, [math, displayMode]);\n\n  if (html === null) {\n    return (\n      <code style={style}>\n        {displayMode ? '$$\\n' : '$'}\n        {math}\n        {displayMode ? '\\n$$' : '$'}\n      </code>\n    );\n  }\n\n  const Tag = displayMode ? 'div' : 'span';\n  return <Tag style={style} dangerouslySetInnerHTML={{ __html: html }} />;\n}\n\nexport const makeMentionCustomProps = (\n  handleMentionClick?: ReactEventHandler<HTMLElement>,\n  content?: string\n): ComponentPropsWithoutRef<'a'> => ({\n  style: { cursor: 'pointer' },\n  target: '_blank',\n  rel: 'noreferrer noopener',\n  role: 'link',\n  tabIndex: handleMentionClick ? 0 : -1,\n  onKeyDown: handleMentionClick ? onEnterOrSpace(handleMentionClick) : undefined,\n  onClick: handleMentionClick,\n  children: content,\n});\n\nconst matrixPermalinkDisplayLabel = (\n  href: string,\n  customChildren: ReactNode | undefined,\n  fallback: ReactNode\n): ReactNode => {\n  if (customChildren === undefined || customChildren === null) return fallback;\n  if (typeof customChildren === 'string') {\n    const redundant =\n      isRedundantMatrixToAnchorText(href, customChildren) ||\n      isRedundantMatrixUriAnchorText(href, customChildren);\n    return redundant ? fallback : customChildren;\n  }\n  return customChildren;\n};\n\nexport const renderMatrixMention = (\n  mx: MatrixClient,\n  currentRoomId: string | undefined,\n  href: string,\n  customProps: ComponentPropsWithoutRef<'a'>,\n  nicknames?: Nicknames\n) => {\n  const matrixUri = parseMatrixUri(href);\n\n  const userId =\n    parseMatrixToUser(href) ?? (matrixUri?.kind === 'user' ? matrixUri.userId : undefined);\n  if (userId) {\n    const currentRoom = mx.getRoom(currentRoomId);\n\n    return (\n      <a\n        href={href}\n        {...customProps}\n        className={css.Mention({ highlight: mx.getUserId() === userId })}\n        data-mention-id={userId}\n      >\n        {`@${\n          (currentRoom && getMemberDisplayName(currentRoom, userId, nicknames)) ??\n          getMxIdLocalPart(userId)\n        }`}\n      </a>\n    );\n  }\n\n  const matrixToRoom =\n    parseMatrixToRoom(href) ?? (matrixUri?.kind === 'room' ? matrixUri.room : undefined);\n  if (matrixToRoom) {\n    const { roomIdOrAlias, viaServers } = matrixToRoom;\n    const mentionRoom = mx.getRoom(\n      isRoomAlias(roomIdOrAlias) ? getCanonicalAliasRoomId(mx, roomIdOrAlias) : roomIdOrAlias\n    );\n\n    const fallbackContent = mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias;\n    const label = matrixPermalinkDisplayLabel(href, customProps.children, fallbackContent);\n\n    return (\n      <a\n        href={href}\n        {...customProps}\n        className={css.Mention({\n          highlight: currentRoomId === (mentionRoom?.roomId ?? roomIdOrAlias),\n        })}\n        data-mention-id={mentionRoom?.roomId ?? roomIdOrAlias}\n        data-mention-via={viaServers?.join(',')}\n      >\n        {label}\n      </a>\n    );\n  }\n\n  const matrixToRoomEvent =\n    parseMatrixToRoomEvent(href) ?? (matrixUri?.kind === 'event' ? matrixUri.event : undefined);\n  if (matrixToRoomEvent) {\n    const { roomIdOrAlias, eventId, viaServers } = matrixToRoomEvent;\n    const mentionRoom = mx.getRoom(\n      isRoomAlias(roomIdOrAlias) ? getCanonicalAliasRoomId(mx, roomIdOrAlias) : roomIdOrAlias\n    );\n    let fallbackContent = mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias;\n    if (mentionRoom) {\n      const linkedEvent = mentionRoom.findEventById?.(eventId);\n      if (linkedEvent) {\n        const raw = linkedEvent.getContent() as { body?: unknown };\n        const body = typeof raw.body === 'string' ? raw.body.trim() : '';\n        if (body) {\n          const singleLine = body.replace(/\\s+/g, ' ');\n          const short = singleLine.length > 72 ? `${singleLine.slice(0, 69)}…` : singleLine;\n          fallbackContent = `#${mentionRoom.name}: ${short}`;\n        }\n      }\n    }\n    const label = matrixPermalinkDisplayLabel(href, customProps.children, fallbackContent);\n\n    return (\n      <a\n        href={href}\n        {...customProps}\n        className={classNames(\n          css.Mention({\n            highlight: currentRoomId === (mentionRoom?.roomId ?? roomIdOrAlias),\n          }),\n          css.MentionWithIcon\n        )}\n        data-mention-id={mentionRoom?.roomId ?? roomIdOrAlias}\n        data-mention-event-id={eventId}\n        data-mention-via={viaServers?.join(',')}\n      >\n        <span aria-hidden=\"true\" className={css.MentionIcon}>\n          {sizedIcon(ChatCircle, '50')}\n        </span>\n        {label}\n      </a>\n    );\n  }\n\n  return undefined;\n};\n\nconst renderSettingsLink = ({\n  href,\n  section,\n  focus,\n  handleMentionClick,\n}: {\n  href: string;\n  section: Parameters<typeof getSettingsLinkChipLabel>[0];\n  focus?: string;\n  handleMentionClick?: ReactEventHandler<HTMLElement>;\n}) => (\n  <a\n    href={href}\n    {...makeMentionCustomProps(handleMentionClick)}\n    className={classNames(css.Mention({}), css.MentionWithIcon)}\n    data-settings-link-section={section}\n    data-settings-link-focus={focus}\n  >\n    <span aria-hidden=\"true\" className={css.MentionIcon}>\n      {sizedIcon(GearSix, '50')}\n    </span>\n    {getSettingsLinkChipLabel(section, focus)}\n  </a>\n);\n\nexport const factoryRenderLinkifyWithMention = (\n  settingsLinkBaseUrl: string,\n  mentionRender: (href: string) => JSX.Element | undefined,\n  handleMentionClick?: ReactEventHandler<HTMLElement>\n): OptFn<(ir: IntermediateRepresentation) => unknown> => {\n  const renderLink: OptFn<(ir: IntermediateRepresentation) => unknown> = ({\n    tagName,\n    attributes,\n    content,\n  }) => {\n    const encodedHref = attributes.href;\n    const decodedHref = encodedHref && safeDecodeUrl(encodedHref);\n\n    if (\n      tagName === 'a' &&\n      decodedHref &&\n      (testMatrixTo(decodedHref) || testMatrixUri(decodedHref))\n    ) {\n      const mention = mentionRender(decodedHref);\n      if (mention) return mention;\n    }\n\n    if (tagName === 'a' && decodedHref) {\n      const settingsLink = parseSettingsLink(settingsLinkBaseUrl, decodedHref);\n      if (settingsLink) {\n        const { section, focus } = settingsLink;\n        return renderSettingsLink({\n          href: decodedHref,\n          section,\n          focus,\n          handleMentionClick,\n        });\n      }\n    }\n\n    return (\n      <a {...attributes} target=\"_blank\" rel=\"noreferrer noopener\">\n        {content}\n      </a>\n    );\n  };\n\n  return renderLink;\n};\n\nconst scaleEmojiChunk = (text: string, output: (string | JSX.Element)[]) => {\n  splitEmojiText(text).forEach((part) => {\n    if (part.type === 'text') {\n      output.push(part.value);\n      return;\n    }\n\n    output.push(\n      <span key={`scaleSystemEmoji-${output.length}`} className={css.EmoticonBase}>\n        <span className={css.Emoticon()} title={getShortcodeFor(getHexcodeForEmoji(part.value))}>\n          {part.value}\n        </span>\n      </span>\n    );\n  });\n};\n\nexport const scaleSystemEmoji = (text: string): (string | JSX.Element)[] => {\n  const parts: (string | JSX.Element)[] = [];\n  const urlReg = new RegExp(URL_REG, 'g');\n  let lastIndex = 0;\n\n  [...text.matchAll(urlReg)].forEach((match) => {\n    const start = match.index ?? 0;\n    scaleEmojiChunk(text.slice(lastIndex, start), parts);\n    parts.push(match[0]);\n    lastIndex = start + match[0].length;\n  });\n\n  scaleEmojiChunk(text.slice(lastIndex), parts);\n\n  const normalized: (string | JSX.Element)[] = [];\n  parts.forEach((part) => {\n    if (typeof part !== 'string') {\n      normalized.push(part);\n      return;\n    }\n\n    if (part === '') return;\n    const previous = normalized.at(-1);\n    if (typeof previous === 'string') {\n      normalized[normalized.length - 1] = `${previous}${part}`;\n      return;\n    }\n\n    normalized.push(part);\n  });\n\n  return normalized.length > 0 ? normalized : [''];\n};\n\nexport const makeHighlightRegex = (highlights: string[]): RegExp | undefined => {\n  const pattern = highlights.map(sanitizeForRegex).join('|');\n  if (!pattern) return undefined;\n  return new RegExp(pattern, 'gi');\n};\n\nexport const highlightText = (\n  regex: RegExp,\n  data: (string | JSX.Element)[]\n): (string | JSX.Element)[] =>\n  data.flatMap((text) => {\n    if (typeof text !== 'string') return text;\n\n    return findAndReplace(\n      text,\n      regex,\n      (match, pushIndex) => (\n        <span key={`highlight-${pushIndex}`} className={css.highlightText}>\n          {match[0]}\n        </span>\n      ),\n      (txt) => txt\n    );\n  });\n\nconst extractTextFromNodes = (n: ChildNode[]): string => {\n  let text = '';\n  n.forEach((node) => {\n    if ((node.type as unknown as string) === 'text') {\n      text += (node as unknown as Text).data;\n    } else if (node instanceof Element && node.children) {\n      text += extractTextFromNodes(node.children);\n    }\n  });\n  return text;\n};\n\n/**\n * Recursively extracts and concatenates all text content from an array of ChildNode objects.\n *\n * @param {ChildNode[]} nodes - An array of ChildNode objects to extract text from.\n * @returns {string} The concatenated plain text content of all descendant text nodes.\n */\nconst extractTextFromChildren = (nodes: ChildNode[]): string =>\n  extractTextFromNodes(nodes).replace(/\\n$/, '');\n\nconst getLanguageFromClassName = (className?: string): string | undefined => {\n  if (!className) return undefined;\n\n  return className\n    .split(/\\s+/)\n    .find((token) => token.startsWith('language-'))\n    ?.replace('language-', '');\n};\n\nconst getCodeBlockLanguage = (\n  children: ChildNode[],\n  attribs?: Record<string, string | undefined>\n): string | undefined => {\n  const code = children.find((child) => child instanceof Element && child.name === 'code');\n  const codeAttribs = code instanceof Element ? code.attribs : undefined;\n\n  return (\n    codeAttribs?.['data-lang'] ??\n    attribs?.['data-lang'] ??\n    getLanguageFromClassName(codeAttribs?.class) ??\n    getLanguageFromClassName(attribs?.class)\n  );\n};\n\nexport function CodeBlock({\n  children,\n  attribs,\n  opts,\n}: {\n  children: ChildNode[];\n  attribs?: Record<string, string | undefined>;\n  opts: HTMLReactParserOptions;\n}) {\n  const language = getCodeBlockLanguage(children, attribs);\n\n  const LINE_LIMIT = 14;\n  const largeCodeBlock = useMemo(\n    () => extractTextFromChildren(children).split('\\n').length > LINE_LIMIT,\n    [children]\n  );\n\n  const [expanded, setExpand] = useState(false);\n  const [copied, setCopied] = useTimeoutToggle();\n\n  const handleCopy = () => {\n    void copyToClipboard(extractTextFromChildren(children));\n    setCopied();\n  };\n\n  const toggleExpand = () => {\n    setExpand(!expanded);\n  };\n\n  return (\n    <Text size=\"T300\" as=\"pre\" className={css.CodeBlock}>\n      <Header variant=\"Surface\" size=\"400\" className={css.CodeBlockHeader}>\n        <Box grow=\"Yes\">\n          <Text size=\"L400\" truncate>\n            {language ?? 'Code'}\n          </Text>\n        </Box>\n        <Box shrink=\"No\" gap=\"200\">\n          <Chip\n            variant={copied ? 'Success' : 'Surface'}\n            fill=\"None\"\n            radii=\"Pill\"\n            onClick={handleCopy}\n            before={copied && sizedIcon(Check, '50')}\n          >\n            <Text size=\"B300\">{copied ? 'Copied' : 'Copy'}</Text>\n          </Chip>\n          {largeCodeBlock && (\n            <IconButton\n              size=\"300\"\n              variant=\"SurfaceVariant\"\n              outlined\n              radii=\"300\"\n              onClick={toggleExpand}\n              aria-label={expanded ? 'Collapse' : 'Expand'}\n            >\n              {sizedIcon(expanded ? CaretUp : CaretDown, '50')}\n            </IconButton>\n          )}\n        </Box>\n      </Header>\n      <Scroll\n        style={{\n          maxHeight: largeCodeBlock && !expanded ? toRem(300) : undefined,\n          paddingBottom: largeCodeBlock ? config.space.S400 : undefined,\n        }}\n        direction=\"Both\"\n        variant=\"SurfaceVariant\"\n        size=\"300\"\n        visibility=\"Hover\"\n        hideTrack\n      >\n        <div id=\"code-block-content\" className={css.CodeBlockInternal}>\n          {domToReact(children as unknown as Parameters<typeof domToReact>[0], opts)}\n        </div>\n      </Scroll>\n      {largeCodeBlock && !expanded && <Box className={css.CodeBlockBottomShadow} />}\n    </Text>\n  );\n}\n\n/**\n * Thin wrapper around <img> that gracefully swaps in a fallback node when the\n * image fails to load (e.g. federation down, mxc URL unavailable).  Avoids the\n * silent browser broken-image icon showing up in message bodies.\n */\nfunction FallbackImg({\n  fallback,\n  src,\n  className,\n  style,\n  ...props\n}: ComponentPropsWithoutRef<typeof MediaImage> & { fallback: ReactNode }) {\n  const [failed, setFailed] = useState(false);\n  const renderableSrc = useRenderableMediaUrl(typeof src === 'string' ? src : undefined);\n  if (failed) return <>{fallback}</>;\n  return (\n    <MediaImage\n      {...props}\n      disableDefaultSizing\n      src={renderableSrc ?? src}\n      className={className}\n      style={className === css.EmoticonImg ? { width: 'auto', height: '1em', ...style } : style}\n      onError={() => setFailed(true)}\n      onLottieError={() => setFailed(true)}\n    />\n  );\n}\n\nexport const getReactCustomHtmlParser = (\n  mx: MatrixClient,\n  roomId: string | undefined,\n  params: {\n    settingsLinkBaseUrl: string;\n    linkifyOpts?: LinkifyOpts;\n    highlightRegex?: RegExp;\n    handleSpoilerClick?: ReactEventHandler<HTMLElement>;\n    handleMentionClick?: ReactEventHandler<HTMLElement>;\n    useAuthentication?: boolean;\n    nicknames?: Nicknames;\n    autoplayEmojis?: boolean;\n    incomingInlineImagesDefaultHeight?: number;\n    incomingInlineImagesMaxHeight?: number;\n    replaceTextNode?: (\n      text: string,\n      renderText: (text: string, key?: string) => JSX.Element\n    ) => JSX.Element | undefined;\n  }\n): HTMLReactParserOptions => {\n  const { replaceTextNode } = params;\n\n  const defaultIncomingImgHeight = params.incomingInlineImagesDefaultHeight ?? 32;\n  const maxIncomingImgHeight = params.incomingInlineImagesMaxHeight ?? 64;\n\n  const normalizeIncomingImgHeight = (raw: unknown): number => {\n    const parsed =\n      typeof raw === 'number' ? raw : typeof raw === 'string' ? Number.parseInt(raw, 10) : NaN;\n    const fallback = defaultIncomingImgHeight;\n    const safe = Number.isFinite(parsed) ? parsed : fallback;\n    // Clamp to sane bounds first, then apply the user max.\n    const bounded = Math.max(1, Math.min(4096, Math.round(safe)));\n    const max = Math.max(1, Math.min(4096, Math.round(maxIncomingImgHeight)));\n    return Math.min(bounded, max);\n  };\n\n  const decorateText = (text: string) => {\n    let jsx = scaleSystemEmoji(text);\n\n    if (params.highlightRegex) {\n      jsx = highlightText(params.highlightRegex, jsx);\n    }\n\n    return jsx;\n  };\n\n  const renderReplacementText = (text: string, linkify: boolean, key?: string): JSX.Element => {\n    const decoratedText = decorateText(text);\n\n    if (linkify) {\n      return (\n        <Linkify key={key} options={params.linkifyOpts}>\n          {decoratedText}\n        </Linkify>\n      );\n    }\n\n    return <Fragment key={key}>{decoratedText}</Fragment>;\n  };\n\n  const opts: HTMLReactParserOptions = {\n    replace: (domNode) => {\n      if (replaceTextNode && domNode instanceof DOMText) {\n        const replacement = replaceTextNode(domNode.data, (text, key) =>\n          renderReplacementText(text, !!params.linkifyOpts && shouldLinkifyDomText(domNode), key)\n        );\n\n        if (replacement !== undefined) {\n          return replacement;\n        }\n      }\n      if (domNode instanceof Element && 'name' in domNode) {\n        const { name, attribs, children, parent } = domNode;\n        const renderChildren = () =>\n          domToReact(children as unknown as Parameters<typeof domToReact>[0], opts);\n        const props = stripIncomingStyle(attribs);\n        const matrixColorStyle = getMatrixColorStyle(attribs);\n\n        if (name === 'h1') {\n          return (\n            <Text {...props} className={css.Heading} size=\"H2\">\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'h2') {\n          return (\n            <Text {...props} className={css.Heading} size=\"H3\">\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'h3') {\n          return (\n            <Text {...props} className={css.Heading} size=\"H4\">\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'h4') {\n          return (\n            <Text {...props} className={css.Heading} size=\"H4\">\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'h5') {\n          return (\n            <Text {...props} className={css.Heading} size=\"H5\">\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'h6') {\n          return (\n            <Text {...props} className={css.Heading} size=\"H6\">\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'p') {\n          if (parent instanceof Element && parent.name === 'li') {\n            return <>{renderChildren()}</>;\n          }\n          return (\n            <Text {...props} className={classNames(css.Paragraph, css.MarginSpaced)} size=\"Inherit\">\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'sub') {\n          return (\n            <Text {...props} className={css.Small} size=\"Inherit\">\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'hr') {\n          return <hr {...props} className={css.HorizontalRule} />;\n        }\n\n        if (name === 'pre') {\n          return (\n            <CodeBlock attribs={attribs} opts={opts}>\n              {children}\n            </CodeBlock>\n          );\n        }\n\n        if (name === 'blockquote') {\n          return (\n            <Text {...props} size=\"Inherit\" as=\"blockquote\" className={css.BlockQuote}>\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'ul') {\n          return (\n            <ul {...props} className={css.List}>\n              {renderChildren()}\n            </ul>\n          );\n        }\n        if (name === 'ol') {\n          return (\n            <ol {...props} className={css.OrderedList}>\n              {renderChildren()}\n            </ol>\n          );\n        }\n\n        if (name === 'table') {\n          return (\n            <div className={css.TableContainer}>\n              <table {...props} className={css.Table}>\n                {renderChildren()}\n              </table>\n            </div>\n          );\n        }\n        if (name === 'th') {\n          return (\n            <th {...props} className={css.Th}>\n              {renderChildren()}\n            </th>\n          );\n        }\n        if (name === 'td') {\n          return (\n            <td {...props} className={css.Td}>\n              {renderChildren()}\n            </td>\n          );\n        }\n\n        if (name === 'code') {\n          if (parent && 'name' in parent && parent.name === 'pre') {\n            const codeContent = renderChildren();\n            if (typeof codeContent !== 'string') {\n              return undefined;\n            }\n\n            const language = getCodeBlockLanguage(\n              parent instanceof Element ? parent.children : [],\n              parent instanceof Element ? parent.attribs : undefined\n            );\n            const trimmedCode = codeContent.replace(/\\n$/, '');\n            return (\n              <CodeHighlightRenderer\n                code={trimmedCode}\n                language={language}\n                allowDetect={false}\n                className={typeof props.className === 'string' ? props.className : undefined}\n              />\n            );\n          }\n\n          return (\n            <Text as=\"code\" size=\"T300\" className={css.Code} {...props}>\n              {renderChildren()}\n            </Text>\n          );\n        }\n\n        if (name === 'a' && typeof props.href === 'string') {\n          const encodedHref = props.href;\n          const decodedHref = encodedHref && safeDecodeUrl(encodedHref);\n          const renderedChildren = renderChildren();\n          const anchorProps = {\n            ...props,\n            target: '_blank',\n            rel: ensureNoopenerRel(props.rel),\n          };\n\n          const content = children.find((child) => !(child instanceof DOMText))\n            ? undefined\n            : children.map((c) => (c instanceof DOMText ? c.data : '')).join();\n\n          if (decodedHref && (testMatrixTo(decodedHref) || testMatrixUri(decodedHref))) {\n            const mention = renderMatrixMention(\n              mx,\n              roomId,\n              decodedHref,\n              makeMentionCustomProps(params.handleMentionClick, content),\n              params.nicknames\n            );\n\n            if (mention) return mention;\n          }\n\n          if (decodedHref) {\n            const settingsLink = parseSettingsLink(params.settingsLinkBaseUrl, decodedHref);\n            if (settingsLink) {\n              const { section, focus } = settingsLink;\n              return renderSettingsLink({\n                href: decodedHref,\n                section,\n                focus,\n                handleMentionClick: params.handleMentionClick,\n              });\n            }\n          }\n\n          if (!params.linkifyOpts) return <span {...anchorProps}>{renderChildren()}</span>;\n          return <a {...anchorProps}>{renderedChildren}</a>;\n        }\n\n        if (name === 'span' && 'data-mx-spoiler' in props) {\n          return (\n            <span\n              {...props}\n              role=\"button\"\n              tabIndex={params.handleSpoilerClick ? 0 : -1}\n              onKeyDown={params.handleSpoilerClick}\n              onClick={params.handleSpoilerClick}\n              className={css.Spoiler()}\n              aria-pressed\n              style={{ ...matrixColorStyle, cursor: 'pointer' }}\n            >\n              {renderChildren()}\n            </span>\n          );\n        }\n\n        if (name === 'span' && 'data-mx-maths' in props) {\n          const math = props['data-mx-maths'];\n          if (typeof math === 'string') {\n            return <KatexRenderer math={math} displayMode={false} style={matrixColorStyle} />;\n          }\n        }\n\n        if (name === 'div' && 'data-mx-maths' in props) {\n          const math = props['data-mx-maths'];\n          if (typeof math === 'string') {\n            return <KatexRenderer math={math} displayMode={true} style={matrixColorStyle} />;\n          }\n        }\n\n        if (name === 'span' && matrixColorStyle) {\n          return (\n            <span {...props} style={matrixColorStyle}>\n              {renderChildren()}\n            </span>\n          );\n        }\n\n        if (name === 'img') {\n          // Guard: img without a src survives sanitisation (fix for crash #1731)\n          // but we can't convert it  Eskip rendering rather than passing\n          // undefined into mxcUrlToHttp where it would throw.\n          const src = attrString(props.src);\n          if (!src) return null;\n\n          const alt = attrString(props.alt);\n          const title = attrString(props.title);\n          const isEmoticon = 'data-mx-emoticon' in props;\n          const htmlSrc = isEmoticon\n            ? (mxcUrlToHttp(mx, src, params.useAuthentication) ?? undefined)\n            : (mxcUrlToHttp(mx, src, params.useAuthentication, 640, 480, 'scale') ?? undefined);\n          const fallbackLabel = alt || title || '[media]';\n          const failedToResolveMxc = src.startsWith('mxc://') && !htmlSrc;\n\n          // Non-mxc images were already converted to <a> links by the sanitiser,\n          // but handle the edge case defensively here too.\n          if (htmlSrc && !src.startsWith('mxc://')) {\n            return (\n              <a href={htmlSrc} target=\"_blank\" rel=\"noreferrer noopener\">\n                {alt || title || htmlSrc}\n              </a>\n            );\n          }\n\n          // Unresolved non-mxc src (e.g. javascript: URLs that bypassed the\n          // sanitiser) must never render as an <img>; fall back to the label.\n          if (!src.startsWith('mxc://')) {\n            return <span title={fallbackLabel}>{fallbackLabel}</span>;\n          }\n\n          if (isEmoticon) {\n            // When the mxc URL can't be resolved (e.g. federation unavailable),\n            // fall back to rendering the shortcode text so the message stays readable.\n            if (!htmlSrc) {\n              const label = alt || title || '';\n              return (\n                <span title={label} className={css.EmoticonBase}>\n                  {label ? `:${label}:` : ''}\n                </span>\n              );\n            }\n\n            const height = normalizeIncomingImgHeight(props.height);\n\n            const siblingCount = domNode.parent?.children.length ?? 0;\n\n            // seperate style for bundled emojis\n            // seperate style for bundled emojis\n            if (siblingCount > 5) {\n              return (\n                <span className={css.EmoticonBase}>\n                  <span className={css.Emoticon()}>\n                    {!params.autoplayEmojis ? (\n                      <ClientSideHoverFreeze src={htmlSrc}>\n                        <FallbackImg\n                          {...props}\n                          src={htmlSrc}\n                          className={css.EmoticonImg}\n                          height={height}\n                          style={{ verticalAlign: 'middle' }}\n                          fallback={\n                            <span className={css.EmoticonBase}>\n                              {props.alt || props.title || '?'}\n                            </span>\n                          }\n                        />\n                      </ClientSideHoverFreeze>\n                    ) : (\n                      <FallbackImg\n                        {...props}\n                        src={htmlSrc}\n                        className={css.EmoticonImg}\n                        height={height}\n                        style={{ verticalAlign: 'middle' }}\n                        fallback={\n                          <span className={css.EmoticonBase}>\n                            {props.alt || props.title || '?'}\n                          </span>\n                        }\n                      />\n                    )}\n                  </span>\n                </span>\n              );\n            }\n\n            // old style for just a few... what is this even for? React components or something?\n            return (\n              <span className={css.EmoticonBase}>\n                <span className={css.Emoticon()}>\n                  {!params.autoplayEmojis ? (\n                    <ClientSideHoverFreeze src={htmlSrc}>\n                      <FallbackImg\n                        {...props}\n                        src={htmlSrc}\n                        className={css.EmoticonImg}\n                        height={height}\n                        fallback={\n                          <span className={css.EmoticonBase}>\n                            {props.alt || props.title || '?'}\n                          </span>\n                        }\n                      />\n                    </ClientSideHoverFreeze>\n                  ) : (\n                    <FallbackImg\n                      {...props}\n                      src={htmlSrc}\n                      className={css.EmoticonImg}\n                      height={height}\n                      fallback={\n                        <span className={css.EmoticonBase}>{props.alt || props.title || '?'}</span>\n                      }\n                    />\n                  )}\n                </span>\n              </span>\n            );\n          }\n\n          if (failedToResolveMxc) {\n            return (\n              <span title={`Failed to load media${props.alt ? `: ${props.alt}` : ''}`}>\n                {fallbackLabel}\n              </span>\n            );\n          }\n\n          if (htmlSrc)\n            return (\n              <FallbackImg\n                {...props}\n                className={css.Img}\n                src={htmlSrc}\n                height={normalizeIncomingImgHeight(props.height)}\n                fallback={\n                  <span title={`Failed to load media${props.alt ? `: ${props.alt}` : ''}`}>\n                    {props.alt || '[media]'}\n                  </span>\n                }\n              />\n            );\n        }\n      }\n\n      if (domNode instanceof DOMText) {\n        const linkify = !!params.linkifyOpts && shouldLinkifyDomText(domNode);\n        const decoratedText = decorateText(domNode.data);\n\n        if (linkify) {\n          return <Linkify options={params.linkifyOpts}>{decoratedText}</Linkify>;\n        }\n\n        return decoratedText;\n      }\n      return undefined;\n    },\n  };\n  return opts;\n};\n","import { as, Box, Header, IconButton, Modal, Scroll, Text } from 'folds';\nimport { composerIcon, X } from '$components/icons/phosphor';\nimport classNames from 'classnames';\nimport Linkify from 'linkify-react';\nimport { LINKIFY_OPTS, scaleSystemEmoji } from '$plugins/react-custom-html-parser';\nimport * as css from './style.css';\n\nexport const RoomTopicViewer = as<\n  'div',\n  {\n    name: string;\n    topic: string;\n    requestClose: () => void;\n  }\n>(({ name, topic, requestClose, className, ...props }, ref) => (\n  <Modal\n    size=\"300\"\n    flexHeight\n    className={classNames(css.ModalFlex, className)}\n    {...props}\n    ref={ref}\n  >\n    <Header className={css.ModalHeader} variant=\"Surface\" size=\"500\">\n      <Box grow=\"Yes\">\n        <Text size=\"H4\" truncate>\n          {name}\n        </Text>\n      </Box>\n      <IconButton size=\"300\" onClick={requestClose} radii=\"300\">\n        {composerIcon(X)}\n      </IconButton>\n    </Header>\n    <Scroll data-room-topic className={css.ModalScroll} size=\"300\" hideTrack>\n      <Box className={css.ModalContent} direction=\"Column\" gap=\"100\">\n        <Text size=\"T300\" className={css.ModalTopic} priority=\"400\">\n          <Linkify options={LINKIFY_OPTS}>{scaleSystemEmoji(topic)}</Linkify>\n        </Text>\n      </Box>\n    </Scroll>\n  </Modal>\n));\n","import type { IPushRule, IPushRules, MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk';\nimport {\n  Direction,\n  EventType,\n  NotificationCountType,\n  PushRuleActionName,\n  ReceiptType,\n  RelationType,\n} from '$types/matrix-sdk';\n\nimport type { UnreadInfo } from '$types/matrix/room';\nimport { NotificationType } from '$types/matrix/room';\n\nexport const getMDirects = (mDirectEvent: MatrixEvent): Set<string> => {\n  const roomIds = new Set<string>();\n  const userIdToDirects = mDirectEvent?.getContent();\n\n  if (userIdToDirects === undefined) return roomIds;\n\n  Object.keys(userIdToDirects).forEach((userId) => {\n    const directs = userIdToDirects[userId];\n    if (Array.isArray(directs)) {\n      directs.forEach((id) => {\n        if (typeof id === 'string') roomIds.add(id);\n      });\n    }\n  });\n\n  return roomIds;\n};\n\nexport const isDirectInvite = (room: Room | null, myUserId: string | null): boolean => {\n  if (!room || !myUserId) return false;\n  const me = room.getMember(myUserId);\n  const memberEvent = me?.events?.member;\n  const content = memberEvent?.getContent();\n  return content?.is_direct === true;\n};\n\nexport const isDMRoom = (room: Room, mDirects?: Set<string>): boolean => {\n  if (mDirects?.has(room.roomId)) return true;\n  // Fallback for DMs missing from m.direct account data.\n  return !room.isSpaceRoom() && room.getJoinedMemberCount() === 2;\n};\n\nconst hasNotifyPushAction = (actions: IPushRule['actions']): boolean =>\n  actions.some((a) => typeof a === 'string' && a === PushRuleActionName.Notify);\n\nconst findRoomMuteOverrideRule = (\n  overrideRules: IPushRule[] | undefined,\n  roomId: string\n): IPushRule | undefined =>\n  overrideRules?.find(\n    (rule) =>\n      rule.rule_id === roomId && rule.rule_id.startsWith('!') && !hasNotifyPushAction(rule.actions)\n  );\n\nexport const getNotificationType = (mx: MatrixClient, roomId: string): NotificationType => {\n  const overrideRules = mx.getAccountData(EventType.PushRules)?.getContent<IPushRules>()\n    ?.global?.override;\n  if (findRoomMuteOverrideRule(overrideRules, roomId)) {\n    return NotificationType.Mute;\n  }\n\n  let roomPushRule: IPushRule | undefined;\n  try {\n    roomPushRule = mx.getRoomPushRule('global', roomId);\n  } catch {\n    roomPushRule = undefined;\n  }\n\n  if (!roomPushRule) {\n    return NotificationType.Default;\n  }\n\n  if (roomPushRule.actions[0] === PushRuleActionName.Notify) return NotificationType.AllMessages;\n  return NotificationType.MentionsAndKeywords;\n};\n\nconst NOTIFICATION_EVENT_TYPES = new Set<string>([\n  EventType.RoomMessage,\n  EventType.RoomMessageEncrypted,\n  EventType.Sticker,\n  EventType.Reaction,\n]);\nexport const isNotificationEvent = (mEvent: MatrixEvent, room?: Room, userId?: string) => {\n  if (!NOTIFICATION_EVENT_TYPES.has(mEvent.getType())) return false;\n  if (mEvent.isRedacted()) return false;\n\n  const relation = mEvent.getRelation();\n  const relationType = relation?.rel_type;\n  if (relationType === RelationType.Replace) return false;\n\n  if (relationType === RelationType.Annotation) {\n    // Without context we cannot tell whose message was reacted to, so ignore it.\n    if (!room || !userId || !relation?.event_id) return false;\n    return room.findEventById(relation.event_id)?.getSender() === userId;\n  }\n\n  return true;\n};\n\nexport const roomHaveNotification = (room: Room): boolean => {\n  const total = room.getUnreadNotificationCount(NotificationCountType.Total);\n  const highlight = room.getUnreadNotificationCount(NotificationCountType.Highlight);\n\n  return total > 0 || highlight > 0;\n};\n\nexport const getFullyReadEventId = (room: Room): string | undefined =>\n  room.getAccountData(EventType.FullyRead)?.getContent<{ event_id?: string }>()?.event_id;\n\n// m.fully_read is a boundary too: the receipt can be gone after a restart.\nexport const getReadBoundaryEventId = (room: Room, userId: string): string | undefined => {\n  const receiptId = room.getEventReadUpTo(userId) ?? undefined;\n  const fullyReadId = getFullyReadEventId(room);\n  if (!fullyReadId || receiptId === fullyReadId) return receiptId;\n\n  // Only trust the marker if it is actually loaded.\n  const liveEvents = room.getLiveTimeline().getEvents();\n  for (let i = liveEvents.length - 1; i >= 0; i -= 1) {\n    const eventId = liveEvents[i]?.getId();\n    if (eventId === receiptId) return receiptId;\n    if (eventId === fullyReadId) return fullyReadId;\n  }\n  return receiptId;\n};\n\nexport const roomHaveUnread = (mx: MatrixClient, room: Room) => {\n  if (getNotificationType(mx, room.roomId) === NotificationType.Mute) return false;\n  const userId = mx.getUserId();\n  if (!userId) return false;\n  const readUpToId = getReadBoundaryEventId(room, userId);\n  const liveEvents = room.getLiveTimeline().getEvents();\n\n  if (!readUpToId) {\n    return false;\n  }\n\n  for (let i = liveEvents.length - 1; i >= 0; i -= 1) {\n    const event = liveEvents[i];\n    if (!event) return false;\n    if (event.getId() === readUpToId) {\n      return false;\n    }\n    if (event.getSender() === userId) {\n      return false;\n    }\n    if (isNotificationEvent(event, room, userId)) {\n      return true;\n    }\n  }\n  return false;\n};\n\ntype UnreadInfoOptions = {\n  applyFixup?: boolean;\n  mDirects?: Set<string>;\n};\n\nexport const hasAnyReadReceipt = (room: Room, userId: string): boolean =>\n  !!room.getReadReceiptForUserId(userId) ||\n  !!room.getReadReceiptForUserId(userId, false, ReceiptType.ReadPrivate);\n\nexport const isTimelineExhausted = (room: Room): boolean =>\n  !room.getLiveTimeline().getPaginationToken(Direction.Backward);\n\n// Accepts m.fully_read as evidence when the receipt is missing or lags behind it.\nexport const hasReadEvent = (room: Room, userId: string, eventId: string): boolean => {\n  if (room.hasUserReadEvent(userId, eventId)) return true;\n\n  const fullyReadId = getFullyReadEventId(room);\n  if (!fullyReadId) return false;\n\n  const liveEvents = room.getLiveTimeline().getEvents();\n  for (let i = liveEvents.length - 1; i >= 0; i -= 1) {\n    const currentId = liveEvents[i]?.getId();\n    // Walking backwards, the marker wins only if it sits at or after the event.\n    if (currentId === fullyReadId) return true;\n    if (currentId === eventId) return false;\n  }\n  return false;\n};\n\nexport const isReadBoundaryLoaded = (room: Room, userId: string): boolean => {\n  const readUpToId = room.getEventReadUpTo(userId);\n  if (readUpToId && room.findEventById(readUpToId)) return true;\n  const fullyReadEventId = getFullyReadEventId(room);\n  if (fullyReadEventId && room.findEventById(fullyReadEventId)) return true;\n  return isTimelineExhausted(room);\n};\n\ntype TimelineUnreadOptions = {\n  boundaryEventId?: string | null;\n  stopAtOwnEvent?: boolean;\n};\n\nexport const countTimelineUnread = (\n  room: Room,\n  userId: string,\n  options: TimelineUnreadOptions = {}\n): { total: number; highlight: number } => {\n  const { boundaryEventId, stopAtOwnEvent = false } = options;\n  let total = 0;\n  let highlight = 0;\n  const pushProcessor = room.client.pushProcessor;\n  const liveEvents = room.getLiveTimeline().getEvents();\n  for (let i = liveEvents.length - 1; i >= 0; i -= 1) {\n    const event = liveEvents[i];\n    if (!event) break;\n    if (boundaryEventId && event.getId() === boundaryEventId) break;\n    if (event.getSender() === userId) {\n      if (stopAtOwnEvent) break;\n      continue;\n    }\n    if (isNotificationEvent(event, room, userId)) {\n      total += 1;\n      const pushActions = pushProcessor?.actionsForEvent(event);\n      if (pushActions?.tweaks?.highlight) highlight += 1;\n    }\n  }\n  return { total, highlight };\n};\n\ntype Counts = { total: number; highlight: number };\n\n// Clamps only the room portion so thread reply counts survive.\nconst clampStaleCounts = (room: Room, userId: string, counts: Counts): Counts => {\n  const roomTotal = room.getRoomUnreadNotificationCount(NotificationCountType.Total);\n  if (roomTotal === 0) return counts;\n\n  // Own sent events always read as read, which would clamp incorrectly.\n  const latestNotification = room\n    .getLiveTimeline()\n    .getEvents()\n    .toReversed()\n    .find(\n      (event) =>\n        !event.isSending() &&\n        event.getSender() !== userId &&\n        isNotificationEvent(event, room, userId)\n    );\n  const latestNotificationId = latestNotification?.getId();\n  if (!latestNotificationId || !hasReadEvent(room, userId, latestNotificationId)) return counts;\n\n  return {\n    total: counts.total - roomTotal,\n    highlight:\n      counts.highlight - room.getRoomUnreadNotificationCount(NotificationCountType.Highlight),\n  };\n};\n\nconst countFromBoundary = (room: Room, userId: string): UnreadInfo | undefined => {\n  const boundaryId = getReadBoundaryEventId(room, userId);\n  const counted = countTimelineUnread(room, userId, { boundaryEventId: boundaryId });\n  if (counted.total === 0) return undefined;\n\n  const countIsExact =\n    !!(boundaryId && room.findEventById(boundaryId)) || isTimelineExhausted(room);\n  return {\n    roomId: room.roomId,\n    highlight: counted.highlight,\n    total: counted.total,\n    estimated: !countIsExact,\n  };\n};\n\nconst scanForActivity = (\n  room: Room,\n  userId: string,\n  fullyReadEventId: string | undefined\n): { hasActivity: boolean; foundReadBoundary: boolean } => {\n  const liveEvents = room.getLiveTimeline().getEvents();\n  for (let i = liveEvents.length - 1; i >= 0; i -= 1) {\n    const event = liveEvents[i];\n    if (!event) break;\n    if (event.getId() === fullyReadEventId || event.getSender() === userId) {\n      return { hasActivity: false, foundReadBoundary: true };\n    }\n    if (isNotificationEvent(event, room, userId)) {\n      return { hasActivity: true, foundReadBoundary: false };\n    }\n  }\n  return { hasActivity: false, foundReadBoundary: false };\n};\n\n// Rooms unvisited under sliding sync have no receipt, so SDK counts are unreliable.\nconst estimateWithoutReceipt = (\n  room: Room,\n  userId: string,\n  { total, highlight }: Counts\n): UnreadInfo | undefined => {\n  const fullyReadEventId = getFullyReadEventId(room);\n  const { hasActivity, foundReadBoundary } = scanForActivity(room, userId, fullyReadEventId);\n  const boundaryKnown = foundReadBoundary || isReadBoundaryLoaded(room, userId);\n  const hasDistantReadEvidence =\n    !boundaryKnown && (!!fullyReadEventId || hasAnyReadReceipt(room, userId));\n  if (!hasActivity && !hasDistantReadEvidence) return undefined;\n\n  if (total > 0 || highlight > 0) {\n    return hasActivity ? { roomId: room.roomId, highlight, total } : undefined;\n  }\n\n  if (boundaryKnown) {\n    const counted = countTimelineUnread(room, userId, {\n      boundaryEventId: fullyReadEventId,\n      stopAtOwnEvent: true,\n    });\n    if (counted.total === 0 && counted.highlight === 0) return undefined;\n    return { roomId: room.roomId, highlight: counted.highlight, total: counted.total };\n  }\n  if (hasActivity && !fullyReadEventId) {\n    // No read evidence at all: dot badge with an unknown real count.\n    return { roomId: room.roomId, highlight: 0, total: 1, estimated: true };\n  }\n  // Cannot prove unread state until the distant boundary is loaded.\n  return { roomId: room.roomId, highlight: 0, total: 0, estimated: true };\n};\n\n// Push rules can fail to match a DM, so unread DMs are badged as highlights regardless.\nconst shouldForceDMHighlight = (room: Room, mDirects?: Set<string>): boolean => {\n  if (!isDMRoom(room, mDirects)) return false;\n  const notificationType = getNotificationType(room.client, room.roomId);\n  return (\n    notificationType !== NotificationType.Mute &&\n    notificationType !== NotificationType.MentionsAndKeywords\n  );\n};\n\nconst unreadInfoFixupInProgress = new WeakSet<Room>();\n\nexport const getUnreadInfo = (room: Room, options?: UnreadInfoOptions): UnreadInfo => {\n  if (getNotificationType(room.client, room.roomId) === NotificationType.Mute) {\n    return { roomId: room.roomId, highlight: 0, total: 0 };\n  }\n\n  const userId = room.client.getUserId();\n  if (userId && options?.applyFixup && !unreadInfoFixupInProgress.has(room)) {\n    unreadInfoFixupInProgress.add(room);\n    try {\n      room.fixupNotifications(userId);\n    } finally {\n      unreadInfoFixupInProgress.delete(room);\n    }\n  }\n\n  let counts: Counts = {\n    total: room.getUnreadNotificationCount(NotificationCountType.Total),\n    highlight: room.getUnreadNotificationCount(NotificationCountType.Highlight),\n  };\n\n  let cachedTimelineUnread: boolean | undefined;\n  const hasTimelineUnread = () => {\n    cachedTimelineUnread ??= roomHaveUnread(room.client, room);\n    return cachedTimelineUnread;\n  };\n\n  if (userId && counts.total > 0 && !hasTimelineUnread()) {\n    counts = clampStaleCounts(room, userId, counts);\n  }\n\n  if (userId && counts.total === 0 && counts.highlight === 0 && hasTimelineUnread()) {\n    const counted = countFromBoundary(room, userId);\n    if (counted) return counted;\n  }\n\n  if (userId && !room.getEventReadUpTo(userId)) {\n    const estimated = estimateWithoutReceipt(room, userId, counts);\n    if (estimated) return estimated;\n  }\n\n  const { total, highlight } = counts;\n  if (total > 0 && highlight === 0 && shouldForceDMHighlight(room, options?.mDirects)) {\n    return { roomId: room.roomId, highlight: total, total };\n  }\n\n  return {\n    roomId: room.roomId,\n    highlight,\n    total: Math.max(total, highlight),\n  };\n};\n\nconst tracksUnread = (mx: MatrixClient, room: Room): boolean =>\n  room.getMyMembership() === 'join' &&\n  getNotificationType(mx, room.roomId) !== NotificationType.Mute;\n\nconst hasUnread = (unreadInfo: UnreadInfo): boolean =>\n  unreadInfo.total > 0 || unreadInfo.highlight > 0;\n\nexport const getUnreadInfos = (mx: MatrixClient, options?: UnreadInfoOptions): UnreadInfo[] =>\n  mx.getRooms().reduce<UnreadInfo[]>((unread, room) => {\n    if (room.isSpaceRoom() || !tracksUnread(mx, room)) return unread;\n\n    const unreadInfo = getUnreadInfo(room, options);\n    if (hasUnread(unreadInfo)) unread.push(unreadInfo);\n    return unread;\n  }, []);\n\nexport const getUnreadInfosForRooms = (\n  mx: MatrixClient,\n  roomIds: Iterable<string>,\n  options?: UnreadInfoOptions\n): { unread: UnreadInfo[]; deleted: string[] } => {\n  const unread: UnreadInfo[] = [];\n  const deleted: string[] = [];\n\n  for (const roomId of roomIds) {\n    const room = mx.getRoom(roomId);\n    if (!room) {\n      deleted.push(roomId);\n      continue;\n    }\n    // Space unread is derived from children in the atom reducer; skip like\n    // getUnreadInfos rather than deleting.\n    if (room.isSpaceRoom()) continue;\n    if (!tracksUnread(mx, room)) {\n      deleted.push(roomId);\n      continue;\n    }\n\n    const unreadInfo = getUnreadInfo(room, options);\n    if (hasUnread(unreadInfo)) {\n      unread.push(unreadInfo);\n    } else {\n      deleted.push(roomId);\n    }\n  }\n\n  return { unread, deleted };\n};\n","import { atom, useSetAtom } from 'jotai';\nimport type { MatrixClient, MatrixEvent } from '$types/matrix-sdk';\nimport { ClientEvent, EventType } from '$types/matrix-sdk';\nimport { useEffect } from 'react';\n\nimport { getAccountData } from '$utils/room/hierarchy';\nimport { getMDirects } from '$utils/room/unread';\n\ntype MDirectAction = {\n  type: 'INITIALIZE' | 'UPDATE';\n  rooms: Set<string>;\n};\n\nconst baseMDirectAtom = atom(new Set<string>());\nexport const mDirectAtom = atom<Set<string>, [MDirectAction], undefined>(\n  (get) => get(baseMDirectAtom),\n  (get, set, action) => {\n    set(baseMDirectAtom, action.rooms);\n  }\n);\n\nexport const useBindMDirectAtom = (mx: MatrixClient, mDirect: typeof mDirectAtom) => {\n  const setMDirect = useSetAtom(mDirect);\n\n  useEffect(() => {\n    const mDirectEvent = getAccountData(mx, EventType.Direct);\n    if (mDirectEvent) {\n      setMDirect({\n        type: 'INITIALIZE',\n        rooms: getMDirects(mDirectEvent),\n      });\n    }\n\n    const handleAccountData = (event: MatrixEvent) => {\n      if (event.getType() === (EventType.Direct as string)) {\n        setMDirect({\n          type: 'UPDATE',\n          rooms: getMDirects(event),\n        });\n      }\n    };\n\n    mx.on(ClientEvent.AccountData, handleAccountData);\n    return () => {\n      mx.removeListener(ClientEvent.AccountData, handleAccountData);\n    };\n  }, [mx, setMDirect]);\n};\n","import { atom } from 'jotai';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\n\nexport type Nicknames = Record<string, string>;\n\nexport const nicknamesAtom = atom<Nicknames>({});\n\nexport const setNicknameAtom = atom<\n  null,\n  [userId: string, nick: string | undefined, mx: MatrixClient],\n  void\n>(null, (get, set, userId, nick, mx) => {\n  const prev = get(nicknamesAtom);\n  const next = { ...prev };\n  if (nick === undefined || nick.trim() === '') {\n    delete next[userId];\n  } else {\n    next[userId] = nick.trim();\n  }\n  set(nicknamesAtom, next);\n\n  mx.setAccountData(CustomAccountDataEvent.SableNicknames, next);\n});\n","import type { ClientEventHandlerMap, MatrixClient } from '$types/matrix-sdk';\nimport { ClientEvent } from '$types/matrix-sdk';\nimport { useEffect } from 'react';\n\nexport const useAccountDataCallback = (\n  mx: MatrixClient | undefined,\n  onAccountData: ClientEventHandlerMap[ClientEvent.AccountData]\n) => {\n  useEffect(() => {\n    if (!mx) return undefined;\n    mx.on(ClientEvent.AccountData, onAccountData);\n    return () => {\n      mx.removeListener(ClientEvent.AccountData, onAccountData);\n    };\n  }, [mx, onAccountData]);\n};\n","import { useAtomValue, useSetAtom } from 'jotai';\nimport { useCallback, useEffect } from 'react';\nimport type { MatrixClient } from '$types/matrix-sdk';\n\nimport { nicknamesAtom, setNicknameAtom } from '$state/nicknames';\nimport { useAccountDataCallback } from './useAccountDataCallback';\nimport { useMatrixClient } from './useMatrixClient';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\n\nexport const useNickname = (userId: string): string | undefined => {\n  const nicknames = useAtomValue(nicknamesAtom);\n  return nicknames[userId];\n};\n\nexport const useSetNickname = () => {\n  const mx = useMatrixClient();\n  const setNick = useSetAtom(setNicknameAtom);\n\n  return useCallback(\n    (userId: string, nick: string | undefined) => {\n      setNick(userId, nick, mx);\n    },\n    [mx, setNick]\n  );\n};\n\nexport const useSyncNicknames = (mx?: MatrixClient) => {\n  const setNicknames = useSetAtom(nicknamesAtom);\n\n  useEffect(() => {\n    if (!mx) return;\n    const event = mx.getAccountData(CustomAccountDataEvent.SableNicknames);\n    if (event) {\n      setNicknames(event.getContent() || {});\n    }\n  }, [mx, setNicknames]);\n\n  useAccountDataCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (mEvent.getType() === (CustomAccountDataEvent.SableNicknames as string)) {\n          setNicknames(mEvent.getContent() || {});\n        }\n      },\n      [setNicknames]\n    )\n  );\n};\n","import { useAtomValue } from 'jotai';\nimport { useEffect, useState } from 'react';\nimport type { MatrixEvent, RoomJoinRulesEventContent, Room } from '$types/matrix-sdk';\nimport { RoomEvent, RoomStateEvent, EventType } from '$types/matrix-sdk';\n\nimport { mDirectAtom } from '$state/mDirectList';\nimport { getDmOtherMember, getMemberDisplayName } from '$utils/room/display';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useStateEvent } from './useStateEvent';\nimport { useNickname } from './useNickname';\n\n// Sliding sync's ensureNameEvent injects the server-computed room name with this\n// fake event id; it counts bridge bots, so DMs rank it below the member name.\nconst isServerGeneratedRoomName = (event?: MatrixEvent): boolean =>\n  event?.getId()?.startsWith('$fake-sliding-sync-name-event-') === true;\n\nconst getRoomDisplayName = (\n  roomName: string,\n  stateName: unknown,\n  stateNameIsServerGenerated: boolean,\n  isDmTagged: boolean,\n  dmNickname?: string,\n  dmOtherMemberName?: string\n): string => {\n  if (isDmTagged && dmNickname) return dmNickname;\n  if (typeof stateName === 'string' && stateName && !stateNameIsServerGenerated) return stateName;\n  if (isDmTagged && dmOtherMemberName) return dmOtherMemberName;\n  return roomName;\n};\n\nexport const useRoomAvatar = (room: Room, dm?: boolean): string | undefined => {\n  const avatarEvent = useStateEvent(room, EventType.RoomAvatar);\n  const [, refreshDmAvatar] = useState(0);\n\n  useEffect(() => {\n    if (!dm) return undefined;\n\n    const updateAvatar = () => refreshDmAvatar((version) => version + 1);\n    room.on(RoomStateEvent.Members, updateAvatar);\n\n    return () => {\n      room.removeListener(RoomStateEvent.Members, updateAvatar);\n    };\n  }, [room, dm]);\n\n  if (dm) {\n    return room.getAvatarFallbackMember()?.getMxcAvatarUrl();\n  }\n  const content = avatarEvent?.getContent();\n  const avatarMxc = content && typeof content.url === 'string' ? content.url : undefined;\n\n  return avatarMxc;\n};\n\nexport const useRoomName = (room: Room): string => {\n  const mx = useMatrixClient();\n  const mDirects = useAtomValue(mDirectAtom);\n  const isDmTagged = mDirects.has(room.roomId);\n  const dmUserId = room.guessDMUserId();\n  const dmNickname = useNickname(dmUserId || '');\n  const nameEvent = useStateEvent(room, EventType.RoomName);\n  const stateName = nameEvent?.getContent().name;\n  const stateNameIsServerGenerated = isServerGeneratedRoomName(nameEvent);\n  const [name, setName] = useState(room.name);\n\n  useEffect(() => {\n    const updateName = () => {\n      if (isDmTagged || room.name === 'Empty room') {\n        room.recalculate();\n      }\n\n      const otherMember = isDmTagged ? getDmOtherMember(mx, room) : undefined;\n      const dmOtherMemberName = otherMember\n        ? (getMemberDisplayName(room, otherMember.userId) ?? otherMember.rawDisplayName)\n        : undefined;\n\n      const nextName = getRoomDisplayName(\n        room.name,\n        stateName,\n        stateNameIsServerGenerated,\n        isDmTagged,\n        dmNickname,\n        dmOtherMemberName\n      );\n      setName((prev) => (prev !== nextName ? nextName : prev));\n    };\n\n    updateName();\n\n    room.on(RoomEvent.Name, updateName);\n    room.on(RoomStateEvent.Members, updateName);\n\n    return () => {\n      room.removeListener(RoomEvent.Name, updateName);\n      room.removeListener(RoomStateEvent.Members, updateName);\n    };\n  }, [room, mx, stateName, stateNameIsServerGenerated, dmNickname, isDmTagged]);\n\n  return name;\n};\n\nexport const useRoomTopic = (room: Room): string | undefined => {\n  const topicEvent = useStateEvent(room, EventType.RoomTopic);\n\n  const content = topicEvent?.getContent();\n  const topic = content && typeof content.topic === 'string' ? content.topic : undefined;\n\n  return topic;\n};\n\nexport const useRoomJoinRule = (room: Room): RoomJoinRulesEventContent | undefined => {\n  const mEvent = useStateEvent(room, EventType.RoomJoinRules);\n  const joinRuleContent = mEvent?.getContent<RoomJoinRulesEventContent>();\n  return joinRuleContent;\n};\n","import type { WritableAtom } from 'jotai';\nimport { useSetAtom } from 'jotai';\nimport type { MatrixClient, Membership, Room } from '$types/matrix-sdk';\nimport { ClientEvent, RoomEvent } from '$types/matrix-sdk';\nimport { useEffect } from 'react';\n\nexport type RoomsAction =\n  | {\n      type: 'INITIALIZE';\n      rooms: string[];\n    }\n  | {\n      type: 'PUT';\n      roomId: string;\n    }\n  | {\n      type: 'DELETE';\n      roomId: string;\n    }\n  | {\n      type: 'BATCH';\n      put: string[];\n      delete: string[];\n    };\n\nexport const applyRoomsAction = (ids: string[], action: RoomsAction): string[] => {\n  if (action.type === 'INITIALIZE') return [...new Set(action.rooms)];\n\n  if (action.type === 'PUT') {\n    if (ids.includes(action.roomId)) return ids;\n    return [...ids, action.roomId];\n  }\n\n  if (action.type === 'DELETE') {\n    if (!ids.includes(action.roomId)) return ids;\n    return ids.filter((id) => id !== action.roomId);\n  }\n\n  const deleted = new Set(action.delete);\n  const next = deleted.size === 0 ? [...ids] : ids.filter((id) => !deleted.has(id));\n  const known = new Set(next);\n  action.put.forEach((roomId) => {\n    if (known.has(roomId)) return;\n    known.add(roomId);\n    next.push(roomId);\n  });\n\n  const unchanged =\n    next.length === ids.length && next.every((roomId, index) => roomId === ids[index]);\n  return unchanged ? ids : next;\n};\n\nexport const useBindRoomsWithMembershipsAtom = (\n  mx: MatrixClient,\n  roomsAtom: WritableAtom<string[], [RoomsAction], undefined>,\n  memberships: Membership[]\n) => {\n  const setRoomsAtom = useSetAtom(roomsAtom);\n\n  useEffect(() => {\n    let flushTimer: ReturnType<typeof globalThis.setTimeout> | undefined;\n    const pendingRoomActions = new Map<string, 'PUT' | 'DELETE'>();\n\n    const flushPendingRoomActions = () => {\n      flushTimer = undefined;\n      if (pendingRoomActions.size === 0) return;\n\n      const put: string[] = [];\n      const deleted: string[] = [];\n      pendingRoomActions.forEach((action, roomId) => {\n        if (action === 'PUT') put.push(roomId);\n        else deleted.push(roomId);\n      });\n      pendingRoomActions.clear();\n      setRoomsAtom({ type: 'BATCH', put, delete: deleted });\n    };\n\n    const queueRoomAction = (action: 'PUT' | 'DELETE', roomId: string) => {\n      pendingRoomActions.set(roomId, action);\n      if (flushTimer === undefined) {\n        flushTimer = globalThis.setTimeout(flushPendingRoomActions, 0);\n      }\n    };\n\n    const satisfyMembership = (room: Room): boolean =>\n      !!memberships.find((membership) => membership === room.getMyMembership());\n    setRoomsAtom({\n      type: 'INITIALIZE',\n      rooms: mx\n        .getRooms()\n        .filter(satisfyMembership)\n        .map((room) => room.roomId),\n    });\n\n    const handleAddRoom = (room: Room) => {\n      if (satisfyMembership(room)) {\n        queueRoomAction('PUT', room.roomId);\n      }\n    };\n\n    const handleMembershipChange = (room: Room) => {\n      if (satisfyMembership(room)) {\n        queueRoomAction('PUT', room.roomId);\n      } else {\n        queueRoomAction('DELETE', room.roomId);\n      }\n    };\n\n    const handleDeleteRoom = (roomId: string) => {\n      queueRoomAction('DELETE', roomId);\n    };\n\n    mx.on(ClientEvent.Room, handleAddRoom);\n    mx.on(RoomEvent.MyMembership, handleMembershipChange);\n    mx.on(ClientEvent.DeleteRoom, handleDeleteRoom);\n    return () => {\n      if (flushTimer !== undefined) globalThis.clearTimeout(flushTimer);\n      pendingRoomActions.clear();\n      mx.removeListener(ClientEvent.Room, handleAddRoom);\n      mx.removeListener(RoomEvent.MyMembership, handleMembershipChange);\n      mx.removeListener(ClientEvent.DeleteRoom, handleDeleteRoom);\n    };\n  }, [mx, memberships, setRoomsAtom]);\n};\n\nexport const compareRoomsEqual = (a: string[], b: string[]) => {\n  if (a.length !== b.length) return false;\n  return a.every((roomId, roomIdIndex) => roomId === b[roomIdIndex]);\n};\n","import { atom } from 'jotai';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { useMemo } from 'react';\n\nimport type { RoomsAction } from './utils';\nimport { applyRoomsAction, useBindRoomsWithMembershipsAtom } from './utils';\nimport { KnownMembership } from '$types/matrix-sdk';\n\nconst baseRoomsAtom = atom<string[]>([]);\nexport const allRoomsAtom = atom<string[], [RoomsAction], undefined>(\n  (get) => get(baseRoomsAtom),\n  (_get, set, action) => {\n    set(baseRoomsAtom, (ids) => applyRoomsAction(ids, action));\n    return undefined;\n  }\n);\nexport const useBindAllRoomsAtom = (mx: MatrixClient, allRooms: typeof allRoomsAtom) => {\n  useBindRoomsWithMembershipsAtom(\n    mx,\n    allRooms,\n    useMemo(() => [KnownMembership.Join], [])\n  );\n};\n","import type { ReactNode } from 'react';\nimport { useCallback } from 'react';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { matchPath, useLocation, useNavigate } from 'react-router';\nimport { getHomePath, resolveSection } from '$pages/pathUtils';\nimport {\n  DIRECT_ROOM_FORUM_PATH,\n  DIRECT_ROOM_PATH,\n  HOME_ROOM_FORUM_PATH,\n  HOME_ROOM_PATH,\n  SPACE_ROOM_FORUM_PATH,\n  SPACE_ROOM_PATH,\n} from '$pages/paths';\nimport { lastVisitedRoomAtom } from '$state/room/lastRoom';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { getCanonicalAliasRoomId, isRoomAlias, isRoomId } from '$utils/matrix';\nimport { useAndroidBackHandler } from '$utils/androidBack';\n\ntype BackRouteHandlerProps = {\n  children: (onBack: () => void) => ReactNode;\n};\n\nexport function useBackRoute(): () => void {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const mx = useMatrixClient();\n  const allRooms = useAtomValue(allRoomsAtom);\n  const setLastRoom = useSetAtom(lastVisitedRoomAtom);\n\n  return useCallback(() => {\n    const section = resolveSection(location.pathname);\n    if (!section) return;\n\n    const roomPaths = [\n      HOME_ROOM_FORUM_PATH,\n      DIRECT_ROOM_FORUM_PATH,\n      SPACE_ROOM_FORUM_PATH,\n      HOME_ROOM_PATH,\n      DIRECT_ROOM_PATH,\n      SPACE_ROOM_PATH,\n    ];\n    const roomMatch = roomPaths\n      .map((path) => matchPath({ path, end: false }, location.pathname))\n      .find((match) => match !== null);\n\n    const currentRoomIdOrAlias = roomMatch?.params.roomIdOrAlias;\n    const decoded = currentRoomIdOrAlias && decodeURIComponent(currentRoomIdOrAlias);\n    const inRoomRoute = !!decoded && (isRoomId(decoded) || isRoomAlias(decoded));\n    if (section.getRoomPath && inRoomRoute && decoded) {\n      setLastRoom((prev) => ({ ...prev, [section.key]: decoded }));\n    }\n\n    // An unjoined space renders the preview screen on every route of its section,\n    // so its own list path loops back onto the same screen: escape to home instead.\n    if (!inRoomRoute && section.spaceIdOrAlias) {\n      const spaceId = isRoomId(section.spaceIdOrAlias)\n        ? section.spaceIdOrAlias\n        : getCanonicalAliasRoomId(mx, section.spaceIdOrAlias);\n      if (!spaceId || !allRooms.includes(spaceId)) {\n        navigate(getHomePath(), { replace: true });\n        return;\n      }\n    }\n\n    navigate(section.listPath);\n  }, [navigate, location, setLastRoom, mx, allRooms]);\n}\n\nexport function BackRouteHandler({ children }: BackRouteHandlerProps) {\n  const goBack = useBackRoute();\n  useAndroidBackHandler(() => {\n    goBack();\n    return true;\n  });\n\n  return children(goBack);\n}\n","import { useMemo } from 'react';\nimport type { RoomPinnedEventsEventContent, Room } from '$types/matrix-sdk';\n\nimport { useStateEvent } from './useStateEvent';\nimport { EventType } from '$types/matrix-sdk';\n\nexport const useRoomPinnedEvents = (room: Room): string[] => {\n  const pinEvent = useStateEvent(room, EventType.RoomPinnedEvents);\n  const events = useMemo(() => {\n    const content = pinEvent?.getContent<RoomPinnedEventsEventContent>();\n    return content?.pinned ?? [];\n  }, [pinEvent]);\n\n  return events;\n};\n","import { atom } from 'jotai';\n\nexport enum RoomSettingsPage {\n  GeneralPage,\n  MembersPage,\n  PermissionsPage,\n  EmojisStickersPage,\n  DeveloperToolsPage,\n  // Sable pages\n  CosmeticsPage,\n  AbbreviationsPage,\n  /** Spaces only. */\n  AppearancePage,\n}\n\nexport type RoomSettingsState = {\n  page?: RoomSettingsPage;\n  roomId: string;\n  spaceId?: string;\n  /** True when opened via the chat-level leftward swipe (mobile fullscreen). */\n  openedViaSwipe?: boolean;\n};\n\nexport const roomSettingsAtom = atom<RoomSettingsState | undefined>(undefined);\n","import { useCallback } from 'react';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport type { RoomSettingsPage, RoomSettingsState } from '$state/roomSettings';\nimport { roomSettingsAtom } from '$state/roomSettings';\n\nexport const useRoomSettingsState = (): RoomSettingsState | undefined => {\n  const data = useAtomValue(roomSettingsAtom);\n\n  return data;\n};\n\ntype CloseCallback = () => void;\nexport const useCloseRoomSettings = (): CloseCallback => {\n  const setSettings = useSetAtom(roomSettingsAtom);\n\n  const close: CloseCallback = useCallback(() => {\n    setSettings(undefined);\n  }, [setSettings]);\n\n  return close;\n};\n\ntype OpenCallback = (\n  roomId: string,\n  space?: string,\n  page?: RoomSettingsPage,\n  options?: { viaSwipe?: boolean }\n) => void;\nexport const useOpenRoomSettings = (): OpenCallback => {\n  const setSettings = useSetAtom(roomSettingsAtom);\n\n  const open: OpenCallback = useCallback(\n    (roomId, spaceId, page, options) => {\n      setSettings({ roomId, spaceId, page, openedViaSwipe: options?.viaSwipe });\n    },\n    [setSettings]\n  );\n\n  return open;\n};\n","import type { IEvent, Room, CryptoBackend } from '$types/matrix-sdk';\nimport { MatrixEvent, MatrixEventEvent, RoomEvent } from '$types/matrix-sdk';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport to from 'await-to-js';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMatrixClient } from './useMatrixClient';\n\nconst useFetchEvent = (room: Room, eventId: string) => {\n  const mx = useMatrixClient();\n\n  const fetchEventCallback = useCallback(async () => {\n    // Use fetchRoomEvent rather than getEventTimeline.\n    //\n    // getEventTimeline calls /context, which adds a new EventTimeline to the\n    // room's UnfilteredTimelineSet.  The SDK then emits RoomEvent.TimelineRefresh,\n    // which RoomTimeline.tsx catches and scrolls the visible window back to the\n    // live end — causing an unwanted jump-to-bottom on every reply reload.\n    //\n    // fetchRoomEvent fetches the raw event without touching the timeline state,\n    // so there is no side-effect on the visible scroll position.  The trade-off\n    // is that the returned MatrixEvent is standalone (not tracked in SDK state),\n    // so we handle edits and decryption manually below.\n    const evt = await mx.fetchRoomEvent(room.roomId, eventId);\n    const mEvent = new MatrixEvent(evt);\n\n    if (evt.unsigned?.['m.relations']?.['m.replace']) {\n      const replaceEvt = evt.unsigned['m.relations']['m.replace'] as IEvent;\n      mEvent.makeReplaced(new MatrixEvent(replaceEvt));\n    }\n\n    if (mEvent.isEncrypted() && mx.getCrypto()) {\n      await to(mEvent.attemptDecryption(mx.getCrypto() as CryptoBackend));\n    }\n\n    return mEvent;\n  }, [mx, room.roomId, eventId]);\n\n  return fetchEventCallback;\n};\n\n/**\n *\n * @param room\n * @param eventId\n * @returns `MatrixEvent`, `undefined` means loading, `null` means failure\n */\nexport const useRoomEvent = (\n  room: Room,\n  eventId: string,\n  getLocally?: () => MatrixEvent | undefined\n) => {\n  const mx = useMatrixClient();\n\n  // Shared re-render trigger used by both decryption listeners below.\n  const [, forceUpdate] = useState(0);\n\n  // `tick` lets useMemo re-run when the reply-target event arrives via sync.\n  // The Room reference is stable (SDK mutates it in-place), so without this\n  // the memo would never recompute even when room.findEventById(eventId) would\n  // now return a result.\n  const [tick, setTick] = useState(0);\n\n  const event = useMemo(() => {\n    // `tick` intentionally forces re-evaluation when new timeline events arrive.\n    void tick;\n    // `tick` is in the deps array below — useMemo reruns whenever a timeline\n    // event for our eventId arrives (see RoomEvent.Timeline below).\n    // Check the caller's local window first (e.g. the rendered timeline set),\n    // then fall back to the SDK's full room state.  Events that are present in\n    // room history but outside the currently visible window are found this way\n    // without a network round-trip.\n    const local = getLocally?.();\n    return local ?? room.findEventById(eventId);\n  }, [room, eventId, getLocally, tick]);\n\n  // Re-evaluate the local lookup the moment the target event arrives in the\n  // room's live timeline.  We only subscribe while the event is missing to\n  // keep overhead to zero once it has been resolved.  Checking the event ID\n  // in the handler avoids spurious setTick calls for unrelated messages.\n  useEffect(() => {\n    if (event !== undefined) return undefined;\n    const onTimeline = (incoming: MatrixEvent) => {\n      if (incoming.getId() === eventId) setTick((n) => n + 1);\n    };\n    room.on(RoomEvent.Timeline, onTimeline);\n    return () => {\n      room.off(RoomEvent.Timeline, onTimeline);\n    };\n  }, [room, event, eventId]);\n\n  const fetchEvent = useFetchEvent(room, eventId);\n\n  const { data, error } = useQuery({\n    // Only hit the network when neither the visible window nor the SDK's room\n    // state has the event.  Note: fetchRoomEvent does NOT add its result to SDK\n    // state, so `event` stays undefined after a successful fetch and this flag\n    // remains true on subsequent renders — but staleTime: Infinity prevents\n    // any redundant re-fetches.\n    enabled: event === undefined,\n    queryKey: [room.roomId, eventId],\n    queryFn: fetchEvent,\n    staleTime: Infinity,\n    gcTime: 60 * 60 * 1000, // 1 hour\n    retry: 3,\n    // Progressive back-off: 1 s → 2 s → 4 s (capped at 30 s).\n    retryDelay: (attempt) => Math.min(1_000 * 2 ** attempt, 30_000),\n  });\n\n  // ── E2EE retry for standalone fetched events ──────────────────────────────\n  // fetchRoomEvent returns a MatrixEvent that is NOT tracked in SDK state, so\n  // the SDK's normal Megolm key-delivery pipeline never fires\n  // MatrixEventEvent.Decrypted on it.  Instead, we piggyback on the Decrypted\n  // events of SDK-tracked live-timeline events as a proxy signal for\n  // \"new Megolm session keys have arrived\" and immediately retry\n  // attemptDecryption on our standalone event.\n  useEffect(() => {\n    if (!data?.isEncrypted() || !data.isDecryptionFailure()) return undefined;\n    const crypto = mx.getCrypto();\n    if (!crypto) return undefined;\n\n    const retryDecrypt = async () => {\n      const [err] = await to(data.attemptDecryption(crypto as CryptoBackend));\n      if (!err && !data.isDecryptionFailure()) forceUpdate((n) => n + 1);\n    };\n\n    // Use the last 50 live-timeline events that are still encrypted as\n    // sentinels.  When any of them fires Decrypted it means new keys arrived.\n    const sentinels = room\n      .getLiveTimeline()\n      .getEvents()\n      .slice(-50)\n      .filter((e) => e.isEncrypted());\n\n    const onKeyArrived = () => {\n      retryDecrypt();\n    };\n    sentinels.forEach((e) => e.on(MatrixEventEvent.Decrypted, onKeyArrived));\n    return () => sentinels.forEach((e) => e.off(MatrixEventEvent.Decrypted, onKeyArrived));\n  }, [data, room, mx]);\n\n  // ── Decryption listener for SDK-tracked events ────────────────────────────\n  // When an event IS in the SDK state (found locally via `event`), the SDK's\n  // Megolm pipeline fires MatrixEventEvent.Decrypted on it automatically when\n  // keys later arrive.  Subscribe so the component re-renders without any\n  // manual retry.\n  const resolvedEvent = event ?? data ?? undefined;\n  useEffect(() => {\n    if (!resolvedEvent?.isEncrypted()) return undefined;\n    const onDecrypted = () => forceUpdate((n) => n + 1);\n    resolvedEvent.on(MatrixEventEvent.Decrypted, onDecrypted);\n    return () => {\n      resolvedEvent.off(MatrixEventEvent.Decrypted, onDecrypted);\n    };\n  }, [resolvedEvent]);\n\n  if (event) return event;\n  if (data) return data;\n  if (error) return null;\n\n  return undefined;\n};\n","import type { ReactNode } from 'react';\nimport { Box, as } from 'folds';\nimport * as css from './layout.css';\n\ntype ModernLayoutProps = {\n  before?: ReactNode;\n};\n\nexport const ModernLayout = as<'div', ModernLayoutProps>(({ before, children, ...props }, ref) => (\n  <Box gap=\"300\" {...props} ref={ref}>\n    <Box className={css.ModernBefore} shrink=\"No\">\n      {before}\n    </Box>\n    <Box grow=\"Yes\" direction=\"Column\">\n      {children}\n    </Box>\n  </Box>\n));\n","import type { ReactNode } from 'react';\nimport { Box, as } from 'folds';\nimport * as css from './layout.css';\n\ntype CompactLayoutProps = {\n  before?: ReactNode;\n};\n\nexport const CompactLayout = as<'div', CompactLayoutProps>(\n  ({ before, children, ...props }, ref) => (\n    <Box gap=\"200\" {...props} ref={ref}>\n      <Box className={css.CompactHeader} gap=\"200\" shrink=\"No\">\n        {before}\n      </Box>\n      {children}\n    </Box>\n  )\n);\n","import type { ReactNode } from 'react';\nimport classNames from 'classnames';\nimport type { ContainerColor } from 'folds';\nimport { Box, as, color } from 'folds';\nimport * as css from './layout.css';\n\ntype BubbleArrowProps = {\n  variant: ContainerColor;\n};\nfunction BubbleLeftArrow({ variant }: BubbleArrowProps) {\n  return (\n    <svg\n      className={css.BubbleLeftArrow}\n      width=\"9\"\n      height=\"8\"\n      viewBox=\"0 0 9 8\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M9.00004 8V0H4.82847C3.04666 0 2.15433 2.15428 3.41426 3.41421L8.00004 8H9.00004Z\"\n        fill={color[variant].Container}\n      />\n    </svg>\n  );\n}\nfunction BubbleRightArrow({ variant }: BubbleArrowProps) {\n  return (\n    <svg\n      className={css.BubbleRightArrow}\n      style={{ transform: 'scaleX(-1)' }}\n      width=\"9\"\n      height=\"8\"\n      viewBox=\"0 0 9 8\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M9.00004 8V0H4.82847C3.04666 0 2.15433 2.15428 3.41426 3.41421L8.00004 8H9.00004Z\"\n        fill={color[variant].Container}\n      />\n    </svg>\n  );\n}\n\ntype BubbleLayoutProps = {\n  hideBubble?: boolean;\n  before?: ReactNode;\n  header?: ReactNode;\n  align?: 'left' | 'right';\n};\n\nexport const BubbleLayout = as<'div', BubbleLayoutProps>(\n  ({ hideBubble, before, header, align = 'left', children, ...props }, ref) => {\n    const isRight = align === 'right';\n\n    return (\n      <Box gap=\"300\" {...props} ref={ref}>\n        {!isRight && (\n          <Box className={css.BubbleBefore} shrink=\"No\">\n            {before}\n          </Box>\n        )}\n\n        <Box grow=\"Yes\" direction=\"Column\" alignItems={isRight ? 'End' : 'Start'}>\n          {header}\n          {hideBubble ? (\n            children\n          ) : (\n            <Box className={css.BubbleWrapper}>\n              <Box\n                className={\n                  hideBubble\n                    ? undefined\n                    : classNames(\n                        css.BubbleContent,\n                        before && !isRight ? css.BubbleContentArrowLeft : undefined,\n                        before && isRight ? css.BubbleContentArrowRight : undefined\n                      )\n                }\n                direction=\"Column\"\n              >\n                {before && !isRight ? <BubbleLeftArrow variant=\"SurfaceVariant\" /> : null}\n                {before && isRight ? <BubbleRightArrow variant=\"SurfaceVariant\" /> : null}\n\n                {children}\n              </Box>\n            </Box>\n          )}\n        </Box>\n\n        {isRight && (\n          <Box className={css.BubbleBefore} shrink=\"No\">\n            {before}\n          </Box>\n        )}\n      </Box>\n    );\n  }\n);\n","import { Text, as } from 'folds';\nimport classNames from 'classnames';\nimport * as css from './layout.css';\n\nexport const MessageBase = as<'div', css.MessageBaseVariants>(\n  (\n    {\n      className,\n      highlight,\n      notifyHighlight,\n      selected,\n      isMarked,\n      collapse,\n      autoCollapse,\n      space,\n      mobile,\n      ...props\n    },\n    ref\n  ) => (\n    <div\n      className={classNames(\n        css.MessageBase({\n          highlight,\n          notifyHighlight,\n          isMarked,\n          selected,\n          collapse,\n          autoCollapse,\n          space,\n          mobile,\n        }),\n        className\n      )}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport const AvatarBase = as<'span'>(({ className, ...props }, ref) => (\n  <span className={classNames(css.AvatarBase, className)} {...props} ref={ref} />\n));\n\nexport const Username = as<'span'>(({ as: AsUsername = 'span', className, ...props }, ref) => (\n  <AsUsername className={classNames(css.Username, className)} {...props} ref={ref} />\n));\n\nexport const UsernameBold = as<'b'>(({ as: AsUsernameBold = 'b', className, ...props }, ref) => (\n  <AsUsernameBold className={classNames(css.UsernameBold, className)} {...props} ref={ref} />\n));\n\nexport const PronounPill = as<'span'>(\n  ({ as: AsPronounPill = 'span', className, ...props }, ref) => (\n    <AsPronounPill className={classNames(css.PronounPill, className)} {...props} ref={ref} />\n  )\n);\n\nexport const MessageTextBody = as<'div', css.MessageTextBodyVariants & { notice?: boolean }>(\n  (\n    { as: asComp = 'div', children, className, preWrap, jumboEmoji, emote, notice, ...props },\n    ref\n  ) => (\n    <Text\n      as={asComp}\n      size=\"T400\"\n      priority={notice ? '300' : '400'}\n      className={classNames(css.MessageTextBody({ preWrap, jumboEmoji, emote }), className)}\n      {...props}\n      ref={ref}\n      dir=\"auto\"\n    >\n      {children}\n    </Text>\n  )\n);\n","import { Box, as } from 'folds';\nimport classNames from 'classnames';\nimport * as css from './LinePlaceholder.css';\n\nexport const LinePlaceholder = as<'div', css.LinePlaceholderVariants>(\n  ({ className, variant, ...props }, ref) => (\n    <Box\n      className={classNames(css.LinePlaceholder({ variant }), className)}\n      shrink=\"No\"\n      {...props}\n      ref={ref}\n    />\n  )\n);\n","import { useMemo } from 'react';\nimport type { ContainerColor } from 'folds';\nimport { as, toRem } from 'folds';\nimport { randomNumberBetween } from '$utils/common';\nimport { CompactLayout } from '$components/message/layout';\nimport { LinePlaceholder } from './LinePlaceholder';\n\nexport const CompactPlaceholder = as<'div', { variant?: ContainerColor }>(\n  ({ variant, ...props }, ref) => {\n    const nameSize = useMemo(() => randomNumberBetween(40, 100), []);\n    const msgSize = useMemo(() => randomNumberBetween(120, 500), []);\n\n    return (\n      <CompactLayout\n        {...props}\n        ref={ref}\n        before={\n          <>\n            <LinePlaceholder variant={variant} style={{ maxWidth: toRem(50) }} />\n            <LinePlaceholder variant={variant} style={{ maxWidth: toRem(nameSize) }} />\n          </>\n        }\n      >\n        <LinePlaceholder variant={variant} style={{ maxWidth: toRem(msgSize) }} />\n      </CompactLayout>\n    );\n  }\n);\n","import type { CSSProperties } from 'react';\nimport { useMemo } from 'react';\nimport type { ContainerColor } from 'folds';\nimport { Avatar, Box, as, color, toRem } from 'folds';\nimport { randomNumberBetween } from '$utils/common';\nimport { ModernLayout } from '$components/message/layout';\nimport { LinePlaceholder } from './LinePlaceholder';\n\nconst contentMargin: CSSProperties = { marginTop: toRem(3) };\n\ntype DefaultPlaceholderProps = {\n  variant?: ContainerColor;\n};\n\nexport const DefaultPlaceholder = as<'div', DefaultPlaceholderProps>(\n  ({ variant, ...props }, ref) => {\n    const nameSize = useMemo(() => randomNumberBetween(40, 100), []);\n    const msgSize = useMemo(() => randomNumberBetween(80, 200), []);\n    const msg2Size = useMemo(() => randomNumberBetween(80, 200), []);\n\n    return (\n      <ModernLayout\n        {...props}\n        ref={ref}\n        before={\n          <Avatar\n            style={{\n              backgroundColor: color[variant ?? 'SurfaceVariant'].Container,\n            }}\n            size=\"300\"\n          />\n        }\n      >\n        <Box style={contentMargin} grow=\"Yes\" direction=\"Column\" gap=\"200\">\n          <Box grow=\"Yes\" gap=\"200\" alignItems=\"Center\" justifyContent=\"SpaceBetween\">\n            <LinePlaceholder variant={variant} style={{ maxWidth: toRem(nameSize) }} />\n            <LinePlaceholder variant={variant} style={{ maxWidth: toRem(50) }} />\n          </Box>\n          <Box grow=\"Yes\" gap=\"200\" wrap=\"Wrap\">\n            <LinePlaceholder variant={variant} style={{ maxWidth: toRem(msgSize) }} />\n            <LinePlaceholder variant={variant} style={{ maxWidth: toRem(msg2Size) }} />\n          </Box>\n        </Box>\n      </ModernLayout>\n    );\n  }\n);\n","import { useState } from 'react';\nimport { Box, Text, as } from 'folds';\nimport { sizedIcon, Warning } from '$components/icons/phosphor';\nimport classNames from 'classnames';\nimport type { MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk';\nimport { getHexcodeForEmoji, getShortcodeFor } from '$plugins/emoji';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { eventWithShortcode, getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport { useAtomValue } from 'jotai';\nimport { Image as MediaImage } from '$components/media';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport { nicknamesAtom } from '$state/nicknames';\nimport * as css from './Reaction.css';\n\nexport const Reaction = as<\n  'button',\n  {\n    mx: MatrixClient;\n    count: number;\n    reaction: string;\n    useAuthentication?: boolean;\n  }\n>(({ className, mx, count, reaction, useAuthentication, ...props }, ref) => {\n  const [imgError, setImgError] = useState(false);\n  const rawReactionUrl = reaction.startsWith('mxc://')\n    ? (mxcUrlToHttp(mx, reaction, useAuthentication) ?? undefined)\n    : undefined;\n  const renderableReactionUrl = useRenderableMediaUrl(rawReactionUrl);\n\n  return (\n    <Box\n      as=\"button\"\n      className={classNames(css.Reaction, className)}\n      alignItems=\"Center\"\n      shrink=\"No\"\n      gap=\"200\"\n      {...props}\n      ref={ref}\n    >\n      <Text className={css.ReactionText} as=\"span\" size=\"T400\">\n        {reaction.startsWith('mxc://') ? (\n          (() => {\n            if (imgError)\n              return (\n                // Image loaded but fetch failed  Eshow a small warning icon so the\n                // reaction button still renders correctly and the user can see\n                // something went wrong rather than a browser broken-image icon.\n                <span title=\"Failed to load emoji image\" aria-label=\"Failed to load emoji image\">\n                  {sizedIcon(Warning, '100', { style: { opacity: 0.5 } })}\n                </span>\n              );\n            return (\n              <MediaImage\n                className={css.ReactionImg}\n                src={renderableReactionUrl}\n                alt={reaction}\n                onError={() => setImgError(true)}\n              />\n            );\n          })()\n        ) : (\n          <Text as=\"span\" size=\"Inherit\" truncate>\n            {reaction}\n          </Text>\n        )}\n      </Text>\n      <Text as=\"span\" size=\"T300\">\n        {count}\n      </Text>\n    </Box>\n  );\n});\n\ntype ReactionTooltipMsgProps = {\n  room: Room;\n  reaction: string;\n  events: MatrixEvent[];\n};\n\nexport function ReactionTooltipMsg({ room, reaction, events }: ReactionTooltipMsgProps) {\n  const shortCodeEvt = events.find(eventWithShortcode);\n  const shortcode =\n    shortCodeEvt?.getContent().shortcode ??\n    getShortcodeFor(getHexcodeForEmoji(reaction)) ??\n    reaction;\n  const nicknames = useAtomValue(nicknamesAtom);\n  const names = events.map(\n    (ev: MatrixEvent) =>\n      getMemberDisplayName(room, ev.getSender() ?? 'Unknown', nicknames) ??\n      getMxIdLocalPart(ev.getSender() ?? 'Unknown') ??\n      'Unknown'\n  );\n\n  return (\n    <>\n      {names.length === 1 && <b>{names[0]}</b>}\n      {names.length === 2 && (\n        <>\n          <b>{names[0]}</b>\n          <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n            {' and '}\n          </Text>\n          <b>{names[1]}</b>\n        </>\n      )}\n      {names.length === 3 && (\n        <>\n          <b>{names[0]}</b>\n          <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n            {', '}\n          </Text>\n          <b>{names[1]}</b>\n          <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n            {' and '}\n          </Text>\n          <b>{names[2]}</b>\n        </>\n      )}\n      {names.length > 3 && (\n        <>\n          <b>{names[0]}</b>\n          <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n            {', '}\n          </Text>\n          <b>{names[1]}</b>\n          <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n            {', '}\n          </Text>\n          <b>{names[2]}</b>\n          <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n            {' and '}\n          </Text>\n          <b>{names.length - 3} others</b>\n        </>\n      )}\n      <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n        {' reacted with '}\n      </Text>\n      :<b>{shortcode}</b>:\n    </>\n  );\n}\n","import { useState } from 'react';\nimport { Text } from 'folds';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { menuIcon, Warning } from '$components/icons/phosphor';\nimport { scaleSystemEmoji } from '$plugins/react-custom-html-parser';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { Image as MediaImage } from '$components/media';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport * as css from './Reaction.css';\n\ntype ReactionKeyInlineProps = {\n  mx: MatrixClient;\n  reactionKey?: string;\n  shortcode?: string;\n  useAuthentication?: boolean;\n};\n\nexport function ReactionKeyInline({\n  mx,\n  reactionKey,\n  shortcode,\n  useAuthentication,\n}: ReactionKeyInlineProps) {\n  const [imgError, setImgError] = useState(false);\n  const rawReactionUrl =\n    reactionKey && reactionKey.startsWith('mxc://')\n      ? (mxcUrlToHttp(mx, reactionKey, useAuthentication) ?? undefined)\n      : undefined;\n  const renderableReactionUrl = useRenderableMediaUrl(rawReactionUrl);\n\n  if (!reactionKey) {\n    if (shortcode) {\n      return (\n        <Text as=\"span\" size=\"Inherit\">\n          :{shortcode}:\n        </Text>\n      );\n    }\n    return null;\n  }\n\n  if (reactionKey.startsWith('mxc://')) {\n    if (imgError) {\n      return (\n        <span title=\"Failed to load emoji image\" aria-label=\"Failed to load emoji image\">\n          {menuIcon(Warning, { style: { opacity: 0.5 } })}\n        </span>\n      );\n    }\n\n    return (\n      <MediaImage\n        className={css.ReactionImg}\n        src={renderableReactionUrl}\n        alt={shortcode ?? 'reaction'}\n        onError={() => setImgError(true)}\n      />\n    );\n  }\n\n  return (\n    <Text as=\"span\" size=\"Inherit\" style={{ unicodeBidi: 'plaintext' }}>\n      {scaleSystemEmoji(reactionKey)}\n    </Text>\n  );\n}\n","export type TextDiffPart = {\n  type: 'equal' | 'insert' | 'delete';\n  value: string;\n};\n\nexport type LineDiffPart = {\n  type: 'equal' | 'insert' | 'delete';\n  lines: string[];\n};\n\nexport type MessageDiffRow =\n  | { type: 'equal'; text: string }\n  | { type: 'delete'; text: string }\n  | { type: 'insert'; text: string }\n  | { type: 'skip'; lines: string[]; placement: 'before' | 'after' | 'between' };\n\nexport type MessageDiffDisplay =\n  | { mode: 'inline'; parts: TextDiffPart[] }\n  | { mode: 'lines'; rows: MessageDiffRow[] };\n\nconst DEFAULT_CONTEXT_LINES = 1;\n\nconst tokenizeForDiff = (text: string): string[] => text.match(/\\s+|[^\\s]+/g) ?? [];\n\nconst mergeAdjacentParts = (parts: TextDiffPart[]): TextDiffPart[] => {\n  const merged: TextDiffPart[] = [];\n  for (const part of parts) {\n    const last = merged.at(-1);\n    if (last && last.type === part.type) {\n      last.value += part.value;\n      continue;\n    }\n    merged.push({ ...part });\n  }\n  return merged;\n};\n\nconst lcsDiff = <T>(\n  oldTokens: T[],\n  newTokens: T[],\n  isEqual: (left: T, right: T) => boolean\n): Array<{ type: 'equal' | 'insert' | 'delete'; value: T }> => {\n  const oldLen = oldTokens.length;\n  const newLen = newTokens.length;\n\n  const lcs: number[][] = Array.from({ length: oldLen + 1 }, () =>\n    Array<number>(newLen + 1).fill(0)\n  );\n\n  for (let i = oldLen - 1; i >= 0; i -= 1) {\n    for (let j = newLen - 1; j >= 0; j -= 1) {\n      if (isEqual(oldTokens[i]!, newTokens[j]!)) {\n        lcs[i]![j] = lcs[i + 1]![j + 1]! + 1;\n      } else {\n        lcs[i]![j] = Math.max(lcs[i + 1]![j]!, lcs[i]![j + 1]!);\n      }\n    }\n  }\n\n  const parts: Array<{ type: 'equal' | 'insert' | 'delete'; value: T }> = [];\n  let i = 0;\n  let j = 0;\n\n  while (i < oldLen && j < newLen) {\n    if (isEqual(oldTokens[i]!, newTokens[j]!)) {\n      parts.push({ type: 'equal', value: oldTokens[i]! });\n      i += 1;\n      j += 1;\n    } else if (lcs[i + 1]![j]! >= lcs[i]![j + 1]!) {\n      parts.push({ type: 'delete', value: oldTokens[i]! });\n      i += 1;\n    } else {\n      parts.push({ type: 'insert', value: newTokens[j]! });\n      j += 1;\n    }\n  }\n\n  while (i < oldLen) {\n    parts.push({ type: 'delete', value: oldTokens[i]! });\n    i += 1;\n  }\n\n  while (j < newLen) {\n    parts.push({ type: 'insert', value: newTokens[j]! });\n    j += 1;\n  }\n\n  return parts;\n};\n\nexport const diffWords = (oldText: string, newText: string): TextDiffPart[] => {\n  if (oldText === newText) {\n    return oldText ? [{ type: 'equal', value: oldText }] : [];\n  }\n\n  const parts = lcsDiff(tokenizeForDiff(oldText), tokenizeForDiff(newText), (a, b) => a === b);\n  return mergeAdjacentParts(parts.map((part) => ({ type: part.type, value: part.value })));\n};\n\nconst splitLines = (text: string): string[] => {\n  if (text === '') return [];\n  return text.replace(/\\n$/, '').split('\\n');\n};\n\nconst trimLineDiffEdges = (text: string): string => {\n  const lines = splitLines(text);\n  while (lines.length > 0 && lines[0] === '') lines.shift();\n  while (lines.length > 0 && lines.at(-1) === '') lines.pop();\n  return lines.join('\\n');\n};\n\nconst mergeLineParts = (\n  parts: Array<{ type: 'equal' | 'insert' | 'delete'; value: string }>\n): LineDiffPart[] => {\n  const merged: LineDiffPart[] = [];\n  for (const part of parts) {\n    const last = merged.at(-1);\n    if (last && last.type === part.type) {\n      last.lines.push(part.value);\n      continue;\n    }\n    merged.push({ type: part.type, lines: [part.value] });\n  }\n  return merged;\n};\n\nexport const diffLinesRaw = (oldText: string, newText: string): LineDiffPart[] => {\n  if (oldText === newText) {\n    const lines = splitLines(oldText);\n    return lines.length > 0 ? [{ type: 'equal', lines }] : [];\n  }\n\n  const parts = lcsDiff(splitLines(oldText), splitLines(newText), (a, b) => a === b);\n  return mergeLineParts(parts);\n};\n\nexport const collapseEqualLineRuns = (\n  parts: LineDiffPart[],\n  contextLines = DEFAULT_CONTEXT_LINES\n): MessageDiffRow[] => {\n  const rows: MessageDiffRow[] = [];\n\n  for (let partIndex = 0; partIndex < parts.length; partIndex += 1) {\n    const part = parts[partIndex]!;\n    if (part.type !== 'equal') {\n      for (const line of part.lines) {\n        rows.push({ type: part.type, text: line });\n      }\n      continue;\n    }\n\n    const { lines } = part;\n    const prevIsChange = partIndex > 0 && parts[partIndex - 1]!.type !== 'equal';\n    const nextIsChange = partIndex < parts.length - 1 && parts[partIndex + 1]!.type !== 'equal';\n\n    if (lines.length <= contextLines) {\n      for (const line of lines) {\n        rows.push({ type: 'equal', text: line });\n      }\n      continue;\n    }\n\n    if (!prevIsChange && nextIsChange) {\n      const hiddenLines = lines.slice(0, -contextLines);\n      if (hiddenLines.length > 0) {\n        rows.push({ type: 'skip', lines: hiddenLines, placement: 'before' });\n      }\n      for (const line of lines.slice(-contextLines)) {\n        rows.push({ type: 'equal', text: line });\n      }\n      continue;\n    }\n\n    if (prevIsChange && !nextIsChange) {\n      for (const line of lines.slice(0, contextLines)) {\n        rows.push({ type: 'equal', text: line });\n      }\n      const hiddenLines = lines.slice(contextLines);\n      if (hiddenLines.length > 0) {\n        rows.push({ type: 'skip', lines: hiddenLines, placement: 'after' });\n      }\n      continue;\n    }\n\n    if (prevIsChange && nextIsChange) {\n      if (lines.length <= contextLines * 2) {\n        for (const line of lines) {\n          rows.push({ type: 'equal', text: line });\n        }\n        continue;\n      }\n\n      for (const line of lines.slice(0, contextLines)) {\n        rows.push({ type: 'equal', text: line });\n      }\n      rows.push({\n        type: 'skip',\n        lines: lines.slice(contextLines, -contextLines),\n        placement: 'between',\n      });\n      for (const line of lines.slice(-contextLines)) {\n        rows.push({ type: 'equal', text: line });\n      }\n      continue;\n    }\n\n    for (const line of lines) {\n      rows.push({ type: 'equal', text: line });\n    }\n  }\n\n  return rows;\n};\n\nexport const buildMessageDiffDisplay = (oldText: string, newText: string): MessageDiffDisplay => {\n  const isMultiline = oldText.includes('\\n') || newText.includes('\\n');\n  if (!isMultiline) {\n    return { mode: 'inline', parts: diffWords(oldText, newText) };\n  }\n\n  const normalizedOld = trimLineDiffEdges(oldText);\n  const normalizedNew = trimLineDiffEdges(newText);\n\n  return {\n    mode: 'lines',\n    rows: collapseEqualLineRuns(diffLinesRaw(normalizedOld, normalizedNew)),\n  };\n};\n","import classNames from 'classnames';\nimport { useCallback, useMemo, useState, type ReactNode } from 'react';\nimport { scaleSystemEmoji } from '$plugins/react-custom-html-parser';\nimport { buildMessageDiffDisplay, type MessageDiffRow, type TextDiffPart } from '$utils/textDiff';\n\nimport * as css from './InlineTextDiff.css';\n\nconst SKIP_EXPAND_CHUNK = 20;\n\ntype InlineTextDiffProps = {\n  oldText: string;\n  newText: string;\n};\n\ntype CodeDiffRow = Exclude<MessageDiffRow, { type: 'skip' }>;\n\nconst renderInlineParts = (parts: TextDiffPart[]) =>\n  parts.map((part, index) => {\n    const content = scaleSystemEmoji(part.value);\n    const key = `diff-${index}-${part.type}`;\n    if (part.type === 'delete') {\n      return (\n        <span key={key} className={css.DiffInlineDelete}>\n          {content}\n        </span>\n      );\n    }\n    if (part.type === 'insert') {\n      return (\n        <span key={key} className={css.DiffInlineInsert}>\n          {content}\n        </span>\n      );\n    }\n    return <span key={key}>{content}</span>;\n  });\n\nconst renderCodeLine = (row: CodeDiffRow, key: string) => {\n  const prefix = row.type === 'delete' ? '-' : row.type === 'insert' ? '+' : ' ';\n  const lineClass =\n    row.type === 'delete'\n      ? css.DiffLineDelete\n      : row.type === 'insert'\n        ? css.DiffLineInsert\n        : css.DiffLineEqual;\n\n  return (\n    <div key={key} className={classNames(css.DiffLine, lineClass)}>\n      <span className={css.DiffLinePrefix} aria-hidden>\n        {prefix}\n      </span>\n      <span className={css.DiffLineText}>{scaleSystemEmoji(row.text)}</span>\n    </div>\n  );\n};\n\ntype DiffSkipRowsProps = {\n  skipIndex: number;\n  lines: string[];\n  placement: 'before' | 'after' | 'between';\n  revealed: number;\n  onReveal: (skipIndex: number, amount: number) => void;\n};\n\nfunction DiffSkipRows({ skipIndex, lines, placement, revealed, onReveal }: DiffSkipRowsProps) {\n  const remaining = lines.length - revealed;\n  const nextReveal = Math.min(SKIP_EXPAND_CHUNK, remaining);\n  const expandUp = placement === 'before';\n  const arrow = expandUp ? '↑' : '↓';\n  const revealedLines =\n    placement === 'before'\n      ? lines.slice(Math.max(0, lines.length - revealed))\n      : lines.slice(0, revealed);\n\n  const label = `Expand ${remaining <= SKIP_EXPAND_CHUNK ? `all ${remaining}` : nextReveal} unchanged ${remaining === 1 ? 'line' : 'lines'}`;\n\n  const expandRow =\n    remaining > 0 ? (\n      <button\n        type=\"button\"\n        className={css.DiffExpand}\n        onClick={() => onReveal(skipIndex, nextReveal)}\n      >\n        <span className={css.DiffLinePrefix} aria-hidden>\n          {' '}\n        </span>\n        <span className={css.DiffLineText}>\n          {arrow} {label}\n        </span>\n      </button>\n    ) : null;\n\n  const revealedRows = revealedLines.map((line, lineIndex) =>\n    renderCodeLine({ type: 'equal', text: line }, `skip-${skipIndex}-line-${lineIndex}`)\n  );\n\n  if (expandUp) {\n    return (\n      <>\n        {expandRow}\n        {revealedRows}\n      </>\n    );\n  }\n\n  return (\n    <>\n      {revealedRows}\n      {expandRow}\n    </>\n  );\n}\n\nfunction InlineDiffBlock({ children }: { children: ReactNode }) {\n  return (\n    <pre className={css.DiffCodeBlock}>\n      <code className={css.DiffCodeBlockInner}>{children}</code>\n    </pre>\n  );\n}\n\nexport function InlineTextDiff({ oldText, newText }: InlineTextDiffProps) {\n  const display = useMemo(() => buildMessageDiffDisplay(oldText, newText), [oldText, newText]);\n  const [revealedBySkip, setRevealedBySkip] = useState<Record<number, number>>({});\n\n  const revealSkip = useCallback((skipIndex: number, amount: number) => {\n    setRevealedBySkip((prev) => ({\n      ...prev,\n      [skipIndex]: (prev[skipIndex] ?? 0) + amount,\n    }));\n  }, []);\n\n  if (display.mode === 'inline') {\n    if (display.parts.length === 0) {\n      return <InlineDiffBlock>(empty)</InlineDiffBlock>;\n    }\n\n    return (\n      <InlineDiffBlock>\n        <div className={classNames(css.DiffLine, css.DiffLineEqual)}>\n          <span className={css.DiffLinePrefix} aria-hidden>\n            {' '}\n          </span>\n          <span className={css.DiffLineText}>{renderInlineParts(display.parts)}</span>\n        </div>\n      </InlineDiffBlock>\n    );\n  }\n\n  if (display.rows.length === 0) {\n    return <InlineDiffBlock>(empty)</InlineDiffBlock>;\n  }\n\n  let skipIndex = 0;\n\n  return (\n    <InlineDiffBlock>\n      {display.rows.map((row, index) => {\n        if (row.type === 'skip') {\n          const currentSkipIndex = skipIndex;\n          skipIndex += 1;\n          return (\n            <DiffSkipRows\n              key={`skip-${currentSkipIndex}`}\n              skipIndex={currentSkipIndex}\n              lines={row.lines}\n              placement={row.placement}\n              revealed={revealedBySkip[currentSkipIndex] ?? 0}\n              onReveal={revealSkip}\n            />\n          );\n        }\n\n        return renderCodeLine(row, `${row.type}-${row.text}-${index}`);\n      })}\n    </InlineDiffBlock>\n  );\n}\n","import { Box, as } from 'folds';\nimport classNames from 'classnames';\nimport * as css from './Attachment.css';\n\nexport const Attachment = as<'div', css.AttachmentVariants>(\n  ({ className, outlined, ...props }, ref) => (\n    <Box\n      display=\"InlineFlex\"\n      direction=\"Column\"\n      className={classNames(css.Attachment({ outlined }), className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport const AttachmentHeader = as<'div'>(({ className, ...props }, ref) => (\n  <Box\n    shrink=\"No\"\n    gap=\"200\"\n    className={classNames(css.AttachmentHeader, className)}\n    {...props}\n    ref={ref}\n  />\n));\n\nexport const AttachmentBox = as<'div'>(({ className, ...props }, ref) => (\n  <Box\n    direction=\"Column\"\n    className={classNames(css.AttachmentBox, className)}\n    {...props}\n    ref={ref}\n  />\n));\n\nexport const AttachmentContent = as<'div'>(({ className, ...props }, ref) => (\n  <Box\n    direction=\"Column\"\n    className={classNames(css.AttachmentContent, className)}\n    {...props}\n    ref={ref}\n  />\n));\n","/*! @license DOMPurify 3.4.13 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.13/LICENSE */\n\nfunction _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nfunction _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nfunction _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = true,\n      o = false;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = true, n = r;\n    } finally {\n      try {\n        if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n  return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n  }\n}\n\nconst entries = Object.entries,\n  setPrototypeOf = Object.setPrototypeOf,\n  isFrozen = Object.isFrozen,\n  getPrototypeOf = Object.getPrototypeOf,\n  getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nlet freeze = Object.freeze,\n  seal = Object.seal,\n  create = Object.create; // eslint-disable-line import/no-mutable-exports\nlet _ref = typeof Reflect !== 'undefined' && Reflect,\n  apply = _ref.apply,\n  construct = _ref.construct;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(func, thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n    return func.apply(thisArg, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func) {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n    for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n      args[_key3 - 1] = arguments[_key3];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n  return function () {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    return construct(Func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  if (!arrayIsArray(array)) {\n    return set;\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const _ref2 of entries(object)) {\n    var _ref3 = _slicedToArray(_ref2, 2);\n    const property = _ref3[0];\n    const value = _ref3[1];\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (arrayIsArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n  switch (typeof value) {\n    case 'string':\n      {\n        return value;\n      }\n    case 'number':\n      {\n        return numberToString(value);\n      }\n    case 'boolean':\n      {\n        return booleanToString(value);\n      }\n    case 'bigint':\n      {\n        return bigintToString ? bigintToString(value) : '0';\n      }\n    case 'symbol':\n      {\n        return symbolToString ? symbolToString(value) : 'Symbol()';\n      }\n    case 'undefined':\n      {\n        return objectToString(value);\n      }\n    case 'function':\n    case 'object':\n      {\n        if (value === null) {\n          return objectToString(value);\n        }\n        const valueAsRecord = value;\n        const valueToString = lookupGetter(valueAsRecord, 'toString');\n        if (typeof valueToString === 'function') {\n          const stringified = valueToString(valueAsRecord);\n          return typeof stringified === 'string' ? stringified : objectToString(stringified);\n        }\n        return objectToString(value);\n      }\n    default:\n      {\n        return objectToString(value);\n      }\n  }\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\nfunction isRegex(value) {\n  try {\n    regExpTest(value, '');\n    return true;\n  } catch (_unused) {\n    return false;\n  }\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'command', 'commandfor', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dominant-baseline', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-orientation', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\nconst MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nconst ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n// Markup-significant character probes used by _sanitizeElements.\n// Shared module-level instances are safe despite the sticky /g flags:\n// unapply() resets lastIndex for RegExp receivers before every call.\nconst ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nconst COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nconst FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nconst SELF_CLOSING_TAG = seal(/\\/>/i);\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  attribute: 2,\n  text: 3,\n  cdataSection: 4,\n  entityReference: 5,\n  // Deprecated\n  entityNode: 6,\n  // Deprecated\n  processingInstruction: 7,\n  comment: 8,\n  document: 9,\n  documentType: 10,\n  documentFragment: 11,\n  notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\n/**\n * Resolve a set-valued configuration option: a fresh set built from\n * cfg[key] when it is an own array property (seeded with a clone of\n * options.base when given, case-normalized via options.transform),\n * the fallback set otherwise.\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param fallback the set to use when the option is absent or not an array\n * @param options transform and optional base set to merge into\n * @returns the resolved set\n */\nconst _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {\n  return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.4.13';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let document = window.document;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  window.DocumentFragment;\n    const HTMLTemplateElement = window.HTMLTemplateElement,\n    Node = window.Node,\n    Element = window.Element,\n    NodeFilter = window.NodeFilter,\n    _window$NamedNodeMap = window.NamedNodeMap;\n    _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap;\n    window.HTMLFormElement;\n    const DOMParser = window.DOMParser,\n    trustedTypes = window.trustedTypes;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  const getShadowRoot = lookupGetter(ElementPrototype, 'shadowRoot');\n  const getAttributes = lookupGetter(ElementPrototype, 'attributes');\n  const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;\n  const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;\n  const getOwnerDocument = Node && Node.prototype ? lookupGetter(Node.prototype, 'ownerDocument') : null;\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  // The instance's own internal Trusted Types policy. Unlike a caller-supplied\n  // `TRUSTED_TYPES_POLICY`, this is created at most once — Trusted Types throws\n  // on duplicate policy names — and is the only policy allowed to persist\n  // across configurations and survive `clearConfig()`.\n  let defaultTrustedTypesPolicy;\n  let defaultTrustedTypesPolicyResolved = false;\n  // Tracks whether we are already inside a call to the configured Trusted Types\n  // policy (`createHTML` or `createScriptURL`). If a supplied policy callback\n  // itself calls `DOMPurify.sanitize` (the cause of #1422), `sanitize` would\n  // re-enter the policy and recurse until the stack overflows. We detect that\n  // re-entry and throw a clear, actionable error instead. The guard is shared\n  // across both callbacks, because either one re-entering `sanitize` triggers\n  // the same unbounded recursion.\n  let IN_TRUSTED_TYPES_POLICY = 0;\n  const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {\n    if (IN_TRUSTED_TYPES_POLICY > 0) {\n      throw typeErrorCreate('A configured TRUSTED_TYPES_POLICY callback (createHTML or ' + 'createScriptURL) must not call DOMPurify.sanitize, as that causes ' + 'infinite recursion. Do not pass a policy whose callbacks wrap ' + 'DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted ' + 'Types\" section of the README.');\n    }\n  };\n  const _createTrustedHTML = function _createTrustedHTML(html) {\n    _assertNotInTrustedTypesPolicy();\n    IN_TRUSTED_TYPES_POLICY++;\n    try {\n      return trustedTypesPolicy.createHTML(html);\n    } finally {\n      IN_TRUSTED_TYPES_POLICY--;\n    }\n  };\n  const _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {\n    _assertNotInTrustedTypesPolicy();\n    IN_TRUSTED_TYPES_POLICY++;\n    try {\n      return trustedTypesPolicy.createScriptURL(scriptUrl);\n    } finally {\n      IN_TRUSTED_TYPES_POLICY--;\n    }\n  };\n  // Lazily resolve (and cache) the instance's internal default policy.\n  // Resolution is attempted at most once: a successful `createPolicy` cannot be\n  // repeated (Trusted Types throws on duplicate names), and a failed or\n  // unsupported attempt must not be retried on every parse.\n  const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {\n    if (!defaultTrustedTypesPolicyResolved) {\n      defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      defaultTrustedTypesPolicyResolved = true;\n    }\n    return defaultTrustedTypesPolicy;\n  };\n  const _document = document,\n    implementation = _document.implementation,\n    createNodeIterator = _document.createNodeIterator,\n    createDocumentFragment = _document.createDocumentFragment,\n    getElementsByTagName = _document.getElementsByTagName;\n  const importNode = originalDocument.importNode;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n    ERB_EXPR$1 = ERB_EXPR,\n    TMPLIT_EXPR$1 = TMPLIT_EXPR,\n    DATA_ATTR$1 = DATA_ATTR,\n    ARIA_ATTR$1 = ARIA_ATTR,\n    IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE$1 = ATTR_WHITESPACE,\n    CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n  let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n  const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    }\n  }));\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Pristine allowlist bindings captured at setConfig() time. On the\n   * persistent-config path sanitize() restores the sets from these before\n   * the per-walk hook clone-guard, so a hook's in-call widening cannot\n   * carry across calls. Null until setConfig() is called; reset by\n   * clearConfig(). */\n  let SET_CONFIG_ALLOWED_TAGS = null;\n  let SET_CONFIG_ALLOWED_ATTR = null;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script',\n  // <selectedcontent> mirrors the selected <option>'s subtree, cloned by\n  // the UA (customizable <select>) — including any on* handlers — and the\n  // engine re-mirrors synchronously whenever a removal changes which\n  // option/selectedcontent is current, even inside DOMPurify's inert\n  // DOMParser document. Hoisting its children on removal re-inserts a fresh\n  // mirror target ahead of the walk, which the engine refills, looping\n  // forever (DoS) and amplifying output. Dropping its content on removal\n  // (rather than hoisting) breaks that cascade; the content is a duplicate\n  // of the option, which is sanitized on its own. See campaign-3 F1/F6.\n  'selectedcontent', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze(['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);\n  const DEFAULT_HTML_INTEGRATION_POINTS = freeze(['annotation-xml']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = _resolveSetOption(cfg, 'ALLOWED_TAGS', DEFAULT_ALLOWED_TAGS, {\n      transform: transformCaseFunc\n    });\n    ALLOWED_ATTR = _resolveSetOption(cfg, 'ALLOWED_ATTR', DEFAULT_ALLOWED_ATTR, {\n      transform: transformCaseFunc\n    });\n    ALLOWED_NAMESPACES = _resolveSetOption(cfg, 'ALLOWED_NAMESPACES', DEFAULT_ALLOWED_NAMESPACES, {\n      transform: stringToString\n    });\n    URI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, 'ADD_URI_SAFE_ATTR', DEFAULT_URI_SAFE_ATTRIBUTES, {\n      transform: transformCaseFunc,\n      base: DEFAULT_URI_SAFE_ATTRIBUTES\n    });\n    DATA_URI_TAGS = _resolveSetOption(cfg, 'ADD_DATA_URI_TAGS', DEFAULT_DATA_URI_TAGS, {\n      transform: transformCaseFunc,\n      base: DEFAULT_DATA_URI_TAGS\n    });\n    FORBID_CONTENTS = _resolveSetOption(cfg, 'FORBID_CONTENTS', DEFAULT_FORBID_CONTENTS, {\n      transform: transformCaseFunc\n    });\n    FORBID_TAGS = _resolveSetOption(cfg, 'FORBID_TAGS', clone({}), {\n      transform: transformCaseFunc\n    });\n    FORBID_ATTR = _resolveSetOption(cfg, 'FORBID_ATTR', clone({}), {\n      transform: transformCaseFunc\n    });\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp\n    NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n    MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'MATHML_TEXT_INTEGRATION_POINTS') && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === 'object' ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS); // Default built-in map\n    HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'HTML_INTEGRATION_POINTS') && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === 'object' ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS); // Default built-in map\n    const customElementHandling = objectHasOwnProperty(cfg, 'CUSTOM_ELEMENT_HANDLING') && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === 'object' ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);\n    CUSTOM_ELEMENT_HANDLING = create(null);\n    if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined\n    }\n    seal(CUSTOM_ELEMENT_HANDLING);\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = create(null);\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n     * leaking across calls when switching from function to array config */\n    EXTRA_ELEMENT_HANDLING.tagCheck = null;\n    EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n    /* Merge configuration parameters */\n    if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n      if (typeof cfg.ADD_TAGS === 'function') {\n        EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n      } else if (arrayIsArray(cfg.ADD_TAGS)) {\n        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n          ALLOWED_TAGS = clone(ALLOWED_TAGS);\n        }\n        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n      if (typeof cfg.ADD_ATTR === 'function') {\n        EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n      } else if (arrayIsArray(cfg.ADD_ATTR)) {\n        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n          ALLOWED_ATTR = clone(ALLOWED_ATTR);\n        }\n        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    // Re-derive the active Trusted Types policy from this configuration on\n    // every parse. The active policy must never be sticky closure state that\n    // outlives the config that set it: a caller-supplied policy left in place\n    // after `clearConfig()` — or after a later call that supplied none, or\n    // `TRUSTED_TYPES_POLICY: null` — could sign a subsequent \"default\"\n    // `RETURN_TRUSTED_TYPE` result with a foreign, possibly unsafe policy.\n    // See GHSA-vxr8-fq34-vvx9.\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // A caller-supplied policy applies to this configuration only.\n      const previousTrustedTypesPolicy = trustedTypesPolicy;\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`. If the supplied policy's\n      // `createHTML` is circular (i.e. it calls `DOMPurify.sanitize`), this\n      // throws via the re-entrancy guard. Restore the previous policy first so\n      // the instance is not left in a poisoned state. See #1422.\n      try {\n        emptyHTML = _createTrustedHTML('');\n      } catch (error) {\n        trustedTypesPolicy = previousTrustedTypesPolicy;\n        throw error;\n      }\n    } else if (cfg.TRUSTED_TYPES_POLICY === null) {\n      // Explicit opt-out for this call: perform no Trusted Types signing and\n      // create nothing (so a strict `trusted-types` CSP that disallows a\n      // `dompurify` policy can still call `sanitize` from inside its own\n      // policy — see #1422). Resetting to `undefined` rather than a sticky\n      // `null` also drops any previously retained caller policy, so it cannot\n      // resurface on a later call, while still allowing the next config-less\n      // call to restore the internal default policy. See GHSA-vxr8-fq34-vvx9.\n      trustedTypesPolicy = undefined;\n      emptyHTML = '';\n    } else {\n      // No policy supplied: keep the currently active policy if one is set — a\n      // previously supplied policy is intentionally sticky across config-less\n      // calls — otherwise fall back to the instance's own internal policy,\n      // created at most once. (A policy supplied for a *single* call still\n      // lingers by design; what must not linger is a policy whose configuration\n      // has been torn down via `clearConfig()`, which restores the default.)\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _getDefaultTrustedTypesPolicy();\n      }\n      // Sign internal variables only when a policy is active. A falsy policy\n      // (Trusted Types unsupported, creation failed, or an explicit opt-out)\n      // leaves `emptyHTML` as a plain string, so we never call `.createHTML` on\n      // a non-policy and throw. See #1422.\n      if (trustedTypesPolicy && typeof emptyHTML === 'string') {\n        emptyHTML = _createTrustedHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * Namespace rules for an element in the SVG namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkSvgNamespace = function _checkSvgNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from HTML namespace to SVG\n    // is via <svg>. If it happens via any other tag, then\n    // it should be killed.\n    if (parent.namespaceURI === HTML_NAMESPACE) {\n      return tagName === 'svg';\n    }\n    // The only way to switch from MathML to SVG is via <svg>\n    // if the parent is either <annotation-xml> or a MathML\n    // text integration point.\n    if (parent.namespaceURI === MATHML_NAMESPACE) {\n      return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n    }\n    // We only allow elements that are defined in SVG\n    // spec. All others are disallowed in SVG namespace.\n    return Boolean(ALL_SVG_TAGS[tagName]);\n  };\n  /**\n   * Namespace rules for an element in the MathML namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkMathMlNamespace = function _checkMathMlNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from HTML namespace to MathML\n    // is via <math>. If it happens via any other tag, then\n    // it should be killed.\n    if (parent.namespaceURI === HTML_NAMESPACE) {\n      return tagName === 'math';\n    }\n    // The only way to switch from SVG to MathML is via\n    // <math> and HTML integration points\n    if (parent.namespaceURI === SVG_NAMESPACE) {\n      return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n    }\n    // We only allow elements that are defined in MathML\n    // spec. All others are disallowed in MathML namespace.\n    return Boolean(ALL_MATHML_TAGS[tagName]);\n  };\n  /**\n   * Namespace rules for an element in the HTML namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkHtmlNamespace = function _checkHtmlNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from SVG to HTML is via\n    // HTML integration points, and from MathML to HTML\n    // is via MathML text integration points\n    if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n      return false;\n    }\n    if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n      return false;\n    }\n    // We disallow tags that are specific for MathML\n    // or SVG and should never appear in HTML namespace\n    return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n  };\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      return _checkSvgNamespace(tagName, parent, parentTagName);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      return _checkMathMlNamespace(tagName, parent, parentTagName);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      return _checkHtmlNamespace(tagName, parent, parentTagName);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      /* The normal detach failed — this is reached for a parentless node\n         (getParentNode() is null, so .removeChild throws). Element.prototype\n         .remove() is itself a spec no-op on a parentless node, so a recorded\n         \"removal\" would otherwise hand the caller back an intact,\n         payload-bearing node (e.g. a detached IN_PLACE root the mXSS canary or\n         the style-with-element-child rule decided to kill). Fail closed by\n         throwing — exactly as a clobbered root does at the IN_PLACE entry —\n         rather than trying to \"neutralize\" the node via its own methods.\n         Neutralizing would mean calling getAttributeNames()/removeAttribute()\n         on the node, both of which a <form> root can clobber via a named child\n         (and _isClobbered does not even probe getAttributeNames), so the\n         neutralize step could itself be silently defeated, leaving the payload\n         intact. A throw touches only the cached, clobber-safe remove() and\n         getParentNode(). Generalizes GHSA-r47g-fvhr-h676 (clobbered-form root)\n         to every root-kill reason. REPORT-3.\n                This lives inside the catch, so it never fires for a normally-removed\n         in-tree node: those have a parent, removeChild() succeeds, and the\n         catch is not entered. Only a kept (parentless) root reaches here. */\n      remove(node);\n      if (!getParentNode(node)) {\n        throw typeErrorCreate('a node selected for removal could not be detached from its tree ' + 'and cannot be safely returned; refusing to sanitize in place');\n      }\n    }\n  };\n  /**\n   * _neutralizeRoot\n   *\n   * Fail-closed teardown of an in-place root after the sanitize walk aborts\n   * (campaign-3 F2). An internal throw mid-walk — e.g. a page-registered\n   * custom element's reaction detaches a node so `_forceRemove`'s deliberate\n   * parentless guard throws, or any other re-entrant engine mutation — would\n   * otherwise leave the caller's *live* tree half-sanitized, with everything\n   * after the abort point still carrying its handlers. There is no safe way\n   * to resume the walk (the tree mutated under us), so we strip the root bare:\n   * remove every child and every attribute, then let the caller's catch see\n   * the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`\n   * getters; the root was already clobber-pre-flighted at the IN_PLACE entry).\n   *\n   * @param root the in-place root to empty\n   */\n  const _neutralizeRoot = function _neutralizeRoot(root) {\n    /* Strip every disallowed attribute (on* handlers included) off the whole\n       subtree BEFORE detaching anything. Detaching first would hand back\n       handler-bearing originals (e.g. an already-loading `<img onerror>`)\n       whose queued resource event still fires in page scope after we throw.\n       Clobber-safe reads; a doomed clobbered node's own attributes are\n       irrelevant while its non-clobbered descendants are reached and scrubbed. */\n    _neutralizeSubtree(root);\n    const childNodes = getChildNodes(root);\n    if (childNodes) {\n      const snapshot = [];\n      arrayForEach(childNodes, child => {\n        arrayPush(snapshot, child);\n      });\n      arrayForEach(snapshot, child => {\n        try {\n          remove(child);\n        } catch (_) {\n          /* Best-effort teardown; a still-attached child is handled below */\n        }\n      });\n    }\n    const attributes = getAttributes(root);\n    if (attributes) {\n      for (let i = attributes.length - 1; i >= 0; --i) {\n        const attribute = attributes[i];\n        const name = attribute && attribute.name;\n        if (typeof name === 'string') {\n          try {\n            root.removeAttribute(name);\n          } catch (_) {\n            /* Clobbered removeAttribute — ignore (fail-closed best effort) */\n          }\n        }\n      }\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _stripDisallowedAttributes\n   *\n   * Removes every attribute the active configuration does not allow from a\n   * single element, using the same allowlist as the main attribute pass (so\n   * `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to\n   * neutralise nodes that are being discarded from an in-place tree.\n   *\n   * @param element the element to strip\n   */\n  const _stripDisallowedAttributes = function _stripDisallowedAttributes(element) {\n    const attributes = getAttributes(element);\n    if (!attributes) {\n      return;\n    }\n    for (let i = attributes.length - 1; i >= 0; --i) {\n      const attribute = attributes[i];\n      const name = attribute && attribute.name;\n      if (typeof name !== 'string' || ALLOWED_ATTR[transformCaseFunc(name)]) {\n        continue;\n      }\n      try {\n        element.removeAttribute(name);\n      } catch (_) {\n        /* Clobbered removeAttribute on a doomed node — ignore */\n      }\n    }\n  };\n  /**\n   * _neutralizeSubtree\n   *\n   * Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT\n   * move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,\n   * namespace, comment, processing-instruction and KEEP_CONTENT:false removals\n   * all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path\n   * those dropped nodes are detached from the caller's LIVE tree but a\n   * handler-bearing original among them (an `<img onerror>`/`<video>` that was\n   * loading) keeps its queued resource event, which fires in page scope after\n   * sanitize returns. This walks a removed subtree and strips every attribute\n   * the active configuration does not allow — so `on*` handlers are cancelled\n   * through the SAME allowlist that governs kept nodes, not a separate `/^on/`\n   * blocklist. Run synchronously before sanitize returns, i.e. before any\n   * queued event can fire. Hook-free by design: these nodes leave the output,\n   * so firing attribute hooks for them would be surprising. Clobber-safe reads;\n   * a doomed clobbered node may shadow `removeAttribute` (its own attributes are\n   * irrelevant — it is discarded — while its non-clobbered descendants, e.g.\n   * the `<img>`, are reached and scrubbed).\n   *\n   * @param root the root of a removed subtree to neutralise\n   */\n  const _neutralizeSubtree = function _neutralizeSubtree(root) {\n    const stack = [root];\n    while (stack.length > 0) {\n      const node = stack.pop();\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      if (nodeType === NODE_TYPE.element) {\n        _stripDisallowedAttributes(node);\n      }\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push(childNodes[i]);\n        }\n      }\n    }\n  };\n  /**\n   * _neutralizePatchLinkage\n   *\n   * IN_PLACE entry pre-pass (declarative-partial-updates / streaming\n   * hardening, https://github.com/WICG/declarative-partial-updates).\n   *\n   * The main walk strips patch linkage (`for`/`patchsrc`) and removes range\n   * markers (PIs / markup comments) node-by-node, in document order, AS it\n   * reaches each node. On a live in-place root that leaves a window: from the\n   * moment the root is connected until the walk arrives at a given node, that\n   * node's linkage is live. A patch applied on connection/stream can fire as\n   * a microtask during the walk and inject or teleport an unsanitized DOM\n   * range into a region the iterator has already passed and will not revisit,\n   * so the post-return \"tree is sanitized\" contract is violated. Sweep the\n   * whole tree once up front and sever every linkage before the walk begins,\n   * closing that window.\n   *\n   * This CANNOT undo a patch that already fired before sanitize ran — that is\n   * the irreducible \"do not IN_PLACE a live-connected attacker tree\" caveat —\n   * but it closes everything from sanitize-start onward. Gated on SAFE_FOR_XML\n   * to group with the rest of the declarative-partial-updates handling and\n   * stay overridable, consistent with the codebase.\n   *\n   * Clobber-safe traversal (cached childNodes getter); per-node try/catch so a\n   * clobbered root cannot defeat the sweep of its non-clobbered descendants.\n   *\n   * NOTE (pending real-Chrome confirmation, see test/declarative-patch-probe\n   * .html Q1): this mirrors the existing policy of keeping `for` on\n   * <label>/<output>. If the shipping feature can drive a patch through a\n   * surviving `for`-on-label/output + `id` pair, this pre-pass and the\n   * attribute check at _isBasicCustomElement's caller must additionally drop\n   * that pair on the IN_PLACE path. Left as-is until the taxonomy is verified.\n   *\n   * @param root the in-place root to sweep\n   */\n  const _neutralizePatchLinkage = function _neutralizePatchLinkage(root) {\n    if (!SAFE_FOR_XML) {\n      return;\n    }\n    const stack = [root];\n    while (stack.length > 0) {\n      const node = stack.pop();\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      /* Remove range markers (the target side of a patch linkage): every\n         processing instruction, and any markup-bearing comment. */\n      if (nodeType === NODE_TYPE.processingInstruction || nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, node.data)) {\n        try {\n          remove(node);\n        } catch (_) {\n          /* Best-effort */\n        }\n        continue;\n      }\n      /* Strip patch-source attributes (the source side) off elements. */\n      if (nodeType === NODE_TYPE.element) {\n        const element = node;\n        const lcTag = transformCaseFunc(getNodeName ? getNodeName(node) : node.nodeName);\n        try {\n          if (element.hasAttribute && element.hasAttribute('patchsrc')) {\n            element.removeAttribute('patchsrc');\n          }\n          if (element.hasAttribute && element.hasAttribute('for') && lcTag !== 'label' && lcTag !== 'output') {\n            element.removeAttribute('for');\n          }\n        } catch (_) {\n          /* Clobbered removeAttribute/hasAttribute on a doomed node — ignore */\n        }\n      }\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push(childNodes[i]);\n        }\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    /* Read ownerDocument through the cached Node.prototype getter, never the\n       direct property. HTMLFormElement has [LegacyOverrideBuiltIns], so a\n       clobbering child (<input name=\"ownerDocument\"> or a form-associated\n       external input) shadows the prototype getter and makes a direct read\n       return that <input>. createNodeIterator.call(<input>, ...) then throws\n       \"Illegal invocation\", and on the IN_PLACE path that throw lands before\n       the walk's fail-closed barrier - leaving the caller's live tree, with\n       any already-armed handler in it, un-neutralized. The cached getter\n       returns the real Document regardless of the clobber. */\n    const doc = getOwnerDocument ? getOwnerDocument(root) : root.ownerDocument;\n    return createNodeIterator.call(doc || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * Replace template expression syntax (mustache, ERB, template\n   * literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub\n   * sites. Order matters: mustache, then ERB, then template literal.\n   *\n   * @param value the string to scrub\n   * @returns the scrubbed string\n   */\n  const _stripTemplateExpressions = function _stripTemplateExpressions(value) {\n    value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n    value = stringReplace(value, ERB_EXPR$1, ' ');\n    value = stringReplace(value, TMPLIT_EXPR$1, ' ');\n    return value;\n  };\n  /**\n   * Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the\n   * character data of an element subtree. Used as the final safety net for\n   * SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions\n   * which only form after text-node normalization (e.g. fragments split across\n   * stripped elements) cannot survive into a template-evaluating framework.\n   *\n   * Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`\n   * in place rather than round-tripping through innerHTML. This preserves\n   * descendant node references (important for IN_PLACE callers), avoids a\n   * serialize/reparse cycle, and reads literal character data — which means\n   * `<%...%>` in text content matches the ERB regex against its real bytes\n   * instead of the HTML-entity-escaped form innerHTML would produce.\n   *\n   * Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for\n   * attributes is performed during the per-node `_sanitizeAttributes` pass.\n   *\n   * @param node The root element whose character data should be scrubbed.\n   */\n  const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {\n    var _node$querySelectorAl;\n    node.normalize();\n    /* Clobber-safe ownerDocument read, same reasoning as _createNodeIterator:\n       under SAFE_FOR_TEMPLATES this runs on the live IN_PLACE root, which may\n       carry a form-named-getter override of ownerDocument. */\n    const doc = getOwnerDocument ? getOwnerDocument(node) : node.ownerDocument;\n    const walker = createNodeIterator.call(doc || node, node,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);\n    let currentNode = walker.nextNode();\n    while (currentNode) {\n      currentNode.data = _stripTemplateExpressions(currentNode.data);\n      currentNode = walker.nextNode();\n    }\n    // NodeIterator does not descend into <template>.content per the DOM spec,\n    // so we must explicitly recurse into each template's content fragment,\n    // mirroring the approach used by _sanitizeShadowDOM.\n    const templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, 'template');\n    if (templates) {\n      arrayForEach(templates, tmpl => {\n        if (_isDocumentFragment(tmpl.content)) {\n          _scrubTemplateExpressions2(tmpl.content);\n        }\n      });\n    }\n  };\n  /**\n   * _isClobbered\n   *\n   * Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML\n   * interface with [LegacyOverrideBuiltIns]; a descendant element with a\n   * `name` attribute matching a prototype property shadows that property\n   * on direct reads. We use this check at the IN_PLACE entry-point and\n   * during attribute sanitization to refuse clobbered forms.\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    // Realm-independent tag-name probe. If we can't determine the tag\n    // name at all, we can't reason about clobbering — return false\n    // (the caller's other defences still apply).\n    const realTagName = getNodeName ? getNodeName(element) : null;\n    if (typeof realTagName !== 'string') {\n      return false;\n    }\n    if (transformCaseFunc(realTagName) !== 'form') {\n      return false;\n    }\n    return typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' ||\n    // Realm-safe NamedNodeMap detection: equality against the cached\n    // prototype getter. Clobbered .attributes (e.g. <input name=\"attributes\">)\n    // makes the direct read diverge from the cached read; a clean form\n    // (same-realm OR foreign-realm) has both reads pointing at the same\n    // canonical NamedNodeMap.\n    element.attributes !== getAttributes(element) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function' ||\n    // NodeType clobbering probe. Cached Node.prototype.nodeType getter\n    // returns the integer 1 for any Element regardless of realm; direct\n    // read on a clobbered form (e.g. <input name=\"nodeType\">) returns\n    // the named child element. Cheap addition — nodeType is read from\n    // an internal slot, no serialization cost — and removes a residual\n    // clobbering surface used by several mXSS / PI / comment branches\n    // in _sanitizeElements that compare currentNode.nodeType directly.\n    element.nodeType !== getNodeType(element) ||\n    // HTMLFormElement has [LegacyOverrideBuiltIns]: a descendant named\n    // \"childNodes\" shadows the prototype getter. Direct reads of\n    // form.childNodes from a clobbered form return the named child\n    // instead of the real NodeList, so any walk that reads it directly\n    // skips the form's real children. Compare the direct read to the\n    // cached Node.prototype getter — when the form's named-property\n    // getter intercepts the read, the two values differ and we flag\n    // the form. This catches every clobbering child type (input,\n    // select, etc.) regardless of whether the named child happens to\n    // carry a numeric .length, which a typeof-based probe would miss\n    // (e.g. HTMLSelectElement.length is a defined unsigned-long).\n    element.childNodes !== getChildNodes(element);\n  };\n  /**\n   * Checks whether the given value is a DocumentFragment from any realm.\n   *\n   * The realm-independent replacement reads `nodeType` through the cached\n   * Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE\n   * constant (11). nodeType is a numeric value resolved from the node's\n   * internal slot, identical across realms for the same kind of node.\n   *\n   * @param value object to check\n   * @return true if value is a DocumentFragment-shaped node from any realm\n   */\n  const _isDocumentFragment = function _isDocumentFragment(value) {\n    if (!getNodeType || typeof value !== 'object' || value === null) {\n      return false;\n    }\n    try {\n      return getNodeType(value) === NODE_TYPE.documentFragment;\n    } catch (_) {\n      return false;\n    }\n  };\n  /**\n   * Checks whether the given object is a DOM node, including nodes that\n   * originate from a different window/realm (e.g. an iframe's\n   * contentDocument). The previous `value instanceof Node` check was\n   * realm-bound: nodes from a different window failed it, causing\n   * sanitize() to silently stringify them and reset IN_PLACE to false,\n   * returning the original node unsanitized. See GHSA-4w3q-35jp-p934.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true if value is a DOM node from any realm\n   */\n  const _isNode = function _isNode(value) {\n    if (!getNodeType || typeof value !== 'object' || value === null) {\n      return false;\n    }\n    try {\n      return typeof getNodeType(value) === 'number';\n    } catch (_) {\n      return false;\n    }\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    if (hooks.length === 0) {\n      return;\n    }\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * Structural-threat checks that condemn a node regardless of the\n   * allowlists: mXSS via namespace confusion, risky CSS construction,\n   * processing instructions, markup-bearing comments. Pure predicate;\n   * the caller removes. Check order is load-bearing.\n   *\n   * @param currentNode the node to inspect\n   * @param tagName the node's transformCaseFunc'd tag name\n   * @return true if the node must be removed\n   */\n  const _isUnsafeNode = function _isUnsafeNode(currentNode, tagName) {\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) {\n      return true;\n    }\n    /* Remove risky CSS construction leading to mXSS */\n    if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === 'style' && _isNode(currentNode.firstElementChild)) {\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.processingInstruction) {\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) {\n      return true;\n    }\n    return false;\n  };\n  /**\n   * Handle a node whose tag is forbidden or not allowlisted: keep\n   * allowed custom elements (false return exits _sanitizeElements\n   * early - the namespace and fallback-tag removal checks are\n   * intentionally skipped for kept custom elements), else hoist\n   * content per KEEP_CONTENT and remove.\n   *\n   * A kept custom element is the ONLY case in which this function\n   * returns false, so the caller uses that return value to run the\n   * afterSanitizeElements hook on the kept element and keep the\n   * element-hook lifecycle consistent with normal allowlisted\n   * elements (GHSA-c2j3-45gr-mqc4).\n   *\n   * @param currentNode the disallowed node\n   * @param tagName the node's transformCaseFunc'd tag name\n   * @return true if the node was removed, false if kept\n   */\n  const _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName, root) {\n    /* Check if we have a custom element to handle */\n    if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n      if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n        return false;\n      }\n      if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n        return false;\n      }\n    }\n    /* Keep content except for bad-listed elements.\n         Use the cached prototype getters exclusively — the previous code\n         had `|| currentNode.parentNode` / `|| currentNode.childNodes`\n         fallbacks, but the cached getters always return the canonical\n         value (or null for a real parent-less node), so the fallback\n         path was dead in safe cases and a clobbering surface in unsafe\n         ones. Falsy cached results stay falsy; the `if (childNodes &&\n         parentNode)` check already gates correctly. */\n    if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n      const parentNode = getParentNode(currentNode);\n      const childNodes = getChildNodes(currentNode);\n      if (childNodes && parentNode) {\n        const childCount = childNodes.length;\n        /* Hoist by moving each child up one level rather than deep-cloning\n             it. Moving transfers every descendant exactly once, so a chain of\n             nested disallowed elements costs O(n) instead of the O(n^2) that\n             re-cloning the shrinking subtree at each level produced; it also\n             empties the removed original, so `DOMPurify.removed` no longer\n             pins whole subtrees. Moving preserves the in-place guarantee too:\n             an original carrying already-queued resource events (`<img\n             onerror>`, `<video>`/`<audio>` error, lazy/`onload`, …) is\n             relocated and sanitised rather than left detached but still armed.\n                      The sole case that must clone is removing the walk root itself.\n             The result is serialised from the root's subtree, so a restrictive\n             ALLOWED_TAGS that strips the root (`body` on the string path) must\n             leave the content inside it, which only cloning does. In IN_PLACE\n             the root is pre-validated as an allowed tag and so is never removed\n             here, so that path always takes the move branch.\n                      `childNodes` is live; a tail-to-head walk keeps `childNodes[i]`\n             valid whether we move (drops the trailing entry) or clone (leaves\n             the list intact). */\n        for (let i = childCount - 1; i >= 0; --i) {\n          const hoisted = currentNode === root ? cloneNode(childNodes[i], true) : childNodes[i];\n          parentNode.insertBefore(hoisted, getNextSibling(currentNode));\n        }\n      }\n    }\n    _forceRemove(currentNode);\n    return true;\n  };\n  /**\n   * Fork a hook-mutable allowlist off its shared binding the first time a\n   * (possibly lazily-installed) uponSanitize* hook is about to see it, so the\n   * hook cannot widen the per-instance default or the setConfig binding by\n   * reference and leak past the call. Returns the set unchanged once it is\n   * already call-local, so repeated calls across elements are idempotent.\n   *\n   * @param hookList the uponSanitize* hook array for this event\n   * @param set the current ALLOWED_TAGS / ALLOWED_ATTR binding\n   * @param defaultSet the per-instance DEFAULT_ALLOWED_* constant\n   * @param setConfigSet the captured setConfig() binding, or null\n   * @return a call-local clone if a hook is present and set is still shared,\n   *   else set unchanged\n   */\n  const _forkSharedAllowlist = function _forkSharedAllowlist(hookList, set, defaultSet, setConfigSet) {\n    if (hookList.length === 0) {\n      return set;\n    }\n    return set === defaultSet || set === setConfigSet ? clone(set) : set;\n  };\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  // eslint-disable-next-line complexity\n  const _sanitizeElements = function _sanitizeElements(currentNode, root) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* A hook may have detached the node - treat it as removed (see the\n       detached-node comment after the uponSanitizeElement hook below). On\n       the IN_PLACE path, neutralize the detached subtree first so a queued\n       resource handler on it cannot fire in page scope after we return. */\n    if (currentNode !== root && getParentNode(currentNode) === null) {\n      if (IN_PLACE) {\n        _neutralizeSubtree(currentNode);\n      }\n      return true;\n    }\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(getNodeName ? getNodeName(currentNode) : currentNode.nodeName);\n    /* Close the pre-walk clone-guard's timing gap: an uponSanitizeElement\n       hook may have been installed after that guard sampled the hook arrays\n       (e.g. lazily from beforeSanitizeElements), leaving ALLOWED_TAGS still\n       aliasing a shared binding that a widening hook would mutate by\n       reference. Fork it before exposing it to the hook. */\n    ALLOWED_TAGS = _forkSharedAllowlist(hooks.uponSanitizeElement, ALLOWED_TAGS, DEFAULT_ALLOWED_TAGS, SET_CONFIG_ALLOWED_TAGS);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* A hook may have detached the node from the tree — a long-standing\n       user pattern (issue #469; draw.io-style foreignObject filtering).\n       Per the cached, unclobberable parentNode getter the node is\n       genuinely out of the tree, so it can reach neither the serialized\n       output nor an IN_PLACE live tree; treat it as removed and stop\n       processing it. Without this guard, the unsafe-node / namespace\n       checks below would call _forceRemove on a parentless node and hit\n       the REPORT-3 fail-closed throw — which exists for nodes DOMPurify\n       wants gone but *cannot* detach (clobbered / parentless roots), the\n       opposite of a node that is already safely gone. The walk root is\n       exempt: a detached IN_PLACE root is legitimate input and must still\n       be fully sanitized, and a kill-decision on it must keep hitting the\n       REPORT-3 throw. Nodes detached by hooks stay the hook's\n       responsibility for placement: they are not recorded in\n       DOMPurify.removed, so the post-walk IN_PLACE pass (which iterates\n       DOMPurify.removed) does not reach them. But a hook-detached subtree\n       can still hold a queued resource-event handler - e.g. an <img onload>\n       that began loading when the caller built the live tree - which fires\n       in page scope after sanitize returns even though the handler never\n       reached the returned tree. That is the audit-5 F1 hazard, and the\n       documented node.remove() hook pattern walks straight into it. So on\n       the IN_PLACE path we neutralize the detached subtree inline here,\n       stripping its non-allow-listed attributes before returning, exactly\n       as the post-walk pass does for _forceRemove'd subtrees. */\n    if (currentNode !== root && getParentNode(currentNode) === null) {\n      if (IN_PLACE) {\n        _neutralizeSubtree(currentNode);\n      }\n      return true;\n    }\n    /* Remove mXSS vectors, processing instructions and risky comments */\n    if (_isUnsafeNode(currentNode, tagName)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n      const removed = _sanitizeDisallowedNode(currentNode, tagName, root);\n      /* A false return means the node is a custom element kept via\n         CUSTOM_ELEMENT_HANDLING - the only keep path through\n         _sanitizeDisallowedNode. Run afterSanitizeElements on it so the\n         element-hook lifecycle matches normal allowlisted elements: a\n         security policy applied in this hook (e.g. stripping an attribute\n         from every surviving element) must not silently skip kept custom\n         elements (GHSA-c2j3-45gr-mqc4). This mirrors the normal-element\n         tail below - the hook runs, then the walker's subsequent\n         _sanitizeAttributes pass sanitizes the element's attributes. The\n         deliberately skipped namespace and fallback-tag removal checks stay\n         skipped; they are removal decisions, not the hook contract. */\n      if (removed === false) {\n        _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n      }\n      return removed;\n    }\n    /* Check whether element has a valid namespace.\n       Realm-safe check (GHSA-hpcv-96wg-7vj8): use the cached Node.prototype\n       nodeType getter rather than `instanceof Element`, which is realm-\n       bound and short-circuits to false for any node minted in a different\n       realm — letting a foreign-realm element with a forbidden namespace\n       slip past the namespace check entirely. */\n    const nt = getNodeType ? getNodeType(currentNode) : currentNode.nodeType;\n    if (nt === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      const content = _stripTemplateExpressions(currentNode.textContent);\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n    if (FORBID_ATTR[lcName]) {\n      return false;\n    }\n    /* Reject declarative-partial-updates patch-linkage attributes\n       (https://github.com/WICG/declarative-partial-updates).\n            Empirical note (Chrome 150, verified — see\n       test/declarative-patch-probe-v3.html): expansion is NOT applied after\n       sanitization. For the string path it fires during sanitize()'s own\n       parse, so the walk sees and sanitizes the fully materialized expanded\n       tree — teleports into MathML/SVG integration points included; a\n       weaponized `<template for>`->`<img onerror>` comes back with the handler\n       stripped. For the IN_PLACE path it fires on connection, before the walk.\n       Either way DOMPurify is NOT blind to the patch.\n            This removal is therefore defense-in-depth rather than the sole barrier:\n       it prevents live linkage from surviving into the OUTPUT and re-expanding\n       in the caller's context, and keeps behaviour deterministic if a future\n       engine defers expansion. `for` is legitimate only on <label>/<output>;\n       anywhere else (notably <template for>) it links the element to a patch\n       target and teleports or removes an arbitrary DOM range by id/marker name.\n       `patchsrc` fetches remote markup and is treated as a script-loading\n       mechanism (CSP). Gated on SAFE_FOR_XML so the removal groups with the\n       other structural-threat checks and stays overridable, consistent with\n       the rest of the codebase. PI range markers are already removed by\n       _isUnsafeNode. */\n    if (SAFE_FOR_XML && lcName === 'patchsrc') {\n      return false;\n    }\n    if (SAFE_FOR_XML && lcName === 'for' && lcTag !== 'label' && lcTag !== 'output') {\n      return false;\n    }\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!nameIsPermitted) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /* Names the HTML spec reserves from valid-custom-element-name; these must\n   * never be treated as basic custom elements even when a permissive\n   * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n  const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);\n  };\n  /**\n   * Wrap an attribute value in the matching Trusted Types object when\n   * the active policy requires it. Namespaced attributes pass through\n   * unchanged (no TT support yet, see\n   * https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).\n   *\n   * @param lcTag lowercase tag name of the containing element\n   * @param lcName lowercase attribute name\n   * @param namespaceURI the attribute's namespace, if any\n   * @param value the attribute value to wrap\n   * @return the value, wrapped when Trusted Types demand it\n   */\n  const _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value) {\n    if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function' && !namespaceURI) {\n      switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n        case 'TrustedHTML':\n          {\n            return _createTrustedHTML(value);\n          }\n        case 'TrustedScriptURL':\n          {\n            return _createTrustedScriptURL(value);\n          }\n      }\n    }\n    return value;\n  };\n  /**\n   * Write a modified attribute value back onto the element. On\n   * success, re-probe for clobbering introduced by the new value and\n   * remove the element when found; otherwise pop the removal entry\n   * recorded by the earlier _removeAttribute (long-standing pairing\n   * with the SANITIZE_NAMED_PROPS path - do not \"fix\" casually). On\n   * failure, remove the attribute instead.\n   *\n   * @param currentNode the element carrying the attribute\n   * @param name the attribute name as present on the element\n   * @param namespaceURI the attribute's namespace, if any\n   * @param value the new attribute value\n   */\n  const _setAttributeValue = function _setAttributeValue(currentNode, name, namespaceURI, value) {\n    try {\n      if (namespaceURI) {\n        currentNode.setAttributeNS(namespaceURI, name, value);\n      } else {\n        /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n        currentNode.setAttribute(name, value);\n      }\n      if (_isClobbered(currentNode)) {\n        _forceRemove(currentNode);\n      } else {\n        arrayPop(DOMPurify.removed);\n      }\n    } catch (_) {\n      _removeAttribute(name, currentNode);\n    }\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const attributes = currentNode.attributes;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    /* Same lazy-install guard as uponSanitizeElement (see there): fork the\n       attribute allowlist off its shared binding before a hook can see it. */\n    ALLOWED_ATTR = _forkSharedAllowlist(hooks.uponSanitizeAttribute, ALLOWED_ATTR, DEFAULT_ALLOWED_ATTR, SET_CONFIG_ALLOWED_ATTR);\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    const lcTag = transformCaseFunc(currentNode.nodeName);\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const name = attr.name,\n        namespaceURI = attr.namespaceURI,\n        attrValue = attr.value;\n      const lcName = transformCaseFunc(name);\n      const initValue = attrValue;\n      let value = name === 'value' ? initValue : stringTrim(initValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      // Else: already prefixed, leave the attribute alone — the prefix is\n      // itself the clobbering protection, and re-applying it is incorrect.\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n      if (lcName === 'attributename' && stringMatch(value, 'href')) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks force-keep the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        value = _stripTemplateExpressions(value);\n      }\n      /* Is `value` valid for this attribute? */\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);\n      /* Handle invalid data-* attribute set by try-catching it */\n      if (value !== initValue) {\n        _setAttributeValue(currentNode, name, namespaceURI, value);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode, fragment);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected.\n         Realm-safe check (GHSA-hpcv-96wg-7vj8): use nodeType against the\n         DOCUMENT_FRAGMENT_NODE constant rather than instanceof, so we\n         recurse into <template>.content from foreign realms too. */\n      if (_isDocumentFragment(shadowNode.content)) {\n        _sanitizeShadowDOM2(shadowNode.content);\n      }\n      /* An element iterated here may itself host an attached\n         shadow root. The default NodeIterator does not enter shadow\n         trees, so a shadow root nested inside template.content was\n         previously reached by no walk at all (the pre-pass at\n         _sanitizeAttachedShadowRoots descends via childNodes, which\n         doesn't enter template.content; the template-content recursion\n         above iterates the content but never inspected shadowRoot).\n         Walk it explicitly. The nodeType guard avoids reading\n         shadowRoot off text / comment / CDATA / PI nodes that the\n         iterator also surfaces. */\n      const shadowNodeType = getNodeType ? getNodeType(shadowNode) : shadowNode.nodeType;\n      if (shadowNodeType === NODE_TYPE.element) {\n        const innerSr = getShadowRoot(shadowNode);\n        if (_isDocumentFragment(innerSr)) {\n          _sanitizeAttachedShadowRoots(innerSr);\n          _sanitizeShadowDOM2(innerSr);\n        }\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  /**\n   * _sanitizeAttachedShadowRoots\n   *\n   * Walks `root` and feeds every attached shadow root we encounter into\n   * the existing _sanitizeShadowDOM pipeline. The default node iterator\n   * does not descend into shadow trees, so nodes inside an attached\n   * shadow root would otherwise be skipped entirely.\n   *\n   * Two real input paths put attached shadow roots in front of us:\n   *   1. IN_PLACE on a DOM node that already has shadow roots attached.\n   *   2. DOM-node input where importNode(dirty, true) deep-clones the\n   *      shadow root because it was created with `clonable: true`.\n   *\n   * This pass runs once, up front, so the main iteration loop (and the\n   * existing _sanitizeShadowDOM template-content recursion) stay\n   * untouched — string-input paths are not affected.\n   *\n   * @param root the subtree root to walk for attached shadow roots\n   */\n  const _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots(root) {\n    /* Iterative (explicit stack) rather than per-child recursion. DOM APIs\n       impose no depth cap, so an attacker-shaped tree (JSON/CRDT/editor data\n       built straight into the DOM — the IN_PLACE surface) deeper than the JS\n       call-stack budget would otherwise overflow native recursion here and\n       throw at the IN_PLACE entry pre-pass, before a single node is\n       sanitized, leaving the caller's live tree untouched (fail-open). See\n       campaign-3 F4. A heap stack keeps depth off the call stack.\n            Each work item is either a node to descend into, or a deferred\n       `_sanitizeShadowDOM` for an already-walked shadow root. The deferred\n       form preserves the original post-order discipline: a shadow root's\n       nested shadow roots are discovered before the outer shadow is\n       sanitized (which may remove hosts). Pushes are in reverse of the\n       desired processing order (LIFO): template content, then children, then\n       the shadow-sanitize, then the shadow walk — so the order matches the\n       previous recursion exactly. */\n    const stack = [{\n      node: root,\n      shadow: null\n    }];\n    while (stack.length > 0) {\n      const item = stack.pop();\n      /* Deferred shadow-DOM sanitisation: runs after its subtree was walked. */\n      if (item.shadow) {\n        _sanitizeShadowDOM2(item.shadow);\n        continue;\n      }\n      const node = item.node;\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      const isElement = nodeType === NODE_TYPE.element;\n      /* (pushed last → processed first) Children, snapshotted in reverse so\n         the first child is processed first. Snapshotting matters because a\n         hook may detach siblings mid-walk. */\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push({\n            node: childNodes[i],\n            shadow: null\n          });\n        }\n      }\n      /* (pushed before children → processed after them, matching the old\n         \"template content last\" order) When the node is a <template>,\n         descend into its content. */\n      if (isElement) {\n        const rootName = getNodeName ? getNodeName(node) : null;\n        if (typeof rootName === 'string' && transformCaseFunc(rootName) === 'template') {\n          const content = node.content;\n          if (_isDocumentFragment(content)) {\n            stack.push({\n              node: content,\n              shadow: null\n            });\n          }\n        }\n      }\n      /* Shadow root (processed first): walk its subtree, then sanitise it.\n         Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n         rather than `instanceof DocumentFragment`, which is realm-bound and\n         silently skipped foreign-realm shadow roots (e.g.\n         iframe.contentDocument attachShadow). */\n      if (isElement) {\n        const sr = getShadowRoot(node);\n        if (_isDocumentFragment(sr)) {\n          /* Push the deferred sanitise first so it pops after the shadow\n             walk we push next, i.e. nested shadow roots are discovered\n             before this one is sanitised. */\n          stack.push({\n            node: null,\n            shadow: sr\n          }, {\n            node: sr,\n            shadow: null\n          });\n        }\n      }\n    }\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      dirty = stringifyValue(dirty);\n      if (typeof dirty !== 'string') {\n        throw typeErrorCreate('dirty is not a string, aborting');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (SET_CONFIG) {\n      /* Persistent setConfig() path: _parseConfig is skipped, so the sets are\n       * not re-derived per call. Restore them from the pristine bindings\n       * captured at setConfig() time so a previous call's hook clone (mutated\n       * below) does not carry over. */\n      ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;\n      ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;\n    } else {\n      _parseConfig(cfg);\n    }\n    /* Clone the hook-mutable allowlists before the walk whenever an\n     * uponSanitize* hook is registered. The hook event exposes ALLOWED_TAGS\n     * and ALLOWED_ATTR by reference (as allowedTags / allowedAttributes), so\n     * a hook that widens them would otherwise mutate the shared set\n     * permanently: across later calls and across every element. Cloning per\n     * walk keeps documented in-call widening working while scoping it to the\n     * call. A single guard for both config paths - the per-call path rebinds\n     * the sets in _parseConfig each call, the persistent path restores them\n     * from the captured bindings just above - so the two cannot diverge. */\n    if (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) {\n      ALLOWED_TAGS = clone(ALLOWED_TAGS);\n    }\n    if (hooks.uponSanitizeAttribute.length > 0) {\n      ALLOWED_ATTR = clone(ALLOWED_ATTR);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Resolve IN_PLACE for this call without mutating persistent config.\n       Writing the IN_PLACE closure variable here leaks under setConfig(),\n       where _parseConfig is skipped on later calls: a single string call would\n       disable in-place mode for every subsequent node call, returning a\n       sanitized copy while leaving the caller's node — which in-place callers\n       keep using and whose return value they ignore — unsanitized. REPORT-2. */\n    const inPlace = IN_PLACE && typeof dirty !== 'string' && _isNode(dirty);\n    if (inPlace) {\n      /* Declarative-partial-updates / streaming pre-pass: sever every patch\n         linkage across the live tree BEFORE the walk, so no patch can fire\n         mid-walk and inject into an already-processed region. Runs first, so\n         it also covers the forbidden/clobbered roots that throw below. */\n      _neutralizePatchLinkage(dirty);\n      /* Do some early pre-sanitization to avoid unsafe root nodes.\n         Read nodeName through the cached prototype getter — a clobbering\n         child named \"nodeName\" on the form root would otherwise shadow\n         the property and let this check skip the root-allowlist\n         validation entirely. */\n      const nn = getNodeName ? getNodeName(dirty) : dirty.nodeName;\n      if (typeof nn === 'string') {\n        const tagName = transformCaseFunc(nn);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          /* Fail closed on a live root: neutralize handlers/children before\n             throwing, exactly as the mid-walk abort path does. */\n          _neutralizeRoot(dirty);\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n      /* Pre-flight the root through _isClobbered. The iterator-driven\n         removal path can not detach a parent-less root: _forceRemove\n         falls through to Element.prototype.remove(), which per spec\n         is a no-op on a node with no parent. A clobbered root would\n         then survive the main loop with its attributes uninspected,\n         because _sanitizeAttributes early-returns on _isClobbered. The\n         result would be an attacker-controlled form, complete with any\n         event-handler attributes the caller passed in, handed back to\n         the application unsanitized. Refuse to sanitize such a root\n         the same way we refuse a forbidden tag. GHSA-r47g-fvhr-h676. */\n      if (_isClobbered(dirty)) {\n        /* Fail closed on a live clobbered root before throwing.\n           _neutralizeRoot's reads are clobber-safe (cached getters); the\n           form's non-clobbered descendants, e.g. an armed <img>, are scrubbed. */\n        _neutralizeRoot(dirty);\n        throw typeErrorCreate('root node is clobbered and cannot be sanitized in-place');\n      }\n      /* Sanitize attached shadow roots before the main iterator runs.\n         The iterator does not descend into shadow trees. Same fail-closed\n         barrier as the main walk (campaign-3 F2): a custom-element reaction\n         inside a shadow root could abort this pre-pass before the walk runs,\n         which would otherwise leave the entire live tree unsanitized. */\n      try {\n        _sanitizeAttachedShadowRoots(dirty);\n      } catch (error) {\n        _neutralizeRoot(dirty);\n        throw error;\n      }\n    } else if (_isNode(dirty)) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n      /* Clonable shadow roots are deep-cloned by importNode(); sanitize\n         them before the main iterator runs, since the iterator does not\n         descend into shadow trees. The walk routes every read through a\n         cached prototype getter so clobbering descendants on a form root\n         cannot hide a shadow host from this pass. */\n      _sanitizeAttachedShadowRoots(importedNode);\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const walkRoot = inPlace ? dirty : body;\n    /* Now start iterating over the created document.\n       The walk runs inside an exception barrier (campaign-3 F2): a re-entrant\n       engine/custom-element mutation can detach a node mid-walk so\n       `_forceRemove`'s parentless guard throws, aborting the loop. Without the\n       barrier the caller's in-place tree would be left half-sanitized with the\n       unvisited tail still armed. _createNodeIterator itself is inside the\n       barrier too: constructing the iterator dereferences the root's document,\n       and any failure there (e.g. an exotic/clobbered root) must still fail\n       closed rather than skip the neutralize. On any throw we fail closed -\n       strip the in-place root bare - then rethrow so the existing throw\n       contract is preserved. (String/DOM-copy paths never return the partial\n       body, so the propagating throw is already fail-closed there.) */\n    try {\n      const nodeIterator = _createNodeIterator(walkRoot);\n      while (currentNode = nodeIterator.nextNode()) {\n        /* Sanitize tags and elements */\n        _sanitizeElements(currentNode, walkRoot);\n        /* Check attributes next */\n        _sanitizeAttributes(currentNode);\n        /* Shadow DOM detected, sanitize it.\n           Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n           instead of instanceof, so foreign-realm <template>.content is\n           walked correctly. */\n        if (_isDocumentFragment(currentNode.content)) {\n          _sanitizeShadowDOM2(currentNode.content);\n        }\n      }\n    } catch (error) {\n      if (inPlace) {\n        _neutralizeRoot(dirty);\n        /* Nodes _forceRemove'd earlier in the aborted walk are already\n           detached from the root, so _neutralizeRoot's subtree pass does not\n           reach them. Defuse them too, mirroring the success-path loop below. */\n        arrayForEach(DOMPurify.removed, entry => {\n          if (entry.element) {\n            _neutralizeSubtree(entry.element);\n          }\n        });\n      }\n      throw error;\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (inPlace) {\n      /* Fail-closed completion of the audit-5 F1 fix: every node removed from\n         the caller's live tree is detached but may still hold a queued\n         resource-event handler that fires in page scope after we return. The\n         move-hoist covers only disallowed-tag KEEP_CONTENT removals; strip the\n         non-allow-listed attributes off every other removed subtree (clobber,\n         mXSS, namespace, comments, KEEP_CONTENT:false, …) so those handlers are\n         cancelled before any event can fire. Runs synchronously, pre-return. */\n      arrayForEach(DOMPurify.removed, entry => {\n        if (entry.element) {\n          _neutralizeSubtree(entry.element);\n        }\n      });\n      if (SAFE_FOR_TEMPLATES) {\n        _scrubTemplateExpressions2(dirty);\n      }\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (SAFE_FOR_TEMPLATES) {\n        _scrubTemplateExpressions2(body);\n      }\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      serializedHTML = _stripTemplateExpressions(serializedHTML);\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n    SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;\n    SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n    SET_CONFIG_ALLOWED_TAGS = null;\n    SET_CONFIG_ALLOWED_ATTR = null;\n    // Drop any caller-supplied Trusted Types policy so it cannot poison later\n    // `RETURN_TRUSTED_TYPE` output. The internal default policy (cached, and\n    // never recreated — Trusted Types throws on duplicate names) is restored by\n    // the next `_parseConfig`. See GHSA-vxr8-fq34-vvx9.\n    trustedTypesPolicy = defaultTrustedTypesPolicy;\n    emptyHTML = '';\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    /* Reject unknown entry points. Without this, a non-hook key (e.g.\n     * '__proto__') indexes off the prototype chain rather than a real\n     * hook array, and arrayPush then writes to Object.prototype. Guard\n     * with an own-property check against the known hook names. */\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return undefined;\n    }\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return;\n    }\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","import DOMPurify from 'dompurify';\nimport { isMatrixHexColor } from './matrixHtml';\nimport { testMatrixUri } from '../plugins/matrix-uri';\n\nconst MAX_TAG_NESTING = 100;\nconst INTERNAL_IMG_SRC_ATTR = 'data-sable-img-src';\n\nconst permittedHtmlTags = [\n  'del',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'blockquote',\n  'p',\n  'a',\n  'ul',\n  'ol',\n  'sup',\n  'sub',\n  'li',\n  'b',\n  'i',\n  'u',\n  'strong',\n  'em',\n  's',\n  'code',\n  'hr',\n  'br',\n  'div',\n  'table',\n  'thead',\n  'tbody',\n  'tr',\n  'th',\n  'td',\n  'caption',\n  'pre',\n  'span',\n  'img',\n  'details',\n  'summary',\n] as const;\n\nconst permittedTagToAttributes = {\n  span: ['data-mx-bg-color', 'data-mx-color', 'data-mx-spoiler', 'data-mx-maths', 'data-md'],\n  a: ['href', 'data-md'],\n  img: ['width', 'height', 'alt', 'title', 'src', 'data-mx-emoticon'], // data-mx-emoticon is for MSC2545\n  ol: ['start', 'data-md'],\n  ul: ['data-md'],\n  code: ['class', 'data-md', 'data-lang'],\n  pre: ['class', 'data-md', 'data-lang'],\n  div: ['data-mx-maths'],\n  blockquote: ['data-md'],\n  h1: ['data-md'],\n  h2: ['data-md'],\n  h3: ['data-md'],\n  h4: ['data-md'],\n  h5: ['data-md'],\n  h6: ['data-md'],\n  strong: ['data-md'],\n  i: ['data-md'],\n  em: ['data-md'],\n  u: ['data-md'],\n  s: ['data-md'],\n  del: ['data-md'],\n  sub: ['data-md'],\n  hr: ['data-md'],\n} as const satisfies Record<string, readonly string[]>;\n\nconst permittedHtmlAttributes = Array.from(new Set(Object.values(permittedTagToAttributes).flat()));\n\nconst allowedLinkSchemes = new Set(['https', 'http', 'ftp', 'mailto', 'magnet']);\nconst forbiddenContentTags = ['mx-reply', 'script', 'style', 'textarea', 'option', 'noscript'];\n\nconst codeLanguageClassRegex = /^language-[A-Za-z0-9_-]+$/;\nconst orderedListStartRegex = /^-?\\d+$/;\nconst allowedUriRegex = /^(?:https?|ftp|mailto|magnet|mxc|matrix):/i;\n\nexport function sanitizeText(body: string): string {\n  const tagsToReplace: Record<string, string> = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n  };\n\n  return body.replace(/[&<>'\"]/g, (tag) => tagsToReplace[tag] || tag);\n}\n\nfunction tagAllowsAttribute(tagName: string, attrName: string): boolean {\n  const allowedAttributes =\n    permittedTagToAttributes[tagName as keyof typeof permittedTagToAttributes];\n\n  return allowedAttributes ? (allowedAttributes as readonly string[]).includes(attrName) : false;\n}\n\nfunction isAllowedAbsoluteLink(value: string): boolean {\n  try {\n    const parsed = new URL(value);\n    return allowedLinkSchemes.has(parsed.protocol.slice(0, -1));\n  } catch {\n    return false;\n  }\n}\n\nfunction isAllowedMatrixUri(value: string): boolean {\n  return testMatrixUri(value);\n}\n\nfunction isAllowedMxcUri(value: string): boolean {\n  try {\n    const parsed = new URL(value);\n    return (\n      parsed.protocol === 'mxc:' &&\n      parsed.host.length > 0 &&\n      parsed.pathname.length > 1 &&\n      parsed.username === '' &&\n      parsed.password === '' &&\n      parsed.search === '' &&\n      parsed.hash === ''\n    );\n  } catch {\n    return false;\n  }\n}\n\nexport function getSafeMediaUrl(url: string | undefined): string | undefined {\n  if (!url) return undefined;\n\n  if (url.startsWith('blob:')) {\n    return url;\n  }\n\n  try {\n    const parsed = new URL(url);\n\n    if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {\n      return url;\n    }\n\n    if (isAllowedMxcUri(url)) {\n      return url;\n    }\n  } catch {\n    return undefined;\n  }\n\n  return undefined;\n}\n\nfunction normalizeCodeClasses(attrValue: string): string | undefined {\n  const classes = attrValue.split(/\\s+/).filter(Boolean);\n  if (\n    classes.length === 0 ||\n    classes.some((className) => !codeLanguageClassRegex.test(className))\n  ) {\n    return undefined;\n  }\n\n  return classes.join(' ');\n}\n\nfunction getValidatedAttributeValue(\n  tagName: string,\n  attrName: string,\n  attrValue: string\n): string | undefined {\n  if (attrName === 'style') {\n    return undefined;\n  }\n\n  if (\n    (attrName === 'data-mx-color' || attrName === 'data-mx-bg-color') &&\n    !isMatrixHexColor(attrValue)\n  ) {\n    return undefined;\n  }\n\n  if (\n    tagName === 'a' &&\n    attrName === 'href' &&\n    !isAllowedAbsoluteLink(attrValue) &&\n    !isAllowedMatrixUri(attrValue)\n  ) {\n    return undefined;\n  }\n\n  if (tagName === 'img' && attrName === 'src' && !isAllowedMxcUri(attrValue)) {\n    return undefined;\n  }\n\n  if (tagName === 'ol' && attrName === 'start' && !orderedListStartRegex.test(attrValue)) {\n    return undefined;\n  }\n\n  if ((tagName === 'code' || tagName === 'pre') && attrName === 'class') {\n    return normalizeCodeClasses(attrValue);\n  }\n\n  return attrValue;\n}\n\nfunction getValidatedProtectedImageSource(\n  sourceId: string | null,\n  protectedSources?: Map<string, string>\n): string | undefined {\n  const rawSrc = sourceId ? protectedSources?.get(sourceId) : undefined;\n\n  return typeof rawSrc === 'string' ? getValidatedAttributeValue('img', 'src', rawSrc) : undefined;\n}\n\nfunction protectImageSources(customHtml: string): {\n  protectedHtml: string;\n  protectedSources: Map<string, string>;\n} {\n  const protectedSources = new Map<string, string>();\n  const protectedHtml = customHtml.replace(/<img\\b[^>]*>/gi, (imgTag) => {\n    let protectedSourceId: string | undefined;\n\n    const strippedTag = imgTag.replace(\n      /\\s(src|srcset)\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+))/gi,\n      (_match, attrName: string, _value, doubleQuoted, singleQuoted, bareValue) => {\n        if (attrName.toLowerCase() !== 'src') {\n          return '';\n        }\n\n        if (protectedSourceId !== undefined) {\n          return '';\n        }\n\n        const rawSrc = doubleQuoted ?? singleQuoted ?? bareValue ?? '';\n        protectedSourceId = `${protectedSources.size}`;\n        protectedSources.set(protectedSourceId, rawSrc);\n\n        return ` ${INTERNAL_IMG_SRC_ATTR}=\"${protectedSourceId}\"`;\n      }\n    );\n\n    return strippedTag;\n  });\n\n  return {\n    protectedHtml,\n    protectedSources,\n  };\n}\n\nfunction restoreProtectedImageSources(\n  sanitizedHtml: string,\n  protectedSources: Map<string, string>\n): string {\n  return sanitizedHtml.replace(\n    new RegExp(`\\\\s${INTERNAL_IMG_SRC_ATTR}=\"([^\"]+)\"`, 'g'),\n    (_match, sourceId: string) => {\n      const validatedSrc = getValidatedProtectedImageSource(sourceId, protectedSources);\n      if (!validatedSrc) return '';\n\n      return ` src=\"${sanitizeText(validatedSrc)}\"`;\n    }\n  );\n}\n\nconst enforceNestingLimit = (fragment: DocumentFragment): void => {\n  const overlyNestedElements: Array<{ depth: number; element: Element }> = [];\n\n  const collect = (node: ParentNode, depth: number) => {\n    Array.from(node.childNodes).forEach((child) => {\n      if (!(child instanceof Element)) return;\n\n      const childDepth = depth + 1;\n      if (childDepth > MAX_TAG_NESTING) {\n        overlyNestedElements.push({ depth: childDepth, element: child });\n      }\n\n      collect(child, childDepth);\n    });\n  };\n\n  collect(fragment, 0);\n\n  overlyNestedElements\n    .toSorted((a, b) => b.depth - a.depth)\n    .forEach(({ element }) => {\n      if (!element.parentNode) return;\n      element.replaceWith(...Array.from(element.childNodes));\n    });\n};\n\nconst pruneInvalidEmptyElements = (\n  fragment: DocumentFragment,\n  protectedSources?: Map<string, string>\n): void => {\n  fragment.querySelectorAll('img').forEach((img) => {\n    const validatedProtectedSource = getValidatedProtectedImageSource(\n      img.getAttribute(INTERNAL_IMG_SRC_ATTR),\n      protectedSources\n    );\n\n    if (!img.getAttribute('src') && !validatedProtectedSource) {\n      img.remove();\n    }\n  });\n};\n\nlet purifyInstance: ReturnType<typeof DOMPurify> | undefined;\nfunction getPurify(): ReturnType<typeof DOMPurify> {\n  if (!purifyInstance) {\n    purifyInstance = DOMPurify(window);\n  }\n  return purifyInstance;\n}\n\nexport const sanitizeCustomHtml = (customHtml: string): string => {\n  if (typeof window === 'undefined') {\n    return sanitizeText(customHtml);\n  }\n\n  const { protectedHtml, protectedSources } = protectImageSources(customHtml);\n  const purify = getPurify();\n  purify.removeAllHooks();\n  const allowedHtmlAttributes = [...permittedHtmlAttributes, INTERNAL_IMG_SRC_ATTR];\n\n  purify.addHook('uponSanitizeAttribute', (currentNode, hookEvent) => {\n    const tagName = currentNode.tagName.toLowerCase();\n    const attrName = hookEvent.attrName.toLowerCase();\n\n    if (tagName === 'img' && attrName === INTERNAL_IMG_SRC_ATTR) {\n      if (!protectedSources.has(hookEvent.attrValue)) {\n        hookEvent.keepAttr = false;\n        return;\n      }\n\n      hookEvent.forceKeepAttr = true;\n      return;\n    }\n\n    if (!tagAllowsAttribute(tagName, attrName)) {\n      // DOMPurify exposes attribute decisions by mutating the hook event.\n      hookEvent.keepAttr = false;\n      return;\n    }\n\n    const validatedAttrValue = getValidatedAttributeValue(tagName, attrName, hookEvent.attrValue);\n    if (validatedAttrValue === undefined) {\n      hookEvent.keepAttr = false;\n      return;\n    }\n\n    hookEvent.attrValue = validatedAttrValue;\n    hookEvent.forceKeepAttr = true;\n  });\n\n  const sanitizedNode = purify.sanitize(protectedHtml, {\n    ALLOWED_TAGS: [...permittedHtmlTags],\n    ALLOWED_ATTR: allowedHtmlAttributes,\n    ALLOW_ARIA_ATTR: false,\n    ALLOW_DATA_ATTR: true,\n    FORBID_ATTR: ['style'],\n    FORBID_TAGS: ['mx-reply'],\n    FORBID_CONTENTS: forbiddenContentTags,\n    KEEP_CONTENT: true,\n    ALLOWED_URI_REGEXP: allowedUriRegex,\n    RETURN_DOM_FRAGMENT: true,\n  });\n\n  if (!(sanitizedNode instanceof window.DocumentFragment)) {\n    return sanitizeText(customHtml);\n  }\n\n  const fragment = sanitizedNode;\n  enforceNestingLimit(fragment);\n  pruneInvalidEmptyElements(fragment, protectedSources);\n\n  const container = document.createElement('div');\n  container.append(fragment);\n  return restoreProtectedImageSources(container.innerHTML, protectedSources);\n};\n","const { min, max } = Math;\n\nexport default (x, low = 0, high = 1) => {\n    return min(max(low, x), high);\n};\n","import limit from './limit.js';\n\nexport default (rgb) => {\n    rgb._clipped = false;\n    rgb._unclipped = rgb.slice(0);\n    for (let i = 0; i <= 3; i++) {\n        if (i < 3) {\n            if (rgb[i] < 0 || rgb[i] > 255) rgb._clipped = true;\n            rgb[i] = limit(rgb[i], 0, 255);\n        } else if (i === 3) {\n            rgb[i] = limit(rgb[i], 0, 1);\n        }\n    }\n    return rgb;\n};\n","// ported from jQuery's $.type\nconst classToType = {};\nfor (let name of [\n    'Boolean',\n    'Number',\n    'String',\n    'Function',\n    'Array',\n    'Date',\n    'RegExp',\n    'Undefined',\n    'Null'\n]) {\n    classToType[`[object ${name}]`] = name.toLowerCase();\n}\nexport default function (obj) {\n    return classToType[Object.prototype.toString.call(obj)] || 'object';\n}\n","import type from './type.js';\n\nexport default (args, keyOrder = null) => {\n    // if called with more than 3 arguments, we return the arguments\n    if (args.length >= 3) return Array.prototype.slice.call(args);\n    // with less than 3 args we check if first arg is object\n    // and use the keyOrder string to extract and sort properties\n    if (type(args[0]) == 'object' && keyOrder) {\n        return keyOrder\n            .split('')\n            .filter((k) => args[0][k] !== undefined)\n            .map((k) => args[0][k]);\n    }\n    // otherwise we just return the first argument\n    // (which we suppose is an array of args)\n    return args[0].slice(0);\n};\n","import type from './type.js';\n\nexport default (args) => {\n    if (args.length < 2) return null;\n    const l = args.length - 1;\n    if (type(args[l]) == 'string') return args[l].toLowerCase();\n    return null;\n};\n","const { PI, min, max } = Math;\n\nconst rnd2 = (a) => Math.round(a * 100) / 100;\nconst rnd3 = (a) => Math.round(a * 100) / 100;\n\nexport { default as clip_rgb } from './clip_rgb.js';\nexport { default as limit } from './limit.js';\nexport { default as type } from './type.js';\nexport { default as unpack } from './unpack.js';\nexport { default as last } from './last.js';\n\nconst TWOPI = PI * 2;\nconst PITHIRD = PI / 3;\nconst DEG2RAD = PI / 180;\nconst RAD2DEG = 180 / PI;\n\n/**\n * Reverse the first three elements of an array\n *\n * @param {any[]} arr\n * @returns {any[]}\n */\nfunction reverse3(arr) {\n    return [...arr.slice(0, 3).reverse(), ...arr.slice(3)];\n}\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max, rnd2, rnd3, reverse3 };\n","export default {\n    format: {},\n    autodetect: []\n};\n","import { last, clip_rgb, type } from './utils/index.js';\nimport _input from './io/input.js';\n\nclass Color {\n    constructor(...args) {\n        const me = this;\n        if (\n            type(args[0]) === 'object' &&\n            args[0].constructor &&\n            args[0].constructor === this.constructor\n        ) {\n            // the argument is already a Color instance\n            return args[0];\n        }\n        // last argument could be the mode\n        let mode = last(args);\n        let autodetect = false;\n        if (!mode) {\n            autodetect = true;\n\n            if (!_input.sorted) {\n                _input.autodetect = _input.autodetect.sort((a, b) => b.p - a.p);\n                _input.sorted = true;\n            }\n\n            // auto-detect format\n            for (let chk of _input.autodetect) {\n                mode = chk.test(...args);\n                if (mode) break;\n            }\n        }\n        if (_input.format[mode]) {\n            const rgb = _input.format[mode].apply(\n                null,\n                autodetect ? args : args.slice(0, -1)\n            );\n            me._rgb = clip_rgb(rgb);\n        } else {\n            throw new Error('unknown format: ' + args);\n        }\n        // add alpha channel\n        if (me._rgb.length === 3) me._rgb.push(1);\n    }\n    toString() {\n        if (type(this.hex) == 'function') return this.hex();\n        return `[${this._rgb.join(',')}]`;\n    }\n}\nexport default Color;\n","// this gets updated automatically\nexport const version = '3.2.0';\n","import Color from './Color.js';\nimport { version } from './version.js';\n\nconst chroma = (...args) => {\n    return new Color(...args);\n};\n\nchroma.version = version;\n\nexport default chroma;\n","/**\n\tX11 color names\n\n\thttp://www.w3.org/TR/css3-color/#svg-color\n*/\n\nconst w3cx11 = {\n    aliceblue: '#f0f8ff',\n    antiquewhite: '#faebd7',\n    aqua: '#00ffff',\n    aquamarine: '#7fffd4',\n    azure: '#f0ffff',\n    beige: '#f5f5dc',\n    bisque: '#ffe4c4',\n    black: '#000000',\n    blanchedalmond: '#ffebcd',\n    blue: '#0000ff',\n    blueviolet: '#8a2be2',\n    brown: '#a52a2a',\n    burlywood: '#deb887',\n    cadetblue: '#5f9ea0',\n    chartreuse: '#7fff00',\n    chocolate: '#d2691e',\n    coral: '#ff7f50',\n    cornflowerblue: '#6495ed',\n    cornsilk: '#fff8dc',\n    crimson: '#dc143c',\n    cyan: '#00ffff',\n    darkblue: '#00008b',\n    darkcyan: '#008b8b',\n    darkgoldenrod: '#b8860b',\n    darkgray: '#a9a9a9',\n    darkgreen: '#006400',\n    darkgrey: '#a9a9a9',\n    darkkhaki: '#bdb76b',\n    darkmagenta: '#8b008b',\n    darkolivegreen: '#556b2f',\n    darkorange: '#ff8c00',\n    darkorchid: '#9932cc',\n    darkred: '#8b0000',\n    darksalmon: '#e9967a',\n    darkseagreen: '#8fbc8f',\n    darkslateblue: '#483d8b',\n    darkslategray: '#2f4f4f',\n    darkslategrey: '#2f4f4f',\n    darkturquoise: '#00ced1',\n    darkviolet: '#9400d3',\n    deeppink: '#ff1493',\n    deepskyblue: '#00bfff',\n    dimgray: '#696969',\n    dimgrey: '#696969',\n    dodgerblue: '#1e90ff',\n    firebrick: '#b22222',\n    floralwhite: '#fffaf0',\n    forestgreen: '#228b22',\n    fuchsia: '#ff00ff',\n    gainsboro: '#dcdcdc',\n    ghostwhite: '#f8f8ff',\n    gold: '#ffd700',\n    goldenrod: '#daa520',\n    gray: '#808080',\n    green: '#008000',\n    greenyellow: '#adff2f',\n    grey: '#808080',\n    honeydew: '#f0fff0',\n    hotpink: '#ff69b4',\n    indianred: '#cd5c5c',\n    indigo: '#4b0082',\n    ivory: '#fffff0',\n    khaki: '#f0e68c',\n    laserlemon: '#ffff54',\n    lavender: '#e6e6fa',\n    lavenderblush: '#fff0f5',\n    lawngreen: '#7cfc00',\n    lemonchiffon: '#fffacd',\n    lightblue: '#add8e6',\n    lightcoral: '#f08080',\n    lightcyan: '#e0ffff',\n    lightgoldenrod: '#fafad2',\n    lightgoldenrodyellow: '#fafad2',\n    lightgray: '#d3d3d3',\n    lightgreen: '#90ee90',\n    lightgrey: '#d3d3d3',\n    lightpink: '#ffb6c1',\n    lightsalmon: '#ffa07a',\n    lightseagreen: '#20b2aa',\n    lightskyblue: '#87cefa',\n    lightslategray: '#778899',\n    lightslategrey: '#778899',\n    lightsteelblue: '#b0c4de',\n    lightyellow: '#ffffe0',\n    lime: '#00ff00',\n    limegreen: '#32cd32',\n    linen: '#faf0e6',\n    magenta: '#ff00ff',\n    maroon: '#800000',\n    maroon2: '#7f0000',\n    maroon3: '#b03060',\n    mediumaquamarine: '#66cdaa',\n    mediumblue: '#0000cd',\n    mediumorchid: '#ba55d3',\n    mediumpurple: '#9370db',\n    mediumseagreen: '#3cb371',\n    mediumslateblue: '#7b68ee',\n    mediumspringgreen: '#00fa9a',\n    mediumturquoise: '#48d1cc',\n    mediumvioletred: '#c71585',\n    midnightblue: '#191970',\n    mintcream: '#f5fffa',\n    mistyrose: '#ffe4e1',\n    moccasin: '#ffe4b5',\n    navajowhite: '#ffdead',\n    navy: '#000080',\n    oldlace: '#fdf5e6',\n    olive: '#808000',\n    olivedrab: '#6b8e23',\n    orange: '#ffa500',\n    orangered: '#ff4500',\n    orchid: '#da70d6',\n    palegoldenrod: '#eee8aa',\n    palegreen: '#98fb98',\n    paleturquoise: '#afeeee',\n    palevioletred: '#db7093',\n    papayawhip: '#ffefd5',\n    peachpuff: '#ffdab9',\n    peru: '#cd853f',\n    pink: '#ffc0cb',\n    plum: '#dda0dd',\n    powderblue: '#b0e0e6',\n    purple: '#800080',\n    purple2: '#7f007f',\n    purple3: '#a020f0',\n    rebeccapurple: '#663399',\n    red: '#ff0000',\n    rosybrown: '#bc8f8f',\n    royalblue: '#4169e1',\n    saddlebrown: '#8b4513',\n    salmon: '#fa8072',\n    sandybrown: '#f4a460',\n    seagreen: '#2e8b57',\n    seashell: '#fff5ee',\n    sienna: '#a0522d',\n    silver: '#c0c0c0',\n    skyblue: '#87ceeb',\n    slateblue: '#6a5acd',\n    slategray: '#708090',\n    slategrey: '#708090',\n    snow: '#fffafa',\n    springgreen: '#00ff7f',\n    steelblue: '#4682b4',\n    tan: '#d2b48c',\n    teal: '#008080',\n    thistle: '#d8bfd8',\n    tomato: '#ff6347',\n    turquoise: '#40e0d0',\n    violet: '#ee82ee',\n    wheat: '#f5deb3',\n    white: '#ffffff',\n    whitesmoke: '#f5f5f5',\n    yellow: '#ffff00',\n    yellowgreen: '#9acd32'\n};\n\nexport default w3cx11;\n","const RE_HEX = /^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\nconst RE_HEXA = /^#?([A-Fa-f0-9]{8}|[A-Fa-f0-9]{4})$/;\n\nconst hex2rgb = (hex) => {\n    if (hex.match(RE_HEX)) {\n        // remove optional leading #\n        if (hex.length === 4 || hex.length === 7) {\n            hex = hex.substr(1);\n        }\n        // expand short-notation to full six-digit\n        if (hex.length === 3) {\n            hex = hex.split('');\n            hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n        }\n        const u = parseInt(hex, 16);\n        const r = u >> 16;\n        const g = (u >> 8) & 0xff;\n        const b = u & 0xff;\n        return [r, g, b, 1];\n    }\n\n    // match rgba hex format, eg #FF000077\n    if (hex.match(RE_HEXA)) {\n        if (hex.length === 5 || hex.length === 9) {\n            // remove optional leading #\n            hex = hex.substr(1);\n        }\n        // expand short-notation to full eight-digit\n        if (hex.length === 4) {\n            hex = hex.split('');\n            hex =\n                hex[0] +\n                hex[0] +\n                hex[1] +\n                hex[1] +\n                hex[2] +\n                hex[2] +\n                hex[3] +\n                hex[3];\n        }\n        const u = parseInt(hex, 16);\n        const r = (u >> 24) & 0xff;\n        const g = (u >> 16) & 0xff;\n        const b = (u >> 8) & 0xff;\n        const a = Math.round(((u & 0xff) / 0xff) * 100) / 100;\n        return [r, g, b, a];\n    }\n\n    // we used to check for css colors here\n    // if _input.css? and rgb = _input.css hex\n    //     return rgb\n\n    throw new Error(`unknown hex color: ${hex}`);\n};\n\nexport default hex2rgb;\n","import { unpack, last } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2hex = (...args) => {\n    let [r, g, b, a] = unpack(args, 'rgba');\n    let mode = last(args) || 'auto';\n    if (a === undefined) a = 1;\n    if (mode === 'auto') {\n        mode = a < 1 ? 'rgba' : 'rgb';\n    }\n    r = round(r);\n    g = round(g);\n    b = round(b);\n    const u = (r << 16) | (g << 8) | b;\n    let str = '000000' + u.toString(16); //#.toUpperCase();\n    str = str.substr(str.length - 6);\n    let hxa = '0' + round(a * 255).toString(16);\n    hxa = hxa.substr(hxa.length - 2);\n    switch (mode.toLowerCase()) {\n        case 'rgba':\n            return `#${str}${hxa}`;\n        case 'argb':\n            return `#${hxa}${str}`;\n        default:\n            return `#${str}`;\n    }\n};\n\nexport default rgb2hex;\n","import Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport w3cx11 from '../../colors/w3cx11.js';\nimport hex2rgb from '../hex/hex2rgb.js';\nimport rgb2hex from '../hex/rgb2hex.js';\n\nColor.prototype.name = function () {\n    const hex = rgb2hex(this._rgb, 'rgb');\n    for (let n of Object.keys(w3cx11)) {\n        if (w3cx11[n] === hex) return n.toLowerCase();\n    }\n    return hex;\n};\n\ninput.format.named = (name) => {\n    name = name.toLowerCase();\n    if (w3cx11[name]) return hex2rgb(w3cx11[name]);\n    throw new Error('unknown color name: ' + name);\n};\n\ninput.autodetect.push({\n    p: 5,\n    test: (h, ...rest) => {\n        if (!rest.length && type(h) === 'string' && w3cx11[h.toLowerCase()]) {\n            return 'named';\n        }\n    }\n});\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.alpha = function (a, mutate = false) {\n    if (a !== undefined && type(a) === 'number') {\n        if (mutate) {\n            this._rgb[3] = a;\n            return this;\n        }\n        return new Color([this._rgb[0], this._rgb[1], this._rgb[2], a], 'rgb');\n    }\n    return this._rgb[3];\n};\n","import Color from '../Color.js';\n\nColor.prototype.clipped = function () {\n    return this._rgb._clipped || false;\n};\n","const labConstants = {\n    // Corresponds roughly to RGB brighter/darker\n    Kn: 18,\n\n    // D65 standard referent\n    labWhitePoint: 'd65',\n    Xn: 0.95047,\n    Yn: 1,\n    Zn: 1.08883,\n\n    t0: 0.137931034, // 4 / 29\n    t1: 0.206896552, // 6 / 29\n    t2: 0.12841855, // 3 * t1 * t1\n    t3: 0.008856452, // t1 * t1 * t1,\n\n    kE: 216.0 / 24389.0,\n    kKE: 8.0,\n    kK: 24389.0 / 27.0,\n\n    RefWhiteRGB: {\n        // sRGB\n        X: 0.95047,\n        Y: 1,\n        Z: 1.08883\n    },\n\n    MtxRGB2XYZ: {\n        m00: 0.4124564390896922,\n        m01: 0.21267285140562253,\n        m02: 0.0193338955823293,\n        m10: 0.357576077643909,\n        m11: 0.715152155287818,\n        m12: 0.11919202588130297,\n        m20: 0.18043748326639894,\n        m21: 0.07217499330655958,\n        m22: 0.9503040785363679\n    },\n\n    MtxXYZ2RGB: {\n        m00: 3.2404541621141045,\n        m01: -0.9692660305051868,\n        m02: 0.055643430959114726,\n        m10: -1.5371385127977166,\n        m11: 1.8760108454466942,\n        m12: -0.2040259135167538,\n        m20: -0.498531409556016,\n        m21: 0.041556017530349834,\n        m22: 1.0572251882231791\n    },\n\n    // used in rgb2xyz\n    As: 0.9414285350000001,\n    Bs: 1.040417467,\n    Cs: 1.089532651,\n\n    MtxAdaptMa: {\n        m00: 0.8951,\n        m01: -0.7502,\n        m02: 0.0389,\n        m10: 0.2664,\n        m11: 1.7135,\n        m12: -0.0685,\n        m20: -0.1614,\n        m21: 0.0367,\n        m22: 1.0296\n    },\n\n    MtxAdaptMaI: {\n        m00: 0.9869929054667123,\n        m01: 0.43230526972339456,\n        m02: -0.008528664575177328,\n        m10: -0.14705425642099013,\n        m11: 0.5183602715367776,\n        m12: 0.04004282165408487,\n        m20: 0.15996265166373125,\n        m21: 0.0492912282128556,\n        m22: 0.9684866957875502\n    }\n};\n\nexport default labConstants;\n\n// taken from https://de.mathworks.com/help/images/ref/whitepoint.html\nconst ILLUMINANTS = new Map([\n    // ASTM E308-01\n    ['a', [1.0985, 0.35585]],\n    // Wyszecki & Stiles, p. 769\n    ['b', [1.0985, 0.35585]],\n    // C ASTM E308-01\n    ['c', [0.98074, 1.18232]],\n    // D50 (ASTM E308-01)\n    ['d50', [0.96422, 0.82521]],\n    // D55 (ASTM E308-01)\n    ['d55', [0.95682, 0.92149]],\n    // D65 (ASTM E308-01)\n    ['d65', [0.95047, 1.08883]],\n    // E (ASTM E308-01)\n    ['e', [1, 1, 1]],\n    // F2 (ASTM E308-01)\n    ['f2', [0.99186, 0.67393]],\n    // F7 (ASTM E308-01)\n    ['f7', [0.95041, 1.08747]],\n    // F11 (ASTM E308-01)\n    ['f11', [1.00962, 0.6435]],\n    ['icc', [0.96422, 0.82521]]\n]);\n\nexport function setLabWhitePoint(name) {\n    const ill = ILLUMINANTS.get(String(name).toLowerCase());\n    if (!ill) {\n        throw new Error('unknown Lab illuminant ' + name);\n    }\n    labConstants.labWhitePoint = name;\n    labConstants.Xn = ill[0];\n    labConstants.Zn = ill[1];\n}\n\nexport function getLabWhitePoint() {\n    return labConstants.labWhitePoint;\n}\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst lab2rgb = (...args) => {\n    args = unpack(args, 'lab');\n    const [L, a, b] = args;\n    const [x, y, z] = lab2xyz(L, a, b);\n    const [r, g, b_] = xyz2rgb(x, y, z);\n    return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst lab2xyz = (L, a, b) => {\n    const { kE, kK, kKE, Xn, Yn, Zn } = LAB_CONSTANTS;\n\n    const fy = (L + 16.0) / 116.0;\n    const fx = 0.002 * a + fy;\n    const fz = fy - 0.005 * b;\n\n    const fx3 = fx * fx * fx;\n    const fz3 = fz * fz * fz;\n\n    const xr = fx3 > kE ? fx3 : (116.0 * fx - 16.0) / kK;\n    const yr = L > kKE ? Math.pow((L + 16.0) / 116.0, 3.0) : L / kK;\n    const zr = fz3 > kE ? fz3 : (116.0 * fz - 16.0) / kK;\n\n    const x = xr * Xn;\n    const y = yr * Yn;\n    const z = zr * Zn;\n\n    return [x, y, z];\n};\n\nconst compand = (linear) => {\n    /* sRGB */\n    const sign = Math.sign(linear);\n    linear = Math.abs(linear);\n    return (\n        (linear <= 0.0031308\n            ? linear * 12.92\n            : 1.055 * Math.pow(linear, 1.0 / 2.4) - 0.055) * sign\n    );\n};\n\nconst xyz2rgb = (x, y, z) => {\n    const { MtxAdaptMa, MtxAdaptMaI, MtxXYZ2RGB, RefWhiteRGB, Xn, Yn, Zn } =\n        LAB_CONSTANTS;\n\n    const As = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n    const Bs = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n    const Cs = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n    const Ad =\n        RefWhiteRGB.X * MtxAdaptMa.m00 +\n        RefWhiteRGB.Y * MtxAdaptMa.m10 +\n        RefWhiteRGB.Z * MtxAdaptMa.m20;\n    const Bd =\n        RefWhiteRGB.X * MtxAdaptMa.m01 +\n        RefWhiteRGB.Y * MtxAdaptMa.m11 +\n        RefWhiteRGB.Z * MtxAdaptMa.m21;\n    const Cd =\n        RefWhiteRGB.X * MtxAdaptMa.m02 +\n        RefWhiteRGB.Y * MtxAdaptMa.m12 +\n        RefWhiteRGB.Z * MtxAdaptMa.m22;\n\n    const X1 =\n        (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20) *\n        (Ad / As);\n    const Y1 =\n        (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21) *\n        (Bd / Bs);\n    const Z1 =\n        (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22) *\n        (Cd / Cs);\n\n    const X2 =\n        X1 * MtxAdaptMaI.m00 + Y1 * MtxAdaptMaI.m10 + Z1 * MtxAdaptMaI.m20;\n    const Y2 =\n        X1 * MtxAdaptMaI.m01 + Y1 * MtxAdaptMaI.m11 + Z1 * MtxAdaptMaI.m21;\n    const Z2 =\n        X1 * MtxAdaptMaI.m02 + Y1 * MtxAdaptMaI.m12 + Z1 * MtxAdaptMaI.m22;\n\n    const r = compand(\n        X2 * MtxXYZ2RGB.m00 + Y2 * MtxXYZ2RGB.m10 + Z2 * MtxXYZ2RGB.m20\n    );\n    const g = compand(\n        X2 * MtxXYZ2RGB.m01 + Y2 * MtxXYZ2RGB.m11 + Z2 * MtxXYZ2RGB.m21\n    );\n    const b = compand(\n        X2 * MtxXYZ2RGB.m02 + Y2 * MtxXYZ2RGB.m12 + Z2 * MtxXYZ2RGB.m22\n    );\n\n    return [r * 255, g * 255, b * 255];\n};\n\nexport default lab2rgb;\nexport { xyz2rgb };\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\nconst rgb2lab = (...args) => {\n    const [r, g, b, ...rest] = unpack(args, 'rgb');\n    const [x, y, z] = rgb2xyz(r, g, b);\n    const [L, a, b_] = xyz2lab(x, y, z);\n    return [L, a, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nfunction xyz2lab(x, y, z) {\n    const { Xn, Yn, Zn, kE, kK } = LAB_CONSTANTS;\n    const xr = x / Xn;\n    const yr = y / Yn;\n    const zr = z / Zn;\n\n    const fx = xr > kE ? Math.pow(xr, 1.0 / 3.0) : (kK * xr + 16.0) / 116.0;\n    const fy = yr > kE ? Math.pow(yr, 1.0 / 3.0) : (kK * yr + 16.0) / 116.0;\n    const fz = zr > kE ? Math.pow(zr, 1.0 / 3.0) : (kK * zr + 16.0) / 116.0;\n\n    return [116.0 * fy - 16.0, 500.0 * (fx - fy), 200.0 * (fy - fz)];\n}\n\nfunction gammaAdjustSRGB(companded) {\n    const sign = Math.sign(companded);\n    companded = Math.abs(companded);\n    const linear =\n        companded <= 0.04045\n            ? companded / 12.92\n            : Math.pow((companded + 0.055) / 1.055, 2.4);\n    return linear * sign;\n}\n\nconst rgb2xyz = (r, g, b) => {\n    // normalize and gamma adjust\n    r = gammaAdjustSRGB(r / 255);\n    g = gammaAdjustSRGB(g / 255);\n    b = gammaAdjustSRGB(b / 255);\n\n    const { MtxRGB2XYZ, MtxAdaptMa, MtxAdaptMaI, Xn, Yn, Zn, As, Bs, Cs } =\n        LAB_CONSTANTS;\n\n    let x = r * MtxRGB2XYZ.m00 + g * MtxRGB2XYZ.m10 + b * MtxRGB2XYZ.m20;\n    let y = r * MtxRGB2XYZ.m01 + g * MtxRGB2XYZ.m11 + b * MtxRGB2XYZ.m21;\n    let z = r * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;\n\n    const Ad = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n    const Bd = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n    const Cd = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n    let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20;\n    let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21;\n    let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22;\n\n    X *= Ad / As;\n    Y *= Bd / Bs;\n    Z *= Cd / Cs;\n\n    x = X * MtxAdaptMaI.m00 + Y * MtxAdaptMaI.m10 + Z * MtxAdaptMaI.m20;\n    y = X * MtxAdaptMaI.m01 + Y * MtxAdaptMaI.m11 + Z * MtxAdaptMaI.m21;\n    z = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;\n\n    return [x, y, z];\n};\n\nexport default rgb2lab;\nexport { rgb2xyz };\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lab2rgb from './lab2rgb.js';\nimport rgb2lab from './rgb2lab.js';\nimport { getLabWhitePoint, setLabWhitePoint } from './lab-constants.js';\n\nColor.prototype.lab = function () {\n    return rgb2lab(this._rgb);\n};\n\nconst lab = (...args) => new Color(...args, 'lab');\nObject.assign(chroma, { lab, getLabWhitePoint, setLabWhitePoint });\n\ninput.format.lab = lab2rgb;\n\ninput.autodetect.push({\n    p: 2,\n    test: (...args) => {\n        args = unpack(args, 'lab');\n        if (type(args) === 'array' && args.length === 3) {\n            return 'lab';\n        }\n    }\n});\n\nexport { lab, getLabWhitePoint, setLabWhitePoint };\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.darken = function (amount = 1) {\n    const me = this;\n    const lab = me.lab();\n    lab[0] -= LAB_CONSTANTS.Kn * amount;\n    return new Color(lab, 'lab').alpha(me.alpha(), true);\n};\n\nColor.prototype.brighten = function (amount = 1) {\n    return this.darken(-amount);\n};\n\nColor.prototype.darker = Color.prototype.darken;\nColor.prototype.brighter = Color.prototype.brighten;\n","import Color from '../Color.js';\n\nColor.prototype.get = function (mc) {\n    const [mode, channel] = mc.split('.');\n    const src = this[mode]();\n    if (channel) {\n        const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n        if (i > -1) return src[i];\n        throw new Error(`unknown channel ${channel} in mode ${mode}`);\n    } else {\n        return src;\n    }\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nconst { pow } = Math;\n\nconst EPS = 1e-7;\nconst MAX_ITER = 20;\n\nColor.prototype.luminance = function (lum, mode = 'rgb') {\n    if (lum !== undefined && type(lum) === 'number') {\n        if (lum === 0) {\n            // return pure black\n            return new Color([0, 0, 0, this._rgb[3]], 'rgb');\n        }\n        if (lum === 1) {\n            // return pure white\n            return new Color([255, 255, 255, this._rgb[3]], 'rgb');\n        }\n        // compute new color using...\n        let cur_lum = this.luminance();\n        let max_iter = MAX_ITER;\n\n        const test = (low, high) => {\n            const mid = low.interpolate(high, 0.5, mode);\n            const lm = mid.luminance();\n            if (Math.abs(lum - lm) < EPS || !max_iter--) {\n                // close enough\n                return mid;\n            }\n            return lm > lum ? test(low, mid) : test(mid, high);\n        };\n\n        const rgb = (\n            cur_lum > lum\n                ? test(new Color([0, 0, 0]), this)\n                : test(this, new Color([255, 255, 255]))\n        ).rgb();\n        return new Color([...rgb, this._rgb[3]]);\n    }\n    return rgb2luminance(...this._rgb.slice(0, 3));\n};\n\nconst rgb2luminance = (r, g, b) => {\n    // relative luminance\n    // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n    r = luminance_x(r);\n    g = luminance_x(g);\n    b = luminance_x(b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nconst luminance_x = (x) => {\n    x /= 255;\n    return x <= 0.03928 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n};\n","export default {};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\nimport interpolator from '../interpolator/index.js';\n\nexport default (col1, col2, f = 0.5, ...rest) => {\n    let mode = rest[0] || 'lrgb';\n    if (!interpolator[mode] && !rest.length) {\n        // fall back to the first supported mode\n        mode = Object.keys(interpolator)[0];\n    }\n    if (!interpolator[mode]) {\n        throw new Error(`interpolation mode ${mode} is not defined`);\n    }\n    if (type(col1) !== 'object') col1 = new Color(col1);\n    if (type(col2) !== 'object') col2 = new Color(col2);\n    return interpolator[mode](col1, col2, f).alpha(\n        col1.alpha() + f * (col2.alpha() - col1.alpha())\n    );\n};\n","import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.mix = Color.prototype.interpolate = function (\n    col2,\n    f = 0.5,\n    ...rest\n) {\n    return mix(this, col2, f, ...rest);\n};\n","import Color from '../Color.js';\n\nColor.prototype.premultiply = function (mutate = false) {\n    const rgb = this._rgb;\n    const a = rgb[3];\n    if (mutate) {\n        this._rgb = [rgb[0] * a, rgb[1] * a, rgb[2] * a, a];\n        return this;\n    } else {\n        return new Color([rgb[0] * a, rgb[1] * a, rgb[2] * a, a], 'rgb');\n    }\n};\n","import { unpack, DEG2RAD } from '../../utils/index.js';\nconst { sin, cos } = Math;\n\nconst lch2lab = (...args) => {\n    /*\n    Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n    These formulas were invented by David Dalrymple to obtain maximum contrast without going\n    out of gamut if the parameters are in the range 0-1.\n\n    A saturation multiplier was added by Gregor Aisch\n    */\n    let [l, c, h] = unpack(args, 'lch');\n    if (isNaN(h)) h = 0;\n    h = h * DEG2RAD;\n    return [l, cos(h) * c, sin(h) * c];\n};\n\nexport default lch2lab;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from './lch2lab.js';\nimport lab2rgb from '../lab/lab2rgb.js';\n\nconst lch2rgb = (...args) => {\n    args = unpack(args, 'lch');\n    const [l, c, h] = args;\n    const [L, a, b_] = lch2lab(l, c, h);\n    const [r, g, b] = lab2rgb(L, a, b_);\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default lch2rgb;\n","import { unpack, reverse3 } from '../../utils/index.js';\nimport lch2rgb from './lch2rgb.js';\n\nconst hcl2rgb = (...args) => {\n    const hcl = reverse3(unpack(args, 'hcl'));\n    return lch2rgb(...hcl);\n};\n\nexport default hcl2rgb;\n","import { unpack, RAD2DEG } from '../../utils/index.js';\nconst { sqrt, atan2, round } = Math;\n\nconst lab2lch = (...args) => {\n    const [l, a, b] = unpack(args, 'lab');\n    const c = sqrt(a * a + b * b);\n    let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n    if (round(c * 10000) === 0) h = Number.NaN;\n    return [l, c, h];\n};\n\nexport default lab2lch;\n","import { unpack } from '../../utils/index.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lab2lch from './lab2lch.js';\n\nconst rgb2lch = (...args) => {\n    const [r, g, b, ...rest] = unpack(args, 'rgb');\n    const [l, a, b_] = rgb2lab(r, g, b);\n    const [L, c, h] = lab2lch(l, a, b_);\n    return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2lch;\n","import { unpack, type, reverse3 } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport lch2rgb from './lch2rgb.js';\nimport hcl2rgb from './hcl2rgb.js';\nimport rgb2lch from './rgb2lch.js';\n\nColor.prototype.lch = function () {\n    return rgb2lch(this._rgb);\n};\nColor.prototype.hcl = function () {\n    return reverse3(rgb2lch(this._rgb));\n};\n\nconst lch = (...args) => new Color(...args, 'lch');\nconst hcl = (...args) => new Color(...args, 'hcl');\n\nObject.assign(chroma, { lch, hcl });\n\ninput.format.lch = lch2rgb;\ninput.format.hcl = hcl2rgb;\n['lch', 'hcl'].forEach((m) =>\n    input.autodetect.push({\n        p: 2,\n        test: (...args) => {\n            args = unpack(args, m);\n            if (type(args) === 'array' && args.length === 3) {\n                return m;\n            }\n        }\n    })\n);\n\nexport { lch, hcl };\n","import '../io/lch/index.js';\nimport Color from '../Color.js';\nimport LAB_CONSTANTS from '../io/lab/lab-constants.js';\n\nColor.prototype.saturate = function (amount = 1) {\n    const me = this;\n    const lch = me.lch();\n    lch[1] += LAB_CONSTANTS.Kn * amount;\n    if (lch[1] < 0) lch[1] = 0;\n    return new Color(lch, 'lch').alpha(me.alpha(), true);\n};\n\nColor.prototype.desaturate = function (amount = 1) {\n    return this.saturate(-amount);\n};\n","import Color from '../Color.js';\nimport { type } from '../utils/index.js';\n\nColor.prototype.set = function (mc, value, mutate = false) {\n    const [mode, channel] = mc.split('.');\n    const src = this[mode]();\n    if (channel) {\n        const i = mode.indexOf(channel) - (mode.substr(0, 2) === 'ok' ? 2 : 0);\n        if (i > -1) {\n            if (type(value) == 'string') {\n                switch (value.charAt(0)) {\n                    case '+':\n                        src[i] += +value;\n                        break;\n                    case '-':\n                        src[i] += +value;\n                        break;\n                    case '*':\n                        src[i] *= +value.substr(1);\n                        break;\n                    case '/':\n                        src[i] /= +value.substr(1);\n                        break;\n                    default:\n                        src[i] = +value;\n                }\n            } else if (type(value) === 'number') {\n                src[i] = value;\n            } else {\n                throw new Error(`unsupported value for Color.set`);\n            }\n            const out = new Color(src, mode);\n            if (mutate) {\n                this._rgb = out._rgb;\n                return this;\n            }\n            return out;\n        }\n        throw new Error(`unknown channel ${channel} in mode ${mode}`);\n    } else {\n        return src;\n    }\n};\n","import '../io/lab/index.js';\nimport Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\nColor.prototype.tint = function (f = 0.5, ...rest) {\n    return mix(this, 'white', f, ...rest);\n};\n\nColor.prototype.shade = function (f = 0.5, ...rest) {\n    return mix(this, 'black', f, ...rest);\n};\n","import Color from '../Color.js';\nimport index from './index.js';\n\nconst rgb = (col1, col2, f) => {\n    const xyz0 = col1._rgb;\n    const xyz1 = col2._rgb;\n    return new Color(\n        xyz0[0] + f * (xyz1[0] - xyz0[0]),\n        xyz0[1] + f * (xyz1[1] - xyz0[1]),\n        xyz0[2] + f * (xyz1[2] - xyz0[2]),\n        'rgb'\n    );\n};\n\n// register interpolator\nindex.rgb = rgb;\n\nexport default rgb;\n","import Color from '../Color.js';\nconst { sqrt, pow } = Math;\nimport index from './index.js';\n\nconst lrgb = (col1, col2, f) => {\n    const [x1, y1, z1] = col1._rgb;\n    const [x2, y2, z2] = col2._rgb;\n    return new Color(\n        sqrt(pow(x1, 2) * (1 - f) + pow(x2, 2) * f),\n        sqrt(pow(y1, 2) * (1 - f) + pow(y2, 2) * f),\n        sqrt(pow(z1, 2) * (1 - f) + pow(z2, 2) * f),\n        'rgb'\n    );\n};\n\n// register interpolator\nindex.lrgb = lrgb;\n\nexport default lrgb;\n","import '../io/lab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst lab = (col1, col2, f) => {\n    const xyz0 = col1.lab();\n    const xyz1 = col2.lab();\n    return new Color(\n        xyz0[0] + f * (xyz1[0] - xyz0[0]),\n        xyz0[1] + f * (xyz1[1] - xyz0[1]),\n        xyz0[2] + f * (xyz1[2] - xyz0[2]),\n        'lab'\n    );\n};\n\n// register interpolator\nindex.lab = lab;\n\nexport default lab;\n","import Color from '../Color.js';\n\nexport default (col1, col2, f, m) => {\n    let xyz0, xyz1;\n    if (m === 'hsl') {\n        xyz0 = col1.hsl();\n        xyz1 = col2.hsl();\n    } else if (m === 'hsv') {\n        xyz0 = col1.hsv();\n        xyz1 = col2.hsv();\n    } else if (m === 'hcg') {\n        xyz0 = col1.hcg();\n        xyz1 = col2.hcg();\n    } else if (m === 'hsi') {\n        xyz0 = col1.hsi();\n        xyz1 = col2.hsi();\n    } else if (m === 'lch' || m === 'hcl') {\n        m = 'hcl';\n        xyz0 = col1.hcl();\n        xyz1 = col2.hcl();\n    } else if (m === 'oklch') {\n        xyz0 = col1.oklch().reverse();\n        xyz1 = col2.oklch().reverse();\n    }\n\n    let hue0, hue1, sat0, sat1, lbv0, lbv1;\n    if (m.substr(0, 1) === 'h' || m === 'oklch') {\n        [hue0, sat0, lbv0] = xyz0;\n        [hue1, sat1, lbv1] = xyz1;\n    }\n\n    let sat, hue, lbv, dh;\n\n    if (!isNaN(hue0) && !isNaN(hue1)) {\n        // both colors have hue\n        if (hue1 > hue0 && hue1 - hue0 > 180) {\n            dh = hue1 - (hue0 + 360);\n        } else if (hue1 < hue0 && hue0 - hue1 > 180) {\n            dh = hue1 + 360 - hue0;\n        } else {\n            dh = hue1 - hue0;\n        }\n        hue = hue0 + f * dh;\n    } else if (!isNaN(hue0)) {\n        hue = hue0;\n        if ((lbv1 == 1 || lbv1 == 0) && m != 'hsv') sat = sat0;\n    } else if (!isNaN(hue1)) {\n        hue = hue1;\n        if ((lbv0 == 1 || lbv0 == 0) && m != 'hsv') sat = sat1;\n    } else {\n        hue = Number.NaN;\n    }\n\n    if (sat === undefined) sat = sat0 + f * (sat1 - sat0);\n    lbv = lbv0 + f * (lbv1 - lbv0);\n    return m === 'oklch'\n        ? new Color([lbv, sat, hue], m)\n        : new Color([hue, sat, lbv], m);\n};\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst lch = (col1, col2, f) => {\n    return interpolate_hsx(col1, col2, f, 'lch');\n};\n\n// register interpolator\nindex.lch = lch;\nindex.hcl = lch;\n\nexport default lch;\n","import { type } from '../../utils/index.js';\n\nconst num2rgb = (num) => {\n    if (type(num) == 'number' && num >= 0 && num <= 0xffffff) {\n        const r = num >> 16;\n        const g = (num >> 8) & 0xff;\n        const b = num & 0xff;\n        return [r, g, b, 1];\n    }\n    throw new Error('unknown num color: ' + num);\n};\n\nexport default num2rgb;\n","import { unpack } from '../../utils/index.js';\n\nconst rgb2num = (...args) => {\n    const [r, g, b] = unpack(args, 'rgb');\n    return (r << 16) + (g << 8) + b;\n};\n\nexport default rgb2num;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\nimport num2rgb from './num2rgb.js';\nimport rgb2num from './rgb2num.js';\n\nColor.prototype.num = function () {\n    return rgb2num(this._rgb);\n};\n\nconst num = (...args) => new Color(...args, 'num');\n\nObject.assign(chroma, { num });\n\ninput.format.num = num2rgb;\n\ninput.autodetect.push({\n    p: 5,\n    test: (...args) => {\n        if (\n            args.length === 1 &&\n            type(args[0]) === 'number' &&\n            args[0] >= 0 &&\n            args[0] <= 0xffffff\n        ) {\n            return 'num';\n        }\n    }\n});\n\nexport { num };\n","import '../io/num/index.js';\nimport index from './index.js';\n\nimport Color from '../Color.js';\n\nconst num = (col1, col2, f) => {\n    const c1 = col1.num();\n    const c2 = col2.num();\n    return new Color(c1 + f * (c2 - c1), 'num');\n};\n\n// register interpolator\nindex.num = num;\n\nexport default num;\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\n/*\n * this is basically just HSV with some minor tweaks\n *\n * hue.. [0..360]\n * chroma .. [0..1]\n * grayness .. [0..1]\n */\n\nconst hcg2rgb = (...args) => {\n    args = unpack(args, 'hcg');\n    let [h, c, _g] = args;\n    let r, g, b;\n    _g = _g * 255;\n    const _c = c * 255;\n    if (c === 0) {\n        r = g = b = _g;\n    } else {\n        if (h === 360) h = 0;\n        if (h > 360) h -= 360;\n        if (h < 0) h += 360;\n        h /= 60;\n        const i = floor(h);\n        const f = h - i;\n        const p = _g * (1 - c);\n        const q = p + _c * (1 - f);\n        const t = p + _c * f;\n        const v = p + _c;\n        switch (i) {\n            case 0:\n                [r, g, b] = [v, t, p];\n                break;\n            case 1:\n                [r, g, b] = [q, v, p];\n                break;\n            case 2:\n                [r, g, b] = [p, v, t];\n                break;\n            case 3:\n                [r, g, b] = [p, q, v];\n                break;\n            case 4:\n                [r, g, b] = [t, p, v];\n                break;\n            case 5:\n                [r, g, b] = [v, p, q];\n                break;\n        }\n    }\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hcg2rgb;\n","import { unpack, max, min } from '../../utils/index.js';\n\nconst rgb2hcg = (...args) => {\n    const [r, g, b] = unpack(args, 'rgb');\n    const minRgb = min(r, g, b);\n    const maxRgb = max(r, g, b);\n    const delta = maxRgb - minRgb;\n    const c = (delta * 100) / 255;\n    const _g = (minRgb / (255 - delta)) * 100;\n    let h;\n    if (delta === 0) {\n        h = Number.NaN;\n    } else {\n        if (r === maxRgb) h = (g - b) / delta;\n        if (g === maxRgb) h = 2 + (b - r) / delta;\n        if (b === maxRgb) h = 4 + (r - g) / delta;\n        h *= 60;\n        if (h < 0) h += 360;\n    }\n    return [h, c, _g];\n};\n\nexport default rgb2hcg;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hcg2rgb from './hcg2rgb.js';\nimport rgb2hcg from './rgb2hcg.js';\n\nColor.prototype.hcg = function () {\n    return rgb2hcg(this._rgb);\n};\n\nconst hcg = (...args) => new Color(...args, 'hcg');\nchroma.hcg = hcg;\n\ninput.format.hcg = hcg2rgb;\n\ninput.autodetect.push({\n    p: 1,\n    test: (...args) => {\n        args = unpack(args, 'hcg');\n        if (type(args) === 'array' && args.length === 3) {\n            return 'hcg';\n        }\n    }\n});\n\nexport { hcg };\n","import '../io/hcg/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hcg = (col1, col2, f) => {\n    return interpolate_hsx(col1, col2, f, 'hcg');\n};\n\n// register interpolator\nindex.hcg = hcg;\n\nexport default hcg;\n","import { unpack, limit, TWOPI, PITHIRD } from '../../utils/index.js';\nconst { cos } = Math;\n\n/*\n * hue [0..360]\n * saturation [0..1]\n * intensity [0..1]\n */\nconst hsi2rgb = (...args) => {\n    /*\n    borrowed from here:\n    http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp\n    */\n    args = unpack(args, 'hsi');\n    let [h, s, i] = args;\n    let r, g, b;\n\n    if (isNaN(h)) h = 0;\n    if (isNaN(s)) s = 0;\n    // normalize hue\n    if (h > 360) h -= 360;\n    if (h < 0) h += 360;\n    h /= 360;\n    if (h < 1 / 3) {\n        b = (1 - s) / 3;\n        r = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n        g = 1 - (b + r);\n    } else if (h < 2 / 3) {\n        h -= 1 / 3;\n        r = (1 - s) / 3;\n        g = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n        b = 1 - (r + g);\n    } else {\n        h -= 2 / 3;\n        g = (1 - s) / 3;\n        b = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3;\n        r = 1 - (g + b);\n    }\n    r = limit(i * r * 3);\n    g = limit(i * g * 3);\n    b = limit(i * b * 3);\n    return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsi2rgb;\n","import { unpack, TWOPI } from '../../utils/index.js';\nconst { min, sqrt, acos } = Math;\n\nconst rgb2hsi = (...args) => {\n    /*\n    borrowed from here:\n    http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/rgb2hsi.cpp\n    */\n    let [r, g, b] = unpack(args, 'rgb');\n    r /= 255;\n    g /= 255;\n    b /= 255;\n    let h;\n    const min_ = min(r, g, b);\n    const i = (r + g + b) / 3;\n    const s = i > 0 ? 1 - min_ / i : 0;\n    if (s === 0) {\n        h = NaN;\n    } else {\n        h = (r - g + (r - b)) / 2;\n        h /= sqrt((r - g) * (r - g) + (r - b) * (g - b));\n        h = acos(h);\n        if (b > g) {\n            h = TWOPI - h;\n        }\n        h /= TWOPI;\n    }\n    return [h * 360, s, i];\n};\n\nexport default rgb2hsi;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsi2rgb from './hsi2rgb.js';\nimport rgb2hsi from './rgb2hsi.js';\n\nColor.prototype.hsi = function () {\n    return rgb2hsi(this._rgb);\n};\n\nconst hsi = (...args) => new Color(...args, 'hsi');\nchroma.hsi = hsi;\n\ninput.format.hsi = hsi2rgb;\n\ninput.autodetect.push({\n    p: 2,\n    test: (...args) => {\n        args = unpack(args, 'hsi');\n        if (type(args) === 'array' && args.length === 3) {\n            return 'hsi';\n        }\n    }\n});\n\nexport { hsi };\n","import '../io/hsi/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsi = (col1, col2, f) => {\n    return interpolate_hsx(col1, col2, f, 'hsi');\n};\n\n// register interpolator\nindex.hsi = hsi;\n\nexport default hsi;\n","import { unpack } from '../../utils/index.js';\n\nconst hsl2rgb = (...args) => {\n    args = unpack(args, 'hsl');\n    const [h, s, l] = args;\n    let r, g, b;\n    if (s === 0) {\n        r = g = b = l * 255;\n    } else {\n        const t3 = [0, 0, 0];\n        const c = [0, 0, 0];\n        const t2 = l < 0.5 ? l * (1 + s) : l + s - l * s;\n        const t1 = 2 * l - t2;\n        const h_ = h / 360;\n        t3[0] = h_ + 1 / 3;\n        t3[1] = h_;\n        t3[2] = h_ - 1 / 3;\n        for (let i = 0; i < 3; i++) {\n            if (t3[i] < 0) t3[i] += 1;\n            if (t3[i] > 1) t3[i] -= 1;\n            if (6 * t3[i] < 1) c[i] = t1 + (t2 - t1) * 6 * t3[i];\n            else if (2 * t3[i] < 1) c[i] = t2;\n            else if (3 * t3[i] < 2) c[i] = t1 + (t2 - t1) * (2 / 3 - t3[i]) * 6;\n            else c[i] = t1;\n        }\n        [r, g, b] = [c[0] * 255, c[1] * 255, c[2] * 255];\n    }\n    if (args.length > 3) {\n        // keep alpha channel\n        return [r, g, b, args[3]];\n    }\n    return [r, g, b, 1];\n};\n\nexport default hsl2rgb;\n","import { unpack, min, max } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - rgb2hsl(r,g,b)\n * - rgb2hsl(r,g,b,a)\n * - rgb2hsl([r,g,b])\n * - rgb2hsl([r,g,b,a])\n * - rgb2hsl({r,g,b,a})\n */\nconst rgb2hsl = (...args) => {\n    args = unpack(args, 'rgba');\n    let [r, g, b] = args;\n\n    r /= 255;\n    g /= 255;\n    b /= 255;\n\n    const minRgb = min(r, g, b);\n    const maxRgb = max(r, g, b);\n\n    const l = (maxRgb + minRgb) / 2;\n    let s, h;\n\n    if (maxRgb === minRgb) {\n        s = 0;\n        h = Number.NaN;\n    } else {\n        s =\n            l < 0.5\n                ? (maxRgb - minRgb) / (maxRgb + minRgb)\n                : (maxRgb - minRgb) / (2 - maxRgb - minRgb);\n    }\n\n    if (r == maxRgb) h = (g - b) / (maxRgb - minRgb);\n    else if (g == maxRgb) h = 2 + (b - r) / (maxRgb - minRgb);\n    else if (b == maxRgb) h = 4 + (r - g) / (maxRgb - minRgb);\n\n    h *= 60;\n    if (h < 0) h += 360;\n    if (args.length > 3 && args[3] !== undefined) return [h, s, l, args[3]];\n    return [h, s, l];\n};\n\nexport default rgb2hsl;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsl2rgb from './hsl2rgb.js';\nimport rgb2hsl from './rgb2hsl.js';\n\nColor.prototype.hsl = function () {\n    return rgb2hsl(this._rgb);\n};\n\nconst hsl = (...args) => new Color(...args, 'hsl');\nchroma.hsl = hsl;\n\ninput.format.hsl = hsl2rgb;\n\ninput.autodetect.push({\n    p: 2,\n    test: (...args) => {\n        args = unpack(args, 'hsl');\n        if (type(args) === 'array' && args.length === 3) {\n            return 'hsl';\n        }\n    }\n});\n\nexport { hsl };\n","import '../io/hsl/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsl = (col1, col2, f) => {\n    return interpolate_hsx(col1, col2, f, 'hsl');\n};\n\n// register interpolator\nindex.hsl = hsl;\n\nexport default hsl;\n","import { unpack } from '../../utils/index.js';\nconst { floor } = Math;\n\nconst hsv2rgb = (...args) => {\n    args = unpack(args, 'hsv');\n    let [h, s, v] = args;\n    let r, g, b;\n    v *= 255;\n    if (s === 0) {\n        r = g = b = v;\n    } else {\n        if (h === 360) h = 0;\n        if (h > 360) h -= 360;\n        if (h < 0) h += 360;\n        h /= 60;\n\n        const i = floor(h);\n        const f = h - i;\n        const p = v * (1 - s);\n        const q = v * (1 - s * f);\n        const t = v * (1 - s * (1 - f));\n\n        switch (i) {\n            case 0:\n                [r, g, b] = [v, t, p];\n                break;\n            case 1:\n                [r, g, b] = [q, v, p];\n                break;\n            case 2:\n                [r, g, b] = [p, v, t];\n                break;\n            case 3:\n                [r, g, b] = [p, q, v];\n                break;\n            case 4:\n                [r, g, b] = [t, p, v];\n                break;\n            case 5:\n                [r, g, b] = [v, p, q];\n                break;\n        }\n    }\n    return [r, g, b, args.length > 3 ? args[3] : 1];\n};\n\nexport default hsv2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { min, max } = Math;\n\n/*\n * supported arguments:\n * - rgb2hsv(r,g,b)\n * - rgb2hsv([r,g,b])\n * - rgb2hsv({r,g,b})\n */\nconst rgb2hsl = (...args) => {\n    args = unpack(args, 'rgb');\n    let [r, g, b] = args;\n    const min_ = min(r, g, b);\n    const max_ = max(r, g, b);\n    const delta = max_ - min_;\n    let h, s, v;\n    v = max_ / 255.0;\n    if (max_ === 0) {\n        h = Number.NaN;\n        s = 0;\n    } else {\n        s = delta / max_;\n        if (r === max_) h = (g - b) / delta;\n        if (g === max_) h = 2 + (b - r) / delta;\n        if (b === max_) h = 4 + (r - g) / delta;\n        h *= 60;\n        if (h < 0) h += 360;\n    }\n    return [h, s, v];\n};\n\nexport default rgb2hsl;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport hsv2rgb from './hsv2rgb.js';\nimport rgb2hsv from './rgb2hsv.js';\n\nColor.prototype.hsv = function () {\n    return rgb2hsv(this._rgb);\n};\n\nconst hsv = (...args) => new Color(...args, 'hsv');\nchroma.hsv = hsv;\n\ninput.format.hsv = hsv2rgb;\n\ninput.autodetect.push({\n    p: 2,\n    test: (...args) => {\n        args = unpack(args, 'hsv');\n        if (type(args) === 'array' && args.length === 3) {\n            return 'hsv';\n        }\n    }\n});\n\nexport { hsv };\n","import '../io/hsv/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst hsv = (col1, col2, f) => {\n    return interpolate_hsx(col1, col2, f, 'hsv');\n};\n\n// register interpolator\nindex.hsv = hsv;\n\nexport default hsv;\n","// from https://www.w3.org/TR/css-color-4/multiply-matrices.js\nexport default function multiplyMatrices(A, B) {\n    let m = A.length;\n\n    if (!Array.isArray(A[0])) {\n        // A is vector, convert to [[a, b, c, ...]]\n        A = [A];\n    }\n\n    if (!Array.isArray(B[0])) {\n        // B is vector, convert to [[a], [b], [c], ...]]\n        B = B.map((x) => [x]);\n    }\n\n    let p = B[0].length;\n    let B_cols = B[0].map((_, i) => B.map((x) => x[i])); // transpose B\n    let product = A.map((row) =>\n        B_cols.map((col) => {\n            if (!Array.isArray(row)) {\n                return col.reduce((a, c) => a + c * row, 0);\n            }\n\n            return row.reduce((a, c, i) => a + c * (col[i] || 0), 0);\n        })\n    );\n\n    if (m === 1) {\n        product = product[0]; // Avoid [[a, b, c, ...]]\n    }\n\n    if (p === 1) {\n        return product.map((x) => x[0]); // Avoid [[a], [b], [c], ...]]\n    }\n\n    return product;\n}\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { xyz2rgb } from '../lab/lab2rgb.js';\n\nconst oklab2rgb = (...args) => {\n    args = unpack(args, 'lab');\n    const [L, a, b, ...rest] = args;\n    const [X, Y, Z] = OKLab_to_XYZ([L, a, b]);\n    const [r, g, b_] = xyz2rgb(X, Y, Z);\n    return [r, g, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction OKLab_to_XYZ(OKLab) {\n    // Given OKLab, convert to XYZ relative to D65\n    var LMStoXYZ = [\n        [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],\n        [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],\n        [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816]\n    ];\n    var OKLabtoLMS = [\n        [1.0, 0.3963377773761749, 0.2158037573099136],\n        [1.0, -0.1055613458156586, -0.0638541728258133],\n        [1.0, -0.0894841775298119, -1.2914855480194092]\n    ];\n\n    var LMSnl = multiplyMatrices(OKLabtoLMS, OKLab);\n    return multiplyMatrices(\n        LMStoXYZ,\n        LMSnl.map((c) => c ** 3)\n    );\n}\n\nexport default oklab2rgb;\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { rgb2xyz } from '../lab/rgb2lab.js';\n\nconst rgb2oklab = (...args) => {\n    const [r, g, b, ...rest] = unpack(args, 'rgb');\n    const xyz = rgb2xyz(r, g, b);\n    const oklab = XYZ_to_OKLab(xyz);\n    return [...oklab, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction XYZ_to_OKLab(XYZ) {\n    // Given XYZ relative to D65, convert to OKLab\n    const XYZtoLMS = [\n        [0.819022437996703, 0.3619062600528904, -0.1288737815209879],\n        [0.0329836539323885, 0.9292868615863434, 0.0361446663506424],\n        [0.0481771893596242, 0.2642395317527308, 0.6335478284694309]\n    ];\n    const LMStoOKLab = [\n        [0.210454268309314, 0.7936177747023054, -0.0040720430116193],\n        [1.9779985324311684, -2.4285922420485799, 0.450593709617411],\n        [0.0259040424655478, 0.7827717124575296, -0.8086757549230774]\n    ];\n\n    const LMS = multiplyMatrices(XYZtoLMS, XYZ);\n    // JavaScript Math.cbrt returns a sign-matched cube root\n    // beware if porting to other languages\n    // especially if tempted to use a general power function\n    return multiplyMatrices(\n        LMStoOKLab,\n        LMS.map((c) => Math.cbrt(c))\n    );\n    // L in range [0,1]. For use in CSS, multiply by 100 and add a percent\n}\n\nexport default rgb2oklab;\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklab2rgb from './oklab2rgb.js';\nimport rgb2oklab from './rgb2oklab.js';\n\nColor.prototype.oklab = function () {\n    return rgb2oklab(this._rgb);\n};\n\nconst oklab = (...args) => new Color(...args, 'oklab');\nObject.assign(chroma, { oklab });\n\ninput.format.oklab = oklab2rgb;\n\ninput.autodetect.push({\n    p: 2,\n    test: (...args) => {\n        args = unpack(args, 'oklab');\n        if (type(args) === 'array' && args.length === 3) {\n            return 'oklab';\n        }\n    }\n});\n\nexport { oklab };\n","import '../io/oklab/index.js';\nimport index from './index.js';\nimport Color from '../Color.js';\n\nconst oklab = (col1, col2, f) => {\n    const xyz0 = col1.oklab();\n    const xyz1 = col2.oklab();\n    return new Color(\n        xyz0[0] + f * (xyz1[0] - xyz0[0]),\n        xyz0[1] + f * (xyz1[1] - xyz0[1]),\n        xyz0[2] + f * (xyz1[2] - xyz0[2]),\n        'oklab'\n    );\n};\n\n// register interpolator\nindex.oklab = oklab;\n\nexport default oklab;\n","import '../io/lch/index.js';\nimport interpolate_hsx from './_hsx.js';\nimport index from './index.js';\n\nconst oklch = (col1, col2, f) => {\n    return interpolate_hsx(col1, col2, f, 'oklch');\n};\n\n// register interpolator\nindex.oklch = oklch;\n\nexport default oklch;\n","import Color from '../Color.js';\nimport { clip_rgb } from '../utils/index.js';\n\nconst { pow, sqrt, PI, cos, sin, atan2 } = Math;\n\nexport default (colors, mode = 'lrgb', weights = null) => {\n    const l = colors.length;\n    if (!weights) weights = Array.from(new Array(l)).map(() => 1);\n    // normalize weights\n    const k =\n        l /\n        weights.reduce(function (a, b) {\n            return a + b;\n        });\n    weights.forEach((w, i) => {\n        weights[i] *= k;\n    });\n    // convert colors to Color objects\n    colors = colors.map((c) => new Color(c));\n    if (mode === 'lrgb') {\n        return _average_lrgb(colors, weights);\n    }\n    const first = colors.shift();\n    const xyz = first.get(mode);\n    const cnt = [];\n    let dx = 0;\n    let dy = 0;\n    // initial color\n    for (let i = 0; i < xyz.length; i++) {\n        xyz[i] = (xyz[i] || 0) * weights[0];\n        cnt.push(isNaN(xyz[i]) ? 0 : weights[0]);\n        if (mode.charAt(i) === 'h' && !isNaN(xyz[i])) {\n            const A = (xyz[i] / 180) * PI;\n            dx += cos(A) * weights[0];\n            dy += sin(A) * weights[0];\n        }\n    }\n\n    let alpha = first.alpha() * weights[0];\n    colors.forEach((c, ci) => {\n        const xyz2 = c.get(mode);\n        alpha += c.alpha() * weights[ci + 1];\n        for (let i = 0; i < xyz.length; i++) {\n            if (!isNaN(xyz2[i])) {\n                cnt[i] += weights[ci + 1];\n                if (mode.charAt(i) === 'h') {\n                    const A = (xyz2[i] / 180) * PI;\n                    dx += cos(A) * weights[ci + 1];\n                    dy += sin(A) * weights[ci + 1];\n                } else {\n                    xyz[i] += xyz2[i] * weights[ci + 1];\n                }\n            }\n        }\n    });\n\n    for (let i = 0; i < xyz.length; i++) {\n        if (mode.charAt(i) === 'h') {\n            let A = (atan2(dy / cnt[i], dx / cnt[i]) / PI) * 180;\n            while (A < 0) A += 360;\n            while (A >= 360) A -= 360;\n            xyz[i] = A;\n        } else {\n            xyz[i] = xyz[i] / cnt[i];\n        }\n    }\n    alpha /= l;\n    return new Color(xyz, mode).alpha(alpha > 0.99999 ? 1 : alpha, true);\n};\n\nconst _average_lrgb = (colors, weights) => {\n    const l = colors.length;\n    const xyz = [0, 0, 0, 0];\n    for (let i = 0; i < colors.length; i++) {\n        const col = colors[i];\n        const f = weights[i] / l;\n        const rgb = col._rgb;\n        xyz[0] += pow(rgb[0], 2) * f;\n        xyz[1] += pow(rgb[1], 2) * f;\n        xyz[2] += pow(rgb[2], 2) * f;\n        xyz[3] += rgb[3] * f;\n    }\n    xyz[0] = sqrt(xyz[0]);\n    xyz[1] = sqrt(xyz[1]);\n    xyz[2] = sqrt(xyz[2]);\n    if (xyz[3] > 0.9999999) xyz[3] = 1;\n    return new Color(clip_rgb(xyz));\n};\n","// minimal multi-purpose interface\n\n// @requires utils color analyze\nimport chroma from '../chroma.js';\nimport { limit, type } from '../utils/index.js';\n\nconst { pow } = Math;\n\nexport default function (colors) {\n    // constructor\n    let _mode = 'rgb';\n    let _nacol = chroma('#ccc');\n    let _spread = 0;\n    // const _fixed = false;\n    let _positions = [0, 1];\n    let _domain = [0, 1];\n    let _pos = [];\n    let _padding = [0, 0];\n    let _classes = false;\n    let _colors = [];\n    let _out = false;\n    let _min = 0;\n    let _max = 1;\n    let _correctLightness = false;\n    let _colorCache = {};\n    let _useCache = true;\n    let _gamma = 1;\n\n    // private methods\n\n    const setColors = function (colors) {\n        colors = colors || ['#fff', '#000'];\n        if (\n            colors &&\n            type(colors) === 'string' &&\n            chroma.brewer &&\n            chroma.brewer[colors.toLowerCase()]\n        ) {\n            colors = chroma.brewer[colors.toLowerCase()];\n        }\n        if (type(colors) === 'array') {\n            // handle single color\n            if (colors.length === 1) {\n                colors = [colors[0], colors[0]];\n            }\n            // make a copy of the colors\n            colors = colors.slice(0);\n            // convert to chroma classes\n            for (let c = 0; c < colors.length; c++) {\n                colors[c] = chroma(colors[c]);\n            }\n            // auto-fill color position\n            _pos.length = 0;\n            for (let c = 0; c < colors.length; c++) {\n                _pos.push(c / (colors.length - 1));\n            }\n        }\n        resetCache();\n        return (_colors = colors);\n    };\n\n    const getClass = function (value) {\n        if (_classes != null) {\n            const n = _classes.length - 1;\n            let i = 0;\n            while (i < n && value >= _classes[i]) {\n                i++;\n            }\n            return i - 1;\n        }\n        return 0;\n    };\n\n    let tMapLightness = (t) => t;\n    let tMapDomain = (t) => t;\n\n    // const classifyValue = function(value) {\n    //     let val = value;\n    //     if (_classes.length > 2) {\n    //         const n = _classes.length-1;\n    //         const i = getClass(value);\n    //         const minc = _classes[0] + ((_classes[1]-_classes[0]) * (0 + (_spread * 0.5)));  // center of 1st class\n    //         const maxc = _classes[n-1] + ((_classes[n]-_classes[n-1]) * (1 - (_spread * 0.5)));  // center of last class\n    //         val = _min + ((((_classes[i] + ((_classes[i+1] - _classes[i]) * 0.5)) - minc) / (maxc-minc)) * (_max - _min));\n    //     }\n    //     return val;\n    // };\n\n    const getColor = function (val, bypassMap) {\n        let col, t;\n        if (bypassMap == null) {\n            bypassMap = false;\n        }\n        if (isNaN(val) || val === null) {\n            return _nacol;\n        }\n        if (!bypassMap) {\n            if (_classes && _classes.length > 2) {\n                // find the class\n                const c = getClass(val);\n                t = c / (_classes.length - 2);\n            } else if (_max !== _min) {\n                // just interpolate between min/max\n                t = (val - _min) / (_max - _min);\n            } else {\n                t = 1;\n            }\n        } else {\n            t = val;\n        }\n\n        // domain map\n        t = tMapDomain(t);\n\n        if (!bypassMap) {\n            t = tMapLightness(t); // lightness correction\n        }\n\n        if (_gamma !== 1) {\n            t = pow(t, _gamma);\n        }\n\n        t = _padding[0] + t * (1 - _padding[0] - _padding[1]);\n\n        t = limit(t, 0, 1);\n\n        const k = Math.floor(t * 10000);\n\n        if (_useCache && _colorCache[k]) {\n            col = _colorCache[k];\n        } else {\n            if (type(_colors) === 'array') {\n                //for i in [0.._pos.length-1]\n                for (let i = 0; i < _pos.length; i++) {\n                    const p = _pos[i];\n                    if (t <= p) {\n                        col = _colors[i];\n                        break;\n                    }\n                    if (t >= p && i === _pos.length - 1) {\n                        col = _colors[i];\n                        break;\n                    }\n                    if (t > p && t < _pos[i + 1]) {\n                        t = (t - p) / (_pos[i + 1] - p);\n                        col = chroma.interpolate(\n                            _colors[i],\n                            _colors[i + 1],\n                            t,\n                            _mode\n                        );\n                        break;\n                    }\n                }\n            } else if (type(_colors) === 'function') {\n                col = _colors(t);\n            }\n            if (_useCache) {\n                _colorCache[k] = col;\n            }\n        }\n        return col;\n    };\n\n    var resetCache = () => (_colorCache = {});\n\n    setColors(colors);\n\n    // public interface\n\n    const f = function (v) {\n        const c = chroma(getColor(v));\n        if (_out && c[_out]) {\n            return c[_out]();\n        } else {\n            return c;\n        }\n    };\n\n    f.classes = function (classes) {\n        if (classes != null) {\n            if (type(classes) === 'array') {\n                _classes = classes;\n                _positions = [classes[0], classes[classes.length - 1]];\n            } else {\n                const d = chroma.analyze(_positions);\n                if (classes === 0) {\n                    _classes = [d.min, d.max];\n                } else {\n                    _classes = chroma.limits(d, 'e', classes);\n                }\n            }\n            return f;\n        }\n        return _classes;\n    };\n\n    f.domain = function (domain) {\n        if (!arguments.length) {\n            // return original domain\n            return _domain;\n        }\n        // store original domain so we can return it later\n        _domain = domain.slice(0);\n        _min = domain[0];\n        _max = domain[domain.length - 1];\n        _pos = [];\n        const k = _colors.length;\n        if (domain.length === k && _min !== _max) {\n            // update positions\n            for (let d of Array.from(domain)) {\n                _pos.push((d - _min) / (_max - _min));\n            }\n        } else {\n            for (let c = 0; c < k; c++) {\n                _pos.push(c / (k - 1));\n            }\n            if (domain.length > 2) {\n                // set domain map\n                const tOut = domain.map((d, i) => i / (domain.length - 1));\n                const tBreaks = domain.map((d) => (d - _min) / (_max - _min));\n                if (!tBreaks.every((val, i) => tOut[i] === val)) {\n                    tMapDomain = (t) => {\n                        if (t <= 0 || t >= 1) return t;\n                        let i = 0;\n                        while (t >= tBreaks[i + 1]) i++;\n                        const f =\n                            (t - tBreaks[i]) / (tBreaks[i + 1] - tBreaks[i]);\n                        const out = tOut[i] + f * (tOut[i + 1] - tOut[i]);\n                        return out;\n                    };\n                }\n            }\n        }\n        _positions = [_min, _max];\n        return f;\n    };\n\n    f.mode = function (_m) {\n        if (!arguments.length) {\n            return _mode;\n        }\n        _mode = _m;\n        resetCache();\n        return f;\n    };\n\n    f.range = function (colors, _pos) {\n        setColors(colors, _pos);\n        return f;\n    };\n\n    f.out = function (_o) {\n        _out = _o;\n        return f;\n    };\n\n    f.spread = function (val) {\n        if (!arguments.length) {\n            return _spread;\n        }\n        _spread = val;\n        return f;\n    };\n\n    f.correctLightness = function (v) {\n        if (v == null) {\n            v = true;\n        }\n        _correctLightness = v;\n        resetCache();\n        if (_correctLightness) {\n            tMapLightness = function (t) {\n                const L0 = getColor(0, true).lab()[0];\n                const L1 = getColor(1, true).lab()[0];\n                const pol = L0 > L1;\n                let L_actual = getColor(t, true).lab()[0];\n                const L_ideal = L0 + (L1 - L0) * t;\n                let L_diff = L_actual - L_ideal;\n                let t0 = 0;\n                let t1 = 1;\n                let max_iter = 20;\n                while (Math.abs(L_diff) > 1e-2 && max_iter-- > 0) {\n                    (function () {\n                        if (pol) {\n                            L_diff *= -1;\n                        }\n                        if (L_diff < 0) {\n                            t0 = t;\n                            t += (t1 - t) * 0.5;\n                        } else {\n                            t1 = t;\n                            t += (t0 - t) * 0.5;\n                        }\n                        L_actual = getColor(t, true).lab()[0];\n                        return (L_diff = L_actual - L_ideal);\n                    })();\n                }\n                return t;\n            };\n        } else {\n            tMapLightness = (t) => t;\n        }\n        return f;\n    };\n\n    f.padding = function (p) {\n        if (p != null) {\n            if (type(p) === 'number') {\n                p = [p, p];\n            }\n            _padding = p;\n            return f;\n        } else {\n            return _padding;\n        }\n    };\n\n    f.colors = function (numColors, out) {\n        // If no arguments are given, return the original colors that were provided\n        if (arguments.length < 2) {\n            out = 'hex';\n        }\n        let result = [];\n\n        if (arguments.length === 0) {\n            result = _colors.slice(0);\n        } else if (numColors === 1) {\n            result = [f(0.5)];\n        } else if (numColors > 1) {\n            const dm = _positions[0];\n            const dd = _positions[1] - dm;\n            result = __range__(0, numColors, false).map((i) =>\n                f(dm + (i / (numColors - 1)) * dd)\n            );\n        } else {\n            // returns all colors based on the defined classes\n            colors = [];\n            let samples = [];\n            if (_classes && _classes.length > 2) {\n                for (\n                    let i = 1, end = _classes.length, asc = 1 <= end;\n                    asc ? i < end : i > end;\n                    asc ? i++ : i--\n                ) {\n                    samples.push((_classes[i - 1] + _classes[i]) * 0.5);\n                }\n            } else {\n                samples = _positions;\n            }\n            result = samples.map((v) => f(v));\n        }\n\n        if (chroma[out]) {\n            result = result.map((c) => c[out]());\n        }\n        return result;\n    };\n\n    f.cache = function (c) {\n        if (c != null) {\n            _useCache = c;\n            return f;\n        } else {\n            return _useCache;\n        }\n    };\n\n    f.gamma = function (g) {\n        if (g != null) {\n            _gamma = g;\n            return f;\n        } else {\n            return _gamma;\n        }\n    };\n\n    f.nodata = function (d) {\n        if (d != null) {\n            _nacol = chroma(d);\n            return f;\n        } else {\n            return _nacol;\n        }\n    };\n\n    return f;\n}\n\nfunction __range__(left, right, inclusive) {\n    let range = [];\n    let ascending = left < right;\n    let end = !inclusive ? right : ascending ? right + 1 : right - 1;\n    for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {\n        range.push(i);\n    }\n    return range;\n}\n","//\n// interpolates between a set of colors uzing a bezier spline\n//\n\n// @requires utils lab\nimport Color from '../Color.js';\nimport '../io/lab/index.js';\nimport scale from './scale.js';\n\n// nth row of the pascal triangle\nconst binom_row = function (n) {\n    let row = [1, 1];\n    for (let i = 1; i < n; i++) {\n        let newrow = [1];\n        for (let j = 1; j <= row.length; j++) {\n            newrow[j] = (row[j] || 0) + row[j - 1];\n        }\n        row = newrow;\n    }\n    return row;\n};\n\nconst bezier = function (colors) {\n    let I, lab0, lab1, lab2;\n    colors = colors.map((c) => new Color(c));\n    if (colors.length === 2) {\n        // linear interpolation\n        [lab0, lab1] = colors.map((c) => c.lab());\n        I = function (t) {\n            const lab = [0, 1, 2].map((i) => lab0[i] + t * (lab1[i] - lab0[i]));\n            return new Color(lab, 'lab');\n        };\n    } else if (colors.length === 3) {\n        // quadratic bezier interpolation\n        [lab0, lab1, lab2] = colors.map((c) => c.lab());\n        I = function (t) {\n            const lab = [0, 1, 2].map(\n                (i) =>\n                    (1 - t) * (1 - t) * lab0[i] +\n                    2 * (1 - t) * t * lab1[i] +\n                    t * t * lab2[i]\n            );\n            return new Color(lab, 'lab');\n        };\n    } else if (colors.length === 4) {\n        // cubic bezier interpolation\n        let lab3;\n        [lab0, lab1, lab2, lab3] = colors.map((c) => c.lab());\n        I = function (t) {\n            const lab = [0, 1, 2].map(\n                (i) =>\n                    (1 - t) * (1 - t) * (1 - t) * lab0[i] +\n                    3 * (1 - t) * (1 - t) * t * lab1[i] +\n                    3 * (1 - t) * t * t * lab2[i] +\n                    t * t * t * lab3[i]\n            );\n            return new Color(lab, 'lab');\n        };\n    } else if (colors.length >= 5) {\n        // general case (degree n bezier)\n        let labs, row, n;\n        labs = colors.map((c) => c.lab());\n        n = colors.length - 1;\n        row = binom_row(n);\n        I = function (t) {\n            const u = 1 - t;\n            const lab = [0, 1, 2].map((i) =>\n                labs.reduce(\n                    (sum, el, j) =>\n                        sum + row[j] * u ** (n - j) * t ** j * el[i],\n                    0\n                )\n            );\n            return new Color(lab, 'lab');\n        };\n    } else {\n        throw new RangeError('No point in running bezier with only one color.');\n    }\n    return I;\n};\n\nexport default (colors) => {\n    const f = bezier(colors);\n    f.scale = () => scale(f);\n    return f;\n};\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nconst { round } = Math;\n\nColor.prototype.rgb = function (rnd = true) {\n    if (rnd === false) return this._rgb.slice(0, 3);\n    return this._rgb.slice(0, 3).map(round);\n};\n\nColor.prototype.rgba = function (rnd = true) {\n    return this._rgb.slice(0, 4).map((v, i) => {\n        return i < 3 ? (rnd === false ? v : round(v)) : v;\n    });\n};\n\nconst rgb = (...args) => new Color(...args, 'rgb');\nObject.assign(chroma, { rgb });\n\ninput.format.rgb = (...args) => {\n    const rgba = unpack(args, 'rgba');\n    if (rgba[3] === undefined) rgba[3] = 1;\n    return rgba;\n};\n\ninput.autodetect.push({\n    p: 3,\n    test: (...args) => {\n        args = unpack(args, 'rgba');\n        if (\n            type(args) === 'array' &&\n            (args.length === 3 ||\n                (args.length === 4 &&\n                    type(args[3]) == 'number' &&\n                    args[3] >= 0 &&\n                    args[3] <= 1))\n        ) {\n            return 'rgb';\n        }\n    }\n});\n\nexport { rgb };\n","/*\n * interpolates between a set of colors uzing a bezier spline\n * blend mode formulas taken from https://web.archive.org/web/20180110014946/http://www.venture-ware.com/kevin/coding/lets-learn-math-photoshop-blend-modes/\n */\n\nimport '../io/rgb/index.js';\nimport chroma from '../chroma.js';\n\nconst blend = (bottom, top, mode) => {\n    if (!blend[mode]) {\n        throw new Error('unknown blend mode ' + mode);\n    }\n    return blend[mode](bottom, top);\n};\n\nconst blend_f = (f) => (bottom, top) => {\n    const c0 = chroma(top).rgb();\n    const c1 = chroma(bottom).rgb();\n    return chroma.rgb(f(c0, c1));\n};\n\nconst each = (f) => (c0, c1) => {\n    const out = [];\n    out[0] = f(c0[0], c1[0]);\n    out[1] = f(c0[1], c1[1]);\n    out[2] = f(c0[2], c1[2]);\n    return out;\n};\n\nconst normal = (a) => a;\nconst multiply = (a, b) => (a * b) / 255;\nconst darken = (a, b) => (a > b ? b : a);\nconst lighten = (a, b) => (a > b ? a : b);\nconst screen = (a, b) => 255 * (1 - (1 - a / 255) * (1 - b / 255));\nconst overlay = (a, b) =>\n    b < 128 ? (2 * a * b) / 255 : 255 * (1 - 2 * (1 - a / 255) * (1 - b / 255));\nconst burn = (a, b) => 255 * (1 - (1 - b / 255) / (a / 255));\nconst dodge = (a, b) => {\n    if (a === 255) return 255;\n    a = (255 * (b / 255)) / (1 - a / 255);\n    return a > 255 ? 255 : a;\n};\n\n// # add = (a,b) ->\n// #     if (a + b > 255) then 255 else a + b\n\nblend.normal = blend_f(each(normal));\nblend.multiply = blend_f(each(multiply));\nblend.screen = blend_f(each(screen));\nblend.overlay = blend_f(each(overlay));\nblend.darken = blend_f(each(darken));\nblend.lighten = blend_f(each(lighten));\nblend.dodge = blend_f(each(dodge));\nblend.burn = blend_f(each(burn));\n// blend.add = blend_f(each(add));\n\nexport default blend;\n","// cubehelix interpolation\n// based on D.A. Green \"A colour scheme for the display of astronomical intensity images\"\n// http://astron-soc.in/bulletin/11June/289392011.pdf\nimport { type, clip_rgb, TWOPI } from '../utils/index.js';\nimport chroma from '../chroma.js';\nconst { pow, sin, cos } = Math;\n\nexport default function (\n    start = 300,\n    rotations = -1.5,\n    hue = 1,\n    gamma = 1,\n    lightness = [0, 1]\n) {\n    let dh = 0,\n        dl;\n    if (type(lightness) === 'array') {\n        dl = lightness[1] - lightness[0];\n    } else {\n        dl = 0;\n        lightness = [lightness, lightness];\n    }\n    const f = function (fract) {\n        const a = TWOPI * ((start + 120) / 360 + rotations * fract);\n        const l = pow(lightness[0] + dl * fract, gamma);\n        const h = dh !== 0 ? hue[0] + fract * dh : hue;\n        const amp = (h * l * (1 - l)) / 2;\n        const cos_a = cos(a);\n        const sin_a = sin(a);\n        const r = l + amp * (-0.14861 * cos_a + 1.78277 * sin_a);\n        const g = l + amp * (-0.29227 * cos_a - 0.90649 * sin_a);\n        const b = l + amp * (+1.97294 * cos_a);\n        return chroma(clip_rgb([r * 255, g * 255, b * 255, 1]));\n    };\n    f.start = function (s) {\n        if (s == null) {\n            return start;\n        }\n        start = s;\n        return f;\n    };\n    f.rotations = function (r) {\n        if (r == null) {\n            return rotations;\n        }\n        rotations = r;\n        return f;\n    };\n    f.gamma = function (g) {\n        if (g == null) {\n            return gamma;\n        }\n        gamma = g;\n        return f;\n    };\n    f.hue = function (h) {\n        if (h == null) {\n            return hue;\n        }\n        hue = h;\n        if (type(hue) === 'array') {\n            dh = hue[1] - hue[0];\n            if (dh === 0) {\n                hue = hue[1];\n            }\n        } else {\n            dh = 0;\n        }\n        return f;\n    };\n    f.lightness = function (h) {\n        if (h == null) {\n            return lightness;\n        }\n        if (type(h) === 'array') {\n            lightness = h;\n            dl = h[1] - h[0];\n        } else {\n            lightness = [h, h];\n            dl = 0;\n        }\n        return f;\n    };\n    f.scale = () => chroma.scale(f);\n    f.hue(hue);\n    return f;\n}\n","import Color from '../Color.js';\nconst digits = '0123456789abcdef';\n\nconst { floor, random } = Math;\n\n/**\n * Generates a random color.\n * @param {() => number} rng - A random number generator function.\n */\nexport default (rng = random) => {\n    let code = '#';\n    for (let i = 0; i < 6; i++) {\n        code += digits.charAt(floor(rng() * 16));\n    }\n    return new Color(code, 'hex');\n};\n","import type from './type.js';\n\nconst { log, pow, floor, abs } = Math;\n\nexport function analyze(data, key = null) {\n    const r = {\n        min: Number.MAX_VALUE,\n        max: Number.MAX_VALUE * -1,\n        sum: 0,\n        values: [],\n        count: 0\n    };\n    if (type(data) === 'object') {\n        data = Object.values(data);\n    }\n    data.forEach((val) => {\n        if (key && type(val) === 'object') val = val[key];\n        if (val !== undefined && val !== null && !isNaN(val)) {\n            r.values.push(val);\n            r.sum += val;\n            if (val < r.min) r.min = val;\n            if (val > r.max) r.max = val;\n            r.count += 1;\n        }\n    });\n\n    r.domain = [r.min, r.max];\n\n    r.limits = (mode, num) => limits(r, mode, num);\n\n    return r;\n}\n\nexport function limits(data, mode = 'equal', num = 7) {\n    if (type(data) == 'array') {\n        data = analyze(data);\n    }\n    const { min, max } = data;\n    const values = data.values.sort((a, b) => a - b);\n\n    if (num === 1) {\n        return [min, max];\n    }\n\n    const limits = [];\n\n    if (mode.substr(0, 1) === 'c') {\n        // continuous\n        limits.push(min);\n        limits.push(max);\n    }\n\n    if (mode.substr(0, 1) === 'e') {\n        // equal interval\n        limits.push(min);\n        for (let i = 1; i < num; i++) {\n            limits.push(min + (i / num) * (max - min));\n        }\n        limits.push(max);\n    } else if (mode.substr(0, 1) === 'l') {\n        // log scale\n        if (min <= 0) {\n            throw new Error(\n                'Logarithmic scales are only possible for values > 0'\n            );\n        }\n        const min_log = Math.LOG10E * log(min);\n        const max_log = Math.LOG10E * log(max);\n        limits.push(min);\n        for (let i = 1; i < num; i++) {\n            limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n        }\n        limits.push(max);\n    } else if (mode.substr(0, 1) === 'q') {\n        // quantile scale\n        limits.push(min);\n        for (let i = 1; i < num; i++) {\n            const p = ((values.length - 1) * i) / num;\n            const pb = floor(p);\n            if (pb === p) {\n                limits.push(values[pb]);\n            } else {\n                // p > pb\n                const pr = p - pb;\n                limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n            }\n        }\n        limits.push(max);\n    } else if (mode.substr(0, 1) === 'k') {\n        // k-means clustering\n        /*\n        implementation based on\n        http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n        simplified for 1-d input values\n        */\n        let cluster;\n        const n = values.length;\n        const assignments = new Array(n);\n        const clusterSizes = new Array(num);\n        let repeat = true;\n        let nb_iters = 0;\n        let centroids = null;\n\n        // get seed values\n        centroids = [];\n        centroids.push(min);\n        for (let i = 1; i < num; i++) {\n            centroids.push(min + (i / num) * (max - min));\n        }\n        centroids.push(max);\n\n        while (repeat) {\n            // assignment step\n            for (let j = 0; j < num; j++) {\n                clusterSizes[j] = 0;\n            }\n            for (let i = 0; i < n; i++) {\n                const value = values[i];\n                let mindist = Number.MAX_VALUE;\n                let best;\n                for (let j = 0; j < num; j++) {\n                    const dist = abs(centroids[j] - value);\n                    if (dist < mindist) {\n                        mindist = dist;\n                        best = j;\n                    }\n                    clusterSizes[best]++;\n                    assignments[i] = best;\n                }\n            }\n\n            // update centroids step\n            const newCentroids = new Array(num);\n            for (let j = 0; j < num; j++) {\n                newCentroids[j] = null;\n            }\n            for (let i = 0; i < n; i++) {\n                cluster = assignments[i];\n                if (newCentroids[cluster] === null) {\n                    newCentroids[cluster] = values[i];\n                } else {\n                    newCentroids[cluster] += values[i];\n                }\n            }\n            for (let j = 0; j < num; j++) {\n                newCentroids[j] *= 1 / clusterSizes[j];\n            }\n\n            // check convergence\n            repeat = false;\n            for (let j = 0; j < num; j++) {\n                if (newCentroids[j] !== centroids[j]) {\n                    repeat = true;\n                    break;\n                }\n            }\n\n            centroids = newCentroids;\n            nb_iters++;\n\n            if (nb_iters > 200) {\n                repeat = false;\n            }\n        }\n\n        // finished k-means clustering\n        // the next part is borrowed from gabrielflor.it\n        const kClusters = {};\n        for (let j = 0; j < num; j++) {\n            kClusters[j] = [];\n        }\n        for (let i = 0; i < n; i++) {\n            cluster = assignments[i];\n            kClusters[cluster].push(values[i]);\n        }\n        let tmpKMeansBreaks = [];\n        for (let j = 0; j < num; j++) {\n            tmpKMeansBreaks.push(kClusters[j][0]);\n            tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n        }\n        tmpKMeansBreaks = tmpKMeansBreaks.sort((a, b) => a - b);\n        limits.push(tmpKMeansBreaks[0]);\n        for (let i = 1; i < tmpKMeansBreaks.length; i += 2) {\n            const v = tmpKMeansBreaks[i];\n            if (!isNaN(v) && limits.indexOf(v) === -1) {\n                limits.push(v);\n            }\n        }\n    }\n    return limits;\n}\n","import Color from '../Color.js';\nimport '../ops/luminance.js';\n\nexport default (a, b) => {\n    // WCAG contrast ratio\n    // see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n    a = new Color(a);\n    b = new Color(b);\n    const l1 = a.luminance();\n    const l2 = b.luminance();\n    return l1 > l2 ? (l1 + 0.05) / (l2 + 0.05) : (l2 + 0.05) / (l1 + 0.05);\n};\n","import Color from '../Color.js';\nimport mix from '../generator/mix.js';\n\n/**\n * @license\n *\n * The APCA contrast prediction algorithm is based of the formulas published\n * in the APCA-1.0.98G specification by Myndex. The specification is available at:\n * https://raw.githubusercontent.com/Myndex/apca-w3/master/images/APCAw3_0.1.17_APCA0.0.98G.svg\n *\n * Note that the APCA implementation is still beta, so please update to\n * future versions of chroma.js when they become available.\n *\n * You can read more about the APCA Readability Criterion at\n * https://readtech.org/ARC/\n */\n\n// constants\nconst W_offset = 0.027;\nconst P_in = 0.0005;\nconst P_out = 0.1;\nconst R_scale = 1.14;\nconst B_threshold = 0.022;\nconst B_exp = 1.414;\n\nexport default (text, bg) => {\n    // parse input colors\n    text = new Color(text);\n    bg = new Color(bg);\n    // if text color has alpha, blend against background\n    if (text.alpha() < 1) {\n        text = mix(bg, text, text.alpha(), 'rgb');\n    }\n    const l_text = lum(...text.rgb());\n    const l_bg = lum(...bg.rgb());\n\n    // soft clamp black levels\n    const Y_text =\n        l_text >= B_threshold\n            ? l_text\n            : l_text + Math.pow(B_threshold - l_text, B_exp);\n    const Y_bg =\n        l_bg >= B_threshold ? l_bg : l_bg + Math.pow(B_threshold - l_bg, B_exp);\n\n    // normal polarity (dark text on light background)\n    const S_norm = Math.pow(Y_bg, 0.56) - Math.pow(Y_text, 0.57);\n    // reverse polarity (light text on dark background)\n    const S_rev = Math.pow(Y_bg, 0.65) - Math.pow(Y_text, 0.62);\n    // clamp noise then scale\n    const C =\n        Math.abs(Y_bg - Y_text) < P_in\n            ? 0\n            : Y_text < Y_bg\n              ? S_norm * R_scale\n              : S_rev * R_scale;\n    // clamp minimum contrast then offset\n    const S_apc = Math.abs(C) < P_out ? 0 : C > 0 ? C - W_offset : C + W_offset;\n    // scale to 100\n    return S_apc * 100;\n};\n\nfunction lum(r, g, b) {\n    return (\n        0.2126729 * Math.pow(r / 255, 2.4) +\n        0.7151522 * Math.pow(g / 255, 2.4) +\n        0.072175 * Math.pow(b / 255, 2.4)\n    );\n}\n","import Color from '../Color.js';\nconst { sqrt, pow, min, max, atan2, abs, cos, sin, exp, PI } = Math;\n\nexport default function (a, b, Kl = 1, Kc = 1, Kh = 1) {\n    // Delta E (CIE 2000)\n    // see http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html\n    var rad2deg = function (rad) {\n        return (360 * rad) / (2 * PI);\n    };\n    var deg2rad = function (deg) {\n        return (2 * PI * deg) / 360;\n    };\n    a = new Color(a);\n    b = new Color(b);\n    const [L1, a1, b1] = Array.from(a.lab());\n    const [L2, a2, b2] = Array.from(b.lab());\n    const avgL = (L1 + L2) / 2;\n    const C1 = sqrt(pow(a1, 2) + pow(b1, 2));\n    const C2 = sqrt(pow(a2, 2) + pow(b2, 2));\n    const avgC = (C1 + C2) / 2;\n    const G = 0.5 * (1 - sqrt(pow(avgC, 7) / (pow(avgC, 7) + pow(25, 7))));\n    const a1p = a1 * (1 + G);\n    const a2p = a2 * (1 + G);\n    const C1p = sqrt(pow(a1p, 2) + pow(b1, 2));\n    const C2p = sqrt(pow(a2p, 2) + pow(b2, 2));\n    const avgCp = (C1p + C2p) / 2;\n    const arctan1 = rad2deg(atan2(b1, a1p));\n    const arctan2 = rad2deg(atan2(b2, a2p));\n    const h1p = arctan1 >= 0 ? arctan1 : arctan1 + 360;\n    const h2p = arctan2 >= 0 ? arctan2 : arctan2 + 360;\n    const avgHp =\n        abs(h1p - h2p) > 180 ? (h1p + h2p + 360) / 2 : (h1p + h2p) / 2;\n    const T =\n        1 -\n        0.17 * cos(deg2rad(avgHp - 30)) +\n        0.24 * cos(deg2rad(2 * avgHp)) +\n        0.32 * cos(deg2rad(3 * avgHp + 6)) -\n        0.2 * cos(deg2rad(4 * avgHp - 63));\n    let deltaHp = h2p - h1p;\n    deltaHp =\n        abs(deltaHp) <= 180\n            ? deltaHp\n            : h2p <= h1p\n              ? deltaHp + 360\n              : deltaHp - 360;\n    deltaHp = 2 * sqrt(C1p * C2p) * sin(deg2rad(deltaHp) / 2);\n    const deltaL = L2 - L1;\n    const deltaCp = C2p - C1p;\n    const sl = 1 + (0.015 * pow(avgL - 50, 2)) / sqrt(20 + pow(avgL - 50, 2));\n    const sc = 1 + 0.045 * avgCp;\n    const sh = 1 + 0.015 * avgCp * T;\n    const deltaTheta = 30 * exp(-pow((avgHp - 275) / 25, 2));\n    const Rc = 2 * sqrt(pow(avgCp, 7) / (pow(avgCp, 7) + pow(25, 7)));\n    const Rt = -Rc * sin(2 * deg2rad(deltaTheta));\n    const result = sqrt(\n        pow(deltaL / (Kl * sl), 2) +\n            pow(deltaCp / (Kc * sc), 2) +\n            pow(deltaHp / (Kh * sh), 2) +\n            Rt * (deltaCp / (Kc * sc)) * (deltaHp / (Kh * sh))\n    );\n    return max(0, min(100, result));\n}\n","import Color from '../Color.js';\n\n// simple Euclidean distance\nexport default function (a, b, mode = 'lab') {\n    // Delta E (CIE 1976)\n    // see http://www.brucelindbloom.com/index.html?Equations.html\n    a = new Color(a);\n    b = new Color(b);\n    const l1 = a.get(mode);\n    const l2 = b.get(mode);\n    let sum_sq = 0;\n    for (let i in l1) {\n        const d = (l1[i] || 0) - (l2[i] || 0);\n        sum_sq += d * d;\n    }\n    return Math.sqrt(sum_sq);\n}\n","import Color from '../Color.js';\n\nexport default (...args) => {\n    try {\n        new Color(...args);\n        return true;\n        // eslint-disable-next-line\n    } catch (e) {\n        return false;\n    }\n};\n","// some pre-defined color scales:\nimport chroma from '../chroma.js';\nimport '../io/hsl/index.js';\nimport scale from '../generator/scale.js';\n\nexport default {\n    cool() {\n        return scale([chroma.hsl(180, 1, 0.9), chroma.hsl(250, 0.7, 0.4)]);\n    },\n    hot() {\n        return scale(['#000', '#f00', '#ff0', '#fff'], [0, 0.25, 0.75, 1]).mode(\n            'rgb'\n        );\n    }\n};\n","/**\n    ColorBrewer colors for chroma.js\n\n    Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The\n    Pennsylvania State University.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n    http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software distributed\n    under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n    CONDITIONS OF ANY KIND, either express or implied. See the License for the\n    specific language governing permissions and limitations under the License.\n*/\n\nconst colorbrewer = {\n    // sequential\n    OrRd: ['#fff7ec', '#fee8c8', '#fdd49e', '#fdbb84', '#fc8d59', '#ef6548', '#d7301f', '#b30000', '#7f0000'],\n    PuBu: ['#fff7fb', '#ece7f2', '#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#045a8d', '#023858'],\n    BuPu: ['#f7fcfd', '#e0ecf4', '#bfd3e6', '#9ebcda', '#8c96c6', '#8c6bb1', '#88419d', '#810f7c', '#4d004b'],\n    Oranges: ['#fff5eb', '#fee6ce', '#fdd0a2', '#fdae6b', '#fd8d3c', '#f16913', '#d94801', '#a63603', '#7f2704'],\n    BuGn: ['#f7fcfd', '#e5f5f9', '#ccece6', '#99d8c9', '#66c2a4', '#41ae76', '#238b45', '#006d2c', '#00441b'],\n    YlOrBr: ['#ffffe5', '#fff7bc', '#fee391', '#fec44f', '#fe9929', '#ec7014', '#cc4c02', '#993404', '#662506'],\n    YlGn: ['#ffffe5', '#f7fcb9', '#d9f0a3', '#addd8e', '#78c679', '#41ab5d', '#238443', '#006837', '#004529'],\n    Reds: ['#fff5f0', '#fee0d2', '#fcbba1', '#fc9272', '#fb6a4a', '#ef3b2c', '#cb181d', '#a50f15', '#67000d'],\n    RdPu: ['#fff7f3', '#fde0dd', '#fcc5c0', '#fa9fb5', '#f768a1', '#dd3497', '#ae017e', '#7a0177', '#49006a'],\n    Greens: ['#f7fcf5', '#e5f5e0', '#c7e9c0', '#a1d99b', '#74c476', '#41ab5d', '#238b45', '#006d2c', '#00441b'],\n    YlGnBu: ['#ffffd9', '#edf8b1', '#c7e9b4', '#7fcdbb', '#41b6c4', '#1d91c0', '#225ea8', '#253494', '#081d58'],\n    Purples: ['#fcfbfd', '#efedf5', '#dadaeb', '#bcbddc', '#9e9ac8', '#807dba', '#6a51a3', '#54278f', '#3f007d'],\n    GnBu: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4', '#4eb3d3', '#2b8cbe', '#0868ac', '#084081'],\n    Greys: ['#ffffff', '#f0f0f0', '#d9d9d9', '#bdbdbd', '#969696', '#737373', '#525252', '#252525', '#000000'],\n    YlOrRd: ['#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8d3c', '#fc4e2a', '#e31a1c', '#bd0026', '#800026'],\n    PuRd: ['#f7f4f9', '#e7e1ef', '#d4b9da', '#c994c7', '#df65b0', '#e7298a', '#ce1256', '#980043', '#67001f'],\n    Blues: ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'],\n    PuBuGn: ['#fff7fb', '#ece2f0', '#d0d1e6', '#a6bddb', '#67a9cf', '#3690c0', '#02818a', '#016c59', '#014636'],\n    Viridis: ['#440154', '#482777', '#3f4a8a', '#31678e', '#26838f', '#1f9d8a', '#6cce5a', '#b6de2b', '#fee825'],\n\n    // diverging\n    Spectral: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'],\n    RdYlGn: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee08b', '#ffffbf', '#d9ef8b', '#a6d96a', '#66bd63', '#1a9850', '#006837'],\n    RdBu: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#2166ac', '#053061'],\n    PiYG: ['#8e0152', '#c51b7d', '#de77ae', '#f1b6da', '#fde0ef', '#f7f7f7', '#e6f5d0', '#b8e186', '#7fbc41', '#4d9221', '#276419'],\n    PRGn: ['#40004b', '#762a83', '#9970ab', '#c2a5cf', '#e7d4e8', '#f7f7f7', '#d9f0d3', '#a6dba0', '#5aae61', '#1b7837', '#00441b'],\n    RdYlBu: ['#a50026', '#d73027', '#f46d43', '#fdae61', '#fee090', '#ffffbf', '#e0f3f8', '#abd9e9', '#74add1', '#4575b4', '#313695'],\n    BrBG: ['#543005', '#8c510a', '#bf812d', '#dfc27d', '#f6e8c3', '#f5f5f5', '#c7eae5', '#80cdc1', '#35978f', '#01665e', '#003c30'],\n    RdGy: ['#67001f', '#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#ffffff', '#e0e0e0', '#bababa', '#878787', '#4d4d4d', '#1a1a1a'],\n    PuOr: ['#7f3b08', '#b35806', '#e08214', '#fdb863', '#fee0b6', '#f7f7f7', '#d8daeb', '#b2abd2', '#8073ac', '#542788', '#2d004b'],\n\n    // qualitative\n    Set2: ['#66c2a5', '#fc8d62', '#8da0cb', '#e78ac3', '#a6d854', '#ffd92f', '#e5c494', '#b3b3b3'],\n    Accent: ['#7fc97f', '#beaed4', '#fdc086', '#ffff99', '#386cb0', '#f0027f', '#bf5b17', '#666666'],\n    Set1: ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33', '#a65628', '#f781bf', '#999999'],\n    Set3: ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3', '#fdb462', '#b3de69', '#fccde5', '#d9d9d9', '#bc80bd', '#ccebc5', '#ffed6f'],\n    Dark2: ['#1b9e77', '#d95f02', '#7570b3', '#e7298a', '#66a61e', '#e6ab02', '#a6761d', '#666666'],\n    Paired: ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'],\n    Pastel2: ['#b3e2cd', '#fdcdac', '#cbd5e8', '#f4cae4', '#e6f5c9', '#fff2ae', '#f1e2cc', '#cccccc'],\n    Pastel1: ['#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4', '#fed9a6', '#ffffcc', '#e5d8bd', '#fddaec', '#f2f2f2']\n};\n\nconst colorbrewerTypes = Object.keys(colorbrewer);\nconst typeMap = new Map(colorbrewerTypes.map((key) => [key.toLowerCase(), key]));\n\n// use Proxy to allow case-insensitive access to palettes\nconst colorbrewerProxy =\n    typeof Proxy === 'function'\n        ? new Proxy(colorbrewer, {\n              get(target, prop) {\n                  const lower = prop.toLowerCase();\n                  if (typeMap.has(lower)) {\n                      return target[typeMap.get(lower)];\n                  }\n              },\n              getOwnPropertyNames() {\n                  return Object.getOwnPropertyNames(colorbrewerTypes);\n              }\n          })\n        : colorbrewer;\n\nexport default colorbrewerProxy;\n","import { unpack } from '../../utils/index.js';\n\nconst cmyk2rgb = (...args) => {\n    args = unpack(args, 'cmyk');\n    const [c, m, y, k] = args;\n    const alpha = args.length > 4 ? args[4] : 1;\n    if (k === 1) return [0, 0, 0, alpha];\n    return [\n        c >= 1 ? 0 : 255 * (1 - c) * (1 - k), // r\n        m >= 1 ? 0 : 255 * (1 - m) * (1 - k), // g\n        y >= 1 ? 0 : 255 * (1 - y) * (1 - k), // b\n        alpha\n    ];\n};\n\nexport default cmyk2rgb;\n","import { unpack } from '../../utils/index.js';\nconst { max } = Math;\n\nconst rgb2cmyk = (...args) => {\n    let [r, g, b] = unpack(args, 'rgb');\n    r = r / 255;\n    g = g / 255;\n    b = b / 255;\n    const k = 1 - max(r, max(g, b));\n    const f = k < 1 ? 1 / (1 - k) : 0;\n    const c = (1 - r - k) * f;\n    const m = (1 - g - k) * f;\n    const y = (1 - b - k) * f;\n    return [c, m, y, k];\n};\n\nexport default rgb2cmyk;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { unpack, type } from '../../utils/index.js';\nimport cmyk2rgb from './cmyk2rgb.js';\nimport rgb2cmyk from './rgb2cmyk.js';\n\nColor.prototype.cmyk = function () {\n    return rgb2cmyk(this._rgb);\n};\n\nconst cmyk = (...args) => new Color(...args, 'cmyk');\nObject.assign(chroma, { cmyk });\n\ninput.format.cmyk = cmyk2rgb;\n\ninput.autodetect.push({\n    p: 2,\n    test: (...args) => {\n        args = unpack(args, 'cmyk');\n        if (type(args) === 'array' && args.length === 4) {\n            return 'cmyk';\n        }\n    }\n});\n\nexport { cmyk };\n","import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - hsl2css(h,s,l)\n * - hsl2css(h,s,l,a)\n * - hsl2css([h,s,l], mode)\n * - hsl2css([h,s,l,a], mode)\n * - hsl2css({h,s,l,a}, mode)\n */\nconst hsl2css = (...args) => {\n    const hsla = unpack(args, 'hsla');\n    let mode = last(args) || 'lsa';\n    hsla[0] = rnd2(hsla[0] || 0) + 'deg';\n    hsla[1] = rnd2(hsla[1] * 100) + '%';\n    hsla[2] = rnd2(hsla[2] * 100) + '%';\n    if (mode === 'hsla' || (hsla.length > 3 && hsla[3] < 1)) {\n        hsla[3] = '/ ' + (hsla.length > 3 ? hsla[3] : 1);\n        mode = 'hsla';\n    } else {\n        hsla.length = 3;\n    }\n    return `${mode.substr(0, 3)}(${hsla.join(' ')})`;\n};\n\nexport default hsl2css;\n","import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - lab2css(l,a,b)\n * - lab2css(l,a,b,alpha)\n * - lab2css([l,a,b], mode)\n * - lab2css([l,a,b,alpha], mode)\n */\nconst lab2css = (...args) => {\n    const laba = unpack(args, 'lab');\n    let mode = last(args) || 'lab';\n    laba[0] = rnd2(laba[0]) + '%';\n    laba[1] = rnd2(laba[1]);\n    laba[2] = rnd2(laba[2]);\n    if (mode === 'laba' || (laba.length > 3 && laba[3] < 1)) {\n        laba[3] = '/ ' + (laba.length > 3 ? laba[3] : 1);\n    } else {\n        laba.length = 3;\n    }\n    return `lab(${laba.join(' ')})`;\n};\n\nexport default lab2css;\n","import { unpack, last, rnd2 } from '../../utils/index.js';\n\n/*\n * supported arguments:\n * - lab2css(l,a,b)\n * - lab2css(l,a,b,alpha)\n * - lab2css([l,a,b], mode)\n * - lab2css([l,a,b,alpha], mode)\n */\nconst lch2css = (...args) => {\n    const lcha = unpack(args, 'lch');\n    let mode = last(args) || 'lab';\n    lcha[0] = rnd2(lcha[0]) + '%';\n    lcha[1] = rnd2(lcha[1]);\n    lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue\n    if (mode === 'lcha' || (lcha.length > 3 && lcha[3] < 1)) {\n        lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);\n    } else {\n        lcha.length = 3;\n    }\n    return `lch(${lcha.join(' ')})`;\n};\n\nexport default lch2css;\n","import { unpack, rnd2, rnd3 } from '../../utils/index.js';\n\nconst oklab2css = (...args) => {\n    const laba = unpack(args, 'lab');\n    laba[0] = rnd2(laba[0] * 100) + '%';\n    laba[1] = rnd3(laba[1]);\n    laba[2] = rnd3(laba[2]);\n    if (laba.length > 3 && laba[3] < 1) {\n        laba[3] = '/ ' + (laba.length > 3 ? laba[3] : 1);\n    } else {\n        laba.length = 3;\n    }\n    return `oklab(${laba.join(' ')})`;\n};\n\nexport default oklab2css;\n","import { unpack } from '../../utils/index.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport lab2lch from '../lch/lab2lch.js';\n\nconst rgb2oklch = (...args) => {\n    const [r, g, b, ...rest] = unpack(args, 'rgb');\n    const [l, a, b_] = rgb2oklab(r, g, b);\n    const [L, c, h] = lab2lch(l, a, b_);\n    return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2oklch;\n","import { unpack, rnd2, rnd3 } from '../../utils/index.js';\n\nconst oklch2css = (...args) => {\n    const lcha = unpack(args, 'lch');\n    lcha[0] = rnd2(lcha[0] * 100) + '%';\n    lcha[1] = rnd3(lcha[1]);\n    lcha[2] = isNaN(lcha[2]) ? 'none' : rnd2(lcha[2]) + 'deg'; // add deg unit to hue\n    if (lcha.length > 3 && lcha[3] < 1) {\n        lcha[3] = '/ ' + (lcha.length > 3 ? lcha[3] : 1);\n    } else {\n        lcha.length = 3;\n    }\n    return `oklch(${lcha.join(' ')})`;\n};\n\nexport default oklch2css;\n","import { unpack, last } from '../../utils/index.js';\nimport hsl2css from './hsl2css.js';\nimport rgb2hsl from '../hsl/rgb2hsl.js';\nimport lab2css from './lab2css.js';\nimport rgb2lab from '../lab/rgb2lab.js';\nimport lch2css from './lch2css.js';\nimport rgb2lch from '../lch/rgb2lch.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport oklab2css from './oklab2css.js';\nimport rgb2oklch from '../oklch/rgb2oklch.js';\nimport oklch2css from './oklch2css.js';\nimport { getLabWhitePoint, setLabWhitePoint } from '../lab/lab-constants.js';\nconst { round } = Math;\n\n/*\n * supported arguments:\n * - rgb2css(r,g,b)\n * - rgb2css(r,g,b,a)\n * - rgb2css([r,g,b], mode)\n * - rgb2css([r,g,b,a], mode)\n * - rgb2css({r,g,b,a}, mode)\n */\nconst rgb2css = (...args) => {\n    const rgba = unpack(args, 'rgba');\n    let mode = last(args) || 'rgb';\n    if (mode.substr(0, 3) === 'hsl') {\n        return hsl2css(rgb2hsl(rgba), mode);\n    }\n    if (mode.substr(0, 3) === 'lab') {\n        // change to D50 lab whitepoint since this is what W3C is using for CSS Lab colors\n        const prevWhitePoint = getLabWhitePoint();\n        setLabWhitePoint('d50');\n        const cssColor = lab2css(rgb2lab(rgba), mode);\n        setLabWhitePoint(prevWhitePoint);\n        return cssColor;\n    }\n    if (mode.substr(0, 3) === 'lch') {\n        // change to D50 lab whitepoint since this is what W3C is using for CSS Lab colors\n        const prevWhitePoint = getLabWhitePoint();\n        setLabWhitePoint('d50');\n        const cssColor = lch2css(rgb2lch(rgba), mode);\n        setLabWhitePoint(prevWhitePoint);\n        return cssColor;\n    }\n    if (mode.substr(0, 5) === 'oklab') {\n        return oklab2css(rgb2oklab(rgba));\n    }\n    if (mode.substr(0, 5) === 'oklch') {\n        return oklch2css(rgb2oklch(rgba));\n    }\n    rgba[0] = round(rgba[0]);\n    rgba[1] = round(rgba[1]);\n    rgba[2] = round(rgba[2]);\n    if (mode === 'rgba' || (rgba.length > 3 && rgba[3] < 1)) {\n        rgba[3] = '/ ' + (rgba.length > 3 ? rgba[3] : 1);\n        mode = 'rgba';\n    }\n    return `${mode.substr(0, 3)}(${rgba.slice(0, mode === 'rgb' ? 3 : 4).join(' ')})`;\n};\n\nexport default rgb2css;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from '../lch/lch2lab.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\n\nconst oklch2rgb = (...args) => {\n    args = unpack(args, 'lch');\n    const [l, c, h, ...rest] = args;\n    const [L, a, b_] = lch2lab(l, c, h);\n    const [r, g, b] = oklab2rgb(L, a, b_);\n    return [r, g, b, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default oklch2rgb;\n","import hsl2rgb from '../hsl/hsl2rgb.js';\nimport lab2rgb from '../lab/lab2rgb.js';\nimport lch2rgb from '../lch/lch2rgb.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\nimport oklch2rgb from '../oklch/oklch2rgb.js';\nimport input from '../input.js';\nimport limit from '../../utils/limit.js';\nimport { getLabWhitePoint, setLabWhitePoint } from '../lab/lab-constants.js';\n\nconst INT_OR_PCT = /((?:-?\\d+)|(?:-?\\d+(?:\\.\\d+)?)%|none)/.source;\nconst FLOAT_OR_PCT = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%?)|none)/.source;\nconst PCT = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)%)|none)/.source;\nconst RE_S = /\\s*/.source;\nconst SEP = /\\s+/.source;\nconst COMMA = /\\s*,\\s*/.source;\nconst ANLGE = /((?:-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:deg)?)|none)/.source;\nconst ALPHA = /\\s*(?:\\/\\s*((?:[01]|[01]?\\.\\d+)|\\d+(?:\\.\\d+)?%))?/.source;\n\n// e.g. rgb(250 20 0), rgb(100% 50% 20%), rgb(100% 50% 20% / 0.5)\nconst RE_RGB = new RegExp(\n    '^rgba?\\\\(' +\n        RE_S +\n        [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(SEP) +\n        ALPHA +\n        '\\\\)$'\n);\nconst RE_RGB_LEGACY = new RegExp(\n    '^rgb\\\\(' +\n        RE_S +\n        [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT].join(COMMA) +\n        RE_S +\n        '\\\\)$'\n);\nconst RE_RGBA_LEGACY = new RegExp(\n    '^rgba\\\\(' +\n        RE_S +\n        [INT_OR_PCT, INT_OR_PCT, INT_OR_PCT, FLOAT_OR_PCT].join(COMMA) +\n        RE_S +\n        '\\\\)$'\n);\n\nconst RE_HSL = new RegExp(\n    '^hsla?\\\\(' + RE_S + [ANLGE, PCT, PCT].join(SEP) + ALPHA + '\\\\)$'\n);\nconst RE_HSL_LEGACY = new RegExp(\n    '^hsl?\\\\(' + RE_S + [ANLGE, PCT, PCT].join(COMMA) + RE_S + '\\\\)$'\n);\nconst RE_HSLA_LEGACY =\n    /^hsla\\(\\s*(-?\\d+(?:\\.\\d+)?),\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*(-?\\d+(?:\\.\\d+)?)%\\s*,\\s*([01]|[01]?\\.\\d+)\\)$/;\n\nconst RE_LAB = new RegExp(\n    '^lab\\\\(' +\n        RE_S +\n        [FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +\n        ALPHA +\n        '\\\\)$'\n);\nconst RE_LCH = new RegExp(\n    '^lch\\\\(' +\n        RE_S +\n        [FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +\n        ALPHA +\n        '\\\\)$'\n);\nconst RE_OKLAB = new RegExp(\n    '^oklab\\\\(' +\n        RE_S +\n        [FLOAT_OR_PCT, FLOAT_OR_PCT, FLOAT_OR_PCT].join(SEP) +\n        ALPHA +\n        '\\\\)$'\n);\nconst RE_OKLCH = new RegExp(\n    '^oklch\\\\(' +\n        RE_S +\n        [FLOAT_OR_PCT, FLOAT_OR_PCT, ANLGE].join(SEP) +\n        ALPHA +\n        '\\\\)$'\n);\n\nconst { round } = Math;\n\nconst roundRGB = (rgb) => {\n    return rgb.map((v, i) => (i <= 2 ? limit(round(v), 0, 255) : v));\n};\n\nconst percentToAbsolute = (pct, min = 0, max = 100, signed = false) => {\n    if (typeof pct === 'string' && pct.endsWith('%')) {\n        pct = parseFloat(pct.substring(0, pct.length - 1)) / 100;\n        if (signed) {\n            // signed percentages are in the range -100% to 100%\n            pct = min + (pct + 1) * 0.5 * (max - min);\n        } else {\n            pct = min + pct * (max - min);\n        }\n    }\n    return +pct;\n};\n\nconst noneToValue = (v, noneValue) => {\n    return v === 'none' ? noneValue : v;\n};\n\nconst css2rgb = (css) => {\n    css = css.toLowerCase().trim();\n\n    if (css === 'transparent') {\n        return [0, 0, 0, 0];\n    }\n\n    let m;\n\n    if (input.format.named) {\n        try {\n            return input.format.named(css);\n            // eslint-disable-next-line\n        } catch (e) {}\n    }\n\n    // rgb(250 20 0) or rgb(250,20,0)\n    if ((m = css.match(RE_RGB)) || (m = css.match(RE_RGB_LEGACY))) {\n        let rgb = m.slice(1, 4);\n        for (let i = 0; i < 3; i++) {\n            rgb[i] = +percentToAbsolute(noneToValue(rgb[i], 0), 0, 255);\n        }\n        rgb = roundRGB(rgb);\n        const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n        rgb[3] = alpha; // default alpha\n        return rgb;\n    }\n\n    // rgba(250,20,0,0.4)\n    if ((m = css.match(RE_RGBA_LEGACY))) {\n        const rgb = m.slice(1, 5);\n        for (let i = 0; i < 4; i++) {\n            rgb[i] = +percentToAbsolute(rgb[i], 0, 255);\n        }\n        return rgb;\n    }\n\n    // hsl(0,100%,50%)\n    if ((m = css.match(RE_HSL)) || (m = css.match(RE_HSL_LEGACY))) {\n        const hsl = m.slice(1, 4);\n        hsl[0] = +noneToValue(hsl[0].replace('deg', ''), 0);\n        hsl[1] = +percentToAbsolute(noneToValue(hsl[1], 0), 0, 100) * 0.01;\n        hsl[2] = +percentToAbsolute(noneToValue(hsl[2], 0), 0, 100) * 0.01;\n        const rgb = roundRGB(hsl2rgb(hsl));\n        const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n        rgb[3] = alpha;\n        return rgb;\n    }\n\n    // hsla(0,100%,50%,0.5)\n    if ((m = css.match(RE_HSLA_LEGACY))) {\n        const hsl = m.slice(1, 4);\n        hsl[1] *= 0.01;\n        hsl[2] *= 0.01;\n        const rgb = hsl2rgb(hsl);\n        for (let i = 0; i < 3; i++) {\n            rgb[i] = round(rgb[i]);\n        }\n        rgb[3] = +m[4]; // default alpha = 1\n        return rgb;\n    }\n\n    if ((m = css.match(RE_LAB))) {\n        const lab = m.slice(1, 4);\n        lab[0] = percentToAbsolute(noneToValue(lab[0], 0), 0, 100);\n        lab[1] = percentToAbsolute(noneToValue(lab[1], 0), -125, 125, true);\n        lab[2] = percentToAbsolute(noneToValue(lab[2], 0), -125, 125, true);\n        // convert to D50 Lab whitepoint\n        const wp = getLabWhitePoint();\n        setLabWhitePoint('d50');\n        const rgb = roundRGB(lab2rgb(lab));\n        // convert back to original Lab whitepoint\n        setLabWhitePoint(wp);\n        const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n        rgb[3] = alpha;\n        return rgb;\n    }\n\n    if ((m = css.match(RE_LCH))) {\n        const lch = m.slice(1, 4);\n        lch[0] = percentToAbsolute(lch[0], 0, 100);\n        lch[1] = percentToAbsolute(noneToValue(lch[1], 0), 0, 150, false);\n        lch[2] = +noneToValue(lch[2].replace('deg', ''), 0);\n        // convert to D50 Lab whitepoint\n        const wp = getLabWhitePoint();\n        setLabWhitePoint('d50');\n        const rgb = roundRGB(lch2rgb(lch));\n        // convert back to original Lab whitepoint\n        setLabWhitePoint(wp);\n        const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n        rgb[3] = alpha;\n        return rgb;\n    }\n\n    if ((m = css.match(RE_OKLAB))) {\n        const oklab = m.slice(1, 4);\n        oklab[0] = percentToAbsolute(noneToValue(oklab[0], 0), 0, 1);\n        oklab[1] = percentToAbsolute(noneToValue(oklab[1], 0), -0.4, 0.4, true);\n        oklab[2] = percentToAbsolute(noneToValue(oklab[2], 0), -0.4, 0.4, true);\n        const rgb = roundRGB(oklab2rgb(oklab));\n        const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n        rgb[3] = alpha;\n        return rgb;\n    }\n\n    if ((m = css.match(RE_OKLCH))) {\n        const oklch = m.slice(1, 4);\n        oklch[0] = percentToAbsolute(noneToValue(oklch[0], 0), 0, 1);\n        oklch[1] = percentToAbsolute(noneToValue(oklch[1], 0), 0, 0.4, false);\n        oklch[2] = +noneToValue(oklch[2].replace('deg', ''), 0);\n        const rgb = roundRGB(oklch2rgb(oklch));\n        const alpha = m[4] !== undefined ? +percentToAbsolute(m[4], 0, 1) : 1;\n        rgb[3] = alpha;\n        return rgb;\n    }\n};\n\ncss2rgb.test = (s) => {\n    return (\n        // modern\n        RE_RGB.test(s) ||\n        RE_HSL.test(s) ||\n        RE_LAB.test(s) ||\n        RE_LCH.test(s) ||\n        RE_OKLAB.test(s) ||\n        RE_OKLCH.test(s) ||\n        // legacy\n        RE_RGB_LEGACY.test(s) ||\n        RE_RGBA_LEGACY.test(s) ||\n        RE_HSL_LEGACY.test(s) ||\n        RE_HSLA_LEGACY.test(s) ||\n        s === 'transparent'\n    );\n};\n\nexport default css2rgb;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport { type } from '../../utils/index.js';\n\nimport rgb2css from './rgb2css.js';\nimport css2rgb from './css2rgb.js';\n\nColor.prototype.css = function (mode) {\n    return rgb2css(this._rgb, mode);\n};\n\nconst css = (...args) => new Color(...args, 'css');\nchroma.css = css;\n\ninput.format.css = css2rgb;\n\ninput.autodetect.push({\n    p: 5,\n    test: (h, ...rest) => {\n        if (!rest.length && type(h) === 'string' && css2rgb.test(h)) {\n            return 'css';\n        }\n    }\n});\n\nexport { css };\n","import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport input from '../input.js';\nimport { unpack } from '../../utils/index.js';\n\ninput.format.gl = (...args) => {\n    const rgb = unpack(args, 'rgba');\n    rgb[0] *= 255;\n    rgb[1] *= 255;\n    rgb[2] *= 255;\n    return rgb;\n};\n\nconst gl = (...args) => new Color(...args, 'gl');\nchroma.gl = gl;\n\nColor.prototype.gl = function () {\n    const rgb = this._rgb;\n    return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];\n};\n\nexport { gl };\n","import Color from '../../Color.js';\nimport chroma from '../../chroma.js';\nimport { type } from '../../utils/index.js';\nimport input from '../input.js';\nimport hex2rgb from './hex2rgb.js';\nimport rgb2hex from './rgb2hex.js';\n\nColor.prototype.hex = function (mode) {\n    return rgb2hex(this._rgb, mode);\n};\n\nconst hex = (...args) => new Color(...args, 'hex');\nchroma.hex = hex;\n\ninput.format.hex = hex2rgb;\ninput.autodetect.push({\n    p: 4,\n    test: (h, ...rest) => {\n        if (\n            !rest.length &&\n            type(h) === 'string' &&\n            [3, 4, 5, 6, 7, 8, 9].indexOf(h.length) >= 0\n        ) {\n            return 'hex';\n        }\n    }\n});\n\nexport { hex };\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n */\n\nconst { log } = Math;\n\nconst temperature2rgb = (kelvin) => {\n    const temp = kelvin / 100;\n    let r, g, b;\n    if (temp < 66) {\n        r = 255;\n        g =\n            temp < 6\n                ? 0\n                : -155.25485562709179 -\n                  0.44596950469579133 * (g = temp - 2) +\n                  104.49216199393888 * log(g);\n        b =\n            temp < 20\n                ? 0\n                : -254.76935184120902 +\n                  0.8274096064007395 * (b = temp - 10) +\n                  115.67994401066147 * log(b);\n    } else {\n        r =\n            351.97690566805693 +\n            0.114206453784165 * (r = temp - 55) -\n            40.25366309332127 * log(r);\n        g =\n            325.4494125711974 +\n            0.07943456536662342 * (g = temp - 50) -\n            28.0852963507957 * log(g);\n        b = 255;\n    }\n    return [r, g, b, 1];\n};\n\nexport default temperature2rgb;\n","/*\n * Based on implementation by Neil Bartlett\n * https://github.com/neilbartlett/color-temperature\n **/\n\nimport temperature2rgb from './temperature2rgb.js';\nimport { unpack } from '../../utils/index.js';\nconst { round } = Math;\n\nconst rgb2temperature = (...args) => {\n    const rgb = unpack(args, 'rgb');\n    const r = rgb[0],\n        b = rgb[2];\n    let minTemp = 1000;\n    let maxTemp = 40000;\n    const eps = 0.4;\n    let temp;\n    while (maxTemp - minTemp > eps) {\n        temp = (maxTemp + minTemp) * 0.5;\n        const rgb = temperature2rgb(temp);\n        if (rgb[2] / rgb[0] >= b / r) {\n            maxTemp = temp;\n        } else {\n            minTemp = temp;\n        }\n    }\n    return round(temp);\n};\n\nexport default rgb2temperature;\n","import chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport temperature2rgb from './temperature2rgb.js';\nimport rgb2temperature from './rgb2temperature.js';\n\nColor.prototype.temp =\n    Color.prototype.kelvin =\n    Color.prototype.temperature =\n        function () {\n            return rgb2temperature(this._rgb);\n        };\n\nconst temp = (...args) => new Color(...args, 'temp');\nObject.assign(chroma, { temp, kelvin: temp, temperature: temp });\n\ninput.format.temp =\n    input.format.kelvin =\n    input.format.temperature =\n        temperature2rgb;\n\nexport { temp, temp as kelvin, temp as temperature };\n","import { unpack, type } from '../../utils/index.js';\nimport chroma from '../../chroma.js';\nimport Color from '../../Color.js';\nimport input from '../input.js';\nimport oklch2rgb from './oklch2rgb.js';\nimport rgb2oklch from './rgb2oklch.js';\n\nColor.prototype.oklch = function () {\n    return rgb2oklch(this._rgb);\n};\n\nconst oklch = (...args) => new Color(...args, 'oklch');\nObject.assign(chroma, { oklch });\n\ninput.format.oklch = oklch2rgb;\n\ninput.autodetect.push({\n    p: 2,\n    test: (...args) => {\n        args = unpack(args, 'oklch');\n        if (type(args) === 'array' && args.length === 3) {\n            return 'oklch';\n        }\n    }\n});\n\nexport { oklch };\n","// feel free to comment out anything to rollup\n// a smaller chroma.js bundle\nimport chroma from './src/chroma.js';\n\n// io --> convert colors\nimport './src/io/named/index.js';\n\n// operators --> modify existing Colors\nimport './src/ops/alpha.js';\nimport './src/ops/clipped.js';\nimport './src/ops/darken.js';\nimport './src/ops/get.js';\nimport './src/ops/luminance.js';\nimport './src/ops/mix.js';\nimport './src/ops/premultiply.js';\nimport './src/ops/saturate.js';\nimport './src/ops/set.js';\nimport './src/ops/shade.js';\n\n// interpolators\nimport './src/interpolator/rgb.js';\nimport './src/interpolator/lrgb.js';\nimport './src/interpolator/lab.js';\nimport './src/interpolator/lch.js';\nimport './src/interpolator/num.js';\nimport './src/interpolator/hcg.js';\nimport './src/interpolator/hsi.js';\nimport './src/interpolator/hsl.js';\nimport './src/interpolator/hsv.js';\nimport './src/interpolator/oklab.js';\nimport './src/interpolator/oklch.js';\n\n// generators -- > create new colors\nimport average from './src/generator/average.js';\nimport bezier from './src/generator/bezier.js';\nimport blend from './src/generator/blend.js';\nimport cubehelix from './src/generator/cubehelix.js';\nimport mix from './src/generator/mix.js';\nimport random from './src/generator/random.js';\nimport scale from './src/generator/scale.js';\n\n// other utility methods\nimport { analyze } from './src/utils/analyze.js';\nimport contrast from './src/utils/contrast.js';\nimport contrastAPCA from './src/utils/contrastAPCA.js';\nimport deltaE from './src/utils/delta-e.js';\nimport distance from './src/utils/distance.js';\nimport { limits } from './src/utils/analyze.js';\nimport valid from './src/utils/valid.js';\nimport input from './src/io/input.js';\n\n// scale\nimport scales from './src/utils/scales.js';\n\n// colors\nimport colors from './src/colors/w3cx11.js';\nimport brewer from './src/colors/colorbrewer.js';\nimport Color from './src/Color.js';\n\nObject.assign(chroma, {\n    analyze,\n    average,\n    bezier,\n    blend,\n    brewer,\n    Color,\n    colors,\n    contrast,\n    contrastAPCA,\n    cubehelix,\n    deltaE,\n    distance,\n    input,\n    interpolate: mix,\n    limits,\n    mix,\n    random,\n    scale,\n    scales,\n    valid\n});\n\nexport default chroma;\n\nexport {\n    analyze,\n    average,\n    bezier,\n    blend,\n    brewer,\n    Color,\n    colors,\n    contrast,\n    contrastAPCA,\n    cubehelix,\n    deltaE,\n    distance,\n    input,\n    limits,\n    mix,\n    mix as interpolate,\n    random,\n    scale,\n    scales,\n    valid\n};\n\nexport * from './src/io/cmyk/index.js';\nexport * from './src/io/css/index.js';\nexport * from './src/io/gl/index.js';\nexport * from './src/io/hcg/index.js';\nexport * from './src/io/hex/index.js';\nexport * from './src/io/hsi/index.js';\nexport * from './src/io/hsl/index.js';\nexport * from './src/io/hsv/index.js';\nexport * from './src/io/lab/index.js';\nexport * from './src/io/lch/index.js';\nexport * from './src/io/num/index.js';\nexport * from './src/io/rgb/index.js';\nexport * from './src/io/temp/index.js';\nexport * from './src/io/oklab/index.js';\nexport * from './src/io/oklch/index.js';\n","import chroma from 'chroma-js';\nimport { ThemeKind } from '$hooks/useTheme';\n\nconst clampColor = (\n  lightness: number,\n  lightCap: number,\n  darkCap: number,\n  themeKind: ThemeKind\n): number => {\n  if (themeKind === ThemeKind.Dark && lightness < darkCap) {\n    lightness = darkCap;\n  }\n  if (themeKind === ThemeKind.Light && lightness > lightCap) {\n    lightness = lightCap;\n  }\n  return lightness;\n};\n\nexport const accessibleColor = (themeKind: ThemeKind, color: string): string => {\n  if (!chroma.valid(color)) return color;\n\n  let lightness = chroma(color).lab()[0];\n  lightness = clampColor(lightness, 50, 60, themeKind);\n\n  return chroma(color).set('lab.l', lightness).hex();\n};\n\nexport const accessibleColorWeakCorrection = (themeKind: ThemeKind, color: string): string => {\n  if (!chroma.valid(color)) return color;\n\n  let lightness = chroma(color).lab()[0];\n  lightness = clampColor(lightness, 70, 40, themeKind);\n\n  return chroma(color).set('lab.l', lightness).hex();\n};\n","import { useCallback } from 'react';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { accessibleColor, accessibleColorWeakCorrection } from '$plugins/color';\nimport type { ThemeKind } from './useTheme';\n\nexport const useAccessibleNameColor = (themeKind: ThemeKind) => {\n  const [nameColorLightnessCorrection] = useSetting(settingsAtom, 'nameColorLightnessCorrection');\n\n  return useCallback(\n    (color: string | undefined) => {\n      if (!color || nameColorLightnessCorrection === 'off') {\n        return color;\n      }\n      return nameColorLightnessCorrection === 'strong'\n        ? accessibleColor(themeKind, color)\n        : accessibleColorWeakCorrection(themeKind, color);\n    },\n    [nameColorLightnessCorrection, themeKind]\n  );\n};\n","import type { Room } from '$types/matrix-sdk';\nimport { useMemo } from 'react';\nimport type { MemberPowerTag } from '$types/matrix/room';\n\nimport type { IPowerLevels } from './usePowerLevels';\nimport { useStateEvent } from './useStateEvent';\nimport { CustomStateEvent } from '$types/matrix/room';\n\nexport type PowerLevelTags = Record<number, MemberPowerTag>;\n\nconst powerSortFn = (a: number, b: number) => b - a;\nconst sortPowers = (powers: number[]): number[] => powers.sort(powerSortFn);\n\nexport const getPowers = (tags: PowerLevelTags): number[] => {\n  const powers: number[] = Object.keys(tags)\n    .map((p) => {\n      const power = parseInt(p, 10);\n      if (Number.isNaN(power)) {\n        return undefined;\n      }\n      return power;\n    })\n    .filter((power) => typeof power === 'number');\n\n  return sortPowers(powers);\n};\n\nexport const getUsedPowers = (powerLevels: IPowerLevels): Set<number> => {\n  const powers: Set<number> = new Set();\n\n  const findAndAddPower = (data: Record<string, unknown>) => {\n    Object.keys(data).forEach((key) => {\n      const powerOrAny: unknown = data[key];\n\n      if (typeof powerOrAny === 'number') {\n        powers.add(powerOrAny);\n        return;\n      }\n      if (powerOrAny && typeof powerOrAny === 'object') {\n        findAndAddPower(powerOrAny as Record<string, unknown>);\n      }\n    });\n  };\n\n  findAndAddPower(powerLevels);\n\n  return powers;\n};\n\nconst DEFAULT_TAGS: PowerLevelTags = {\n  9001: {\n    name: 'Goku',\n    color: '#ff6a00',\n  },\n  150: {\n    name: 'Manager',\n    color: '#ff6a7f',\n  },\n  101: {\n    name: 'Founder',\n    color: '#0000ff',\n  },\n  100: {\n    name: 'Admin',\n    color: '#0088ff',\n  },\n  50: {\n    name: 'Moderator',\n    color: '#1fd81f',\n  },\n  0: {\n    name: 'Member',\n    color: '#91cfdf',\n  },\n  [-1]: {\n    name: 'Muted',\n    color: '#888888',\n  },\n};\n\nconst generateFallbackTag = (powerLevelTags: PowerLevelTags, power: number): MemberPowerTag => {\n  const highToLow = sortPowers(getPowers(powerLevelTags));\n\n  const tagPower = highToLow.find((p) => p < power);\n  const tag = typeof tagPower === 'number' ? powerLevelTags[tagPower] : undefined;\n\n  return {\n    name: tag ? `${tag.name} ${power}` : `Team ${power}`,\n  };\n};\n\nexport const usePowerLevelTags = (room: Room, powerLevels: IPowerLevels): PowerLevelTags => {\n  const tagsEvent = useStateEvent(room, CustomStateEvent.PowerLevelTags);\n\n  const powerLevelTags: PowerLevelTags = useMemo(() => {\n    const content = tagsEvent?.getContent();\n    const powerToTags: PowerLevelTags = { ...content };\n\n    const powers = getUsedPowers(powerLevels);\n    Array.from(powers).forEach((power) => {\n      if (powerToTags[power]?.name === undefined) {\n        powerToTags[power] = DEFAULT_TAGS[power] ?? generateFallbackTag(DEFAULT_TAGS, power);\n      }\n    });\n\n    return powerToTags;\n  }, [powerLevels, tagsEvent]);\n\n  return powerLevelTags;\n};\n\nexport const getPowerLevelTag = (\n  powerLevelTags: PowerLevelTags,\n  powerLevel: number\n): MemberPowerTag => {\n  const tag: MemberPowerTag | undefined = powerLevelTags[powerLevel];\n  return tag ?? generateFallbackTag(powerLevelTags, powerLevel);\n};\n","import type { MemberPowerTag } from '$types/matrix/room';\n\nconst DEFAULT_TAG: MemberPowerTag = {\n  name: 'Founder',\n  color: '#0000ff',\n};\n\nexport const useRoomCreatorsTag = (): MemberPowerTag => DEFAULT_TAG;\n","import { useCallback, useMemo } from 'react';\nimport type { MatrixClient, Room, RoomMember } from '$types/matrix-sdk';\nimport type { MemberPowerTag, MemberPowerTagIcon } from '$types/matrix/room';\nimport { useAccessibleNameColor } from './useAccessibleNameColor';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport type { PowerLevelTags } from './usePowerLevelTags';\nimport { getPowerLevelTag, usePowerLevelTags } from './usePowerLevelTags';\nimport type { IPowerLevels } from './usePowerLevels';\nimport { readPowerLevel } from './usePowerLevels';\nimport { useRoomCreatorsTag } from './useRoomCreatorsTag';\nimport type { ThemeKind } from './useTheme';\n\nexport type GetMemberPowerTag = (userId: string) => MemberPowerTag;\n\nexport const useGetMemberPowerTag = (\n  room: Room,\n  creators: Set<string>,\n  powerLevels: IPowerLevels\n) => {\n  const creatorsTag = useRoomCreatorsTag();\n  const powerLevelTags = usePowerLevelTags(room, powerLevels);\n\n  const getMemberPowerTag: GetMemberPowerTag = useCallback(\n    (userId) => {\n      if (creators.has(userId)) {\n        return creatorsTag;\n      }\n\n      const power = readPowerLevel.user(powerLevels, userId);\n      return getPowerLevelTag(powerLevelTags, power);\n    },\n    [creators, creatorsTag, powerLevels, powerLevelTags]\n  );\n\n  return getMemberPowerTag;\n};\n\nexport const getPowerTagIconSrc = (\n  mx: MatrixClient,\n  useAuthentication: boolean,\n  icon: MemberPowerTagIcon\n): string | undefined =>\n  icon?.key?.startsWith('mxc://')\n    ? (mxcUrlToHttp(mx, icon.key, useAuthentication, 96, 96, 'scale') ?? '🌻')\n    : icon?.key;\n\nexport const useAccessiblePowerTagColors = (\n  themeKind: ThemeKind,\n  creatorsTag: MemberPowerTag,\n  powerLevelTags: PowerLevelTags\n): Map<string, string> => {\n  const accessibleNameColor = useAccessibleNameColor(themeKind);\n\n  const accessibleColors: Map<string, string> = useMemo(() => {\n    const colors: Map<string, string> = new Map();\n    if (creatorsTag.color) {\n      colors.set(creatorsTag.color, accessibleNameColor(creatorsTag.color) ?? creatorsTag.color);\n    }\n\n    Object.values(powerLevelTags).forEach((tag) => {\n      const { color } = tag;\n      if (!color) return;\n\n      colors.set(color, accessibleNameColor(color) ?? color);\n    });\n\n    return colors;\n  }, [powerLevelTags, creatorsTag, accessibleNameColor]);\n\n  return accessibleColors;\n};\n\nexport const useFlattenPowerTagMembers = (\n  members: RoomMember[],\n  getTag: GetMemberPowerTag\n): Array<MemberPowerTag | RoomMember> => {\n  const PLTagOrRoomMember = useMemo(() => {\n    let prevTag: MemberPowerTag | undefined;\n    const tagOrMember: Array<MemberPowerTag | RoomMember> = [];\n    members.forEach((member) => {\n      const tag = getTag(member.userId);\n      if (tag !== prevTag) {\n        prevTag = tag;\n        tagOrMember.push(tag);\n      }\n      tagOrMember.push(member);\n    });\n    return tagOrMember;\n  }, [members, getTag]);\n\n  return PLTagOrRoomMember;\n};\n","export function shadeColor(initialColor?: string, percent?: number) {\n  if (!initialColor || initialColor[0] !== '#' || initialColor.length !== 7 || !percent)\n    return undefined;\n  const ratio = 1 + percent / 100;\n\n  // Get hex value, convert it to number, multiply it by the desired amount, then clamp it\n  let R = Math.min(parseInt(initialColor.substring(1, 3), 16) * ratio, 255);\n  let G = Math.min(parseInt(initialColor.substring(3, 5), 16) * ratio, 255);\n  let B = Math.min(parseInt(initialColor.substring(5, 7), 16) * ratio, 255);\n\n  if (R <= 8 && G <= 8 && B <= 8 && percent > 0) {\n    R = R <= 8 ? Math.max(178 - R, 0) : R;\n    G = G <= 8 ? Math.max(178 - G, 0) : G;\n    B = B <= 8 ? Math.max(178 - B, 0) : B;\n  }\n\n  const RR = Math.floor(R).toString(16).padStart(2, '0');\n  const GG = Math.floor(G).toString(16).padStart(2, '0');\n  const BB = Math.floor(B).toString(16).padStart(2, '0');\n\n  return `#${RR}${GG}${BB}`;\n}\n\nexport function areColorsTooSimilar(colorA?: string, colorB?: string) {\n  if (!colorA || !colorB) return false;\n\n  const aR = parseInt(colorA.substring(1, 3), 16);\n  const aG = parseInt(colorA.substring(3, 5), 16);\n  const aB = parseInt(colorA.substring(5, 7), 16);\n  const bR = parseInt(colorB.substring(1, 3), 16);\n  const bG = parseInt(colorB.substring(3, 5), 16);\n  const bB = parseInt(colorB.substring(5, 7), 16);\n\n  return Math.abs(aR - bR) < 32 && Math.abs(aG - bG) < 32 && Math.abs(aB - bB) < 32;\n}\n","import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';\n\nconst TimelineScrollingContext = createContext(false);\n\nexport const TimelineScrollingProvider = TimelineScrollingContext.Provider;\n\nexport const useTimelineScrolling = (): boolean => useContext(TimelineScrollingContext);\n\nexport const useScrollActivity = (\n  idleDelayMs = 300\n): { isScrolling: boolean; notifyScroll: () => void } => {\n  const [isScrolling, setIsScrolling] = useState(false);\n  const isScrollingRef = useRef(false);\n  const idleTimerRef = useRef<ReturnType<typeof globalThis.setTimeout> | undefined>(undefined);\n\n  const notifyScroll = useCallback(() => {\n    if (!isScrollingRef.current) {\n      isScrollingRef.current = true;\n      setIsScrolling(true);\n    }\n    if (idleTimerRef.current !== undefined) globalThis.clearTimeout(idleTimerRef.current);\n    idleTimerRef.current = globalThis.setTimeout(() => {\n      idleTimerRef.current = undefined;\n      isScrollingRef.current = false;\n      setIsScrolling(false);\n    }, idleDelayMs);\n  }, [idleDelayMs]);\n\n  useEffect(\n    () => () => {\n      if (idleTimerRef.current !== undefined) globalThis.clearTimeout(idleTimerRef.current);\n    },\n    []\n  );\n\n  return { isScrolling, notifyScroll };\n};\n","import { useEffect, useMemo } from 'react';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { selectAtom } from 'jotai/utils';\nimport type { MatrixClient, Room } from '$types/matrix-sdk';\nimport { EventTimeline, EventType } from '$types/matrix-sdk';\n\nimport colorMXID from '$utils/colorMXID';\nimport { persistentProfileIdsAtom, profilesCacheAtom } from '$state/userRoomProfile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom, shouldApplyUserHeroCards } from '$state/settings';\nimport type { MSC1767Text } from '$types/matrix/common';\nimport { areColorsTooSimilar, shadeColor } from '$utils/shadeColor';\nimport type { PronounSet } from '$utils/pronouns';\nimport { useMatrixClient } from './useMatrixClient';\nimport { ThemeKind, useActiveTheme } from './useTheme';\nimport { useTimelineScrolling } from './useTimelineScrollActivity';\nimport { useIsInactivePanel } from './useRoom';\nimport { CustomStateEvent } from '$types/matrix/room';\nimport * as prefix from '$unstable/prefixes';\nimport { PROFILE_CACHE_FRESH_MS } from '$client/userProfileCache';\n\nconst MAX_CONCURRENT_PROFILE_REQUESTS = 4;\nconst PROFILE_REQUEST_DWELL_MS = 150;\nconst inFlightProfiles = new WeakMap<MatrixClient, Map<string, Promise<Record<string, unknown>>>>();\nconst activeProfileRequests = new WeakMap<MatrixClient, number>();\nconst profileRequestQueues = new WeakMap<MatrixClient, Array<() => void>>();\nconst profileFetchGenerations = new WeakMap<MatrixClient, Map<string, number>>();\n\nconst getFetchGeneration = (mx: MatrixClient, userId: string): number =>\n  profileFetchGenerations.get(mx)?.get(userId) ?? 0;\n\nconst bumpFetchGeneration = (mx: MatrixClient, userId: string): void => {\n  const generations = profileFetchGenerations.get(mx) ?? new Map<string, number>();\n  profileFetchGenerations.set(mx, generations);\n  generations.set(userId, (generations.get(userId) ?? 0) + 1);\n};\n\nexport type ColorSet = {\n  on_light?: string;\n  on_dark?: string;\n};\n\nconst scheduleProfileRequest = (\n  mx: MatrixClient,\n  task: () => Promise<Record<string, unknown>>\n): Promise<Record<string, unknown>> =>\n  new Promise((resolve, reject) => {\n    const run = () => {\n      activeProfileRequests.set(mx, (activeProfileRequests.get(mx) ?? 0) + 1);\n      void task()\n        .then(resolve, reject)\n        .finally(() => {\n          const active = Math.max(0, (activeProfileRequests.get(mx) ?? 1) - 1);\n          activeProfileRequests.set(mx, active);\n          // Newest first: a profile just scrolled to would otherwise wait behind the backlog.\n          if (active < MAX_CONCURRENT_PROFILE_REQUESTS) profileRequestQueues.get(mx)?.pop()?.();\n        });\n    };\n\n    if ((activeProfileRequests.get(mx) ?? 0) < MAX_CONCURRENT_PROFILE_REQUESTS) {\n      run();\n      return;\n    }\n\n    const queue = profileRequestQueues.get(mx) ?? [];\n    profileRequestQueues.set(mx, queue);\n    queue.push(run);\n  });\n\nexport type MSC4440Bio = {\n  'm.text': Array<MSC1767Text>;\n};\n\nexport type UserProfile = {\n  avatarUrl?: string;\n  displayName?: string;\n  pronouns?: PronounSet[];\n  timezone?: string;\n  bio?: string;\n  status?: string;\n  bannerUrl?: string;\n  nameColor?: string;\n  nameColorDark?: string;\n  nameColorLight?: string;\n  nameColors?: ColorSet;\n  heroColorScheme?: Record<string, string>;\n  isCat?: boolean;\n  hasCats?: boolean;\n  isAnimal?: string;\n  hasAnimal?: string;\n  animalNeed?: string;\n  extended?: Record<string, unknown>;\n  _fetched?: boolean;\n  _fetchedAt?: number;\n};\n\nconst normalizeInfo = (info: Record<string, unknown>): UserProfile => {\n  const msc4440Bio = info[prefix.MATRIX_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME] as\n    | MSC4440Bio\n    | undefined;\n  const knownKeys = new Set([\n    'avatar_url',\n    'displayname',\n    prefix.MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME,\n    prefix.MATRIX_STABLE_PROFILE_TIMEZONE_PROPERTY_NAME,\n    prefix.MATRIX_UNSTABLE_PROFILE_TIMEZONE_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME,\n    prefix.MATRIX_COMMET_UNSTABLE_PROFILE_BIO_PROPERTY_NAME,\n    prefix.MATRIX_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME,\n    prefix.MATRIX_UNSTABLE_PROFILE_BANNER_PROPERTY_NAME,\n    prefix.MATRIX_COMMET_UNSTABLE_PROFILE_STATUS_PROPERTY_NAME,\n    prefix.MATRIX_UNSTABLE_COLORS,\n    prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_LIGHT_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_DARK_PROPERTY_NAME,\n    prefix.MATRIX_COMMET_UNSTABLE_PROFILE_COLOR_SCHEME_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_CAT_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_CAT_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_ANIMAL_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_ANIMAL_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_ANIMAL_NEED_PROPERTY_NAME,\n  ]);\n\n  const extended: Record<string, unknown> = {};\n  Object.entries(info).forEach(([key, value]) => {\n    if (!knownKeys.has(key)) {\n      extended[key] = value;\n    }\n  });\n\n  const normalized: UserProfile = {\n    avatarUrl: info.avatar_url as string | undefined,\n    displayName: info.displayname as string | undefined,\n    _fetched: true,\n    _fetchedAt: Date.now(),\n  };\n\n  if (prefix.MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME in info) {\n    normalized.pronouns = info[prefix.MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME] as\n      | PronounSet[]\n      | undefined;\n  }\n  if (\n    prefix.MATRIX_UNSTABLE_PROFILE_TIMEZONE_PROPERTY_NAME in info ||\n    prefix.MATRIX_STABLE_PROFILE_TIMEZONE_PROPERTY_NAME in info\n  ) {\n    normalized.timezone = (info[prefix.MATRIX_UNSTABLE_PROFILE_TIMEZONE_PROPERTY_NAME] ||\n      info[prefix.MATRIX_STABLE_PROFILE_TIMEZONE_PROPERTY_NAME]) as string | undefined;\n  }\n  if (\n    prefix.MATRIX_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME in info ||\n    prefix.MATRIX_SABLE_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME in info ||\n    prefix.MATRIX_COMMET_UNSTABLE_PROFILE_BIO_PROPERTY_NAME in info\n  ) {\n    normalized.bio =\n      msc4440Bio?.['m.text']?.[0]?.body ||\n      (info[prefix.MATRIX_SABLE_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME] as string | undefined) ||\n      (info[prefix.MATRIX_COMMET_UNSTABLE_PROFILE_BIO_PROPERTY_NAME] as string | undefined);\n  }\n  if (prefix.MATRIX_COMMET_UNSTABLE_PROFILE_STATUS_PROPERTY_NAME in info) {\n    normalized.status = info[prefix.MATRIX_COMMET_UNSTABLE_PROFILE_STATUS_PROPERTY_NAME] as\n      | string\n      | undefined;\n  }\n  if (prefix.MATRIX_UNSTABLE_PROFILE_BANNER_PROPERTY_NAME in info) {\n    normalized.bannerUrl = info[prefix.MATRIX_UNSTABLE_PROFILE_BANNER_PROPERTY_NAME] as\n      | string\n      | undefined;\n  }\n  if (prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_PROPERTY_NAME in info) {\n    normalized.nameColor = info[prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_PROPERTY_NAME] as\n      | string\n      | undefined;\n  }\n  if (prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_DARK_PROPERTY_NAME in info) {\n    normalized.nameColorDark = info[prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_DARK_PROPERTY_NAME] as\n      | string\n      | undefined;\n  }\n  if (prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_LIGHT_PROPERTY_NAME in info) {\n    normalized.nameColorLight = info[\n      prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_LIGHT_PROPERTY_NAME\n    ] as string | undefined;\n  }\n  if (prefix.MATRIX_UNSTABLE_COLORS in info) {\n    normalized.nameColors = info[prefix.MATRIX_UNSTABLE_COLORS] as ColorSet | undefined;\n  }\n  if (prefix.MATRIX_COMMET_UNSTABLE_PROFILE_COLOR_SCHEME_PROPERTY_NAME in info) {\n    normalized.heroColorScheme = info[\n      prefix.MATRIX_COMMET_UNSTABLE_PROFILE_COLOR_SCHEME_PROPERTY_NAME\n    ] as Record<string, string> | undefined;\n  }\n  if (prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_CAT_PROPERTY_NAME in info) {\n    normalized.isCat = info[prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_CAT_PROPERTY_NAME] as\n      | boolean\n      | undefined;\n  }\n  if (prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_CAT_PROPERTY_NAME in info) {\n    normalized.hasCats = info[\n      prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_CAT_PROPERTY_NAME\n    ] as boolean | undefined;\n  }\n  if (prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_ANIMAL_PROPERTY_NAME in info) {\n    normalized.isAnimal = info[\n      prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_ANIMAL_PROPERTY_NAME\n    ] as string;\n  }\n  if (prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_ANIMAL_PROPERTY_NAME in info) {\n    normalized.hasAnimal = info[\n      prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_ANIMAL_PROPERTY_NAME\n    ] as string;\n  }\n  if (prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_ANIMAL_NEED_PROPERTY_NAME in info) {\n    normalized.animalNeed = info[\n      prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_ANIMAL_NEED_PROPERTY_NAME\n    ] as string;\n  }\n  if (Object.keys(extended).length > 0) {\n    normalized.extended = extended;\n  }\n\n  return normalized;\n};\n\nexport const invalidateUserProfileCache = (\n  mx: MatrixClient,\n  userId: string,\n  setProfiles: (update: (prev: Record<string, UserProfile>) => Record<string, UserProfile>) => void\n): void => {\n  bumpFetchGeneration(mx, userId);\n  setProfiles((prev) => {\n    const existing = prev[userId];\n    if (!existing) return prev;\n    return { ...prev, [userId]: { ...existing, _fetchedAt: 0 } };\n  });\n};\n\nexport const isValidHex = (c: unknown): string | undefined => {\n  if (typeof c !== 'string') return undefined;\n  // silly tuwunel smh\n  const cleaned = c.replaceAll(/[\"']/g, '').trim();\n  // Strictly allow only 3 or 6 digit hex codes, aka no opacity\n  return /^#([0-9A-F]{3}|[0-9A-F]{6})$/i.test(cleaned) ? cleaned : undefined;\n};\nconst sanitizeFont = (f: string) => f.replaceAll(/[;{}<>]/g, '').slice(0, 32);\n\nexport const useUserProfile = (\n  userId: string,\n  room?: Room,\n  initialProfile?: Partial<UserProfile>,\n  persistAcrossSessions = false,\n  fetchEnabled = true\n): UserProfile & {\n  resolvedColor?: string;\n  resolvedFont?: string;\n  resolvedPronouns?: PronounSet[];\n  heroColor?: string;\n  heroNameColor?: string;\n  heroBrightness?: string;\n} => {\n  const mx = useMatrixClient();\n  const [legacyUsernameColor] = useSetting(settingsAtom, 'legacyUsernameColor');\n  const [renderGlobalColors] = useSetting(settingsAtom, 'renderGlobalNameColors');\n  const [renderRoomColors] = useSetting(settingsAtom, 'renderRoomColors');\n  const [renderRoomFonts] = useSetting(settingsAtom, 'renderRoomFonts');\n  const [renderUserCardsMode] = useSetting(settingsAtom, 'renderUserCards');\n  const themeKind = useActiveTheme().kind;\n  const timelineScrolling = useTimelineScrolling();\n  const isInactivePanel = useIsInactivePanel();\n\n  const userSelector = useMemo(() => selectAtom(profilesCacheAtom, (db) => db[userId]), [userId]);\n\n  const cached = useAtomValue(userSelector);\n  const setGlobalProfiles = useSetAtom(profilesCacheAtom);\n  const setPersistentProfileIds = useSetAtom(persistentProfileIdsAtom);\n\n  useEffect(() => {\n    if (!persistAcrossSessions || !userId || userId === 'undefined') return;\n    setPersistentProfileIds((prev) => {\n      if (prev.has(userId)) return prev;\n      const next = new Set(prev);\n      next.add(userId);\n      return next;\n    });\n  }, [persistAcrossSessions, setPersistentProfileIds, userId]);\n\n  const fetchedAt = cached?._fetchedAt;\n  const isFresh =\n    cached?._fetched === true &&\n    typeof fetchedAt === 'number' &&\n    Date.now() - fetchedAt < PROFILE_CACHE_FRESH_MS;\n  const needsFetch =\n    fetchEnabled &&\n    !timelineScrolling &&\n    !isInactivePanel &&\n    !!userId &&\n    userId !== 'undefined' &&\n    !isFresh;\n\n  useEffect(() => {\n    if (!needsFetch) return undefined;\n\n    const startFetch = () => {\n      const clientInFlight = inFlightProfiles.get(mx) ?? new Map();\n      inFlightProfiles.set(mx, clientInFlight);\n      if (clientInFlight.has(userId)) return;\n\n      const generation = getFetchGeneration(mx, userId);\n      const fetchPromise = scheduleProfileRequest(mx, () => mx.getProfileInfo(userId)).finally(\n        () => {\n          clientInFlight.delete(userId);\n        }\n      );\n      clientInFlight.set(userId, fetchPromise);\n\n      // Attach the cache update only when creating the shared request. It deliberately outlives\n      // the initiating row: a completed request remains useful after a fast virtualized scroll.\n      fetchPromise\n        .then((info: Record<string, unknown>) => {\n          if (getFetchGeneration(mx, userId) !== generation) {\n            startFetch();\n            return;\n          }\n          const normalized = normalizeInfo(info);\n          setGlobalProfiles((prev) => {\n            const { [userId]: previousProfile, ...otherProfiles } = prev;\n            return {\n              ...otherProfiles,\n              [userId]: { ...previousProfile, ...normalized },\n            };\n          });\n        })\n        .catch(() => {\n          if (getFetchGeneration(mx, userId) !== generation) {\n            startFetch();\n            return;\n          }\n          setGlobalProfiles((prev) => ({\n            ...prev,\n            [userId]: { ...prev[userId], _fetched: true, _fetchedAt: Date.now() },\n          }));\n        });\n    };\n\n    const timeoutId = window.setTimeout(startFetch, PROFILE_REQUEST_DWELL_MS);\n\n    return () => window.clearTimeout(timeoutId);\n  }, [userId, needsFetch, mx, setGlobalProfiles]);\n\n  return useMemo(() => {\n    const data = cached ?? {\n      displayName: initialProfile?.displayName ?? mx.getUser(userId)?.displayName,\n      avatarUrl: initialProfile?.avatarUrl ?? mx.getUser(userId)?.avatarUrl,\n      ...initialProfile,\n    };\n\n    let localColor;\n    let localFont;\n    let localPronouns;\n    let spaceColor;\n    let spaceFont;\n    let spacePronouns;\n\n    if (room && (renderRoomColors || renderRoomFonts)) {\n      const state = room.getLiveTimeline().getState(EventTimeline.FORWARDS);\n\n      if (renderRoomColors) {\n        const roomMemberEvent = state?.getStateEvents(EventType.RoomMember, userId);\n        const roomColorContent = (\n          Array.isArray(roomMemberEvent) ? roomMemberEvent[0] : roomMemberEvent\n        )?.getContent();\n        const roomColorObject = roomColorContent?.[prefix.MATRIX_UNSTABLE_COLORS];\n        const roomColorNew =\n          themeKind === ThemeKind.Light ? roomColorObject?.on_light : roomColorObject?.on_dark;\n        const localEvent = state?.getStateEvents(CustomStateEvent.RoomCosmeticsColor, userId);\n        const localColorOld = (Array.isArray(localEvent) ? localEvent[0] : localEvent)?.getContent()\n          ?.color;\n        localColor = roomColorNew ?? localColorOld;\n      }\n\n      if (renderRoomFonts) {\n        const localFontEvent = state?.getStateEvents(CustomStateEvent.RoomCosmeticsFont, userId);\n        localFont = (\n          Array.isArray(localFontEvent) ? localFontEvent[0] : localFontEvent\n        )?.getContent()?.font;\n      }\n      const localPronounEvent = state?.getStateEvents(\n        CustomStateEvent.RoomCosmeticsPronouns as string,\n        userId\n      );\n      localPronouns = (\n        Array.isArray(localPronounEvent) ? localPronounEvent[0] : localPronounEvent\n      )?.getContent()?.pronouns;\n\n      const parents = state?.getStateEvents(EventType.SpaceParent);\n      if (parents && parents.length > 0) {\n        const parent = parents[0];\n        const parentSpace = parent ? mx.getRoom(parent.getStateKey()) : undefined;\n        const pState = parentSpace?.getLiveTimeline().getState(EventTimeline.FORWARDS);\n\n        if (renderRoomColors) {\n          const spaceMemberEvent = pState?.getStateEvents(EventType.RoomMember, userId);\n          const spaceColorContent = (\n            Array.isArray(spaceMemberEvent) ? spaceMemberEvent[0] : spaceMemberEvent\n          )?.getContent();\n          const spaceColorObject = spaceColorContent?.[prefix.MATRIX_UNSTABLE_COLORS];\n          const spaceColorNew =\n            themeKind === ThemeKind.Light ? spaceColorObject?.on_light : spaceColorObject?.on_dark;\n          const spaceEvent = pState?.getStateEvents(CustomStateEvent.RoomCosmeticsColor, userId);\n          const spaceColorOld = (\n            Array.isArray(spaceEvent) ? spaceEvent[0] : spaceEvent\n          )?.getContent()?.color;\n          spaceColor = spaceColorNew ?? spaceColorOld;\n        }\n\n        if (renderRoomFonts) {\n          const spaceFontEvent = pState?.getStateEvents(CustomStateEvent.RoomCosmeticsFont, userId);\n          spaceFont = (\n            Array.isArray(spaceFontEvent) ? spaceFontEvent[0] : spaceFontEvent\n          )?.getContent()?.font;\n        }\n\n        const spacePronounEvent = pState?.getStateEvents(\n          CustomStateEvent.RoomCosmeticsPronouns as string,\n          userId\n        );\n        spacePronouns = (\n          Array.isArray(spacePronounEvent) ? spacePronounEvent[0] : spacePronounEvent\n        )?.getContent()?.pronouns;\n      }\n    }\n\n    const colorArray = data.nameColors;\n\n    const validGlobalVal = isValidHex(data?.nameColor);\n    const validGlobalValDark = isValidHex(colorArray?.on_dark) ?? isValidHex(data?.nameColorDark);\n    const validGlobalValLight =\n      isValidHex(colorArray?.on_light) ?? isValidHex(data?.nameColorLight);\n\n    const validGlobalGeneral =\n      (renderGlobalColors || userId === mx.getUserId()) && !!validGlobalVal\n        ? validGlobalVal\n        : undefined;\n    const validGlobalDark =\n      (renderGlobalColors || userId === mx.getUserId()) &&\n      themeKind === ThemeKind.Dark &&\n      !!validGlobalValDark\n        ? validGlobalValDark\n        : undefined;\n    const validGlobalLight =\n      (renderGlobalColors || userId === mx.getUserId()) &&\n      themeKind === ThemeKind.Light &&\n      !!validGlobalValLight\n        ? validGlobalValLight\n        : undefined;\n    const validGlobal = validGlobalDark ?? validGlobalLight ?? validGlobalGeneral;\n    const validLocal = localColor && isValidHex(localColor) ? localColor : undefined;\n    const validSpace = spaceColor && isValidHex(spaceColor) ? spaceColor : undefined;\n\n    const resolvedColor =\n      validLocal ||\n      validSpace ||\n      validGlobal ||\n      (legacyUsernameColor ? colorMXID(userId) : undefined);\n\n    const rawFont = localFont || spaceFont;\n    let resolvedFont;\n    if (rawFont) {\n      const clean = sanitizeFont(rawFont);\n      resolvedFont = clean.includes(' ')\n        ? `\"${clean}\", var(--font-secondary)`\n        : `${clean}, var(--font-secondary)`;\n    }\n\n    const resolvedPronouns = localPronouns || spacePronouns || data?.pronouns;\n\n    const rawHeroBrightness = data?.heroColorScheme?.brightness;\n    const rawHeroColor = data?.heroColorScheme?.color;\n    const heroCardsAllowed = shouldApplyUserHeroCards(\n      renderUserCardsMode,\n      rawHeroBrightness,\n      rawHeroColor\n    );\n    const validHeroColor = heroCardsAllowed ? isValidHex(rawHeroColor) : undefined;\n    const heroBrightness = heroCardsAllowed ? rawHeroBrightness : undefined;\n    const testUserHeroColor = shadeColor(validHeroColor, heroBrightness === 'dark' ? -80 : 80);\n\n    const heroNameColor = heroCardsAllowed\n      ? ((renderGlobalColors || userId === mx.getUserId()) &&\n          heroBrightness === 'light' &&\n          !areColorsTooSimilar(testUserHeroColor, validGlobalValLight) &&\n          validGlobalValLight) ||\n        (heroBrightness === 'dark' &&\n          !areColorsTooSimilar(testUserHeroColor, validGlobalValDark) &&\n          validGlobalValDark) ||\n        resolvedColor\n      : resolvedColor;\n    return {\n      ...data,\n      resolvedColor,\n      resolvedFont,\n      resolvedPronouns,\n      pronouns: resolvedPronouns,\n      heroColor: validHeroColor,\n      heroBrightness,\n      heroNameColor,\n    };\n  }, [\n    cached,\n    initialProfile,\n    mx,\n    userId,\n    room,\n    renderRoomColors,\n    renderRoomFonts,\n    renderGlobalColors,\n    renderUserCardsMode,\n    themeKind,\n    legacyUsernameColor,\n  ]);\n};\n","import { useMemo } from 'react';\nimport type { IContent } from '$types/matrix-sdk';\nimport type { Room } from '$types/matrix-sdk';\nimport { usePowerLevels } from './usePowerLevels';\nimport { useRoomCreators } from './useRoomCreators';\nimport { useAccessiblePowerTagColors, useGetMemberPowerTag } from './useMemberPowerTag';\nimport { useRoomCreatorsTag } from './useRoomCreatorsTag';\nimport { usePowerLevelTags } from './usePowerLevelTags';\nimport { useTheme } from './useTheme';\nimport { useUserProfile } from './useUserProfile';\nimport { useAccessibleNameColor } from './useAccessibleNameColor';\n\nexport function useSableCosmetics(\n  userId: string,\n  room: Room,\n  isUserHero?: boolean,\n  fetchProfile = true\n) {\n  const theme = useTheme();\n  const profile = useUserProfile(userId, room, undefined, false, fetchProfile);\n\n  const powerLevels = usePowerLevels(room);\n  const creators = useRoomCreators(room);\n  const creatorsTag = useRoomCreatorsTag();\n  const powerLevelTags = usePowerLevelTags(room, powerLevels);\n  const getPowerTag = useGetMemberPowerTag(room, creators, powerLevels);\n\n  const accessibleTagColors = useAccessiblePowerTagColors(theme.kind, creatorsTag, powerLevelTags);\n  const accessibleNameColor = useAccessibleNameColor(theme.kind);\n\n  return useMemo(() => {\n    if (!room || !userId) return { color: undefined, font: undefined };\n\n    let finalColor = accessibleNameColor(\n      isUserHero ? profile.heroNameColor : profile.resolvedColor\n    );\n    if (!finalColor) {\n      const memberPowerTag = getPowerTag(userId);\n      finalColor = memberPowerTag?.color\n        ? accessibleTagColors?.get(memberPowerTag.color)\n        : undefined;\n    }\n    const resolvedCosmetics: IContent = {\n      color: finalColor,\n      font: profile.resolvedFont,\n    };\n\n    return resolvedCosmetics;\n  }, [\n    room,\n    userId,\n    isUserHero,\n    profile.heroNameColor,\n    profile.resolvedColor,\n    profile.resolvedFont,\n    getPowerTag,\n    accessibleTagColors,\n    accessibleNameColor,\n  ]);\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport type { AccountDataEvents } from '$types/matrix-sdk';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useAccountDataCallback } from './useAccountDataCallback';\n\nexport function useAccountData(eventType: string) {\n  const mx = useMatrixClient();\n  const [event, setEvent] = useState(() => mx.getAccountData(eventType as keyof AccountDataEvents));\n\n  useEffect(() => {\n    setEvent(mx.getAccountData(eventType as keyof AccountDataEvents));\n  }, [mx, eventType]);\n\n  useAccountDataCallback(\n    mx,\n    useCallback(\n      (evt) => {\n        if (evt.getType() === eventType) {\n          setEvent(evt);\n        }\n      },\n      [eventType, setEvent]\n    )\n  );\n\n  return event;\n}\n","import { useMemo } from 'react';\n\nimport { useAccountData } from './useAccountData';\nimport { EventType } from '$types/matrix-sdk';\n\ntype IgnoredUserListContent = {\n  ignored_users?: Record<string, object>;\n};\n\nexport const useIgnoredUsers = (): string[] => {\n  const ignoredUserListEvt = useAccountData(EventType.IgnoredUserList);\n  const ignoredUsers = useMemo(() => {\n    const ignoredUsersRecord =\n      ignoredUserListEvt?.getContent<IgnoredUserListContent>().ignored_users ?? {};\n    return Object.keys(ignoredUsersRecord);\n  }, [ignoredUserListEvt]);\n\n  return ignoredUsers;\n};\n","import { useEffect, useState } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport { hydrateRoomMember } from '$client/roomMemberHydration';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useIsInactivePanel } from './useRoom';\nimport { useTimelineScrolling } from './useTimelineScrollActivity';\n\nexport const useRoomMemberHydration = (\n  room: Room,\n  userId: string,\n  hasTimelineMember = false,\n  profileDisplayName?: string\n): number => {\n  const mx = useMatrixClient();\n  const [version, setVersion] = useState(0);\n  const isInactivePanel = useIsInactivePanel();\n  const timelineScrolling = useTimelineScrolling();\n\n  useEffect(() => {\n    if (isInactivePanel || timelineScrolling || !userId.startsWith('@')) return undefined;\n\n    const member = room.getMember(userId);\n\n    if (!member && !hasTimelineMember) {\n      let disposed = false;\n      void hydrateRoomMember(mx, room.roomId, userId).then(() => {\n        if (!disposed && room.getMember(userId)) setVersion((v) => v + 1);\n      });\n      return () => {\n        disposed = true;\n      };\n    }\n\n    if (member && profileDisplayName && profileDisplayName !== member.rawDisplayName) {\n      let disposed = false;\n      void hydrateRoomMember(mx, room.roomId, userId, true).then(() => {\n        if (!disposed && room.getMember(userId)) setVersion((v) => v + 1);\n      });\n      return () => {\n        disposed = true;\n      };\n    }\n\n    return undefined;\n  }, [mx, room, userId, hasTimelineMember, isInactivePanel, timelineScrolling, profileDisplayName]);\n\n  return version;\n};\n","import type { MouseEventHandler, ReactNode } from 'react';\nimport { useCallback } from 'react';\nimport { Text } from 'folds';\nimport type { MatrixEvent, Room } from '$types/matrix-sdk';\nimport {\n  At,\n  EnvelopeSimple,\n  PaintBrush,\n  SignIn,\n  SignOut,\n  timelineIcon,\n  User,\n  UserMinus,\n  UserPlus,\n} from '$components/icons/phosphor';\n\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { isMembershipChanged } from '$utils/room/relations';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { useSableCosmetics } from './useSableCosmetics';\nimport { useMatrixClient } from './useMatrixClient';\nimport { KnownMembership } from '$types/matrix-sdk';\nimport type { CustomRoomMemberEventContent } from '$unstable/CustomRoomMemberEventContent';\nimport { MATRIX_UNSTABLE_COLORS } from '$unstable/prefixes';\n\ntype DecoratedUserProps = {\n  roomId: string;\n  userId: string;\n  userName?: string;\n};\n\nfunction DecoratedUser({ roomId, userId, userName }: DecoratedUserProps) {\n  const mx = useMatrixClient();\n  const room = mx.getRoom(roomId);\n  const { color, font } = useSableCosmetics(userId, room ?? ({} as Room));\n\n  const openUserRoomProfile = useOpenUserRoomProfile();\n  const handleUserClick: MouseEventHandler = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      openUserRoomProfile(\n        roomId,\n        undefined,\n        userId,\n        undefined,\n        evt.currentTarget.getBoundingClientRect()\n      );\n    },\n    [roomId, userId, openUserRoomProfile]\n  );\n\n  return (\n    <Text as=\"a\" onClick={handleUserClick} truncate>\n      <b style={{ color, font }}>{userName ?? userId} </b>\n    </Text>\n  );\n}\n\nexport type ParsedResult = {\n  icon: ReactNode;\n  body: ReactNode;\n};\n\nexport type MemberEventParser = (mEvent: MatrixEvent) => ParsedResult;\n\nconst parseMemberEvent: MemberEventParser = (mEvent) => {\n  const content = mEvent.getContent<CustomRoomMemberEventContent>();\n  const prevContent = mEvent.getPrevContent() as CustomRoomMemberEventContent;\n  const senderId = mEvent.getSender();\n  const userId = mEvent.getStateKey();\n  const roomId = mEvent.getRoomId();\n  const reason = typeof content.reason === 'string' ? content.reason : undefined;\n\n  if (!senderId || !userId)\n    return {\n      icon: timelineIcon(User),\n      body: 'Broken membership event',\n    };\n\n  const senderName = getMxIdLocalPart(senderId);\n  const userName =\n    typeof content.displayname === 'string'\n      ? content.displayname || getMxIdLocalPart(userId)\n      : getMxIdLocalPart(userId);\n\n  if (isMembershipChanged(mEvent)) {\n    if (content.membership === KnownMembership.Invite) {\n      if (prevContent.membership === KnownMembership.Knock) {\n        return {\n          icon: timelineIcon(UserPlus),\n          body: (\n            <>\n              <DecoratedUser roomId={roomId ?? ''} userId={senderId} userName={senderName} />\n              <Text>{' accepted '}</Text>\n              <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n              <Text>{`'s join request`}</Text>\n              <Text>{reason ? `(${reason})` : null}</Text>\n            </>\n          ),\n        };\n      }\n\n      return {\n        icon: timelineIcon(UserPlus),\n        body: (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={senderId} userName={senderName} />\n            <Text>{' invited '}</Text>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{reason ? `(${reason})` : null}</Text>\n          </>\n        ),\n      };\n    }\n\n    if (content.membership === KnownMembership.Knock) {\n      return {\n        icon: timelineIcon(EnvelopeSimple),\n        body: (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{' requested to join room'}</Text>\n            <Text>{reason ? `(${reason})` : null}</Text>\n          </>\n        ),\n      };\n    }\n\n    if (content.membership === KnownMembership.Join) {\n      return {\n        icon: timelineIcon(SignIn),\n        body: (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{' joined the room'}</Text>\n            <Text>{reason ? `(${reason})` : null}</Text>\n          </>\n        ),\n      };\n    }\n\n    if (content.membership === KnownMembership.Leave) {\n      if (prevContent.membership === KnownMembership.Invite) {\n        return {\n          icon: timelineIcon(UserMinus),\n          body:\n            senderId === userId ? (\n              <>\n                <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n                <Text>{' rejected the invitation'}</Text>\n                <Text>{reason ? `(${reason})` : null}</Text>\n              </>\n            ) : (\n              <>\n                <DecoratedUser roomId={roomId ?? ''} userId={senderId} userName={senderName} />\n                <Text>{' rejected '}</Text>\n                <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n                <Text>{`'s join request`}</Text>\n                <Text>{reason ? `(${reason})` : null}</Text>\n              </>\n            ),\n        };\n      }\n\n      if (prevContent.membership === KnownMembership.Knock) {\n        return {\n          icon: timelineIcon(UserMinus),\n          body:\n            senderId === userId ? (\n              <>\n                <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n                <Text>{' revoked joined request'}</Text>\n                <Text>{reason ? `(${reason})` : null}</Text>\n              </>\n            ) : (\n              <>\n                <DecoratedUser roomId={roomId ?? ''} userId={senderId} userName={senderName} />\n                {' revoked '}\n                <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n                <Text>{`'s invite`}</Text>\n                <Text>{reason ? `(${reason})` : null}</Text>\n              </>\n            ),\n        };\n      }\n\n      if (prevContent.membership === KnownMembership.Ban) {\n        return {\n          icon: timelineIcon(SignOut),\n          body: (\n            <>\n              <DecoratedUser roomId={roomId ?? ''} userId={senderId} userName={senderName} />\n              <Text>{' unbanned '}</Text>\n              <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n              <Text>{reason ? `(${reason})` : null}</Text>\n            </>\n          ),\n        };\n      }\n\n      return {\n        icon: timelineIcon(SignOut),\n        body:\n          senderId === userId ? (\n            <>\n              <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n              <Text>{' left the room '}</Text>\n              <Text>{reason ? `(${reason})` : null}</Text>\n            </>\n          ) : (\n            <>\n              <DecoratedUser roomId={roomId ?? ''} userId={senderId} userName={senderName} />\n              <Text>{' kicked '}</Text>\n              <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n              <Text>{reason ? `(${reason})` : null}</Text>\n            </>\n          ),\n      };\n    }\n\n    if (content.membership === KnownMembership.Ban) {\n      return {\n        icon: timelineIcon(SignOut),\n        body: (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={senderId} userName={senderName} />\n            <Text>{' banned '}</Text>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{reason ? `(${reason})` : null}</Text>\n          </>\n        ),\n      };\n    }\n  }\n\n  if (content.displayname !== prevContent.displayname) {\n    const prevUserName =\n      typeof prevContent.displayname === 'string'\n        ? prevContent.displayname || getMxIdLocalPart(userId)\n        : getMxIdLocalPart(userId);\n\n    return {\n      icon: timelineIcon(At),\n      body:\n        typeof content.displayname === 'string' ? (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={prevUserName} />\n            <Text>{' changed display name to '}</Text>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n          </>\n        ) : (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={prevUserName} />\n            <Text>{' removed their display name'}</Text>\n          </>\n        ),\n    };\n  }\n  if (content.avatar_url !== prevContent.avatar_url) {\n    return {\n      icon: timelineIcon(User),\n      body:\n        content.avatar_url && typeof content.avatar_url === 'string' ? (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{' changed their avatar'}</Text>\n          </>\n        ) : (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{' removed their avatar'}</Text>\n          </>\n        ),\n    };\n  }\n  if (content[MATRIX_UNSTABLE_COLORS]?.on_dark !== prevContent[MATRIX_UNSTABLE_COLORS]?.on_dark) {\n    return {\n      icon: timelineIcon(PaintBrush),\n      body:\n        content[MATRIX_UNSTABLE_COLORS]?.on_dark &&\n        typeof content[MATRIX_UNSTABLE_COLORS]?.on_dark === 'string' ? (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{' changed one of their room name colors'}</Text>\n          </>\n        ) : (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{' removed one of their room name colors '}</Text>\n          </>\n        ),\n    };\n  }\n  if (content[MATRIX_UNSTABLE_COLORS]?.on_light !== prevContent[MATRIX_UNSTABLE_COLORS]?.on_light) {\n    return {\n      icon: timelineIcon(PaintBrush),\n      body:\n        content[MATRIX_UNSTABLE_COLORS]?.on_light &&\n        typeof content[MATRIX_UNSTABLE_COLORS]?.on_light === 'string' ? (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{' changed one of their room name colors'}</Text>\n          </>\n        ) : (\n          <>\n            <DecoratedUser roomId={roomId ?? ''} userId={userId} userName={userName} />\n            <Text>{' removed one of their room name colors '}</Text>\n          </>\n        ),\n    };\n  }\n\n  return {\n    icon: timelineIcon(User),\n    body: 'Membership event with no changes',\n  };\n};\n\nexport const useMemberEventParser = (): MemberEventParser => parseMemberEvent;\n","import { matchPath, type To } from 'react-router';\nimport { ScreenSize } from '$hooks/useScreenSize';\nimport { getHomePath } from '$pages/pathUtils';\nimport {\n  BUG_REPORT_PATH,\n  CREATE_PATH,\n  CREATE_ROOM_PATH,\n  NAVIGATE_PATH,\n  SETTINGS_PATH,\n} from '../paths';\n\nexport type StoredLocation = {\n  pathname: string;\n  search: string;\n  hash: string;\n  state?: unknown;\n  key?: string;\n};\n\nexport type ShallowRouteState = {\n  backgroundLocation?: StoredLocation;\n};\n\n/**\n * Routes that render as an overlay over the page they were opened from on\n * desktop, and as a full page on mobile.\n */\nconst SHALLOW_ROUTE_PATHS = [\n  SETTINGS_PATH,\n  CREATE_ROOM_PATH,\n  CREATE_PATH,\n  BUG_REPORT_PATH,\n  NAVIGATE_PATH,\n];\n\nexport const getBackgroundLocation = (state: unknown): StoredLocation | undefined =>\n  (state as ShallowRouteState | null)?.backgroundLocation;\n\n/** The shallow route pattern a pathname belongs to, if any. */\nexport const getShallowRoutePath = (pathname: string): string | undefined =>\n  SHALLOW_ROUTE_PATHS.find((path) => matchPath(path, pathname) !== null);\n\nexport const isShallowRoute = (\n  pathname: string,\n  state: unknown,\n  screenSize: ScreenSize\n): boolean => {\n  if (screenSize === ScreenSize.Mobile) return false;\n  if (!getBackgroundLocation(state)) return false;\n  return getShallowRoutePath(pathname) !== undefined;\n};\n\nexport function getShallowCloseTarget(state: unknown): { to: To; state?: unknown } {\n  const backgroundLocation = getBackgroundLocation(state);\n  if (!backgroundLocation) {\n    return { to: getHomePath() };\n  }\n\n  return {\n    to: {\n      pathname: backgroundLocation.pathname,\n      search: backgroundLocation.search,\n      hash: backgroundLocation.hash,\n    },\n    state: backgroundLocation.state,\n  };\n}\n","import { useCallback } from 'react';\nimport { useLocation, useNavigate, type To } from 'react-router';\nimport { getShallowCloseTarget, getShallowRoutePath } from './shallowRoute';\n\n/**\n * Navigates to a shallow route, remembering the current location so the route\n * can render over it on desktop and return to it when closed. Navigating\n * within the same surface (settings section to settings section) keeps the\n * background it was opened over instead of recording itself.\n */\nexport function useOpenShallowRoute() {\n  const navigate = useNavigate();\n  const location = useLocation();\n\n  return useCallback(\n    (to: string) => {\n      const [targetPathname] = to.split('?');\n      const currentSurface = getShallowRoutePath(location.pathname);\n      const sameSurface =\n        currentSurface !== undefined &&\n        getShallowRoutePath(targetPathname ?? to) === currentSurface;\n\n      navigate(to, { state: sameSurface ? location.state : { backgroundLocation: location } });\n    },\n    [location, navigate]\n  );\n}\n\n/** Returns to the location a shallow route was opened from, or home. */\nexport function useCloseShallowRoute() {\n  const navigate = useNavigate();\n  const location = useLocation();\n\n  return useCallback(() => {\n    const target: { to: To; state?: unknown } = getShallowCloseTarget(location.state);\n    navigate(target.to, { replace: true, state: target.state });\n  }, [location, navigate]);\n}\n","import { useCallback } from 'react';\nimport { getSettingsPath } from '$pages/pathUtils';\nimport { useOpenShallowRoute } from '$pages/client/useShallowRoute';\nimport type { SettingsSectionId } from './routes';\nimport { normalizeSettingsFocusId } from './settingsLink';\n\nexport function useOpenSettings() {\n  const openShallowRoute = useOpenShallowRoute();\n\n  return useCallback(\n    (section?: SettingsSectionId, focus?: string) => {\n      openShallowRoute(getSettingsPath(section, normalizeSettingsFocusId(focus)));\n    },\n    [openShallowRoute]\n  );\n}\n","import { useMatch, useParams } from 'react-router';\nimport { getCanonicalAliasRoomId, isRoomAlias } from '$utils/matrix';\nimport { getSpaceLobbyPath, getSpaceSearchPath } from '$pages/pathUtils';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\n\nexport const useSelectedSpace = (): string | undefined => {\n  const mx = useMatrixClient();\n\n  const { spaceIdOrAlias: encodedSpaceIdOrAlias } = useParams();\n  const spaceIdOrAlias = encodedSpaceIdOrAlias && decodeURIComponent(encodedSpaceIdOrAlias);\n\n  const spaceId =\n    spaceIdOrAlias && isRoomAlias(spaceIdOrAlias)\n      ? getCanonicalAliasRoomId(mx, spaceIdOrAlias)\n      : spaceIdOrAlias;\n\n  return spaceId;\n};\n\nexport const useSpaceLobbySelected = (spaceIdOrAlias: string): boolean => {\n  const match = useMatch({\n    path: decodeURIComponent(getSpaceLobbyPath(spaceIdOrAlias)),\n    caseSensitive: true,\n    end: false,\n  });\n\n  return !!match;\n};\n\nexport const useSpaceSearchSelected = (spaceIdOrAlias: string): boolean => {\n  const match = useMatch({\n    path: decodeURIComponent(getSpaceSearchPath(spaceIdOrAlias)),\n    caseSensitive: true,\n    end: false,\n  });\n\n  return !!match;\n};\n","import { useCallback } from 'react';\nimport type { NavigateOptions } from 'react-router';\nimport { useNavigate } from 'react-router';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { getCanonicalAliasOrRoomId } from '$utils/matrix';\nimport {\n  getDirectForumPath,\n  getDirectRoomPath,\n  getHomeForumPath,\n  getHomeRoomPath,\n  getSpaceForumPath,\n  getSpacePath,\n  getSpaceRoomPath,\n  resolveSection,\n} from '$pages/pathUtils';\nimport { CustomRoomType } from '$types/matrix/room';\nimport { getOrphanParents, guessPerfectParent } from '$utils/room/hierarchy';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { lastVisitedRoomAtom } from '$state/room/lastRoom';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { useSelectedSpace } from './router/useSelectedSpace';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport const useRoomNavigate = () => {\n  const navigate = useNavigate();\n  const mx = useMatrixClient();\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const mDirects = useAtomValue(mDirectAtom);\n  const spaceSelectedId = useSelectedSpace();\n  const [developerTools] = useSetting(settingsAtom, 'developerTools');\n  const setLastRoom = useSetAtom(lastVisitedRoomAtom);\n\n  const navigateSpace = useCallback(\n    (roomId: string) => {\n      const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, roomId);\n      navigate(getSpacePath(roomIdOrAlias));\n    },\n    [mx, navigate]\n  );\n\n  const navigateRoom = useCallback(\n    (roomId: string, eventId?: string, opts?: NavigateOptions) => {\n      const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, roomId);\n      const openSpaceTimeline = developerTools && spaceSelectedId === roomId;\n      const isForum = mx.getRoom(roomId)?.getType() === CustomRoomType.Forum;\n\n      const orphanParents = openSpaceTimeline ? [roomId] : getOrphanParents(roomToParents, roomId);\n      let destPath: string;\n      let roomPart: string;\n      if (orphanParents.length > 0) {\n        let parentSpace: string;\n        if (spaceSelectedId && orphanParents.includes(spaceSelectedId)) {\n          parentSpace = spaceSelectedId;\n        } else {\n          parentSpace = guessPerfectParent(mx, roomId, orphanParents) ?? orphanParents[0] ?? roomId;\n        }\n\n        const pSpaceIdOrAlias = getCanonicalAliasOrRoomId(mx, parentSpace);\n        roomPart = openSpaceTimeline ? roomId : roomIdOrAlias;\n        destPath = isForum\n          ? getSpaceForumPath(pSpaceIdOrAlias, roomPart, eventId)\n          : getSpaceRoomPath(pSpaceIdOrAlias, roomPart, eventId);\n      } else if (mDirects.has(roomId)) {\n        roomPart = roomIdOrAlias;\n        destPath = isForum\n          ? getDirectForumPath(roomPart, eventId)\n          : getDirectRoomPath(roomPart, eventId);\n      } else {\n        roomPart = roomIdOrAlias;\n        destPath = isForum\n          ? getHomeForumPath(roomPart, eventId)\n          : getHomeRoomPath(roomPart, eventId);\n      }\n\n      const section = resolveSection(destPath);\n      if (section?.getRoomPath) {\n        setLastRoom((prev) => ({ ...prev, [section.key]: roomPart }));\n      }\n\n      navigate(destPath, opts);\n    },\n    [mx, navigate, spaceSelectedId, roomToParents, mDirects, developerTools, setLastRoom]\n  );\n\n  return {\n    navigateSpace,\n    navigateRoom,\n  };\n};\n","import type { ReactEventHandler } from 'react';\nimport { useCallback } from 'react';\nimport { useNavigate } from 'react-router';\nimport type { Position, RectCords } from 'folds';\nimport { isRoomId, isUserId } from '$utils/matrix';\nimport { getHomeRoomPath, withSearchParam } from '$pages/pathUtils';\nimport { isSettingsSectionId } from '$features/settings/routes';\nimport { normalizeSettingsFocusId } from '$features/settings/settingsLink';\nimport { useOpenSettings } from '$features/settings/useOpenSettings';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useRoomNavigate } from './useRoomNavigate';\nimport { useSpaceOptionally } from './useSpace';\n\nexport const useMentionClickHandler = (\n  roomId: string,\n  profileAnchor?: RectCords,\n  profilePosition?: Position\n): ReactEventHandler<HTMLElement> => {\n  const mx = useMatrixClient();\n  const { navigateRoom, navigateSpace } = useRoomNavigate();\n  const navigate = useNavigate();\n  const openProfile = useOpenUserRoomProfile();\n  const space = useSpaceOptionally();\n  const openSettings = useOpenSettings();\n\n  const handleClick: ReactEventHandler<HTMLElement> = useCallback(\n    (evt) => {\n      if (!window.getSelection()?.isCollapsed) return;\n      evt.stopPropagation();\n      evt.preventDefault();\n      const target = evt.currentTarget;\n      const settingsSection = target.getAttribute('data-settings-link-section') || undefined;\n      if (isSettingsSectionId(settingsSection)) {\n        const settingsFocus = normalizeSettingsFocusId(\n          target.getAttribute('data-settings-link-focus') || undefined\n        );\n        openSettings(settingsSection, settingsFocus);\n        return;\n      }\n\n      const mentionId = target.getAttribute('data-mention-id');\n      if (typeof mentionId !== 'string') return;\n\n      if (isUserId(mentionId)) {\n        openProfile(\n          roomId,\n          space?.roomId,\n          mentionId,\n          undefined,\n          profileAnchor ?? target.getBoundingClientRect(),\n          profilePosition\n        );\n        return;\n      }\n\n      const eventId = target.getAttribute('data-mention-event-id') || undefined;\n      if (isRoomId(mentionId) && mx.getRoom(mentionId)) {\n        if (mx.getRoom(mentionId)?.isSpaceRoom()) navigateSpace(mentionId);\n        else navigateRoom(mentionId, eventId);\n        return;\n      }\n\n      const viaServers = target.getAttribute('data-mention-via') || undefined;\n      const path = getHomeRoomPath(mentionId, eventId);\n\n      navigate(viaServers ? withSearchParam(path, { viaServers }) : path);\n    },\n    [\n      mx,\n      navigate,\n      navigateRoom,\n      navigateSpace,\n      openProfile,\n      openSettings,\n      profileAnchor,\n      profilePosition,\n      roomId,\n      space,\n    ]\n  );\n\n  return handleClick;\n};\n","export const warn = (i18n, code, msg, rest) => {\n  const args = [msg, {\n    code,\n    ...(rest || {})\n  }];\n  if (i18n?.services?.logger?.forward) {\n    return i18n.services.logger.forward(args, 'warn', 'react-i18next::', true);\n  }\n  if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;\n  if (i18n?.services?.logger?.warn) {\n    i18n.services.logger.warn(...args);\n  } else if (console?.warn) {\n    console.warn(...args);\n  }\n};\nconst alreadyWarned = {};\nexport const warnOnce = (i18n, code, msg, rest) => {\n  if (isString(msg) && alreadyWarned[msg]) return;\n  if (isString(msg)) alreadyWarned[msg] = new Date();\n  warn(i18n, code, msg, rest);\n};\nconst loadedClb = (i18n, cb) => () => {\n  if (i18n.isInitialized) {\n    cb();\n  } else {\n    const initialized = () => {\n      setTimeout(() => {\n        i18n.off('initialized', initialized);\n      }, 0);\n      cb();\n    };\n    i18n.on('initialized', initialized);\n  }\n};\nexport const loadNamespaces = (i18n, ns, cb) => {\n  i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n};\nexport const loadLanguages = (i18n, lng, ns, cb) => {\n  if (isString(ns)) ns = [ns];\n  if (i18n.options.preload && i18n.options.preload.indexOf(lng) > -1) return loadNamespaces(i18n, ns, cb);\n  ns.forEach(n => {\n    if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n  });\n  i18n.loadLanguages(lng, loadedClb(i18n, cb));\n};\nexport const hasLoadedNamespace = (ns, i18n, options = {}) => {\n  if (!i18n.languages || !i18n.languages.length) {\n    warnOnce(i18n, 'NO_LANGUAGES', 'i18n.languages were undefined or empty', {\n      languages: i18n.languages\n    });\n    return true;\n  }\n  return i18n.hasLoadedNamespace(ns, {\n    lng: options.lng,\n    precheck: (i18nInstance, loadNotPending) => {\n      if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n    }\n  });\n};\nexport const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');\nexport const isString = obj => typeof obj === 'string';\nexport const isObject = obj => typeof obj === 'object' && obj !== null;","const matchHtmlEntity = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g;\nconst htmlEntities = {\n  '&amp;': '&',\n  '&#38;': '&',\n  '&lt;': '<',\n  '&#60;': '<',\n  '&gt;': '>',\n  '&#62;': '>',\n  '&apos;': \"'\",\n  '&#39;': \"'\",\n  '&quot;': '\"',\n  '&#34;': '\"',\n  '&nbsp;': ' ',\n  '&#160;': ' ',\n  '&copy;': '©',\n  '&#169;': '©',\n  '&reg;': '®',\n  '&#174;': '®',\n  '&hellip;': '…',\n  '&#8230;': '…',\n  '&#x2F;': '/',\n  '&#47;': '/'\n};\nconst unescapeHtmlEntity = m => htmlEntities[m];\nexport const unescape = text => text.replace(matchHtmlEntity, unescapeHtmlEntity);","import { unescape } from './unescape.js';\nlet defaultOptions = {\n  bindI18n: 'languageChanged',\n  bindI18nStore: '',\n  transEmptyNodeValue: '',\n  transSupportBasicHtmlNodes: true,\n  transWrapTextNodes: '',\n  transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'p'],\n  useSuspense: true,\n  unescape,\n  transDefaultProps: undefined\n};\nexport const setDefaults = (options = {}) => {\n  defaultOptions = {\n    ...defaultOptions,\n    ...options\n  };\n};\nexport const getDefaults = () => defaultOptions;","let i18nInstance;\nexport const setI18n = instance => {\n  i18nInstance = instance;\n};\nexport const getI18n = () => i18nInstance;","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n  constructor() {\n    this.usedNamespaces = {};\n  }\n  addUsedNamespaces(namespaces) {\n    namespaces.forEach(ns => {\n      if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n    });\n  }\n  getUsedNamespaces() {\n    return Object.keys(this.usedNamespaces);\n  }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n  const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n  const i18nInitialProps = getInitialProps();\n  return {\n    ...componentsInitialProps,\n    ...i18nInitialProps\n  };\n};\nexport const getInitialProps = () => {\n  const i18n = getI18n();\n  if (!i18n) {\n    console.warn('react-i18next:: getInitialProps: You will need to pass in an i18next instance by using initReactI18next');\n    return {};\n  }\n  const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n  const ret = {};\n  const initialI18nStore = {};\n  i18n.languages.forEach(l => {\n    initialI18nStore[l] = {};\n    namespaces.forEach(ns => {\n      initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n    });\n  });\n  ret.initialI18nStore = initialI18nStore;\n  ret.initialLanguage = i18n.language;\n  return ret;\n};","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n  return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n  useState = React.useState,\n  useEffect = React.useEffect,\n  useLayoutEffect = React.useLayoutEffect,\n  useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n  var value = getSnapshot(),\n    _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n    inst = _useState[0].inst,\n    forceUpdate = _useState[1];\n  useLayoutEffect(\n    function () {\n      inst.value = value;\n      inst.getSnapshot = getSnapshot;\n      checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n    },\n    [subscribe, value, getSnapshot]\n  );\n  useEffect(\n    function () {\n      checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n      return subscribe(function () {\n        checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n      });\n    },\n    [subscribe]\n  );\n  useDebugValue(value);\n  return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n  var latestGetSnapshot = inst.getSnapshot;\n  inst = inst.value;\n  try {\n    var nextValue = latestGetSnapshot();\n    return !objectIs(inst, nextValue);\n  } catch (error) {\n    return !0;\n  }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n  return getSnapshot();\n}\nvar shim =\n  \"undefined\" === typeof window ||\n  \"undefined\" === typeof window.document ||\n  \"undefined\" === typeof window.document.createElement\n    ? useSyncExternalStore$1\n    : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n  void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n  module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","import { useContext, useCallback, useMemo, useEffect, useRef, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace, isString, isObject } from './utils.js';\nconst notReadyT = (k, optsOrDefaultValue) => {\n  if (isString(optsOrDefaultValue)) return optsOrDefaultValue;\n  if (isObject(optsOrDefaultValue) && isString(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;\n  if (typeof k === 'function') return '';\n  if (Array.isArray(k)) {\n    const last = k[k.length - 1];\n    return typeof last === 'function' ? '' : last;\n  }\n  return k;\n};\nconst notReadySnapshot = {\n  t: notReadyT,\n  ready: false\n};\nconst dummySubscribe = () => () => {};\nexport const useTranslation = (ns, props = {}) => {\n  const {\n    i18n: i18nFromProps\n  } = props;\n  const {\n    i18n: i18nFromContext,\n    defaultNS: defaultNSFromContext\n  } = useContext(I18nContext) || {};\n  const i18n = i18nFromProps || i18nFromContext || getI18n();\n  if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n  if (!i18n) {\n    warnOnce(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next or by passing it via props or context. In monorepo setups, make sure there is only one instance of react-i18next.');\n  }\n  const i18nOptions = useMemo(() => ({\n    ...getDefaults(),\n    ...i18n?.options?.react,\n    ...props\n  }), [i18n, props]);\n  const {\n    useSuspense,\n    keyPrefix\n  } = i18nOptions;\n  const nsOrContext = ns || defaultNSFromContext || i18n?.options?.defaultNS;\n  const unstableNamespaces = isString(nsOrContext) ? [nsOrContext] : nsOrContext || ['translation'];\n  const namespaces = useMemo(() => unstableNamespaces, unstableNamespaces);\n  i18n?.reportNamespaces?.addUsedNamespaces?.(namespaces);\n  const revisionRef = useRef(0);\n  const subscribe = useCallback(callback => {\n    if (!i18n) return dummySubscribe;\n    const {\n      bindI18n,\n      bindI18nStore\n    } = i18nOptions;\n    const wrappedCallback = () => {\n      revisionRef.current += 1;\n      callback();\n    };\n    if (bindI18n) i18n.on(bindI18n, wrappedCallback);\n    if (bindI18nStore) i18n.store.on(bindI18nStore, wrappedCallback);\n    return () => {\n      if (bindI18n) bindI18n.split(' ').forEach(e => i18n.off(e, wrappedCallback));\n      if (bindI18nStore) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, wrappedCallback));\n    };\n  }, [i18n, i18nOptions]);\n  const snapshotRef = useRef();\n  const getSnapshot = useCallback(() => {\n    if (!i18n) {\n      return notReadySnapshot;\n    }\n    const calculatedReady = !!(i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n    const currentLng = props.lng || i18n.language;\n    const currentRevision = revisionRef.current;\n    const lastSnapshot = snapshotRef.current;\n    if (lastSnapshot && lastSnapshot.ready === calculatedReady && lastSnapshot.lng === currentLng && lastSnapshot.keyPrefix === keyPrefix && lastSnapshot.revision === currentRevision) {\n      return lastSnapshot;\n    }\n    const calculatedT = i18n.getFixedT(currentLng, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix, {\n      scopeNs: namespaces\n    });\n    const newSnapshot = {\n      t: calculatedT,\n      ready: calculatedReady,\n      lng: currentLng,\n      keyPrefix,\n      revision: currentRevision\n    };\n    snapshotRef.current = newSnapshot;\n    return newSnapshot;\n  }, [i18n, namespaces, keyPrefix, i18nOptions, props.lng]);\n  const [loadCount, setLoadCount] = useState(0);\n  const {\n    t,\n    ready\n  } = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n  useEffect(() => {\n    if (i18n && !ready && !useSuspense) {\n      const onLoaded = () => setLoadCount(c => c + 1);\n      if (props.lng) {\n        loadLanguages(i18n, props.lng, namespaces, onLoaded);\n      } else {\n        loadNamespaces(i18n, namespaces, onLoaded);\n      }\n    }\n  }, [i18n, props.lng, namespaces, ready, useSuspense, loadCount]);\n  const finalI18n = i18n || {};\n  const wrapperRef = useRef(null);\n  const wrapperLangRef = useRef();\n  const createI18nWrapper = original => {\n    const descriptors = Object.getOwnPropertyDescriptors(original);\n    if (descriptors.__original) delete descriptors.__original;\n    const wrapper = Object.create(Object.getPrototypeOf(original), descriptors);\n    if (!Object.prototype.hasOwnProperty.call(wrapper, '__original')) {\n      try {\n        Object.defineProperty(wrapper, '__original', {\n          value: original,\n          writable: false,\n          enumerable: false,\n          configurable: false\n        });\n      } catch (_) {}\n    }\n    return wrapper;\n  };\n  const ret = useMemo(() => {\n    const original = finalI18n;\n    const lang = original?.language;\n    let i18nWrapper = original;\n    if (original) {\n      if (wrapperRef.current && wrapperRef.current.__original === original) {\n        if (wrapperLangRef.current !== lang) {\n          i18nWrapper = createI18nWrapper(original);\n          wrapperRef.current = i18nWrapper;\n          wrapperLangRef.current = lang;\n        } else {\n          i18nWrapper = wrapperRef.current;\n        }\n      } else {\n        i18nWrapper = createI18nWrapper(original);\n        wrapperRef.current = i18nWrapper;\n        wrapperLangRef.current = lang;\n      }\n    }\n    const effectiveT = !ready && !useSuspense ? (...args) => {\n      warnOnce(i18n, 'USE_T_BEFORE_READY', 'useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.');\n      return t(...args);\n    } : t;\n    const arr = [effectiveT, i18nWrapper, ready];\n    arr.t = effectiveT;\n    arr.i18n = i18nWrapper;\n    arr.ready = ready;\n    return arr;\n  }, [t, finalI18n, ready, finalI18n.resolvedLanguage, finalI18n.language, finalI18n.languages]);\n  if (i18n && useSuspense && !ready) {\n    let inDevelopment = false;\n    try {\n      inDevelopment = process.env.NODE_ENV !== 'production';\n    } catch (e) {}\n    if (inDevelopment) {\n      warnOnce(i18n, 'SUSPENDED_WHILE_LOADING', 'useTranslation: suspended while translations are loading (useSuspense is true by default). Add a <Suspense> boundary above this component, or set react.useSuspense: false in the i18next init options. https://react.i18next.com/latest/usetranslation-hook');\n    }\n    throw new Promise(resolve => {\n      const onLoaded = () => resolve();\n      if (props.lng) {\n        loadLanguages(i18n, props.lng, namespaces, onLoaded);\n      } else {\n        loadNamespaces(i18n, namespaces, onLoaded);\n      }\n    });\n  }\n  return ret;\n};","import { useMemo } from 'react';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { getOriginBaseUrl } from '$pages/pathUtils';\n\nexport const useSettingsLinkBaseUrl = (): string => {\n  const clientConfig = useClientConfig();\n\n  return useMemo(() => getOriginBaseUrl(clientConfig.hashRouter), [clientConfig.hashRouter]);\n};\n","import { isTauri, invoke } from '@tauri-apps/api/core';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\n\nexport const setMediaEncryption = async (\n  url: string,\n  encInfo: EncryptedAttachmentInfo,\n  mimeType: string\n): Promise<boolean> => {\n  if (!isTauri()) return false;\n\n  const jwkKey = encInfo.key as JsonWebKey;\n  if (!jwkKey.k) return false;\n\n  await invoke('set_media_encryption', {\n    url,\n    key: jwkKey.k,\n    iv: encInfo.iv,\n    sha256: encInfo.hashes.sha256,\n    version: encInfo.v ?? '',\n    mimeType,\n  });\n  return true;\n};\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\n\nexport const useObjectURL = (object?: Blob): string | undefined => {\n  const url = useMemo(() => {\n    if (object) return URL.createObjectURL(object);\n    return undefined;\n  }, [object]);\n\n  useEffect(\n    () => () => {\n      if (url) URL.revokeObjectURL(url);\n    },\n    [url]\n  );\n\n  return url;\n};\n\n// For blob URLs created inside an async callback, which can resolve after unmount\n// with no effect left to revoke them. Passing the pending blob reserves ownership\n// so an older request that resolves late cannot replace or revoke the current URL.\nexport const useCreateObjectURL = (): ((object: Blob | Promise<Blob>) => Promise<string>) => {\n  const urlRef = useRef<string | undefined>(undefined);\n  const mountedRef = useRef(true);\n  const requestRef = useRef(0);\n\n  useEffect(() => {\n    mountedRef.current = true;\n    return () => {\n      mountedRef.current = false;\n      if (urlRef.current) URL.revokeObjectURL(urlRef.current);\n      urlRef.current = undefined;\n    };\n  }, []);\n\n  return useCallback(async (object: Blob | Promise<Blob>) => {\n    const request = ++requestRef.current;\n    const resolvedObject = await object;\n    const url = URL.createObjectURL(resolvedObject);\n\n    if (!mountedRef.current || request !== requestRef.current) {\n      URL.revokeObjectURL(url);\n      return url;\n    }\n\n    if (urlRef.current) URL.revokeObjectURL(urlRef.current);\n    urlRef.current = url;\n    return url;\n  }, []);\n};\n","const IMAGE_MIME_TYPES = [\n  'image/jpeg',\n  'image/gif',\n  'image/png',\n  'image/apng',\n  'image/webp',\n  'image/avif',\n  'image/svg+xml',\n];\n\nconst VIDEO_MIME_TYPES = ['video/mp4', 'video/webm', 'video/ogg', 'video/quicktime'];\n\nconst AUDIO_MIME_TYPES = [\n  'audio/mp4',\n  'audio/x-m4a',\n  'audio/webm',\n  'audio/aac',\n  'audio/mpeg',\n  'audio/ogg',\n  'audio/wave',\n  'audio/wav',\n  'audio/x-wav',\n  'audio/x-pn-wav',\n  'audio/flac',\n  'audio/x-flac',\n];\n\nconst APPLICATION_MIME_TYPES = [\n  'application/pdf',\n  'application/json',\n  'application/x-tgsticker',\n  'application/x-sh',\n  'application/ecmascript',\n  'application/javascript',\n  'application/xhtml+xml',\n  'application/xml',\n];\n\nconst TEXT_MIME_TYPE = [\n  'text/plain',\n  'text/html',\n  'text/css',\n  'text/javascript',\n  'text/x-c',\n  'text/csv',\n  'text/tab-separated-values',\n  'text/yaml',\n  'text/x-java-source,java',\n  'text/markdown',\n];\n\nexport const READABLE_TEXT_MIME_TYPES = [\n  'application/json',\n  'application/x-sh',\n  'application/ecmascript',\n  'application/javascript',\n  'application/xhtml+xml',\n  'application/xml',\n\n  ...TEXT_MIME_TYPE,\n];\n\nexport const READABLE_EXT_TO_MIME_TYPE: Record<string, string> = {\n  go: 'text/go',\n  rs: 'text/rust',\n  py: 'text/python',\n  swift: 'text/swift',\n  c: 'text/c',\n  cpp: 'text/cpp',\n  java: 'text/java',\n  kt: 'text/kotlin',\n  lua: 'text/lua',\n  php: 'text/php',\n  ts: 'text/typescript',\n  js: 'text/javascript',\n  jsx: 'text/jsx',\n  tsx: 'text/tsx',\n  html: 'text/html',\n  xhtml: 'text/xhtml',\n  xht: 'text/xhtml',\n  css: 'text/css',\n  scss: 'text/scss',\n  sass: 'text/sass',\n  json: 'text/json',\n  md: 'text/markdown',\n  yaml: 'text/yaml',\n  yni: 'text/yni',\n  xml: 'text/xml',\n  txt: 'text/plain',\n  text: 'text/plain',\n  conf: 'text/conf',\n  cfg: 'text/conf',\n  cnf: 'text/conf',\n  log: 'text/log',\n  me: 'text/me',\n  cvs: 'text/cvs',\n  tvs: 'text/tvs',\n  sql: 'text/sql',\n};\n\nconst ALLOWED_BLOB_MIME_TYPES = new Set([\n  ...IMAGE_MIME_TYPES,\n  ...VIDEO_MIME_TYPES,\n  ...AUDIO_MIME_TYPES,\n  ...APPLICATION_MIME_TYPES,\n  ...TEXT_MIME_TYPE,\n]);\n\nexport const FALLBACK_MIMETYPE = 'application/octet-stream';\nexport const TGS_MIMETYPE = 'application/x-tgsticker';\n\nexport const isTgsMimeType = (mimeType: string): boolean =>\n  mimeType.split(';', 1)[0]?.toLowerCase() === TGS_MIMETYPE;\n\nexport const isImageMimeType = (mimeType: string): boolean =>\n  mimeType.toLowerCase().startsWith('image/') || isTgsMimeType(mimeType);\n\nconst isTgsCandidate = (file: File): boolean =>\n  file.name.toLowerCase().endsWith('.tgs') || isTgsMimeType(file.type);\n\nexport const isTgsFile = async (file: File): Promise<boolean> => {\n  if (!isTgsCandidate(file)) return false;\n  try {\n    const signature = new Uint8Array(await file.slice(0, 2).arrayBuffer());\n    return signature[0] === 0x1f && signature[1] === 0x8b;\n  } catch {\n    return false;\n  }\n};\n\nexport const getBlobSafeMimeType = (mimeType: string): string => {\n  if (typeof mimeType !== 'string') return FALLBACK_MIMETYPE;\n  const [type] = mimeType.split(';');\n  if (!type || !ALLOWED_BLOB_MIME_TYPES.has(type)) {\n    return FALLBACK_MIMETYPE;\n  }\n  // Required for Chromium browsers\n  if (type === 'video/quicktime') {\n    return 'video/mp4';\n  }\n  return type;\n};\n\nexport const safeFile = (f: File) => {\n  const safeType = getBlobSafeMimeType(f.type);\n  if (safeType !== f.type) {\n    return new File([f], f.name, { type: safeType });\n  }\n  return f;\n};\n\nexport const safeUploadFile = async (file: File): Promise<File> => {\n  if (await isTgsFile(file)) {\n    return file.type === TGS_MIMETYPE\n      ? file\n      : new File([file], file.name, { type: TGS_MIMETYPE, lastModified: file.lastModified });\n  }\n  if (isTgsMimeType(file.type)) {\n    return new File([file], file.name, {\n      type: FALLBACK_MIMETYPE,\n      lastModified: file.lastModified,\n    });\n  }\n  return safeFile(file);\n};\n\nexport const mimeTypeToExt = (mimeType: string): string => {\n  const extStart = mimeType.lastIndexOf('/') + 1;\n  return mimeType.slice(extStart);\n};\nexport const getFileNameExt = (fileName: string): string => {\n  const extStart = fileName.lastIndexOf('.') + 1;\n  return fileName.slice(extStart);\n};\nexport const getFileNameWithoutExt = (fileName: string): string => {\n  const extStart = fileName.lastIndexOf('.');\n  if (extStart === 0 || extStart === -1) return fileName;\n  return fileName.slice(0, extStart);\n};\n","import type { ReactNode } from 'react';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { Box, Spinner } from 'folds';\nimport type { IThumbnailContent } from '$types/matrix/common';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport {\n  decryptFile,\n  downloadEncryptedMedia,\n  mxcUrlToHttp,\n  rewriteAuthenticatedMediaUrl,\n} from '$utils/matrix';\nimport { prepareLoopbackImageSource } from '$utils/mediaUrl';\nimport { setMediaEncryption } from '$utils/tauriMediaEncryption';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport { useCreateObjectURL } from '$hooks/useObjectURL';\nimport { FALLBACK_MIMETYPE } from '$utils/mimeTypes';\n\nexport type ThumbnailContentProps = {\n  info: IThumbnailContent;\n  renderImage: (src: string) => ReactNode;\n};\nexport function ThumbnailContent({ info, renderImage }: ThumbnailContentProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const encInfo = info.thumbnail_file;\n  const thumbMxcUrl = encInfo?.url ?? info.thumbnail_url;\n\n  const rawMediaUrl = useMemo(() => {\n    if (typeof thumbMxcUrl !== 'string') return undefined;\n    return mxcUrlToHttp(mx, thumbMxcUrl, useAuthentication) ?? undefined;\n  }, [mx, thumbMxcUrl, useAuthentication]);\n\n  const tauri = isTauri();\n  // Tauri resolves the source inside `loadThumbSrc` instead.\n  const resolvedMediaUrl = useRenderableMediaUrl(encInfo || tauri ? undefined : rawMediaUrl);\n\n  const createObjectURL = useCreateObjectURL();\n\n  const [thumbSrcState, loadThumbSrc] = useAsyncCallback(\n    useCallback(async () => {\n      const thumbInfo = info.thumbnail_info;\n      // Only the URL is required: `mimetype` is a decryption hint that already falls back,\n      // and other clients routinely omit it.\n      if (typeof thumbMxcUrl !== 'string') {\n        throw new Error('Failed to load thumbnail');\n      }\n      if (encInfo) {\n        if (!rawMediaUrl) throw new Error('Invalid media URL');\n        if (tauri) {\n          await setMediaEncryption(rawMediaUrl, encInfo, thumbInfo?.mimetype ?? FALLBACK_MIMETYPE);\n          return rewriteAuthenticatedMediaUrl(rawMediaUrl)!;\n        }\n        return createObjectURL(\n          downloadEncryptedMedia(rawMediaUrl, (encBuf) =>\n            decryptFile(encBuf, thumbInfo?.mimetype ?? FALLBACK_MIMETYPE, encInfo)\n          )\n        );\n      }\n      if (tauri && rawMediaUrl) return prepareLoopbackImageSource(rawMediaUrl);\n      return resolvedMediaUrl ?? rawMediaUrl ?? thumbMxcUrl;\n    }, [info, thumbMxcUrl, rawMediaUrl, resolvedMediaUrl, tauri, encInfo, createObjectURL])\n  );\n\n  useEffect(() => {\n    // The failure is already reflected in `thumbSrcState`; swallow the rejection so it\n    // does not surface as an unhandled promise rejection.\n    loadThumbSrc().catch(() => undefined);\n  }, [loadThumbSrc]);\n\n  if (thumbSrcState.status === AsyncStatus.Success) return renderImage(thumbSrcState.data);\n\n  if (thumbSrcState.status === AsyncStatus.Loading) {\n    return (\n      <Box alignItems=\"Center\" justifyContent=\"Center\">\n        <Spinner variant=\"Secondary\" />\n      </Box>\n    );\n  }\n\n  return null;\n}\n","var q=[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"#\",\"$\",\"%\",\"*\",\"+\",\",\",\"-\",\".\",\":\",\";\",\"=\",\"?\",\"@\",\"[\",\"]\",\"^\",\"_\",\"{\",\"|\",\"}\",\"~\"],x=t=>{let e=0;for(let r=0;r<t.length;r++){let n=t[r],l=q.indexOf(n);e=e*83+l}return e},p=(t,e)=>{var r=\"\";for(let n=1;n<=e;n++){let l=Math.floor(t)/Math.pow(83,e-n)%83;r+=q[Math.floor(l)]}return r};var f=t=>{let e=t/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)},h=t=>{let e=Math.max(0,Math.min(1,t));return e<=.0031308?Math.trunc(e*12.92*255+.5):Math.trunc((1.055*Math.pow(e,.4166666666666667)-.055)*255+.5)},F=t=>t<0?-1:1,M=(t,e)=>F(t)*Math.pow(Math.abs(t),e);var d=class extends Error{constructor(e){super(e),this.name=\"ValidationError\",this.message=e}};var C=t=>{if(!t||t.length<6)throw new d(\"The blurhash string must be at least 6 characters\");let e=x(t[0]),r=Math.floor(e/9)+1,n=e%9+1;if(t.length!==4+2*n*r)throw new d(`blurhash length mismatch: length is ${t.length} but it should be ${4+2*n*r}`)},N=t=>{try{C(t)}catch(e){return{result:!1,errorReason:e.message}}return{result:!0}},z=t=>{let e=t>>16,r=t>>8&255,n=t&255;return[f(e),f(r),f(n)]},L=(t,e)=>{let r=Math.floor(t/361),n=Math.floor(t/19)%19,l=t%19;return[M((r-9)/9,2)*e,M((n-9)/9,2)*e,M((l-9)/9,2)*e]},U=(t,e,r,n)=>{C(t),n=n|1;let l=x(t[0]),m=Math.floor(l/9)+1,b=l%9+1,i=(x(t[1])+1)/166,u=new Array(b*m);for(let o=0;o<u.length;o++)if(o===0){let a=x(t.substring(2,6));u[o]=z(a)}else{let a=x(t.substring(4+o*2,6+o*2));u[o]=L(a,i*n)}let c=e*4,s=new Uint8ClampedArray(c*r);for(let o=0;o<r;o++)for(let a=0;a<e;a++){let y=0,B=0,R=0;for(let w=0;w<m;w++)for(let P=0;P<b;P++){let G=Math.cos(Math.PI*a*P/e)*Math.cos(Math.PI*o*w/r),T=u[P+w*b];y+=T[0]*G,B+=T[1]*G,R+=T[2]*G}let V=h(y),I=h(B),E=h(R);s[4*a+0+o*c]=V,s[4*a+1+o*c]=I,s[4*a+2+o*c]=E,s[4*a+3+o*c]=255}return s},j=U;var A=4,D=(t,e,r,n)=>{let l=0,m=0,b=0,g=e*A;for(let u=0;u<e;u++){let c=A*u;for(let s=0;s<r;s++){let o=c+s*g,a=n(u,s);l+=a*f(t[o]),m+=a*f(t[o+1]),b+=a*f(t[o+2])}}let i=1/(e*r);return[l*i,m*i,b*i]},$=t=>{let e=h(t[0]),r=h(t[1]),n=h(t[2]);return(e<<16)+(r<<8)+n},H=(t,e)=>{let r=Math.floor(Math.max(0,Math.min(18,Math.floor(M(t[0]/e,.5)*9+9.5)))),n=Math.floor(Math.max(0,Math.min(18,Math.floor(M(t[1]/e,.5)*9+9.5)))),l=Math.floor(Math.max(0,Math.min(18,Math.floor(M(t[2]/e,.5)*9+9.5))));return r*19*19+n*19+l},O=(t,e,r,n,l)=>{if(n<1||n>9||l<1||l>9)throw new d(\"BlurHash must have between 1 and 9 components\");if(e*r*4!==t.length)throw new d(\"Width and height must match the pixels array\");let m=[];for(let s=0;s<l;s++)for(let o=0;o<n;o++){let a=o==0&&s==0?1:2,y=D(t,e,r,(B,R)=>a*Math.cos(Math.PI*o*B/e)*Math.cos(Math.PI*s*R/r));m.push(y)}let b=m[0],g=m.slice(1),i=\"\",u=n-1+(l-1)*9;i+=p(u,1);let c;if(g.length>0){let s=Math.max(...g.map(a=>Math.max(...a))),o=Math.floor(Math.max(0,Math.min(82,Math.floor(s*166-.5))));c=(o+1)/166,i+=p(o,1)}else c=1,i+=p(0,1);return i+=p($(b),4),g.forEach(s=>{i+=p(H(s,c),2)}),i},S=O;export{d as ValidationError,j as decode,S as encode,N as isBlurhashValid};\n//# sourceMappingURL=index.js.map","var P=Object.defineProperty,R=Object.defineProperties;var C=Object.getOwnPropertyDescriptors;var m=Object.getOwnPropertySymbols;var v=Object.prototype.hasOwnProperty,x=Object.prototype.propertyIsEnumerable;var b=(e,s,t)=>s in e?P(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t,h=(e,s)=>{for(var t in s||(s={}))v.call(s,t)&&b(e,t,s[t]);if(m)for(var t of m(s))x.call(s,t)&&b(e,t,s[t]);return e},p=(e,s)=>R(e,C(s));var g=(e,s)=>{var t={};for(var r in e)v.call(e,r)&&s.indexOf(r)<0&&(t[r]=e[r]);if(e!=null&&m)for(var r of m(e))s.indexOf(r)<0&&x.call(e,r)&&(t[r]=e[r]);return t};import*as l from\"react\";import*as f from\"react\";import{decode as y}from\"blurhash\";var o=class extends f.PureComponent{constructor(){super(...arguments);this.canvas=null;this.handleRef=t=>{this.canvas=t,this.draw()};this.draw=()=>{let{hash:t,height:r,punch:n,width:a}=this.props;if(this.canvas){let i=y(t,a,r,n),c=this.canvas.getContext(\"2d\"),d=c.createImageData(a,r);d.data.set(i),c.putImageData(d,0,0)}}}componentDidUpdate(){this.draw()}render(){let i=this.props,{hash:t,height:r,width:n}=i,a=g(i,[\"hash\",\"height\",\"width\"]);return f.createElement(\"canvas\",p(h({},a),{height:r,width:n,ref:this.handleRef}))}};o.defaultProps={height:128,width:128};var D={position:\"absolute\",top:0,bottom:0,left:0,right:0,width:\"100%\",height:\"100%\"},u=class extends l.PureComponent{componentDidUpdate(){if(this.props.resolutionX<=0)throw new Error(\"resolutionX must be larger than zero\");if(this.props.resolutionY<=0)throw new Error(\"resolutionY must be larger than zero\")}render(){let w=this.props,{hash:s,height:t,width:r,punch:n,resolutionX:a,resolutionY:i,style:c}=w,d=g(w,[\"hash\",\"height\",\"width\",\"punch\",\"resolutionX\",\"resolutionY\",\"style\"]);return l.createElement(\"div\",p(h({},d),{style:p(h({display:\"inline-block\",height:t,width:r},c),{position:\"relative\"})}),l.createElement(o,{hash:s,height:i,width:a,punch:n,style:D}))}};u.defaultProps={height:128,width:128,resolutionX:32,resolutionY:32};export{u as Blurhash,o as BlurhashCanvas};\n//# sourceMappingURL=index.js.map","import { encode, isBlurhashValid } from 'blurhash';\nimport { blurHashWorkerSupported, encodeBlurHashInWorker } from '$utils/mediaWorker';\n\nexport const encodeBlurHash = (\n  img: HTMLImageElement | HTMLVideoElement,\n  width?: number,\n  height?: number\n): string | undefined => {\n  const imgWidth = img instanceof HTMLVideoElement ? img.videoWidth : img.width;\n  const imgHeight = img instanceof HTMLVideoElement ? img.videoHeight : img.height;\n  const canvas = document.createElement('canvas');\n  canvas.width = width || imgWidth;\n  canvas.height = height || imgHeight;\n  const context = canvas.getContext('2d');\n\n  if (!context) return undefined;\n  context.drawImage(img, 0, 0, canvas.width, canvas.height);\n  try {\n    const data = context.getImageData(0, 0, canvas.width, canvas.height);\n    return encode(data.data, data.width, data.height, 4, 4);\n  } catch (err) {\n    console.warn('Failed to encode blurhash, possibly due to cross-origin tainted canvas:', err);\n    return undefined;\n  }\n};\n\nexport const encodeBlurHashAsync = async (\n  img: HTMLImageElement | HTMLVideoElement,\n  width: number,\n  height: number\n): Promise<string | undefined> => {\n  if (blurHashWorkerSupported()) {\n    let bitmap: ImageBitmap | undefined;\n    try {\n      bitmap = await createImageBitmap(img, {\n        resizeWidth: width,\n        resizeHeight: height,\n        resizeQuality: 'low',\n      });\n      return await encodeBlurHashInWorker(bitmap, width, height);\n    } catch {\n      bitmap?.close();\n    }\n  }\n  return encodeBlurHash(img, width, height);\n};\n\nexport const validBlurHash = (hash?: string): string | undefined => {\n  if (typeof hash === 'string') {\n    const validity = isBlurhashValid(hash);\n\n    return validity.result ? hash : undefined;\n  }\n\n  return undefined;\n};\n","export type ExternalGifContent = {\n  v: 1;\n  provider: string;\n  media_url: string;\n  w: number;\n  h: number;\n  mimetype?: string;\n  size?: number;\n  blurhash?: string;\n  id?: string;\n  title?: string;\n};\n\nexport type ExternalGif = ExternalGifContent;\n\nexport type ExternalGifProvider = {\n  id: string;\n  isMediaUrlAllowed: (url: URL) => boolean;\n};\n\nconst MAX_DIMENSION = 8192;\nconst externalGifProviders: Record<string, ExternalGifProvider> = {\n  klipy: {\n    id: 'klipy',\n    isMediaUrlAllowed: (url) =>\n      url.protocol === 'https:' &&\n      url.hostname === 'static.klipy.com' &&\n      url.port === '' &&\n      url.username === '' &&\n      url.password === '' &&\n      /^\\/ii\\/.+/.test(url.pathname),\n  },\n};\n\nexport function isAllowedKlipyMediaUrl(value: string | URL): boolean {\n  try {\n    const url = typeof value === 'string' ? new URL(value) : value;\n    return externalGifProviders.klipy?.isMediaUrlAllowed(url) === true;\n  } catch {\n    return false;\n  }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n  !!value && typeof value === 'object' && !Array.isArray(value);\n\nexport const isValidExternalGifDimension = (value: unknown): value is number =>\n  typeof value === 'number' && Number.isSafeInteger(value) && value > 0 && value <= MAX_DIMENSION;\n\nexport function parseExternalGif(content: unknown): ExternalGif | undefined {\n  if (!isRecord(content) || content.msgtype !== 'm.text') return undefined;\n  const raw = content['pet.plz.gif'];\n  if (!isRecord(raw) || raw.v !== 1 || typeof raw.provider !== 'string') return undefined;\n\n  const provider = Object.prototype.hasOwnProperty.call(externalGifProviders, raw.provider)\n    ? externalGifProviders[raw.provider]\n    : undefined;\n  if (\n    !provider ||\n    typeof raw.media_url !== 'string' ||\n    !isValidExternalGifDimension(raw.w) ||\n    !isValidExternalGifDimension(raw.h)\n  ) {\n    return undefined;\n  }\n  let mediaUrl: URL;\n  try {\n    mediaUrl = new URL(raw.media_url);\n  } catch {\n    return undefined;\n  }\n  if (!provider.isMediaUrlAllowed(mediaUrl)) return undefined;\n\n  return {\n    v: 1,\n    provider: provider.id,\n    media_url: raw.media_url,\n    w: raw.w,\n    h: raw.h,\n    ...(typeof raw.mimetype === 'string' ? { mimetype: raw.mimetype } : {}),\n    ...(typeof raw.size === 'number' && Number.isSafeInteger(raw.size) && raw.size >= 0\n      ? { size: raw.size }\n      : {}),\n    ...(typeof raw.blurhash === 'string' ? { blurhash: raw.blurhash } : {}),\n    ...(typeof raw.id === 'string' ? { id: raw.id } : {}),\n    ...(typeof raw.title === 'string' ? { title: raw.title } : {}),\n  };\n}\n","import type { ExternalGifContent } from './externalGif';\nimport { isAllowedKlipyMediaUrl, isValidExternalGifDimension } from './externalGif';\nimport { MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME } from '$unstable/prefixes';\n\nconst LEGACY_MEDIA_PREFIX = 'klipy_';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n  !!value && typeof value === 'object' && !Array.isArray(value);\n\nfunction decodeBase64Url(value: string): string | undefined {\n  try {\n    if (!/^[A-Za-z0-9_-]+$/.test(value)) return undefined;\n    const base64 = value.replaceAll('-', '+').replaceAll('_', '/');\n    const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, '=');\n    const binary = atob(padded);\n    return new TextDecoder().decode(Uint8Array.from(binary, (char) => char.charCodeAt(0)));\n  } catch {\n    return undefined;\n  }\n}\n\nexport function decodeLegacyKlipyMxc(mxcUrl: string): string | undefined {\n  try {\n    const mxc = new URL(mxcUrl);\n    const encoded = mxc.pathname.slice(1);\n    if (\n      mxc.protocol !== 'mxc:' ||\n      mxc.hostname !== 'gifs.sable.moe' ||\n      mxc.port !== '' ||\n      mxc.username !== '' ||\n      mxc.password !== '' ||\n      mxc.search !== '' ||\n      mxc.hash !== '' ||\n      !encoded.startsWith(LEGACY_MEDIA_PREFIX)\n    ) {\n      return undefined;\n    }\n\n    const path = decodeBase64Url(encoded.slice(LEGACY_MEDIA_PREFIX.length));\n    const mediaUrl = path ? `https://static.klipy.com/ii/${path}` : undefined;\n    return mediaUrl && isAllowedKlipyMediaUrl(mediaUrl) ? mediaUrl : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nexport function parseLegacyKlipyGif(content: unknown): ExternalGifContent | undefined {\n  if (!isRecord(content) || content.msgtype !== 'm.image') return undefined;\n\n  const file = content.file;\n  const mxcUrl =\n    typeof content.url === 'string'\n      ? content.url\n      : isRecord(file) && typeof file.url === 'string'\n        ? file.url\n        : undefined;\n  const mediaUrl = mxcUrl ? decodeLegacyKlipyMxc(mxcUrl) : undefined;\n  const info = isRecord(content.info) ? content.info : undefined;\n  const width = info?.w;\n  const height = info?.h;\n  if (!mediaUrl || !isValidExternalGifDimension(width) || !isValidExternalGifDimension(height)) {\n    return undefined;\n  }\n\n  return {\n    v: 1,\n    provider: 'klipy',\n    media_url: mediaUrl,\n    w: width,\n    h: height,\n    ...(typeof info?.mimetype === 'string' ? { mimetype: info.mimetype } : {}),\n    ...(typeof info?.size === 'number' && Number.isSafeInteger(info.size) && info.size >= 0\n      ? { size: info.size }\n      : {}),\n    ...(typeof info?.[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME] === 'string'\n      ? { blurhash: info[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME] }\n      : {}),\n    ...(typeof content.body === 'string' ? { title: content.body } : {}),\n  };\n}\n\nexport { isAllowedKlipyMediaUrl };\n","import { useMemo } from 'react';\nimport type { AccountDataEvents } from 'matrix-js-sdk';\nimport type { GifData } from '$components/emoji-board/types';\nimport { isAllowedKlipyMediaUrl } from '$utils/externalGif';\nimport { decodeLegacyKlipyMxc } from '$utils/klipy';\nimport { MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS } from '../../unstable/prefixes';\nimport { useAccountData } from './useAccountData';\n\ntype FavoriteGif = Omit<GifData, 'id'>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n  !!value && typeof value === 'object' && !Array.isArray(value);\n\nconst isMatrixMediaUrl = (value: string): boolean => {\n  try {\n    const url = new URL(value);\n    return (\n      url.protocol === 'mxc:' &&\n      url.hostname !== '' &&\n      url.username === '' &&\n      url.password === '' &&\n      url.pathname.length > 1 &&\n      url.search === '' &&\n      url.hash === ''\n    );\n  } catch {\n    return false;\n  }\n};\n\nconst normalizeMediaUrl = (value: string): string | undefined => {\n  if (isAllowedKlipyMediaUrl(value)) return value;\n  return decodeLegacyKlipyMxc(value) ?? (isMatrixMediaUrl(value) ? value : undefined);\n};\n\nexport const normalizeFavoriteGifs = (value: unknown): FavoriteGif[] => {\n  if (!isRecord(value) || !Array.isArray(value.gifs)) return [];\n\n  const gifs = value.gifs.flatMap((entry): FavoriteGif[] => {\n    if (!isRecord(entry)) return [];\n    const legacyUrl = typeof entry.url === 'string' ? entry.url : undefined;\n    const rawMediaUrl = typeof entry.mediaUrl === 'string' ? entry.mediaUrl : undefined;\n    const legacyMediaUrl =\n      (rawMediaUrl && decodeLegacyKlipyMxc(rawMediaUrl)) ??\n      (legacyUrl && decodeLegacyKlipyMxc(legacyUrl));\n    const mediaUrl = rawMediaUrl ? normalizeMediaUrl(rawMediaUrl) : undefined;\n    const migratedMediaUrl = mediaUrl ?? (legacyUrl ? normalizeMediaUrl(legacyUrl) : undefined);\n    if (!migratedMediaUrl) return [];\n    const shareUrl =\n      (typeof entry.shareUrl === 'string' && entry.shareUrl\n        ? (decodeLegacyKlipyMxc(entry.shareUrl) ?? entry.shareUrl)\n        : undefined) ?? migratedMediaUrl;\n\n    return [\n      {\n        title: typeof entry.title === 'string' ? entry.title : 'GIF',\n        shareUrl: legacyMediaUrl ?? shareUrl,\n        mediaUrl: migratedMediaUrl,\n        ...(typeof entry.width === 'number' ? { width: entry.width } : {}),\n        ...(typeof entry.height === 'number' ? { height: entry.height } : {}),\n        ...(typeof entry.size === 'number' ? { size: entry.size } : {}),\n        ...(typeof entry.mimetype === 'string' ? { mimetype: entry.mimetype } : {}),\n        ...(typeof entry.blurhash === 'string' ? { blurhash: entry.blurhash } : {}),\n      },\n    ];\n  });\n\n  return gifs;\n};\n\nexport const useFavoriteGifs =\n  (): AccountDataEvents[typeof MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS] => {\n    const favoritedGifsData = useAccountData(MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS);\n    const gifs = useMemo(\n      () => normalizeFavoriteGifs(favoritedGifsData?.getContent()),\n      [favoritedGifsData]\n    );\n\n    return { gifs };\n  };\n","import type { MouseEvent as ReactMouseEvent, MouseEventHandler, PointerEventHandler } from 'react';\nimport { useCallback, useRef } from 'react';\n\nconst TAP_MOVEMENT_THRESHOLD = 10;\nconst MAX_TAP_DURATION = 500;\nconst SYNTHETIC_CLICK_TIMEOUT = 350;\n\nlet clearPendingSyntheticClick: (() => void) | undefined;\n\nfunction blockSyntheticClick(clientX: number, clientY: number) {\n  clearPendingSyntheticClick?.();\n\n  let timeout: number | undefined;\n  const clear = () => {\n    document.removeEventListener('click', handleClick, true);\n    document.removeEventListener('pointerdown', clear, true);\n    window.clearTimeout(timeout);\n    if (clearPendingSyntheticClick === clear) clearPendingSyntheticClick = undefined;\n  };\n  const handleClick = (event: MouseEvent) => {\n    if (\n      Math.abs(event.clientX - clientX) > TAP_MOVEMENT_THRESHOLD ||\n      Math.abs(event.clientY - clientY) > TAP_MOVEMENT_THRESHOLD\n    ) {\n      return;\n    }\n    clear();\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  };\n\n  clearPendingSyntheticClick = clear;\n  document.addEventListener('click', handleClick, true);\n  document.addEventListener('pointerdown', clear, true);\n  timeout = window.setTimeout(clear, SYNTHETIC_CLICK_TIMEOUT);\n}\n\n// Android WebView suppresses click synthesis after a drag gesture, so the first\n// tap on a nav control after swiping the drawer produces no click event. Activate\n// directly on pointerup instead, and swallow the synthetic click that follows a\n// touch tap so the action fires exactly once. (preventDefault on pointerup does\n// NOT suppress click — click is an activation event, not a compatibility mouse\n// event — so the dedup is handled by the returned `onClick` wrapper below.)\n//\n// `onActivate` runs on a qualifying touch pointerup. The returned `onClick`\n// wraps the caller's click handler: if a touch tap already activated, the click\n// is swallowed; otherwise the click handler runs (desktop, keyboard, AT, and\n// the post-swipe case where no click arrives). Do not wrap the callbacks in\n// startTransition or defer them — that reintroduces the double-tap.\nexport function useMobileTapActivation<T extends HTMLElement>(\n  enabled: boolean,\n  onActivate: (evt: ReactMouseEvent<T>) => void,\n  onClick?: MouseEventHandler<T>\n): {\n  onPointerDown: PointerEventHandler<T>;\n  onPointerMove: PointerEventHandler<T>;\n  onPointerUp: PointerEventHandler<T>;\n  onPointerCancel: PointerEventHandler<T>;\n  onClick: MouseEventHandler<T>;\n} {\n  const onActivateRef = useRef(onActivate);\n  const onClickRef = useRef(onClick);\n  const pointerDownRef = useRef<{\n    pointerId: number;\n    x: number;\n    y: number;\n    timestamp: number;\n    eligible: boolean;\n  } | null>(null);\n  // True between a qualifying touch pointerup and the click it synthesises.\n  // Reset on every pointerdown so a stale flag can never outlive one tap.\n  const activatedRef = useRef(false);\n  onActivateRef.current = onActivate;\n  onClickRef.current = onClick;\n\n  const onPointerDown: PointerEventHandler<T> = (evt) => {\n    activatedRef.current = false;\n    if (!enabled || evt.pointerType !== 'touch' || !evt.isPrimary || evt.button !== 0) {\n      pointerDownRef.current = null;\n      return;\n    }\n\n    pointerDownRef.current = {\n      pointerId: evt.pointerId,\n      x: evt.clientX,\n      y: evt.clientY,\n      timestamp: evt.timeStamp,\n      eligible: true,\n    };\n  };\n  const onPointerMove: PointerEventHandler<T> = (evt) => {\n    const pointerDown = pointerDownRef.current;\n    if (!pointerDown || evt.pointerId !== pointerDown.pointerId) return;\n\n    if (\n      Math.abs(evt.clientX - pointerDown.x) > TAP_MOVEMENT_THRESHOLD ||\n      Math.abs(evt.clientY - pointerDown.y) > TAP_MOVEMENT_THRESHOLD\n    ) {\n      pointerDown.eligible = false;\n    }\n  };\n  const onPointerUp: PointerEventHandler<T> = (evt) => {\n    const pointerDown = pointerDownRef.current;\n    if (!pointerDown || evt.pointerId !== pointerDown.pointerId) return;\n\n    pointerDownRef.current = null;\n    if (\n      !enabled ||\n      evt.pointerType !== 'touch' ||\n      !evt.isPrimary ||\n      !pointerDown.eligible ||\n      Math.abs(evt.clientX - pointerDown.x) > TAP_MOVEMENT_THRESHOLD ||\n      Math.abs(evt.clientY - pointerDown.y) > TAP_MOVEMENT_THRESHOLD ||\n      evt.timeStamp - pointerDown.timestamp >= MAX_TAP_DURATION\n    ) {\n      return;\n    }\n\n    evt.preventDefault();\n    activatedRef.current = true;\n    blockSyntheticClick(evt.clientX, evt.clientY);\n    onActivateRef.current(evt);\n  };\n  const onPointerCancel: PointerEventHandler<T> = (evt) => {\n    if (evt.pointerId !== pointerDownRef.current?.pointerId) return;\n    pointerDownRef.current = null;\n  };\n\n  // Swallow the synthetic click that follows a touch pointerup; otherwise run\n  // the caller's click handler (or onActivate when none was provided).\n  const handleClick: MouseEventHandler<T> = useCallback((evt) => {\n    if (activatedRef.current) {\n      activatedRef.current = false;\n      return;\n    }\n    if (onClickRef.current) onClickRef.current(evt);\n    else onActivateRef.current(evt);\n  }, []);\n\n  return { onPointerDown, onPointerMove, onPointerUp, onPointerCancel, onClick: handleClick };\n}\n","import type { CSSProperties, ReactNode, SyntheticEvent } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n  Badge,\n  Box,\n  Button,\n  Chip,\n  Menu,\n  MenuItem,\n  Modal,\n  Spinner,\n  Text,\n  Tooltip,\n  as,\n  color,\n  config,\n  toRem,\n} from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport {\n  Eye,\n  EyeSlash,\n  menuIcon,\n  sizedIcon,\n  Image,\n  Warning,\n  Star,\n} from '$components/icons/phosphor';\nimport classNames from 'classnames';\nimport { BlurhashCanvas } from 'react-blurhash';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport type { IImageInfo } from '$types/matrix/common';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { bytesToSize } from '$utils/common';\nimport { FALLBACK_MIMETYPE } from '$utils/mimeTypes';\nimport {\n  decryptFile,\n  downloadEncryptedMedia,\n  mxcUrlToHttp,\n  rewriteAuthenticatedMediaUrl,\n} from '$utils/matrix';\nimport {\n  addTauriMediaRetryRevision,\n  getTauriMediaRetryTarget,\n  prepareLoopbackImageSource,\n} from '$utils/mediaUrl';\nimport { setMediaEncryption } from '$utils/tauriMediaEncryption';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { ModalWide } from '$styles/Modal.css';\nimport { validBlurHash } from '$utils/blurHash';\nimport * as css from './style.css';\nimport {\n  MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS,\n  MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME,\n} from '../../../../unstable/prefixes';\nimport { useFavoriteGifs } from '$hooks/useFavoriteGifs';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport { useCreateObjectURL } from '$hooks/useObjectURL';\nimport { ScreenSize, useScreenSizeOptionally } from '$hooks/useScreenSize';\nimport { useMobileTapActivation } from '$hooks/useMobileTapActivation';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\nexport function checkIfGif(url: string, mimetype?: string, body?: string) {\n  return (\n    mimetype === 'image/avif' ||\n    mimetype === 'image/gif' ||\n    mimetype === 'image/apng' ||\n    mimetype === 'image/webp' ||\n    (body ?? '').toLowerCase().endsWith('.avif') ||\n    (body ?? '').toLowerCase().endsWith('.gif') ||\n    (body ?? '').toLowerCase().endsWith('.apng') ||\n    (body ?? '').toLowerCase().endsWith('.webp') ||\n    url.toLowerCase().endsWith('.avif') ||\n    url.toLowerCase().endsWith('.gif') ||\n    url.toLowerCase().endsWith('.apng') ||\n    url.toLowerCase().endsWith('.webp') ||\n    false\n  );\n}\n\n// Matches Element Web's timeline thumbnail budget.\nconst TIMELINE_THUMBNAIL_WIDTH = 800;\nconst TIMELINE_THUMBNAIL_HEIGHT = 600;\nconst THUMBNAIL_MIN_SOURCE_BYTES = 1024 * 1024;\n\n// Follows Element Web's `getThumbUrl`, except that unknown dimensions keep the original: stickers\n// and custom emoji render through this component too and routinely omit `info`.\nfunction wantsThumbnail(info: IImageInfo | undefined, width: number, height: number): boolean {\n  if (!info?.w || !info.h || !info.size) return false;\n  if (info.w <= width && info.h <= height) return false;\n  // At 1x the thumbnail is already full quality for the box; denser screens keep the original\n  // until the file is big enough that the bytes matter more than the sharpness.\n  return window.devicePixelRatio === 1 || info.size > THUMBNAIL_MIN_SOURCE_BYTES;\n}\n\n// `info.w`/`info.h` have the source EXIF orientation applied; homeservers that scale raw pixels\n// return a transposed thumbnail with no EXIF left for the browser to correct.\nfunction isTransposedThumbnail(info: IImageInfo | undefined, image: HTMLImageElement): boolean {\n  const { naturalWidth, naturalHeight } = image;\n  if (!info?.w || !info.h || !naturalWidth || !naturalHeight) return false;\n  return info.w > info.h !== naturalWidth > naturalHeight;\n}\n\ntype RenderViewerProps = {\n  src: string;\n  alt: string;\n  filename?: string;\n  requestClose: () => void;\n  info?: IImageInfo;\n  getDownloadBlob?: () => Promise<Blob>;\n};\ntype RenderImageProps = {\n  alt: string;\n  title: string;\n  src: string;\n  info?: IImageInfo;\n  onLoad: (event?: SyntheticEvent<HTMLImageElement>) => void;\n  onError: () => void;\n  onLottieLoad: () => void;\n  onLottieError: () => void;\n  onClick: () => void;\n  tabIndex: number;\n  style?: CSSProperties;\n};\nexport type ImageContentProps = {\n  body?: string;\n  filename?: string;\n  mimeType?: string;\n  url: string;\n  info?: IImageInfo;\n  encInfo?: EncryptedAttachmentInfo;\n  autoPlay?: boolean;\n  favoriteShareUrl?: string;\n  loadLabel?: string;\n  loadDescription?: string;\n  deferMediaLoad?: boolean;\n  markedAsSpoiler?: boolean;\n  spoilerReason?: string;\n  renderViewer: (props: RenderViewerProps) => ReactNode;\n  renderImage: (props: RenderImageProps) => ReactNode;\n  /** Opens the room-scoped mobile viewer when this attachment belongs to a timeline.\n   *  Returns false when it declines, and the local viewer opens instead. */\n  onOpenViewer?: () => boolean;\n  matrixThumbnailMaxEdge?: number;\n  mediaLayout?: 'default' | 'contained';\n  containedStripMinPx?: number;\n  fillsPreviewSlot?: boolean;\n};\nexport const ImageContent = as<'div', ImageContentProps>(\n  (\n    {\n      className,\n      style,\n      body,\n      filename,\n      mimeType,\n      url,\n      info,\n      encInfo,\n      autoPlay,\n      favoriteShareUrl,\n      loadLabel,\n      loadDescription,\n      deferMediaLoad = false,\n      markedAsSpoiler,\n      spoilerReason,\n      renderViewer,\n      renderImage,\n      onOpenViewer,\n      matrixThumbnailMaxEdge,\n      mediaLayout = 'default',\n      containedStripMinPx,\n      fillsPreviewSlot,\n      ...props\n    },\n    ref\n  ) => {\n    const mx = useMatrixClient();\n    const useAuthentication = useMediaAuthentication();\n    const isMobile = useScreenSizeOptionally() === ScreenSize.Mobile;\n    const blurHash = validBlurHash(info?.[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]);\n\n    const [load, setLoad] = useState(false);\n    const [error, setError] = useState(false);\n    const [loadRequested, setLoadRequested] = useState(autoPlay ?? false);\n    // Tauri only: each retry gets a distinct sable-media:// src.\n    const retryRevisionRef = useRef(0);\n    const [viewer, setViewer] = useState(false);\n    const [viewerFullSrc, setViewerFullSrc] = useState<string | null>(null);\n    const [blurred, setBlurred] = useState(markedAsSpoiler ?? false);\n    const [isHovered, setIsHovered] = useState(false);\n\n    const favoritedContent = useFavoriteGifs();\n    const [favorited, setFavorited] = useState(\n      favoritedContent.gifs.find((v) => v.mediaUrl == url) != undefined\n    );\n\n    const isGif = checkIfGif(url, info?.mimetype, body);\n\n    const [thumbnailFailed, setThumbnailFailed] = useState(false);\n    // A caller-supplied edge means it already decided it wants a thumbnail of that size.\n    const explicitEdge = typeof matrixThumbnailMaxEdge === 'number' && matrixThumbnailMaxEdge > 0;\n    // Synapse rejects non-integer dimensions with a 400.\n    const thumbWidth = Math.round(explicitEdge ? matrixThumbnailMaxEdge : TIMELINE_THUMBNAIL_WIDTH);\n    const thumbHeight = Math.round(\n      explicitEdge ? matrixThumbnailMaxEdge : TIMELINE_THUMBNAIL_HEIGHT\n    );\n    const usesThumbnail =\n      !encInfo && // the homeserver cannot scale media it cannot decrypt\n      !isGif && // scaling drops the animation\n      !url.startsWith('http') &&\n      !thumbnailFailed &&\n      (explicitEdge || wantsThumbnail(info, thumbWidth, thumbHeight));\n\n    const rawMediaUrl = useMemo(() => {\n      if (url.startsWith('http')) return url;\n      if (usesThumbnail) {\n        return (\n          mxcUrlToHttp(mx, url, useAuthentication, thumbWidth, thumbHeight, 'scale') ?? undefined\n        );\n      }\n      return mxcUrlToHttp(mx, url, useAuthentication) ?? undefined;\n    }, [mx, url, useAuthentication, usesThumbnail, thumbWidth, thumbHeight]);\n\n    const shouldResolveMedia = !deferMediaLoad || autoPlay || loadRequested;\n    const tauri = isTauri();\n    // Tauri resolves the source inside `loadSrc` instead.\n    const resolvedMediaUrl = useRenderableMediaUrl(\n      encInfo || tauri || !shouldResolveMedia ? undefined : rawMediaUrl\n    );\n\n    const createObjectURL = useCreateObjectURL();\n\n    const [srcState, loadSrc] = useAsyncCallback(\n      useCallback(async () => {\n        if (encInfo) {\n          if (!rawMediaUrl) throw new Error('Invalid media URL');\n          if (tauri) {\n            // The registration key is the revised target; Rust strips the fragment.\n            const attemptedTarget =\n              getTauriMediaRetryTarget(rawMediaUrl, retryRevisionRef.current) ?? rawMediaUrl;\n            await setMediaEncryption(attemptedTarget, encInfo, mimeType ?? FALLBACK_MIMETYPE);\n            return rewriteAuthenticatedMediaUrl(attemptedTarget)!;\n          }\n          return createObjectURL(\n            downloadEncryptedMedia(rawMediaUrl, (encBuf) =>\n              decryptFile(encBuf, mimeType ?? FALLBACK_MIMETYPE, encInfo)\n            )\n          );\n        }\n        const source = addTauriMediaRetryRevision(\n          resolvedMediaUrl ?? rawMediaUrl ?? url,\n          retryRevisionRef.current\n        );\n        return tauri && rawMediaUrl ? prepareLoopbackImageSource(source) : source;\n      }, [rawMediaUrl, resolvedMediaUrl, tauri, url, mimeType, encInfo, createObjectURL])\n    );\n\n    useEffect(() => {\n      if (!viewer) {\n        setViewerFullSrc(null);\n        return undefined;\n      }\n      // The timeline shows a scaled rendition, so the viewer has to re-fetch the original.\n      if (!usesThumbnail) {\n        return undefined;\n      }\n      let cancelled = false;\n      void (async () => {\n        const mediaUrl = mxcUrlToHttp(mx, url, useAuthentication);\n        if (!mediaUrl || cancelled) return;\n        setViewerFullSrc(mediaUrl);\n      })();\n      return () => {\n        cancelled = true;\n      };\n    }, [viewer, usesThumbnail, url, mx, useAuthentication]);\n\n    const handleLoad = (event?: SyntheticEvent<HTMLImageElement>) => {\n      if (usesThumbnail && event && isTransposedThumbnail(info, event.currentTarget)) {\n        setThumbnailFailed(true);\n        return;\n      }\n      setLoad(true);\n    };\n    const handleError = () => {\n      setLoad(false);\n      // Homeservers 4xx thumbnail requests for media they cannot scale; the original still works.\n      if (usesThumbnail) {\n        setThumbnailFailed(true);\n        return;\n      }\n      setError(true);\n    };\n\n    const handleRetry = () => {\n      setLoadRequested(true);\n      setError(false);\n      retryRevisionRef.current += 1;\n      loadSrc().catch(() => undefined);\n    };\n\n    const handleView = async () => {\n      setLoadRequested(true);\n      if (srcState.status !== AsyncStatus.Idle) return;\n      try {\n        const src = await loadSrc();\n        if (src !== undefined && !onOpenViewer?.()) setViewer(true);\n      } catch {\n        // The existing error state is handled by the async callback.\n      }\n    };\n    const viewActivation = useMobileTapActivation(isMobile, () => {\n      void handleView();\n    });\n\n    useEffect(() => {\n      if (autoPlay) loadSrc().catch(() => undefined);\n    }, [autoPlay, loadSrc]);\n\n    // Guarded by a ref rather than `loadSrc` identity: `loadSrc` changes on every render when the\n    // caller passes `info`/`encInfo` inline, which would otherwise re-fetch in a loop.\n    const fallbackLoadedRef = useRef(false);\n    useEffect(() => {\n      if (!thumbnailFailed || fallbackLoadedRef.current) return;\n      fallbackLoadedRef.current = true;\n      loadSrc().catch(() => undefined);\n    }, [thumbnailFailed, loadSrc]);\n\n    const imageW = info?.w;\n    const imageH = info?.h;\n    const hasDimensions = typeof imageW === 'number' && typeof imageH === 'number';\n    const isContained = mediaLayout === 'contained';\n    const fillsSlot = Boolean(fillsPreviewSlot && isContained);\n    const containedReserveStrip =\n      !fillsSlot &&\n      isContained &&\n      (srcState.status === AsyncStatus.Loading ||\n        srcState.status === AsyncStatus.Error ||\n        error ||\n        (srcState.status === AsyncStatus.Success && !load));\n\n    const rootClass = isContained ? css.ContainedMediaRoot : css.RelativeBase;\n    const stripMin = containedStripMinPx ?? 56;\n    const intrinsicSizingStyle = fillsSlot\n      ? {}\n      : isContained\n        ? { minHeight: containedReserveStrip ? toRem(stripMin) : undefined }\n        : hasDimensions\n          ? { aspectRatio: `${imageW} / ${imageH}` }\n          : { minHeight: '150px' };\n\n    const fillPreviewSlotStyle = fillsSlot\n      ? ({ width: '100%', height: '100%' } as const)\n      : undefined;\n    const viewerContent =\n      srcState.status === AsyncStatus.Success\n        ? renderViewer({\n            src: viewerFullSrc ?? srcState.data,\n            alt: body ?? '',\n            filename,\n            requestClose: () => setViewer(false),\n            info,\n            getDownloadBlob:\n              encInfo && rawMediaUrl\n                ? () =>\n                    downloadEncryptedMedia(rawMediaUrl, (buffer) =>\n                      decryptFile(buffer, mimeType ?? FALLBACK_MIMETYPE, encInfo)\n                    )\n                : undefined,\n          })\n        : null;\n\n    return (\n      <Box\n        className={classNames(rootClass, className)}\n        data-gestures=\"ignore\"\n        style={{\n          ...fillPreviewSlotStyle,\n          ...intrinsicSizingStyle,\n          ...style,\n        }}\n        {...props}\n        ref={ref}\n        onPointerEnter={(evt) => {\n          if (evt.pointerType === 'mouse' || evt.pointerType === 'pen') setIsHovered(true);\n        }}\n        onPointerLeave={(evt) => {\n          if (evt.pointerType === 'mouse' || evt.pointerType === 'pen') setIsHovered(false);\n        }}\n      >\n        {srcState.status === AsyncStatus.Success && (\n          <ModalOverlay\n            open={viewer}\n            requestClose={() => setViewer(false)}\n            mobile=\"fullscreen\"\n            background=\"#000\"\n            respectSafeArea={false}\n          >\n            {isMobile ? (\n              viewerContent\n            ) : (\n              <Modal\n                className={ModalWide}\n                size=\"500\"\n                onContextMenu={(evt: React.MouseEvent) => evt.stopPropagation()}\n              >\n                {viewerContent}\n              </Modal>\n            )}\n          </ModalOverlay>\n        )}\n        {typeof blurHash === 'string' && !load && (\n          <BlurhashCanvas\n            style={{ width: '100%', height: '100%' }}\n            width={32}\n            height={32}\n            hash={blurHash}\n            punch={1}\n          />\n        )}\n        {!autoPlay && !markedAsSpoiler && srcState.status === AsyncStatus.Idle && (\n          <Box\n            className={css.AbsoluteContainer}\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            direction=\"Column\"\n            gap=\"200\"\n            {...viewActivation}\n          >\n            {loadDescription && <Text size=\"T300\">{loadDescription}</Text>}\n            <Button\n              variant=\"Secondary\"\n              fill=\"Solid\"\n              radii=\"300\"\n              size=\"300\"\n              before={sizedIcon(Image, 'Inherit', { filled: true })}\n            >\n              <Text size=\"B300\">{loadLabel ?? 'View'}</Text>\n            </Button>\n          </Box>\n        )}\n        {srcState.status === AsyncStatus.Success && (\n          <Box\n            className={classNames(\n              hasDimensions && !isContained ? css.AbsoluteContainer : undefined,\n              blurred && css.Blur\n            )}\n            style={{ width: '100%' }}\n          >\n            {renderImage({\n              alt: body ?? '',\n              title: body ?? '',\n              src: srcState.data,\n              info,\n              style: { objectFit: isContained ? 'contain' : undefined },\n              onLoad: handleLoad,\n              onError: handleError,\n              onLottieLoad: handleLoad,\n              onLottieError: handleError,\n              onClick: () => {\n                setIsHovered(false);\n                if (!onOpenViewer?.()) setViewer(true);\n              },\n              tabIndex: 0,\n            })}\n          </Box>\n        )}\n        {blurred && !error && srcState.status !== AsyncStatus.Error && (\n          <Box\n            className={css.AbsoluteContainer}\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            onClick={() => {\n              setBlurred(false);\n              setLoadRequested(true);\n              if (srcState.status === AsyncStatus.Idle) {\n                loadSrc().catch(() => undefined);\n              }\n            }}\n          >\n            <Chip\n              variant=\"Secondary\"\n              radii=\"Pill\"\n              size=\"500\"\n              outlined\n              onClick={() => {\n                setBlurred(false);\n                setLoadRequested(true);\n                if (srcState.status === AsyncStatus.Idle) {\n                  loadSrc().catch(() => undefined);\n                }\n              }}\n            >\n              <Text size=\"B300\">\n                {typeof spoilerReason === 'string' && spoilerReason.length > 0\n                  ? `Spoiler reason: ${spoilerReason}`\n                  : `Spoilered`}\n              </Text>\n            </Chip>\n          </Box>\n        )}\n        {(srcState.status === AsyncStatus.Loading || srcState.status === AsyncStatus.Success) &&\n          !load &&\n          !blurred && (\n            <Box className={css.AbsoluteContainer} alignItems=\"Center\" justifyContent=\"Center\">\n              <Spinner variant=\"Secondary\" />\n            </Box>\n          )}\n        {(error || srcState.status === AsyncStatus.Error) && (\n          <Box\n            className={css.AbsoluteContainer}\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            onClick={handleRetry}\n          >\n            <TooltipProvider\n              tooltip={\n                <Tooltip variant=\"Critical\">\n                  <Text>Failed to load image!</Text>\n                </Tooltip>\n              }\n              position=\"Top\"\n              align=\"Center\"\n            >\n              {(triggerRef) => (\n                <Button\n                  ref={triggerRef}\n                  size=\"300\"\n                  variant=\"Critical\"\n                  fill=\"Soft\"\n                  outlined\n                  radii=\"300\"\n                  onClick={handleRetry}\n                  before={sizedIcon(Warning, 'Inherit', { filled: true })}\n                >\n                  <Text size=\"B300\">Retry</Text>\n                </Button>\n              )}\n            </TooltipProvider>\n          </Box>\n        )}\n        {isHovered && (\n          <Box style={{ padding: config.space.S200, right: 0, position: 'absolute' }}>\n            <Menu style={{ padding: config.space.S0 }}>\n              <Box>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"0\"\n                  fill=\"Soft\"\n                  variant=\"Secondary\"\n                  title={blurred ? 'Reveal Image' : 'Hide Image'}\n                  onClick={(e) => {\n                    e.preventDefault();\n                    if (srcState.status === AsyncStatus.Idle) {\n                      setLoadRequested(true);\n                      loadSrc().catch(() => undefined);\n                      setBlurred(false);\n                    } else setBlurred(!blurred);\n                  }}\n                >\n                  {menuIcon(blurred ? Eye : EyeSlash)}\n                </MenuItem>\n                {isGif && (\n                  <MenuItem\n                    size=\"300\"\n                    radii=\"0\"\n                    fill=\"Soft\"\n                    variant=\"Secondary\"\n                    title={favorited ? 'Unfavorite gif' : 'Favorite gif'}\n                    onClick={async (e) => {\n                      e.preventDefault();\n                      if (srcState.status === AsyncStatus.Success) {\n                        if (!favorited) {\n                          setFavorited(true);\n                          await mx\n                            .setAccountData(MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS, {\n                              gifs: [\n                                ...favoritedContent.gifs,\n                                {\n                                  title: body ?? '',\n                                  shareUrl: favoriteShareUrl ?? url,\n                                  mediaUrl: url,\n                                  width: imageW,\n                                  height: imageH,\n                                  size: info?.size,\n                                  mimetype: info?.mimetype,\n                                  ...(info?.[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]\n                                    ? {\n                                        blurhash: info[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME],\n                                      }\n                                    : {}),\n                                },\n                              ],\n                            })\n                            .catch(() => setFavorited(false));\n                        } else {\n                          setFavorited(false);\n                          await mx\n                            .setAccountData(MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS, {\n                              gifs: favoritedContent.gifs.filter((v) => v.mediaUrl != url),\n                            })\n                            .catch(() => setFavorited(true));\n                        }\n                      }\n                    }}\n                  >\n                    {menuIcon(Star, {\n                      weight: favorited ? 'fill' : 'regular',\n                      color: favorited ? color.Warning.MainHover : color.Secondary.OnContainer,\n                    })}\n                  </MenuItem>\n                )}\n              </Box>\n            </Menu>\n          </Box>\n        )}\n        {!load && typeof info?.size === 'number' && (\n          <Box className={css.AbsoluteFooter} justifyContent=\"End\" alignContent=\"Center\" gap=\"200\">\n            <Badge variant=\"Secondary\" fill=\"Soft\">\n              <Text size=\"L400\">{bytesToSize(info.size)}</Text>\n            </Badge>\n          </Box>\n        )}\n      </Box>\n    );\n  }\n);\n","import type { ReactNode, SyntheticEvent } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n  Badge,\n  Box,\n  Button,\n  Chip,\n  Menu,\n  MenuItem,\n  Spinner,\n  Text,\n  Tooltip,\n  as,\n  config,\n} from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { Eye, EyeSlash, menuIcon, sizedIcon, Play, Warning } from '$components/icons/phosphor';\nimport classNames from 'classnames';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { BlurhashCanvas } from 'react-blurhash';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport type { IThumbnailContent, IVideoInfo } from '$types/matrix/common';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { bytesToSize, millisecondsToMinutesAndSeconds } from '$utils/common';\nimport {\n  decryptFile,\n  downloadEncryptedMedia,\n  downloadMedia,\n  mxcUrlToHttp,\n  rewriteAuthenticatedMediaUrl,\n} from '$utils/matrix';\nimport {\n  addTauriMediaRetryRevision,\n  getTauriMediaRetryTarget,\n  prepareLoopbackMedia,\n} from '$utils/mediaUrl';\nimport { setMediaEncryption } from '$utils/tauriMediaEncryption';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useCreateObjectURL } from '$hooks/useObjectURL';\nimport { validBlurHash } from '$utils/blurHash';\nimport * as css from './style.css';\nimport { MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME } from '../../../../unstable/prefixes';\nimport { probeSWMediaAuthSupport } from '$utils/swMediaAuth';\nimport { createDebugLogger } from '$utils/debugLogger';\n\nconst logger = createDebugLogger('videoContent');\n\n// Diagnostics bundles drop the `data` field, so details have to go in the message.\n// URLs are redacted there, hence the scheme only.\nconst srcScheme = (src: string): string => src.split(':', 1)[0] ?? 'unknown';\n\nconst MEDIA_ERROR_CODES: Record<number, string> = {\n  1: 'ABORTED',\n  2: 'NETWORK',\n  3: 'DECODE',\n  4: 'SRC_NOT_SUPPORTED',\n};\n\ntype RenderVideoProps = {\n  title: string;\n  src: string;\n  // Base SyntheticEvent because ClientPreview renders an <iframe> through this slot.\n  onLoadedMetadata: (event: SyntheticEvent) => void;\n  onError: (event: SyntheticEvent) => void;\n  autoPlay: boolean;\n  controls: boolean;\n  crossOrigin?: 'anonymous';\n};\ntype VideoContentProps = {\n  body: string;\n  mimeType: string;\n  url: string;\n  info: IVideoInfo & IThumbnailContent;\n  encInfo?: EncryptedAttachmentInfo;\n  autoPlay?: boolean;\n  markedAsSpoiler?: boolean;\n  spoilerReason?: string;\n  renderThumbnail?: () => ReactNode;\n  renderVideo: (props: RenderVideoProps) => ReactNode;\n};\nexport const VideoContent = as<'div', VideoContentProps>(\n  (\n    {\n      className,\n      body,\n      mimeType,\n      url,\n      info,\n      encInfo,\n      autoPlay,\n      markedAsSpoiler,\n      spoilerReason,\n      renderThumbnail,\n      renderVideo,\n      ...props\n    },\n    ref\n  ) => {\n    const mx = useMatrixClient();\n    const useAuthentication = useMediaAuthentication();\n    const blurHash = validBlurHash(info.thumbnail_info?.[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]);\n\n    const [load, setLoad] = useState(false);\n    const [error, setError] = useState(false);\n    // Tauri only: each retry gets a distinct sable-media:// src.\n    const retryRevisionRef = useRef(0);\n    const [blurred, setBlurred] = useState(markedAsSpoiler ?? false);\n    const [isHovered, setIsHovered] = useState(false);\n\n    const createObjectURL = useCreateObjectURL();\n    // Set when the streaming URL already failed once for this attachment; any\n    // further load uses the token-attached blob path instead of the SW.\n    const preferBlobRef = useRef(false);\n\n    useEffect(() => {\n      preferBlobRef.current = false;\n    }, [url]);\n\n    const [srcState, loadSrc] = useAsyncCallback(\n      useCallback(async () => {\n        if (url.startsWith('http')) return url;\n\n        const mediaUrl = mxcUrlToHttp(mx, url, useAuthentication);\n        if (!mediaUrl) throw new Error('Invalid media URL');\n        if (!encInfo) {\n          if (isTauri()) {\n            const attemptedTarget = addTauriMediaRetryRevision(mediaUrl, retryRevisionRef.current);\n            return prepareLoopbackMedia(attemptedTarget);\n          }\n          // Stream through the service worker only after it proved media-auth\n          // support; a stale SW build would otherwise serve the bare URL to\n          // the homeserver and the element would fail with a 4xx.\n          if (!preferBlobRef.current && (await probeSWMediaAuthSupport())) return mediaUrl;\n          return createObjectURL(downloadMedia(mediaUrl, { forceDirectAuth: true }));\n        }\n        if (isTauri()) {\n          const attemptedTarget =\n            getTauriMediaRetryTarget(mediaUrl, retryRevisionRef.current) ?? mediaUrl;\n          await setMediaEncryption(attemptedTarget, encInfo, mimeType);\n          const source = rewriteAuthenticatedMediaUrl(attemptedTarget)!;\n          return prepareLoopbackMedia(source);\n        }\n        return createObjectURL(\n          downloadEncryptedMedia(mediaUrl, (encBuf) => decryptFile(encBuf, mimeType, encInfo))\n        );\n      }, [mx, url, useAuthentication, mimeType, encInfo, createObjectURL])\n    );\n\n    // When the source download succeeds, reset video-element error state so the\n    // Retry button doesn't flash before the <video> has had a chance to load.\n    useEffect(() => {\n      if (srcState.status === AsyncStatus.Success) {\n        setError(false);\n        logger.info(\n          'media',\n          `Video source resolved: mime=${mimeType || 'unset'} scheme=${srcScheme(srcState.data)} ` +\n            `encrypted=${Boolean(encInfo)} size=${info.size ?? 'unknown'} ` +\n            `canPlayType=${document.createElement('video').canPlayType(mimeType) || 'no'} ` +\n            `attempt=${retryRevisionRef.current}`\n        );\n      }\n      if (srcState.status === AsyncStatus.Error) {\n        logger.error(\n          'media',\n          `Video source failed: mime=${mimeType || 'unset'} encrypted=${Boolean(encInfo)} ` +\n            `attempt=${retryRevisionRef.current}`,\n          srcState.error instanceof Error ? srcState.error : undefined\n        );\n      }\n    }, [srcState, mimeType, encInfo, info.size]);\n\n    const streamsAuthenticatedMedia =\n      srcState.status === AsyncStatus.Success &&\n      !url.startsWith('http') &&\n      !srcState.data.startsWith('blob:');\n\n    const handleLoad = (event: SyntheticEvent) => {\n      const video = event.currentTarget;\n      if (video instanceof HTMLVideoElement) {\n        logger.info(\n          'media',\n          `Video metadata loaded: mime=${mimeType || 'unset'} ` +\n            `dimensions=${video.videoWidth}x${video.videoHeight} duration=${video.duration}`\n        );\n      }\n      setLoad(true);\n      setError(false);\n    };\n    const handleError = (event: SyntheticEvent) => {\n      const video = event.currentTarget;\n      if (video instanceof HTMLVideoElement) {\n        const code = video.error?.code;\n        logger.error(\n          'media',\n          `Video element error: code=${code ?? 'none'}(${(code && MEDIA_ERROR_CODES[code]) || 'unknown'}) ` +\n            `message=${video.error?.message || 'none'} mime=${mimeType || 'unset'} ` +\n            `scheme=${srcScheme(video.currentSrc || video.src)} encrypted=${Boolean(encInfo)} ` +\n            `readyState=${video.readyState} networkState=${video.networkState} ` +\n            `attempt=${retryRevisionRef.current} sourceStatus=${srcState.status}`\n        );\n      }\n      // Only show the error if the source download already succeeded — if\n      // it's still loading the video element may fire a transient error\n      // before the blob URL is ready.\n      if (srcState.status === AsyncStatus.Success) {\n        // The streaming URL failed (e.g. a stale service worker acknowledged\n        // the probe but still cannot serve the media): retry once through the\n        // blob path, which attaches the access token in JavaScript.\n        if (\n          !preferBlobRef.current &&\n          !isTauri() &&\n          !url.startsWith('http') &&\n          !srcState.data.startsWith('blob:')\n        ) {\n          preferBlobRef.current = true;\n          loadSrc().catch(() => undefined);\n          return;\n        }\n        setLoad(false);\n        setError(true);\n      }\n    };\n\n    const handleRetry = () => {\n      setError(false);\n      retryRevisionRef.current += 1;\n      loadSrc().catch(() => undefined);\n    };\n\n    useEffect(() => {\n      if (autoPlay) loadSrc().catch(() => undefined);\n    }, [autoPlay, loadSrc]);\n\n    return (\n      <Box\n        className={classNames(css.RelativeBase, className)}\n        {...props}\n        ref={ref}\n        onPointerEnter={() => setIsHovered(true)}\n        onPointerLeave={() => setIsHovered(false)}\n      >\n        {typeof blurHash === 'string' && !load && (\n          <BlurhashCanvas\n            style={{ width: '100%', height: '100%' }}\n            width={32}\n            height={32}\n            hash={blurHash}\n            punch={1}\n          />\n        )}\n        {renderThumbnail && !load && (\n          <Box\n            className={classNames(css.AbsoluteContainer, blurred && css.Blur)}\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n          >\n            {renderThumbnail()}\n          </Box>\n        )}\n        {!autoPlay && !blurred && srcState.status === AsyncStatus.Idle && (\n          <Box\n            className={css.AbsoluteContainer}\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            onClick={loadSrc}\n          >\n            <Button\n              variant=\"Secondary\"\n              fill=\"Solid\"\n              radii=\"300\"\n              size=\"300\"\n              onClick={loadSrc}\n              before={sizedIcon(Play, 'Inherit', { filled: true })}\n            >\n              <Text size=\"B300\">Watch</Text>\n            </Button>\n          </Box>\n        )}\n        {srcState.status === AsyncStatus.Success && (\n          <Box className={classNames(css.AbsoluteContainer, blurred && css.Blur)}>\n            {renderVideo({\n              title: body,\n              src: srcState.data,\n              onLoadedMetadata: handleLoad,\n              onError: handleError,\n              autoPlay: false,\n              controls: true,\n              // Firefox blocks media Range responses it cannot sniff as audio/video (mozilla bug\n              // 1880289); requesting with CORS opts out. External URLs are left alone since we\n              // cannot assume they send Access-Control-Allow-Origin.\n              crossOrigin: streamsAuthenticatedMedia ? 'anonymous' : undefined,\n            })}\n          </Box>\n        )}\n        {blurred && !error && srcState.status !== AsyncStatus.Error && (\n          <Box\n            className={css.AbsoluteContainer}\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            onClick={() => {\n              setBlurred(false);\n              if (srcState.status === AsyncStatus.Idle) {\n                loadSrc().catch(() => undefined);\n              }\n            }}\n          >\n            <Chip\n              variant=\"Secondary\"\n              radii=\"Pill\"\n              size=\"500\"\n              outlined\n              onClick={() => {\n                setBlurred(false);\n                if (srcState.status === AsyncStatus.Idle) {\n                  loadSrc().catch(() => undefined);\n                }\n              }}\n            >\n              <Text size=\"B300\">\n                {typeof spoilerReason === 'string' && spoilerReason.length > 0\n                  ? `Spoiler reason: ${spoilerReason}`\n                  : `Spoilered`}\n              </Text>\n            </Chip>\n          </Box>\n        )}\n        {(srcState.status === AsyncStatus.Loading || srcState.status === AsyncStatus.Success) &&\n          !load &&\n          !error &&\n          !blurred && (\n            <Box className={css.AbsoluteContainer} alignItems=\"Center\" justifyContent=\"Center\">\n              <Spinner variant=\"Secondary\" />\n            </Box>\n          )}\n        {!load && (error || srcState.status === AsyncStatus.Error) && (\n          <Box\n            className={css.AbsoluteContainer}\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            onClick={handleRetry}\n          >\n            <TooltipProvider\n              tooltip={\n                <Tooltip variant=\"Critical\">\n                  <Text>Failed to load video!</Text>\n                </Tooltip>\n              }\n              position=\"Top\"\n              align=\"Center\"\n            >\n              {(triggerRef) => (\n                <Button\n                  ref={triggerRef}\n                  size=\"300\"\n                  variant=\"Critical\"\n                  fill=\"Soft\"\n                  outlined\n                  radii=\"300\"\n                  onClick={handleRetry}\n                  before={sizedIcon(Warning, 'Inherit', { filled: true })}\n                >\n                  <Text size=\"B300\">Retry</Text>\n                </Button>\n              )}\n            </TooltipProvider>\n          </Box>\n        )}\n        {isHovered && (\n          <Box style={{ padding: config.space.S200, right: 0, position: 'absolute' }}>\n            <Menu style={{ padding: config.space.S0 }}>\n              <MenuItem\n                size=\"300\"\n                radii=\"300\"\n                fill=\"Soft\"\n                variant=\"Secondary\"\n                title={blurred ? 'Reveal Video' : 'Hide Video'}\n                onClick={(e) => {\n                  e.preventDefault();\n                  if (srcState.status === AsyncStatus.Idle) {\n                    loadSrc().catch(() => undefined);\n                    setBlurred(false);\n                  } else setBlurred(!blurred);\n                }}\n              >\n                {menuIcon(blurred ? Eye : EyeSlash)}\n              </MenuItem>\n            </Menu>\n          </Box>\n        )}\n        {!load && typeof info.size === 'number' && (\n          <Box\n            className={css.AbsoluteFooter}\n            justifyContent=\"SpaceBetween\"\n            alignContent=\"Center\"\n            gap=\"200\"\n          >\n            <Badge variant=\"Secondary\" fill=\"Soft\">\n              <Text size=\"L400\">{millisecondsToMinutesAndSeconds(info.duration ?? 0)}</Text>\n            </Badge>\n            <Badge variant=\"Secondary\" fill=\"Soft\">\n              <Text size=\"L400\">{bytesToSize(info.size)}</Text>\n            </Badge>\n          </Box>\n        )}\n      </Box>\n    );\n  }\n);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Direction = void 0;\nvar Direction;\n(function (Direction) {\n    Direction[\"Right\"] = \"to right\";\n    Direction[\"Left\"] = \"to left\";\n    Direction[\"Down\"] = \"to bottom\";\n    Direction[\"Up\"] = \"to top\";\n})(Direction || (exports.Direction = Direction = {}));\n","\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (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};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isIOS = exports.useThumbOverlap = exports.assertUnreachable = exports.voidFn = exports.getTrackBackground = exports.replaceAt = exports.schd = exports.translate = exports.getClosestThumbIndex = exports.translateThumbs = exports.getPaddingAndBorder = exports.getMargin = exports.checkInitialOverlap = exports.checkValuesAgainstBoundaries = exports.checkBoundaries = exports.isVertical = exports.relativeValue = exports.normalizeValue = exports.isStepDivisible = exports.isTouchEvent = exports.getStepDecimals = void 0;\nvar react_1 = require(\"react\");\nvar types_1 = require(\"./types\");\nvar getStepDecimals = function (step) {\n    var decimals = step.toString().split(\".\")[1];\n    return decimals ? decimals.length : 0;\n};\nexports.getStepDecimals = getStepDecimals;\nfunction isTouchEvent(event) {\n    return ((event.touches && event.touches.length) ||\n        (event.changedTouches && event.changedTouches.length));\n}\nexports.isTouchEvent = isTouchEvent;\nfunction isStepDivisible(min, max, step) {\n    var res = (max - min) / step;\n    var precision = 8;\n    var roundedRes = Number(res.toFixed(precision));\n    return parseInt(roundedRes.toString(), 10) === roundedRes;\n}\nexports.isStepDivisible = isStepDivisible;\nfunction normalizeValue(value, index, min, max, step, allowOverlap, values) {\n    var BIG_NUM = 10e10;\n    value = Math.round(value * BIG_NUM) / BIG_NUM;\n    if (!allowOverlap) {\n        var prev = values[index - 1];\n        var next = values[index + 1];\n        if (prev && prev > value)\n            return prev;\n        if (next && next < value)\n            return next;\n    }\n    if (value > max)\n        return max;\n    if (value < min)\n        return min;\n    // `remainder` is a difference between the given value and a full step value\n    // that is closest lower to the given value and is in the range between the min value\n    // and the given value\n    var remainder = Math.floor(value * BIG_NUM - min * BIG_NUM) % Math.floor(step * BIG_NUM);\n    var closestLowerNum = Math.floor(value * BIG_NUM - Math.abs(remainder));\n    var rounded = remainder === 0 ? value : closestLowerNum / BIG_NUM;\n    // Values with a remainder `< step/2` are rounded to the closest lower value\n    // while values with a remainder `= > step/2` are rounded to the closest bigger value\n    var res = Math.abs(remainder / BIG_NUM) < step / 2 ? rounded : rounded + step;\n    var decimalPlaces = (0, exports.getStepDecimals)(step);\n    return parseFloat(res.toFixed(decimalPlaces));\n}\nexports.normalizeValue = normalizeValue;\nfunction relativeValue(value, min, max) {\n    return (value - min) / (max - min);\n}\nexports.relativeValue = relativeValue;\nfunction isVertical(direction) {\n    return direction === types_1.Direction.Up || direction === types_1.Direction.Down;\n}\nexports.isVertical = isVertical;\nfunction checkBoundaries(value, min, max) {\n    if (min >= max) {\n        throw new RangeError(\"min (\".concat(min, \") is equal/bigger than max (\").concat(max, \")\"));\n    }\n    if (value < min) {\n        throw new RangeError(\"value (\".concat(value, \") is smaller than min (\").concat(min, \")\"));\n    }\n    if (value > max) {\n        throw new RangeError(\"value (\".concat(value, \") is bigger than max (\").concat(max, \")\"));\n    }\n}\nexports.checkBoundaries = checkBoundaries;\nfunction checkValuesAgainstBoundaries(value, min, max) {\n    if (value < min) {\n        // set selectedValue to min\n        return min;\n    }\n    if (value > max) {\n        // set selectedValue to max\n        return max;\n    }\n    else {\n        return value;\n    }\n}\nexports.checkValuesAgainstBoundaries = checkValuesAgainstBoundaries;\nfunction checkInitialOverlap(values) {\n    if (values.length < 2)\n        return;\n    if (!values.slice(1).every(function (item, i) { return values[i] <= item; })) {\n        throw new RangeError(\"values={[\".concat(values, \"]} needs to be sorted when allowOverlap={false}\"));\n    }\n}\nexports.checkInitialOverlap = checkInitialOverlap;\nfunction getMargin(element) {\n    var style = window.getComputedStyle(element);\n    return {\n        top: parseInt(style[\"margin-top\"], 10),\n        bottom: parseInt(style[\"margin-bottom\"], 10),\n        left: parseInt(style[\"margin-left\"], 10),\n        right: parseInt(style[\"margin-right\"], 10),\n    };\n}\nexports.getMargin = getMargin;\nfunction getPaddingAndBorder(element) {\n    var style = window.getComputedStyle(element);\n    return {\n        top: parseInt(style[\"padding-top\"], 10) +\n            parseInt(style[\"border-top-width\"], 10),\n        bottom: parseInt(style[\"padding-bottom\"], 10) +\n            parseInt(style[\"border-bottom-width\"], 10),\n        left: parseInt(style[\"padding-left\"], 10) +\n            parseInt(style[\"border-left-width\"], 10),\n        right: parseInt(style[\"padding-right\"], 10) +\n            parseInt(style[\"border-right-width\"], 10),\n    };\n}\nexports.getPaddingAndBorder = getPaddingAndBorder;\nfunction translateThumbs(elements, offsets, rtl) {\n    var inverter = rtl ? -1 : 1;\n    elements.forEach(function (element, index) {\n        return translate(element, inverter * offsets[index].x, offsets[index].y);\n    });\n}\nexports.translateThumbs = translateThumbs;\n/**\n * Util function for calculating the index of the thumb that is closes to a given position\n * @param thumbs - array of Thumb element to calculate the distance from\n * @param clientX - target x position (mouse/touch)\n * @param clientY - target y position (mouse/touch)\n * @param direction - the direction of the track\n */\nfunction getClosestThumbIndex(thumbs, clientX, clientY, direction) {\n    var thumbIndex = 0;\n    var minThumbDistance = getThumbDistance(thumbs[0], clientX, clientY, direction);\n    for (var i = 1; i < thumbs.length; i++) {\n        var thumbDistance = getThumbDistance(thumbs[i], clientX, clientY, direction);\n        if (thumbDistance < minThumbDistance) {\n            minThumbDistance = thumbDistance;\n            thumbIndex = i;\n        }\n    }\n    return thumbIndex;\n}\nexports.getClosestThumbIndex = getClosestThumbIndex;\nfunction translate(element, x, y) {\n    element.style.transform = \"translate(\".concat(x, \"px, \").concat(y, \"px)\");\n}\nexports.translate = translate;\n// adapted from https://github.com/alexreardon/raf-schd\nvar schd = function (fn) {\n    var lastArgs = [];\n    var frameId = null;\n    var wrapperFn = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        lastArgs = args;\n        if (frameId) {\n            return;\n        }\n        frameId = requestAnimationFrame(function () {\n            frameId = null;\n            fn.apply(void 0, lastArgs);\n        });\n    };\n    return wrapperFn;\n};\nexports.schd = schd;\nfunction replaceAt(values, index, value) {\n    var ret = values.slice(0);\n    ret[index] = value;\n    return ret;\n}\nexports.replaceAt = replaceAt;\nfunction getTrackBackground(_a) {\n    var values = _a.values, colors = _a.colors, min = _a.min, max = _a.max, _b = _a.direction, direction = _b === void 0 ? types_1.Direction.Right : _b, _c = _a.rtl, rtl = _c === void 0 ? false : _c;\n    if (rtl && direction === types_1.Direction.Right) {\n        direction = types_1.Direction.Left;\n    }\n    else if (rtl && types_1.Direction.Left) {\n        direction = types_1.Direction.Right;\n    }\n    // sort values ascending\n    var progress = values\n        .slice(0)\n        .sort(function (a, b) { return a - b; })\n        .map(function (value) { return ((value - min) / (max - min)) * 100; });\n    var middle = progress.reduce(function (acc, point, index) {\n        return \"\".concat(acc, \", \").concat(colors[index], \" \").concat(point, \"%, \").concat(colors[index + 1], \" \").concat(point, \"%\");\n    }, \"\");\n    return \"linear-gradient(\".concat(direction, \", \").concat(colors[0], \" 0%\").concat(middle, \", \").concat(colors[colors.length - 1], \" 100%)\");\n}\nexports.getTrackBackground = getTrackBackground;\nfunction voidFn() { }\nexports.voidFn = voidFn;\nfunction assertUnreachable(x) {\n    throw new Error(\"Didn't expect to get here\");\n}\nexports.assertUnreachable = assertUnreachable;\n/**\n * Util function for grabbing the true largest width of a thumb\n * including the label\n * @param thumbEl - Thumb element to grab the largest width from\n * @param value - Thumb value, not label value\n * @param separator - Label separator value\n */\nvar getThumbWidth = function (thumbEl, value, separator, decimalPlaces, valueToLabel) {\n    if (valueToLabel === void 0) { valueToLabel = function (value) { return value; }; }\n    var width = Math.ceil(__spreadArray([thumbEl], Array.from(thumbEl.children), true).reduce(function (width, el) {\n        var elWidth = Math.ceil(el.getBoundingClientRect().width);\n        /**\n         * If a label contains a merged label value, it won't return the true\n         * label width for that Thumb. Clone the label and change the value\n         * to that individual Thumb value in order to grab the true width.\n         */\n        if (el.innerText &&\n            el.innerText.includes(separator) &&\n            el.childElementCount === 0) {\n            var elClone = el.cloneNode(true);\n            elClone.innerHTML = valueToLabel(value.toFixed(decimalPlaces));\n            elClone.style.visibility = \"hidden\";\n            document.body.appendChild(elClone);\n            elWidth = Math.ceil(elClone.getBoundingClientRect().width);\n            document.body.removeChild(elClone);\n        }\n        return elWidth > width ? elWidth : width;\n    }, thumbEl.getBoundingClientRect().width));\n    return width;\n};\n/**\n * Bulk of logic for thumb overlaps\n * Consider a scenario with 5 thumbs;\n * Thumb 1 overlaps with thumb 0 and thumb 2\n * Thumb 2 overlaps with thumb 3\n * We need an array that contains [0, 1, 2, 3]\n * The function needs to return the directly overlapping thumbs\n * and all thumbs overlapping linked to those and so on\n * @param index - Thumb index calculating overlaps for\n * @param offsets - Current Array of Thumb offsets for Range\n * @param thumbs - Array of Thumb elements\n * @param values - Array of Thumb values\n * @param separator - String separator for merged label values\n * @returns overlaps - Array of all overlapping thumbs from the index\n */\nvar getOverlaps = function (index, offsets, thumbs, values, separator, decimalPlaces, valueToLabel) {\n    if (valueToLabel === void 0) { valueToLabel = function (value) { return value; }; }\n    var overlaps = [];\n    /**\n     * Recursive function for building the overlaps Array\n     * If an overlap is found, find the overlaps for that overlap\n     * @param thumbIndex current Thumb index to find overlaps from\n     */\n    var buildOverlaps = function (thumbIndex) {\n        var thumbXWidth = getThumbWidth(thumbs[thumbIndex], values[thumbIndex], separator, decimalPlaces, valueToLabel);\n        var thumbX = offsets[thumbIndex].x;\n        /**\n         * Iterate through the Thumb offsets, if there is a match\n         * add the thumbIndex and siblingIndex to the overlaps Array\n         *\n         * Then build overlaps from the overlapping siblingIndex\n         */\n        offsets.forEach(function (_a, siblingIndex) {\n            var siblingX = _a.x;\n            var siblingWidth = getThumbWidth(thumbs[siblingIndex], values[siblingIndex], separator, decimalPlaces, valueToLabel);\n            if (thumbIndex !== siblingIndex &&\n                ((thumbX >= siblingX && thumbX <= siblingX + siblingWidth) ||\n                    (thumbX + thumbXWidth >= siblingX &&\n                        thumbX + thumbXWidth <= siblingX + siblingWidth))) {\n                if (!overlaps.includes(siblingIndex)) {\n                    overlaps.push(thumbIndex);\n                    overlaps.push(siblingIndex);\n                    overlaps = __spreadArray(__spreadArray([], overlaps, true), [thumbIndex, siblingIndex], false);\n                    buildOverlaps(siblingIndex);\n                }\n            }\n        });\n    };\n    buildOverlaps(index);\n    // Sort and remove duplicates from the built overlaps\n    return Array.from(new Set(overlaps.sort()));\n};\n/**\n * A custom React Hook for calculating whether a thumb overlaps\n * another and whether labels could/should merge.\n * @param rangeRef - React ref value of Range component\n * @param values - current Range values Array\n * @param index - thumb index\n * @param step - step value, used to calculate the number of decimal places\n * @param separator - string to separate thumb values\n * @returns label value + styling for thumb label\n */\nvar useThumbOverlap = function (rangeRef, values, index, step, separator, valueToLabel) {\n    if (step === void 0) { step = 0.1; }\n    if (separator === void 0) { separator = \" - \"; }\n    if (valueToLabel === void 0) { valueToLabel = function (value) { return value; }; }\n    var decimalPlaces = (0, exports.getStepDecimals)(step);\n    // Create initial label style and value. Label value defaults to thumb value\n    var _a = (0, react_1.useState)({}), labelStyle = _a[0], setLabelStyle = _a[1];\n    var _b = (0, react_1.useState)(valueToLabel(values[index].toFixed(decimalPlaces))), labelValue = _b[0], setLabelValue = _b[1];\n    // When the rangeRef or values change, update the Thumb label values and styling\n    (0, react_1.useEffect)(function () {\n        if (rangeRef) {\n            var thumbs = rangeRef.getThumbs();\n            if (thumbs.length < 1)\n                return;\n            var newStyle = {};\n            var offsets_1 = rangeRef.getOffsets();\n            /**\n             * Get any overlaps for the given Thumb index. This must return all linked\n             * Thumbs. So if there are 4 Thumbs and Thumbs 2, 3 and 4 overlap. If we are\n             * getting the overlaps for Thumb 1 and it overlaps only Thumb 2, we must get\n             * 2, 3 and 4 also.\n             */\n            var overlaps = getOverlaps(index, offsets_1, thumbs, values, separator, decimalPlaces, valueToLabel);\n            // Set a default label value of the Thumb value\n            var labelValue_1 = valueToLabel(values[index].toFixed(decimalPlaces));\n            /**\n             * If there are overlaps for the Thumb, we need to calculate the correct\n             * Label value along with the relevant styling. We only want to show a Label\n             * for the left most Thumb in an overlapping set.\n             * All other Thumbs will be set to display: none.\n             */\n            if (overlaps.length) {\n                /**\n                 * Get an Array of the offsets for the overlapping Thumbs\n                 * This is so we can determine if the Thumb we are looking at\n                 * is the left most thumb in an overlapping set\n                 */\n                var offsetsX = overlaps.reduce(function (a, c, i, s) {\n                    return a.length ? __spreadArray(__spreadArray([], a, true), [offsets_1[s[i]].x], false) : [offsets_1[s[i]].x];\n                }, []);\n                /**\n                 * If our Thumb is the left most Thumb, we can build a Label value\n                 * and set the style for that Label\n                 */\n                if (Math.min.apply(Math, offsetsX) === offsets_1[index].x) {\n                    /**\n                     * First calculate the Label value. To do this,\n                     * grab all the values for the Thumbs in our overlaps.\n                     * Then convert that to a Set and sort it whilst removing duplicates.\n                     */\n                    var labelValues_1 = [];\n                    overlaps.forEach(function (thumb) {\n                        labelValues_1.push(values[thumb].toFixed(decimalPlaces));\n                    });\n                    /**\n                     *  Update the labelValue with the resulting Array\n                     *  joined by our defined separator\n                     */\n                    labelValue_1 = Array.from(new Set(labelValues_1.sort(function (a, b) { return parseFloat(a) - parseFloat(b); })))\n                        .map(valueToLabel)\n                        .join(separator);\n                    /**\n                     * Lastly, build the label styling. The label styling will\n                     * position the label and apply a transform so that it's centered.\n                     * We want the center point between the left edge of the left most Thumb\n                     * and the right edge of the right most Thumb.\n                     */\n                    var first = Math.min.apply(Math, offsetsX);\n                    var last = Math.max.apply(Math, offsetsX);\n                    var lastWidth = thumbs[overlaps[offsetsX.indexOf(last)]].getBoundingClientRect()\n                        .width;\n                    newStyle.left = \"\".concat(Math.abs(first - (last + lastWidth)) / 2, \"px\");\n                    newStyle.transform = \"translate(-50%, 0)\";\n                }\n                else {\n                    // If the Thumb isn't the left most Thumb, hide the Label!\n                    newStyle.visibility = \"hidden\";\n                }\n            }\n            // Update the label value and style\n            setLabelValue(labelValue_1);\n            setLabelStyle(newStyle);\n        }\n    }, [rangeRef, values]);\n    return [labelValue, labelStyle];\n};\nexports.useThumbOverlap = useThumbOverlap;\n/**\n * Util function for calculating the distance of the center of a thumb\n * form a given mouse/touch target's position\n * @param thumbEl - Thumb element to calculate the distance from\n * @param clientX - target x position (mouse/touch)\n * @param clientY - target y position (mouse/touch)\n * @param direction - the direction of the track\n */\nfunction getThumbDistance(thumbEl, clientX, clientY, direction) {\n    var _a = thumbEl.getBoundingClientRect(), left = _a.left, top = _a.top, width = _a.width, height = _a.height;\n    return isVertical(direction)\n        ? Math.abs(clientY - (top + height / 2))\n        : Math.abs(clientX - (left + width / 2));\n}\nvar isIOS = function () {\n    var _a;\n    // @ts-ignore\n    var platform = ((_a = navigator.userAgentData) === null || _a === void 0 ? void 0 : _a.platform) || navigator.platform;\n    return ([\n        \"iPad Simulator\",\n        \"iPhone Simulator\",\n        \"iPod Simulator\",\n        \"iPad\",\n        \"iPhone\",\n        \"iPod\",\n    ].includes(platform) ||\n        // iPad on iOS 13 detection\n        (navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document));\n};\nexports.isIOS = isIOS;\n","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n    var 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    return function (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})();\nvar __createBinding = (this && this.__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}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nvar __spreadArray = (this && this.__spreadArray) || function (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};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar React = __importStar(require(\"react\"));\nvar utils_1 = require(\"./utils\");\nvar types_1 = require(\"./types\");\nvar INCREASE_KEYS = [\"ArrowRight\", \"ArrowUp\", \"k\", \"PageUp\"];\nvar DECREASE_KEYS = [\"ArrowLeft\", \"ArrowDown\", \"j\", \"PageDown\"];\nvar Range = /** @class */ (function (_super) {\n    __extends(Range, _super);\n    function Range(props) {\n        var _this = _super.call(this, props) || this;\n        _this.trackRef = React.createRef();\n        _this.thumbRefs = [];\n        _this.state = {\n            draggedTrackPos: [-1, -1],\n            draggedThumbIndex: -1,\n            thumbZIndexes: new Array(_this.props.values.length).fill(0).map(function (t, i) { return i; }),\n            isChanged: false,\n            markOffsets: [],\n        };\n        _this.getOffsets = function () {\n            var _a = _this.props, direction = _a.direction, values = _a.values, min = _a.min, max = _a.max;\n            var trackElement = _this.trackRef.current;\n            if (!trackElement) {\n                console.warn(\"No track element found.\");\n                return [];\n            }\n            var trackRect = trackElement.getBoundingClientRect();\n            var trackPadding = (0, utils_1.getPaddingAndBorder)(trackElement);\n            return _this.getThumbs().map(function (thumb, index) {\n                var thumbOffsets = { x: 0, y: 0 };\n                var thumbRect = thumb.getBoundingClientRect();\n                var thumbMargins = (0, utils_1.getMargin)(thumb);\n                switch (direction) {\n                    case types_1.Direction.Right:\n                        thumbOffsets.x = (thumbMargins.left + trackPadding.left) * -1;\n                        thumbOffsets.y =\n                            ((thumbRect.height - trackRect.height) / 2 + trackPadding.top) * -1;\n                        thumbOffsets.x +=\n                            trackRect.width * (0, utils_1.relativeValue)(values[index], min, max) -\n                                thumbRect.width / 2;\n                        return thumbOffsets;\n                    case types_1.Direction.Left:\n                        thumbOffsets.x = (thumbMargins.right + trackPadding.right) * -1;\n                        thumbOffsets.y =\n                            ((thumbRect.height - trackRect.height) / 2 + trackPadding.top) * -1;\n                        thumbOffsets.x +=\n                            trackRect.width -\n                                trackRect.width * (0, utils_1.relativeValue)(values[index], min, max) -\n                                thumbRect.width / 2;\n                        return thumbOffsets;\n                    case types_1.Direction.Up:\n                        thumbOffsets.x =\n                            ((thumbRect.width - trackRect.width) / 2 +\n                                thumbMargins.left +\n                                trackPadding.left) *\n                                -1;\n                        thumbOffsets.y = -trackPadding.left;\n                        thumbOffsets.y +=\n                            trackRect.height -\n                                trackRect.height * (0, utils_1.relativeValue)(values[index], min, max) -\n                                thumbRect.height / 2;\n                        return thumbOffsets;\n                    case types_1.Direction.Down:\n                        thumbOffsets.x =\n                            ((thumbRect.width - trackRect.width) / 2 +\n                                thumbMargins.left +\n                                trackPadding.left) *\n                                -1;\n                        thumbOffsets.y = -trackPadding.left;\n                        thumbOffsets.y +=\n                            trackRect.height * (0, utils_1.relativeValue)(values[index], min, max) -\n                                thumbRect.height / 2;\n                        return thumbOffsets;\n                    default:\n                        return (0, utils_1.assertUnreachable)(direction);\n                }\n            });\n        };\n        _this.getThumbs = function () {\n            if (_this.trackRef && _this.trackRef.current) {\n                return Array.from(_this.trackRef.current.children).filter(function (el) {\n                    return el.hasAttribute(\"aria-valuenow\");\n                });\n            }\n            console.warn(\"No thumbs found in the track container. Did you forget to pass & spread the `props` param in renderTrack?\");\n            return [];\n        };\n        _this.getTargetIndex = function (e) {\n            return _this.getThumbs().findIndex(function (child) { return child === e.target || child.contains(e.target); });\n        };\n        _this.addTouchEvents = function (e) {\n            document.addEventListener(\"touchmove\", _this.schdOnTouchMove, {\n                passive: false,\n            });\n            document.addEventListener(\"touchend\", _this.schdOnEnd, {\n                passive: false,\n            });\n            document.addEventListener(\"touchcancel\", _this.schdOnEnd, {\n                passive: false,\n            });\n        };\n        _this.addMouseEvents = function (e) {\n            document.addEventListener(\"mousemove\", _this.schdOnMouseMove);\n            document.addEventListener(\"mouseup\", _this.schdOnEnd);\n        };\n        _this.onMouseDownTrack = function (e) {\n            var _a;\n            if (e.button !== 0 || (0, utils_1.isIOS)())\n                return;\n            e.persist();\n            e.preventDefault();\n            _this.addMouseEvents(e.nativeEvent);\n            if (_this.props.values.length > 1 && _this.props.draggableTrack) {\n                if (_this.thumbRefs.some(function (thumbRef) { var _a; return (_a = thumbRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target); }))\n                    return;\n                // handle dragging the whole track\n                _this.setState({\n                    draggedTrackPos: [e.clientX, e.clientY],\n                }, function () { return _this.onMove(e.clientX, e.clientY); });\n            }\n            else {\n                // get the index of the thumb that is closest to the place where the track is clicked\n                var draggedThumbIndex = (0, utils_1.getClosestThumbIndex)(_this.thumbRefs.map(function (t) { return t.current; }), e.clientX, e.clientY, _this.props.direction);\n                // move the thumb which is closest to the place where the track is clicked\n                (_a = _this.thumbRefs[draggedThumbIndex].current) === null || _a === void 0 ? void 0 : _a.focus();\n                _this.setState({\n                    draggedThumbIndex: draggedThumbIndex,\n                }, function () { return _this.onMove(e.clientX, e.clientY); });\n            }\n        };\n        _this.onResize = function () {\n            (0, utils_1.translateThumbs)(_this.getThumbs(), _this.getOffsets(), _this.props.rtl);\n            _this.calculateMarkOffsets();\n        };\n        _this.onTouchStartTrack = function (e) {\n            var _a;\n            e.persist();\n            _this.addTouchEvents(e.nativeEvent);\n            if (_this.props.values.length > 1 && _this.props.draggableTrack) {\n                if (_this.thumbRefs.some(function (thumbRef) { var _a; return (_a = thumbRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target); }))\n                    return;\n                // handle dragging the whole track\n                _this.setState({\n                    draggedTrackPos: [e.touches[0].clientX, e.touches[0].clientY],\n                }, function () { return _this.onMove(e.touches[0].clientX, e.touches[0].clientY); });\n            }\n            else {\n                // get the index of the thumb that is closest to the place where the track is clicked\n                var draggedThumbIndex = (0, utils_1.getClosestThumbIndex)(_this.thumbRefs.map(function (t) { return t.current; }), e.touches[0].clientX, e.touches[0].clientY, _this.props.direction);\n                // move the thumb which is closest to the place where the track is clicked\n                (_a = _this.thumbRefs[draggedThumbIndex].current) === null || _a === void 0 ? void 0 : _a.focus();\n                _this.setState({\n                    draggedThumbIndex: draggedThumbIndex,\n                }, function () { return _this.onMove(e.touches[0].clientX, e.touches[0].clientY); });\n            }\n        };\n        _this.onMouseOrTouchStart = function (e) {\n            if (_this.props.disabled)\n                return;\n            var isTouch = (0, utils_1.isTouchEvent)(e);\n            if (!isTouch && e.button !== 0)\n                return;\n            var index = _this.getTargetIndex(e);\n            if (index === -1)\n                return;\n            if (isTouch) {\n                _this.addTouchEvents(e);\n            }\n            else {\n                _this.addMouseEvents(e);\n            }\n            _this.setState({\n                draggedThumbIndex: index,\n                thumbZIndexes: _this.state.thumbZIndexes.map(function (t, i) {\n                    if (i === index) {\n                        return Math.max.apply(Math, _this.state.thumbZIndexes);\n                    }\n                    return t <= _this.state.thumbZIndexes[index] ? t : t - 1;\n                }),\n            });\n        };\n        _this.onMouseMove = function (e) {\n            e.preventDefault();\n            _this.onMove(e.clientX, e.clientY);\n        };\n        _this.onTouchMove = function (e) {\n            e.preventDefault();\n            _this.onMove(e.touches[0].clientX, e.touches[0].clientY);\n        };\n        _this.onKeyDown = function (e) {\n            var _a = _this.props, values = _a.values, onChange = _a.onChange, step = _a.step, rtl = _a.rtl, direction = _a.direction;\n            var isChanged = _this.state.isChanged;\n            var index = _this.getTargetIndex(e.nativeEvent);\n            var inverter = rtl || direction === types_1.Direction.Left || direction === types_1.Direction.Down\n                ? -1\n                : 1;\n            if (index === -1)\n                return;\n            if (INCREASE_KEYS.includes(e.key)) {\n                e.preventDefault();\n                _this.setState({\n                    draggedThumbIndex: index,\n                    isChanged: true,\n                });\n                onChange((0, utils_1.replaceAt)(values, index, _this.normalizeValue(values[index] + inverter * (e.key === \"PageUp\" ? step * 10 : step), index)));\n            }\n            else if (DECREASE_KEYS.includes(e.key)) {\n                e.preventDefault();\n                _this.setState({\n                    draggedThumbIndex: index,\n                    isChanged: true,\n                });\n                onChange((0, utils_1.replaceAt)(values, index, _this.normalizeValue(values[index] -\n                    inverter * (e.key === \"PageDown\" ? step * 10 : step), index)));\n            }\n            else if (e.key === \"Tab\") {\n                _this.setState({ draggedThumbIndex: -1 }, function () {\n                    // If key pressed when thumb was moving, fire onFinalChange\n                    if (isChanged) {\n                        _this.fireOnFinalChange();\n                    }\n                });\n            }\n            else {\n                if (isChanged) {\n                    _this.fireOnFinalChange();\n                }\n            }\n        };\n        _this.onKeyUp = function (e) {\n            var isChanged = _this.state.isChanged;\n            _this.setState({\n                draggedThumbIndex: -1,\n            }, function () {\n                if (isChanged) {\n                    _this.fireOnFinalChange();\n                }\n            });\n        };\n        _this.onMove = function (clientX, clientY) {\n            var _a = _this.state, draggedThumbIndex = _a.draggedThumbIndex, draggedTrackPos = _a.draggedTrackPos;\n            var _b = _this.props, direction = _b.direction, min = _b.min, max = _b.max, onChange = _b.onChange, values = _b.values, step = _b.step, rtl = _b.rtl;\n            if (draggedThumbIndex === -1 &&\n                draggedTrackPos[0] === -1 &&\n                draggedTrackPos[1] === -1)\n                return null;\n            var trackElement = _this.trackRef.current;\n            // If component was closed down prematurely, A last onMove could be triggered based on requestAnimationFrame()\n            if (!trackElement)\n                return null;\n            var trackRect = trackElement.getBoundingClientRect();\n            var trackLength = (0, utils_1.isVertical)(direction)\n                ? trackRect.height\n                : trackRect.width;\n            if (draggedTrackPos[0] !== -1 && draggedTrackPos[1] !== -1) {\n                // calculate how much it moved since the last update\n                var dX = clientX - draggedTrackPos[0];\n                var dY = clientY - draggedTrackPos[1];\n                // calculate the delta of the value\n                var deltaValue = 0;\n                switch (direction) {\n                    case types_1.Direction.Right:\n                    case types_1.Direction.Left:\n                        deltaValue = (dX / trackLength) * (max - min);\n                        break;\n                    case types_1.Direction.Down:\n                    case types_1.Direction.Up:\n                        deltaValue = (dY / trackLength) * (max - min);\n                        break;\n                    default:\n                        (0, utils_1.assertUnreachable)(direction);\n                }\n                // invert for RTL\n                if (rtl) {\n                    deltaValue *= -1;\n                }\n                if (Math.abs(deltaValue) >= step / 2) {\n                    // adjust delta so it fits into the range\n                    for (var i = 0; i < _this.thumbRefs.length; i++) {\n                        if ((values[i] === max && Math.sign(deltaValue) === 1) ||\n                            (values[i] === min && Math.sign(deltaValue) === -1))\n                            return;\n                        var thumbValue = values[i] + deltaValue;\n                        if (thumbValue > max)\n                            deltaValue = max - values[i];\n                        else if (thumbValue < min)\n                            deltaValue = min - values[i];\n                    }\n                    // add the delta to each thumb\n                    var newValues = values.slice(0);\n                    for (var i = 0; i < _this.thumbRefs.length; i++) {\n                        newValues = (0, utils_1.replaceAt)(newValues, i, _this.normalizeValue(values[i] + deltaValue, i));\n                    }\n                    _this.setState({\n                        draggedTrackPos: [clientX, clientY],\n                    });\n                    onChange(newValues);\n                }\n            }\n            else {\n                var newValue = 0;\n                switch (direction) {\n                    case types_1.Direction.Right:\n                        newValue =\n                            ((clientX - trackRect.left) / trackLength) * (max - min) + min;\n                        break;\n                    case types_1.Direction.Left:\n                        newValue =\n                            ((trackLength - (clientX - trackRect.left)) / trackLength) *\n                                (max - min) +\n                                min;\n                        break;\n                    case types_1.Direction.Down:\n                        newValue =\n                            ((clientY - trackRect.top) / trackLength) * (max - min) + min;\n                        break;\n                    case types_1.Direction.Up:\n                        newValue =\n                            ((trackLength - (clientY - trackRect.top)) / trackLength) *\n                                (max - min) +\n                                min;\n                        break;\n                    default:\n                        (0, utils_1.assertUnreachable)(direction);\n                }\n                // invert for RTL\n                if (rtl) {\n                    newValue = max + min - newValue;\n                }\n                if (Math.abs(values[draggedThumbIndex] - newValue) >= step / 2) {\n                    onChange((0, utils_1.replaceAt)(values, draggedThumbIndex, _this.normalizeValue(newValue, draggedThumbIndex)));\n                }\n            }\n        };\n        _this.normalizeValue = function (value, index) {\n            var _a = _this.props, min = _a.min, max = _a.max, step = _a.step, allowOverlap = _a.allowOverlap, values = _a.values;\n            return (0, utils_1.normalizeValue)(value, index, min, max, step, allowOverlap, values);\n        };\n        _this.onEnd = function (e) {\n            e.preventDefault();\n            document.removeEventListener(\"mousemove\", _this.schdOnMouseMove);\n            document.removeEventListener(\"touchmove\", _this.schdOnTouchMove);\n            document.removeEventListener(\"mouseup\", _this.schdOnEnd);\n            document.removeEventListener(\"touchend\", _this.schdOnEnd);\n            document.removeEventListener(\"touchcancel\", _this.schdOnEnd);\n            if (_this.state.draggedThumbIndex === -1 &&\n                _this.state.draggedTrackPos[0] === -1 &&\n                _this.state.draggedTrackPos[1] === -1)\n                return null;\n            _this.setState({ draggedThumbIndex: -1, draggedTrackPos: [-1, -1] }, function () {\n                _this.fireOnFinalChange();\n            });\n        };\n        _this.fireOnFinalChange = function () {\n            _this.setState({ isChanged: false });\n            var _a = _this.props, onFinalChange = _a.onFinalChange, values = _a.values;\n            if (onFinalChange) {\n                onFinalChange(values);\n            }\n        };\n        _this.updateMarkRefs = function (props) {\n            if (!props.renderMark) {\n                // don't create mark refs unless we are rendering marks\n                _this.numOfMarks = undefined;\n                _this.markRefs = undefined;\n                return;\n            }\n            _this.numOfMarks = (props.max - props.min) / _this.props.step;\n            _this.markRefs = [];\n            for (var i = 0; i < _this.numOfMarks + 1; i++) {\n                _this.markRefs[i] = React.createRef();\n            }\n        };\n        _this.calculateMarkOffsets = function () {\n            if (!_this.props.renderMark ||\n                !_this.trackRef ||\n                !_this.numOfMarks ||\n                !_this.markRefs ||\n                _this.trackRef.current === null)\n                return;\n            var elStyles = window.getComputedStyle(_this.trackRef.current);\n            var trackWidth = parseInt(elStyles.width, 10);\n            var trackHeight = parseInt(elStyles.height, 10);\n            var paddingLeft = parseInt(elStyles.paddingLeft, 10);\n            var paddingTop = parseInt(elStyles.paddingTop, 10);\n            var res = [];\n            for (var i = 0; i < _this.numOfMarks + 1; i++) {\n                var markHeight = 9999;\n                var markWidth = 9999;\n                if (_this.markRefs[i].current) {\n                    var markRect = _this.markRefs[i].current.getBoundingClientRect();\n                    markHeight = markRect.height;\n                    markWidth = markRect.width;\n                }\n                if (_this.props.direction === types_1.Direction.Left ||\n                    _this.props.direction === types_1.Direction.Right) {\n                    res.push([\n                        Math.round((trackWidth / _this.numOfMarks) * i + paddingLeft - markWidth / 2),\n                        -Math.round((markHeight - trackHeight) / 2),\n                    ]);\n                }\n                else {\n                    res.push([\n                        Math.round((trackHeight / _this.numOfMarks) * i + paddingTop - markHeight / 2),\n                        -Math.round((markWidth - trackWidth) / 2),\n                    ]);\n                }\n            }\n            _this.setState({ markOffsets: res });\n        };\n        if (props.step === 0) {\n            throw new Error('\"step\" property should be a positive number');\n        }\n        _this.schdOnMouseMove = (0, utils_1.schd)(_this.onMouseMove);\n        _this.schdOnTouchMove = (0, utils_1.schd)(_this.onTouchMove);\n        _this.schdOnEnd = (0, utils_1.schd)(_this.onEnd);\n        _this.thumbRefs = props.values.map(function () { return React.createRef(); });\n        _this.updateMarkRefs(props);\n        return _this;\n    }\n    Range.prototype.componentDidMount = function () {\n        var _this = this;\n        var _a = this.props, values = _a.values, min = _a.min, step = _a.step;\n        this.resizeObserver = window.ResizeObserver\n            ? new window.ResizeObserver(this.onResize)\n            : {\n                observe: function () { return window.addEventListener(\"resize\", _this.onResize); },\n                unobserve: function () { return window.removeEventListener(\"resize\", _this.onResize); },\n            };\n        document.addEventListener(\"touchstart\", this.onMouseOrTouchStart, {\n            passive: false,\n        });\n        document.addEventListener(\"mousedown\", this.onMouseOrTouchStart, {\n            passive: false,\n        });\n        !this.props.allowOverlap && (0, utils_1.checkInitialOverlap)(this.props.values);\n        this.props.values.forEach(function (value) {\n            return (0, utils_1.checkBoundaries)(value, _this.props.min, _this.props.max);\n        });\n        this.resizeObserver.observe(this.trackRef.current);\n        (0, utils_1.translateThumbs)(this.getThumbs(), this.getOffsets(), this.props.rtl);\n        this.calculateMarkOffsets();\n        values.forEach(function (value) {\n            if (!(0, utils_1.isStepDivisible)(min, value, step)) {\n                console.warn(\"The `values` property is in conflict with the current `step`, `min`, and `max` properties. Please provide values that are accessible using the min, max, and step values.\");\n            }\n        });\n    };\n    Range.prototype.componentDidUpdate = function (prevProps, prevState) {\n        var _a = this.props, max = _a.max, min = _a.min, step = _a.step, values = _a.values, rtl = _a.rtl;\n        if (prevProps.max !== max ||\n            prevProps.min !== min ||\n            prevProps.step !== step) {\n            this.updateMarkRefs(this.props);\n        }\n        (0, utils_1.translateThumbs)(this.getThumbs(), this.getOffsets(), rtl);\n        // ensure offsets are calculated when the refs for the marks have been created\n        // and those refs have been mounted to the dom\n        // on the state update in calculateOffsets with new markOffsets are calculated\n        if (prevProps.max !== max ||\n            prevProps.min !== min ||\n            prevProps.step !== step ||\n            prevState.markOffsets.length !== this.state.markOffsets.length) {\n            this.calculateMarkOffsets();\n            values.forEach(function (value) {\n                if (!(0, utils_1.isStepDivisible)(min, value, step)) {\n                    console.warn(\"The `values` property is in conflict with the current `step`, `min`, and `max` properties. Please provide values that are accessible using the min, max, and step values.\");\n                }\n            });\n        }\n    };\n    Range.prototype.componentWillUnmount = function () {\n        var options = {\n            passive: false,\n        };\n        document.removeEventListener(\"mousedown\", this.onMouseOrTouchStart, options);\n        // These need to be removed!!\n        document.removeEventListener(\"mousemove\", this.schdOnMouseMove);\n        document.removeEventListener(\"touchmove\", this.schdOnTouchMove);\n        document.removeEventListener(\"touchstart\", this.onMouseOrTouchStart);\n        document.removeEventListener(\"mouseup\", this.schdOnEnd);\n        document.removeEventListener(\"touchend\", this.schdOnEnd);\n        this.resizeObserver.unobserve(this.trackRef.current);\n    };\n    Range.prototype.render = function () {\n        var _this = this;\n        var _a = this.props, label = _a.label, labelledBy = _a.labelledBy, renderTrack = _a.renderTrack, renderThumb = _a.renderThumb, _b = _a.renderMark, renderMark = _b === void 0 ? function () { return null; } : _b, values = _a.values, min = _a.min, max = _a.max, allowOverlap = _a.allowOverlap, disabled = _a.disabled;\n        var _c = this.state, draggedThumbIndex = _c.draggedThumbIndex, thumbZIndexes = _c.thumbZIndexes, markOffsets = _c.markOffsets;\n        return renderTrack({\n            props: {\n                style: {\n                    // creates stacking context that prevents z-index applied to thumbs\n                    // interfere with other elements\n                    transform: \"scale(1)\",\n                    cursor: draggedThumbIndex > -1\n                        ? \"grabbing\"\n                        : this.props.draggableTrack\n                            ? (0, utils_1.isVertical)(this.props.direction)\n                                ? \"ns-resize\"\n                                : \"ew-resize\"\n                            : values.length === 1 && !disabled\n                                ? \"pointer\"\n                                : \"inherit\",\n                },\n                onMouseDown: disabled ? utils_1.voidFn : this.onMouseDownTrack,\n                onTouchStart: disabled ? utils_1.voidFn : this.onTouchStartTrack,\n                ref: this.trackRef,\n            },\n            isDragged: this.state.draggedThumbIndex > -1,\n            disabled: disabled,\n            children: __spreadArray(__spreadArray([], markOffsets.map(function (offset, index, arr) {\n                return renderMark({\n                    props: {\n                        style: _this.props.direction === types_1.Direction.Left ||\n                            _this.props.direction === types_1.Direction.Right\n                            ? {\n                                position: \"absolute\",\n                                left: \"\".concat(offset[0], \"px\"),\n                                marginTop: \"\".concat(offset[1], \"px\"),\n                            }\n                            : {\n                                position: \"absolute\",\n                                top: \"\".concat(offset[0], \"px\"),\n                                marginLeft: \"\".concat(offset[1], \"px\"),\n                            },\n                        key: \"mark\".concat(index),\n                        ref: _this.markRefs[index],\n                    },\n                    index: index,\n                });\n            }), true), values.map(function (value, index) {\n                var isDragged = _this.state.draggedThumbIndex === index;\n                return renderThumb({\n                    index: index,\n                    value: value,\n                    isDragged: isDragged,\n                    props: {\n                        style: {\n                            position: \"absolute\",\n                            zIndex: thumbZIndexes[index],\n                            cursor: disabled ? \"inherit\" : isDragged ? \"grabbing\" : \"grab\",\n                            userSelect: \"none\",\n                            touchAction: \"none\",\n                            WebkitUserSelect: \"none\",\n                            MozUserSelect: \"none\",\n                            msUserSelect: \"none\",\n                        },\n                        key: index,\n                        tabIndex: disabled ? undefined : 0,\n                        \"aria-valuemax\": allowOverlap ? max : values[index + 1] || max,\n                        \"aria-valuemin\": allowOverlap ? min : values[index - 1] || min,\n                        \"aria-valuenow\": value,\n                        draggable: false,\n                        ref: _this.thumbRefs[index],\n                        \"aria-label\": label,\n                        \"aria-labelledby\": labelledBy,\n                        role: \"slider\",\n                        onKeyDown: disabled ? utils_1.voidFn : _this.onKeyDown,\n                        onKeyUp: disabled ? utils_1.voidFn : _this.onKeyUp,\n                    },\n                });\n            }), true),\n        });\n    };\n    Range.defaultProps = {\n        label: \"Accessibility label\",\n        labelledBy: null,\n        step: 1,\n        direction: types_1.Direction.Right,\n        rtl: false,\n        disabled: false,\n        allowOverlap: false,\n        draggableTrack: false,\n        min: 0,\n        max: 100,\n    };\n    return Range;\n}(React.Component));\nexports.default = Range;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkValuesAgainstBoundaries = exports.relativeValue = exports.useThumbOverlap = exports.Direction = exports.getTrackBackground = exports.Range = void 0;\nvar Range_1 = __importDefault(require(\"./Range\"));\nexports.Range = Range_1.default;\nvar utils_1 = require(\"./utils\");\nObject.defineProperty(exports, \"getTrackBackground\", { enumerable: true, get: function () { return utils_1.getTrackBackground; } });\nObject.defineProperty(exports, \"useThumbOverlap\", { enumerable: true, get: function () { return utils_1.useThumbOverlap; } });\nObject.defineProperty(exports, \"relativeValue\", { enumerable: true, get: function () { return utils_1.relativeValue; } });\nObject.defineProperty(exports, \"checkValuesAgainstBoundaries\", { enumerable: true, get: function () { return utils_1.checkValuesAgainstBoundaries; } });\nvar types_1 = require(\"./types\");\nObject.defineProperty(exports, \"Direction\", { enumerable: true, get: function () { return types_1.Direction; } });\n","import { useCallback, useEffect, useState } from 'react';\n\nexport type MediaPlayData = {\n  playing: boolean;\n};\n\nexport type MediaPlayControl = {\n  setPlaying: (play: boolean) => void;\n};\n\nexport const useMediaPlay = (\n  getTargetElement: () => HTMLMediaElement | null\n): MediaPlayData & MediaPlayControl => {\n  const [playing, setPlay] = useState(false);\n\n  const setPlaying = useCallback(\n    (play: boolean) => {\n      const targetEl = getTargetElement();\n      if (!targetEl) return;\n      if (play) targetEl.play();\n      else targetEl.pause();\n    },\n    [getTargetElement]\n  );\n\n  useEffect(() => {\n    const targetEl = getTargetElement();\n    const handleChange = () => {\n      if (!targetEl) return;\n      setPlay(!targetEl.paused);\n    };\n    targetEl?.addEventListener('playing', handleChange);\n    targetEl?.addEventListener('play', handleChange);\n    targetEl?.addEventListener('pause', handleChange);\n    return () => {\n      targetEl?.removeEventListener('playing', handleChange);\n      targetEl?.removeEventListener('play', handleChange);\n      targetEl?.removeEventListener('pause', handleChange);\n    };\n  }, [getTargetElement]);\n\n  return {\n    playing,\n    setPlaying,\n  };\n};\n","import { useEffect } from 'react';\n\nexport type PlayTimeCallback = (duration: number, currentTime: number) => void;\n\nexport const useMediaPlayTimeCallback = (\n  getTargetElement: () => HTMLMediaElement | null,\n  onPlayTimeCallback: PlayTimeCallback\n): void => {\n  useEffect(() => {\n    const targetEl = getTargetElement();\n    const handleChange = () => {\n      if (!targetEl) return;\n      const { duration, currentTime } = targetEl;\n      onPlayTimeCallback(\n        duration,\n        Number.isFinite(currentTime) && currentTime >= 0 ? currentTime : 0\n      );\n    };\n    targetEl?.addEventListener('timeupdate', handleChange);\n    targetEl?.addEventListener('loadedmetadata', handleChange);\n    targetEl?.addEventListener('ended', handleChange);\n    return () => {\n      targetEl?.removeEventListener('timeupdate', handleChange);\n      targetEl?.removeEventListener('loadedmetadata', handleChange);\n      targetEl?.removeEventListener('ended', handleChange);\n    };\n  }, [getTargetElement, onPlayTimeCallback]);\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nexport type MediaSeekData = {\n  seeking: boolean;\n  seekable?: TimeRanges;\n};\nexport type MediaSeekControl = {\n  seek: (time: number) => void;\n};\n\nexport const useMediaSeek = (\n  getTargetElement: () => HTMLMediaElement | null\n): MediaSeekData & MediaSeekControl => {\n  const [seekData, setSeekData] = useState<MediaSeekData>({\n    seeking: false,\n    seekable: undefined,\n  });\n\n  const seek = useCallback(\n    (time: number) => {\n      const targetEl = getTargetElement();\n      if (!targetEl) return;\n      targetEl.currentTime = time;\n    },\n    [getTargetElement]\n  );\n\n  useEffect(() => {\n    const targetEl = getTargetElement();\n    const handleChange = () => {\n      if (!targetEl) return;\n      setSeekData({\n        seeking: targetEl.seeking,\n        seekable: targetEl.seekable,\n      });\n    };\n    targetEl?.addEventListener('loadedmetadata', handleChange);\n    targetEl?.addEventListener('seeked', handleChange);\n    targetEl?.addEventListener('seeking', handleChange);\n    return () => {\n      targetEl?.removeEventListener('loadedmetadata', handleChange);\n      targetEl?.removeEventListener('seeked', handleChange);\n      targetEl?.removeEventListener('seeking', handleChange);\n    };\n  }, [getTargetElement]);\n\n  return {\n    ...seekData,\n    seek,\n  };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nexport type MediaVolumeData = {\n  volume: number;\n  mute: boolean;\n};\n\nexport type MediaVolumeControl = {\n  setMute: (mute: boolean) => void;\n  setVolume: (volume: number) => void;\n};\n\nexport const useMediaVolume = (\n  getTargetElement: () => HTMLMediaElement | null\n): MediaVolumeData & MediaVolumeControl => {\n  const [volumeData, setVolumeData] = useState<MediaVolumeData>({\n    volume: 1,\n    mute: false,\n  });\n\n  const setMute = useCallback(\n    (mute: boolean) => {\n      const targetEl = getTargetElement();\n      if (!targetEl) return;\n      targetEl.muted = mute;\n    },\n    [getTargetElement]\n  );\n\n  const setVolume = useCallback(\n    (volume: number) => {\n      const targetEl = getTargetElement();\n      if (!targetEl) return;\n      targetEl.volume = volume;\n    },\n    [getTargetElement]\n  );\n\n  useEffect(() => {\n    const targetEl = getTargetElement();\n    const handleChange = () => {\n      if (!targetEl) return;\n\n      setVolumeData({\n        mute: targetEl.muted,\n        volume: Math.max(0, Math.min(targetEl.volume, 1)),\n      });\n    };\n    targetEl?.addEventListener('volumechange', handleChange);\n    return () => {\n      targetEl?.removeEventListener('volumechange', handleChange);\n    };\n  }, [getTargetElement]);\n\n  return {\n    ...volumeData,\n    setMute,\n    setVolume,\n  };\n};\n","import { useEffect, useState } from 'react';\n\nexport type MediaLoadingData = {\n  loading: boolean;\n  error: boolean;\n};\n\nexport const useMediaLoading = (\n  getTargetElement: () => HTMLMediaElement | null\n): MediaLoadingData => {\n  const [loadingData, setLoadingData] = useState<MediaLoadingData>({\n    loading: false,\n    error: false,\n  });\n\n  useEffect(() => {\n    const targetEl = getTargetElement();\n    const handleStart = () => {\n      setLoadingData({\n        loading: true,\n        error: false,\n      });\n    };\n    const handleStop = () => {\n      setLoadingData({\n        loading: false,\n        error: false,\n      });\n    };\n    const handleError = () => {\n      setLoadingData({\n        loading: false,\n        error: true,\n      });\n    };\n    targetEl?.addEventListener('loadstart', handleStart);\n    targetEl?.addEventListener('loadeddata', handleStop);\n    targetEl?.addEventListener('stalled', handleStop);\n    targetEl?.addEventListener('suspend', handleStop);\n    targetEl?.addEventListener('error', handleError);\n    return () => {\n      targetEl?.removeEventListener('loadstart', handleStart);\n      targetEl?.removeEventListener('loadeddata', handleStop);\n      targetEl?.removeEventListener('stalled', handleStop);\n      targetEl?.removeEventListener('suspend', handleStop);\n      targetEl?.removeEventListener('error', handleError);\n    };\n  }, [getTargetElement]);\n\n  return loadingData;\n};\n","import { useCallback, useRef } from 'react';\n\nexport interface ThrottleOptions {\n  wait?: number;\n  immediate?: boolean;\n}\n\nexport type ThrottleCallback<T extends unknown[]> = (...args: T) => void;\n\nexport function useThrottle<T extends unknown[]>(\n  callback: ThrottleCallback<T>,\n  options?: ThrottleOptions\n): ThrottleCallback<T> {\n  const timeoutIdRef = useRef<number | undefined>(undefined);\n  const argsRef = useRef<T | undefined>(undefined);\n  const { wait, immediate } = options ?? {};\n\n  const debounceCallback = useCallback(\n    (...cbArgs: T) => {\n      argsRef.current = cbArgs;\n\n      if (timeoutIdRef.current) {\n        return;\n      }\n      if (immediate) {\n        callback(...cbArgs);\n      }\n\n      timeoutIdRef.current = window.setTimeout(() => {\n        if (argsRef.current) {\n          callback(...argsRef.current);\n        }\n        argsRef.current = undefined;\n        timeoutIdRef.current = undefined;\n      }, wait);\n    },\n    [callback, wait, immediate]\n  );\n\n  return debounceCallback;\n}\n","/* oxlint-disable jsx-a11y/media-has-caption */\nimport type { ReactNode } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Badge, Chip, IconButton, ProgressBar, Spinner, Text, toRem } from 'folds';\nimport { sizedIcon, Pause, Play, SpeakerHigh, SpeakerSlash } from '$components/icons/phosphor';\nimport { isTauri } from '@tauri-apps/api/core';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport { Range } from 'react-range';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport type { IAudioInfo } from '$types/matrix/common';\nimport type { PlayTimeCallback } from '$hooks/media';\nimport {\n  useMediaLoading,\n  useMediaPlay,\n  useMediaPlayTimeCallback,\n  useMediaSeek,\n  useMediaVolume,\n} from '$hooks/media';\nimport { useThrottle } from '$hooks/useThrottle';\nimport { secondsToMinutesAndSeconds } from '$utils/common';\nimport {\n  decryptFile,\n  downloadEncryptedMedia,\n  downloadMedia,\n  mxcUrlToHttp,\n  rewriteAuthenticatedMediaUrl,\n} from '$utils/matrix';\nimport { prepareLoopbackMedia } from '$utils/mediaUrl';\nimport { setMediaEncryption } from '$utils/tauriMediaEncryption';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useCreateObjectURL } from '$hooks/useObjectURL';\nimport { MEDIA_VOLUME_KEY } from '$components/media';\nimport { hasControllingServiceWorker } from '$utils/platform';\n\nconst PLAY_TIME_THROTTLE_OPS = {\n  wait: 500,\n  immediate: true,\n};\n\ntype RenderMediaControlProps = {\n  after: ReactNode;\n  leftControl: ReactNode;\n  rightControl: ReactNode;\n  children: ReactNode;\n};\nexport type AudioContentProps = {\n  mimeType: string;\n  url: string;\n  info: IAudioInfo;\n  encInfo?: EncryptedAttachmentInfo;\n  renderMediaControl: (props: RenderMediaControlProps) => ReactNode;\n};\nexport function AudioContent({\n  mimeType,\n  url,\n  info,\n  encInfo,\n  renderMediaControl,\n}: AudioContentProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const createObjectURL = useCreateObjectURL();\n\n  const [srcState, loadSrc] = useAsyncCallback(\n    useCallback(async () => {\n      const mediaUrl = mxcUrlToHttp(mx, url, useAuthentication);\n      if (!mediaUrl) throw new Error('Invalid media URL');\n      // mxcUrlToHttp already returned a `sable-media` URL under Tauri.\n      if (!encInfo && isTauri()) return prepareLoopbackMedia(mediaUrl);\n      // Service-worker-authenticated browser media can stream with Range requests.\n      if (!encInfo && hasControllingServiceWorker()) return mediaUrl;\n      if (encInfo) {\n        if (isTauri()) {\n          await setMediaEncryption(mediaUrl, encInfo, mimeType);\n          return prepareLoopbackMedia(rewriteAuthenticatedMediaUrl(mediaUrl)!);\n        }\n        return createObjectURL(\n          downloadEncryptedMedia(mediaUrl, (encBuf) => decryptFile(encBuf, mimeType, encInfo))\n        );\n      }\n      return createObjectURL(downloadMedia(mediaUrl));\n    }, [mx, url, useAuthentication, mimeType, encInfo, createObjectURL])\n  );\n\n  const audioRef = useRef<HTMLAudioElement | null>(null);\n\n  useEffect(() => {\n    const stored = localStorage.getItem(MEDIA_VOLUME_KEY);\n    if (audioRef.current && stored !== null) {\n      const parsed = parseFloat(stored);\n      if (!Number.isNaN(parsed)) audioRef.current.volume = parsed;\n    }\n  }, []);\n\n  const [currentTime, setCurrentTime] = useState(0);\n  // duration in seconds. (NOTE: info.duration is in milliseconds)\n  const infoDurationMs = info.duration ?? 0;\n  const initialDurationSec =\n    Number.isFinite(infoDurationMs) && infoDurationMs > 0 ? infoDurationMs / 1000 : 0;\n  const [duration, setDuration] = useState(initialDurationSec);\n\n  const getAudioRef = useCallback(() => audioRef.current, []);\n  const { loading } = useMediaLoading(getAudioRef);\n  const { playing, setPlaying } = useMediaPlay(getAudioRef);\n  const { seek } = useMediaSeek(getAudioRef);\n  const { volume, mute, setMute, setVolume } = useMediaVolume(getAudioRef);\n  const handlePlayTimeCallback: PlayTimeCallback = useCallback((d, ct) => {\n    if (Number.isFinite(d) && d > 0) setDuration(d);\n    if (Number.isFinite(ct) && ct >= 0) setCurrentTime(ct);\n  }, []);\n\n  const trackMax = duration > 0 ? duration : 1;\n  const trackTime =\n    duration > 0 ? Math.min(Number.isFinite(currentTime) ? currentTime : 0, duration) : 0;\n  const displayDuration = duration > 0 ? duration : 0;\n  const displayCurrentTime = Number.isFinite(currentTime) && currentTime >= 0 ? currentTime : 0;\n  useMediaPlayTimeCallback(\n    getAudioRef,\n    useThrottle(handlePlayTimeCallback, PLAY_TIME_THROTTLE_OPS)\n  );\n\n  const handlePlay = () => {\n    if (srcState.status === AsyncStatus.Success) {\n      setPlaying(!playing);\n    } else if (srcState.status !== AsyncStatus.Loading) {\n      loadSrc().catch(() => undefined);\n    }\n  };\n\n  return renderMediaControl({\n    after: (\n      <Range\n        step={1}\n        min={0}\n        max={trackMax}\n        values={[trackTime]}\n        onChange={(values) => {\n          if (!(duration > 0)) return;\n          const next = values[0] ?? 0;\n          if (!Number.isFinite(next)) return;\n          seek(Math.max(0, Math.min(next, duration)));\n        }}\n        renderTrack={(params) => {\n          const { key, ...restProps } = params.props as unknown as {\n            key?: string;\n            [key: string]: unknown;\n          };\n          return (\n            <div key={key} {...restProps}>\n              {params.children}\n              <ProgressBar\n                as=\"div\"\n                variant=\"Secondary\"\n                size=\"300\"\n                min={0}\n                max={trackMax}\n                value={trackTime}\n                radii=\"300\"\n              />\n            </div>\n          );\n        }}\n        renderThumb={(params) => {\n          const { key, style, ...restProps } = params.props as unknown as {\n            key?: unknown;\n            style?: Record<string, unknown>;\n            [key: string]: unknown;\n          };\n          return (\n            <Badge\n              key={String(key)}\n              size=\"300\"\n              variant=\"Secondary\"\n              fill=\"Solid\"\n              radii=\"Pill\"\n              outlined\n              {...(restProps as Record<string, unknown>)}\n              style={{\n                ...(style as Record<string, unknown>),\n                zIndex: 0,\n              }}\n            />\n          );\n        }}\n      />\n    ),\n    leftControl: (\n      <>\n        <Chip\n          onClick={handlePlay}\n          variant=\"Secondary\"\n          radii=\"300\"\n          disabled={srcState.status === AsyncStatus.Loading}\n          before={\n            srcState.status === AsyncStatus.Loading || loading ? (\n              <Spinner variant=\"Secondary\" size=\"50\" />\n            ) : (\n              sizedIcon(playing ? Pause : Play, '50', { filled: playing })\n            )\n          }\n        >\n          <Text size=\"B300\">{playing ? 'Pause' : 'Play'}</Text>\n        </Chip>\n\n        <Text size=\"T200\">{`${secondsToMinutesAndSeconds(\n          displayCurrentTime\n        )} / ${secondsToMinutesAndSeconds(displayDuration)}`}</Text>\n      </>\n    ),\n    rightControl: (\n      <>\n        <IconButton\n          variant=\"SurfaceVariant\"\n          size=\"300\"\n          radii=\"Pill\"\n          onClick={() => setMute(!mute)}\n          aria-pressed={mute}\n        >\n          {sizedIcon(mute ? SpeakerSlash : SpeakerHigh, '50')}\n        </IconButton>\n        <Range\n          step={0.1}\n          min={0}\n          max={1}\n          values={[volume]}\n          onChange={(values) => setVolume(values[0] ?? 1)}\n          renderTrack={(params) => {\n            const { key, ...restProps } = params.props as unknown as {\n              key?: string;\n              [key: string]: unknown;\n            };\n            return (\n              <div key={key} {...restProps}>\n                {params.children}\n                <ProgressBar\n                  style={{ width: toRem(48) }}\n                  variant=\"Secondary\"\n                  size=\"300\"\n                  min={0}\n                  max={1}\n                  value={volume}\n                  radii=\"300\"\n                />\n              </div>\n            );\n          }}\n          renderThumb={(params) => {\n            const { key, style, ...restProps } = params.props as unknown as {\n              key?: unknown;\n              style?: Record<string, unknown>;\n              [key: string]: unknown;\n            };\n            return (\n              <Badge\n                key={String(key)}\n                size=\"300\"\n                variant=\"Secondary\"\n                fill=\"Solid\"\n                radii=\"Pill\"\n                outlined\n                {...(restProps as Record<string, unknown>)}\n                style={{\n                  ...(style as Record<string, unknown>),\n                  zIndex: 0,\n                }}\n              />\n            );\n          }}\n        />\n      </>\n    ),\n    children: (\n      <audio\n        controls={false}\n        autoPlay\n        ref={audioRef}\n        // See VideoContent: CORS opts this Range-streamed media out of Firefox's ORB.\n        crossOrigin={\n          srcState.status === AsyncStatus.Success && !srcState.data.startsWith('blob:')\n            ? 'anonymous'\n            : undefined\n        }\n        onVolumeChange={(e) => {\n          localStorage.setItem(MEDIA_VOLUME_KEY, String((e.target as HTMLAudioElement).volume));\n        }}\n      >\n        {srcState.status === AsyncStatus.Success && <source src={srcState.data} type={mimeType} />}\n      </audio>\n    ),\n  });\n}\n","(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map","import { useSyncExternalStore } from 'react';\n\nexport type ToastMessage = { id: number; text: string };\n\nlet current: ToastMessage | null = null;\nlet counter = 0;\nlet timer: ReturnType<typeof setTimeout> | undefined;\nconst listeners = new Set<() => void>();\n\nconst notify = (): void => {\n  listeners.forEach((listener) => listener());\n};\n\nexport const showToast = (text: string, durationMs = 3000): void => {\n  counter += 1;\n  current = { id: counter, text };\n  notify();\n\n  if (timer) clearTimeout(timer);\n  timer = setTimeout(() => {\n    current = null;\n    timer = undefined;\n    notify();\n  }, durationMs);\n};\n\nconst subscribe = (listener: () => void): (() => void) => {\n  listeners.add(listener);\n  return () => {\n    listeners.delete(listener);\n  };\n};\n\nconst getSnapshot = (): ToastMessage | null => current;\n\nexport const useToastMessage = (): ToastMessage | null =>\n  useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n","import FileSaver from 'file-saver';\nimport * as Sentry from '@sentry/react';\nimport { invoke, isTauri } from '@tauri-apps/api/core';\nimport { type as osType } from '@tauri-apps/plugin-os';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport { showToast } from '$state/toast';\nimport { fetchMediaBlob } from '$utils/mediaTransport';\nimport { setMediaEncryption } from '$utils/tauriMediaEncryption';\n\nconst INVALID_FILENAME_CHARS = /[<>:\"/\\\\|?*]/g;\nconst CONTROL_CHARS = /\\p{Cc}/gu;\nconst BIDI_CONTROL_CHARS = /[\\u202a-\\u202e\\u2066-\\u2069]/g;\nconst WINDOWS_RESERVED_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/i;\nconst MAX_FILENAME_LENGTH = 255;\n\nconst getErrorMessage = (error: unknown): string =>\n  error instanceof Error ? error.message : String(error);\n\nconst nonEmptyString = (value: unknown): string | undefined => {\n  if (typeof value !== 'string') return undefined;\n  const trimmed = value.trim();\n  return trimmed.length > 0 ? trimmed : undefined;\n};\n\nexport const getAttachmentFilename = (\n  filename: unknown,\n  body: unknown,\n  fallback = 'download'\n): string => nonEmptyString(filename) ?? nonEmptyString(body) ?? fallback;\n\nconst sanitizeDownloadFilename = (filename: string, fallback = 'download'): string => {\n  let safeName = filename\n    .replace(INVALID_FILENAME_CHARS, '_')\n    .replace(CONTROL_CHARS, '_')\n    .replace(BIDI_CONTROL_CHARS, '')\n    .trim()\n    .replace(/[. ]+$/g, '');\n\n  if (!safeName || safeName === '.' || safeName === '..') safeName = fallback;\n  if (WINDOWS_RESERVED_NAME.test(safeName)) safeName = `_${safeName}`;\n\n  if (safeName.length > MAX_FILENAME_LENGTH) {\n    const extensionStart = safeName.lastIndexOf('.');\n    const extension = extensionStart > 0 ? safeName.slice(extensionStart) : '';\n    const extensionLength = Math.min(extension.length, 32);\n    safeName = `${safeName.slice(0, MAX_FILENAME_LENGTH - extensionLength)}${extension.slice(\n      -extensionLength\n    )}`;\n  }\n\n  return safeName;\n};\n\nexport const getDownloadFilename = (\n  filename: unknown,\n  body?: unknown,\n  fallback = 'download'\n): string => sanitizeDownloadFilename(getAttachmentFilename(filename, body, fallback), fallback);\n\nconst splitExtension = (filename: string): [stem: string, extension: string] => {\n  const at = filename.lastIndexOf('.');\n  return at > 0 ? [filename.slice(0, at), filename.slice(at)] : [filename, ''];\n};\n\n// MediaStore gives up after 32 numbered variants, and resolves the final name\n// when the pending flag clears rather than on create, so retry the whole save.\nconst saveWithUniqueName = async (\n  filename: string,\n  save: (filename: string) => Promise<void>\n): Promise<void> => {\n  try {\n    await save(filename);\n  } catch {\n    const [stem, extension] = splitExtension(filename);\n    await save(sanitizeDownloadFilename(`${stem}-${Date.now()}${extension}`));\n  }\n};\n\n// Name first: names contain spaces, so `\\S*` would leave the rest behind.\nconst scrubError = (error: unknown, filename: string): string =>\n  getErrorMessage(error)\n    .split(splitExtension(filename)[0])\n    .join('[FILENAME]')\n    .replace(/\\/(?:storage|data|var|Users|home)\\/\\S*/g, '[PATH]')\n    .replace(/\\b(_display_name|_data|title|relative_path)=\\S*/g, '$1=[REDACTED]');\n\nconst platformTag = (): string => (isTauri() ? osType() : 'web');\n\nconst reportSaveFailure = (\n  error: unknown,\n  target: 'downloads' | 'gallery' | 'photos',\n  filename: string,\n  mimeType?: string\n): void => {\n  Sentry.captureException(new Error(scrubError(error, filename)), {\n    tags: { feature: 'media-save', target, platform: platformTag() },\n    extra: { mimeType },\n  });\n};\n\nexport const reportDownloadFailure = (\n  error: unknown,\n  stage: 'fetch' | 'save',\n  filename: string,\n  mimeType?: string\n): void => {\n  Sentry.captureException(new Error(scrubError(error, filename)), {\n    tags: { feature: 'media-download', stage, platform: platformTag() },\n    extra: { mimeType },\n  });\n};\n\nasync function resolveBlob(input: Blob | string): Promise<Blob> {\n  if (typeof input !== 'string') return input;\n  return fetchMediaBlob(input);\n}\n\nexport async function saveMediaToGallery(\n  input: Blob | string,\n  filename: string,\n  mimeType: string\n): Promise<void> {\n  const mediaMimeType = mimeType.trim().toLowerCase();\n  if (!mediaMimeType.startsWith('image/')) {\n    throw new Error(`Only image media can be saved to the gallery (received \"${mimeType}\")`);\n  }\n  if (!isTauri()) {\n    throw new Error('Saving to the gallery is only available in the Android and iOS apps');\n  }\n\n  const platform = osType();\n  if (platform !== 'android' && platform !== 'ios') {\n    throw new Error(`Saving to the gallery is not supported on ${platform}`);\n  }\n\n  if (platform === 'android') {\n    const { AndroidFs, AndroidPublicImageDir } = await import('tauri-plugin-android-fs-api');\n    try {\n      const blob = await resolveBlob(input);\n      const bytes = new Uint8Array(await blob.arrayBuffer());\n\n      if (!(await AndroidFs.checkPublicFilesPermission())) {\n        const granted = await AndroidFs.requestPublicFilesPermission();\n        if (!granted) throw new Error('Storage permission was denied');\n      }\n\n      await saveWithUniqueName(filename, async (name) => {\n        const uri = await AndroidFs.createNewPublicImageFile(\n          AndroidPublicImageDir.Pictures,\n          name,\n          mediaMimeType,\n          { isPending: true, requestPermission: true }\n        );\n        try {\n          await AndroidFs.writeFile(uri, bytes);\n          await AndroidFs.setPublicFilePending(uri, false);\n          await AndroidFs.scanPublicFile(uri);\n        } catch (error) {\n          await AndroidFs.removeFile(uri).catch(() => undefined);\n          throw error;\n        }\n      });\n      showToast('Saved to Gallery');\n    } catch (error) {\n      reportSaveFailure(error, 'gallery', filename, mediaMimeType);\n      showToast(`Failed to save to gallery: ${getErrorMessage(error)}`);\n    }\n    return;\n  }\n\n  try {\n    const blob = await resolveBlob(input);\n    const bytes = new Uint8Array(await blob.arrayBuffer());\n\n    await invoke('save_media_to_photos', {\n      filename,\n      mimeType: mediaMimeType,\n      bytes: Array.from(bytes),\n    });\n    showToast('Saved to Photos');\n  } catch (error) {\n    reportSaveFailure(error, 'photos', filename, mediaMimeType);\n    showToast(`Failed to save to photos: ${getErrorMessage(error)}`);\n  }\n}\n\nexport async function saveFileToDevice(\n  input: Blob | string,\n  filename: string,\n  mimeType?: string\n): Promise<'saved' | 'cancelled' | 'failed'> {\n  let blob: Blob;\n  try {\n    blob = await resolveBlob(input);\n  } catch (error) {\n    reportDownloadFailure(error, 'fetch', filename, mimeType);\n    showToast(`Failed to save file: ${getErrorMessage(error)}`);\n    return 'failed';\n  }\n\n  if (isTauri()) {\n    try {\n      const bytes = new Uint8Array(await blob.arrayBuffer());\n\n      if (osType() === 'android') {\n        const { AndroidFs, AndroidPublicGeneralPurposeDir } =\n          await import('tauri-plugin-android-fs-api');\n        if (!(await AndroidFs.checkPublicFilesPermission())) {\n          const granted = await AndroidFs.requestPublicFilesPermission();\n          if (!granted) throw new Error('Storage permission was denied');\n        }\n\n        await saveWithUniqueName(filename, async (name) => {\n          const uri = await AndroidFs.createNewPublicFile(\n            AndroidPublicGeneralPurposeDir.Download,\n            name,\n            mimeType || blob.type || null,\n            { isPending: true, requestPermission: true }\n          );\n          try {\n            await AndroidFs.writeFile(uri, bytes);\n            await AndroidFs.setPublicFilePending(uri, false);\n            await AndroidFs.scanPublicFile(uri);\n          } catch (error) {\n            await AndroidFs.removeFile(uri).catch(() => undefined);\n            throw error;\n          }\n        });\n        showToast('Saved to Downloads');\n        return 'saved';\n      }\n\n      if (osType() === 'ios') {\n        const { save } = await import('@tauri-apps/plugin-dialog');\n        const path = await save({ defaultPath: filename });\n        if (!path) return 'cancelled';\n\n        const { writeFile } = await import('@tauri-apps/plugin-fs');\n        await writeFile(path, bytes);\n        showToast('File saved');\n        return 'saved';\n      }\n\n      const saved = await invoke<boolean>('save_download', { filename, bytes: Array.from(bytes) });\n      if (saved) showToast('File saved');\n      return saved ? 'saved' : 'cancelled';\n    } catch (error) {\n      reportSaveFailure(error, 'downloads', filename, mimeType || blob.type || undefined);\n      showToast(`Failed to save file: ${getErrorMessage(error)}`);\n      return 'failed';\n    }\n  }\n\n  try {\n    FileSaver.saveAs(blob, filename);\n  } catch (error) {\n    reportDownloadFailure(error, 'save', filename, mimeType || blob.type || undefined);\n    showToast(`Failed to save file: ${getErrorMessage(error)}`);\n    return 'failed';\n  }\n  return 'saved';\n}\n\nconst isDesktopTauri = (): boolean => isTauri() && osType() !== 'android' && osType() !== 'ios';\n\nexport type SaveMediaOptions = {\n  mediaUrl: string;\n  filename: string;\n  mimeType?: string;\n  encInfo?: EncryptedAttachmentInfo;\n  loadBlob: () => Promise<Blob>;\n};\n\nexport async function saveMediaToDevice({\n  mediaUrl,\n  filename,\n  mimeType,\n  encInfo,\n  loadBlob,\n}: SaveMediaOptions): Promise<'saved' | 'cancelled' | 'failed'> {\n  const saveFetchedBlob = async (): Promise<'saved' | 'cancelled' | 'failed'> => {\n    let blob: Blob;\n    try {\n      blob = await loadBlob();\n    } catch (error) {\n      reportDownloadFailure(error, 'fetch', filename, mimeType);\n      showToast(`Failed to save file: ${getErrorMessage(error)}`);\n      return 'failed';\n    }\n    return saveFileToDevice(blob, filename, mimeType);\n  };\n\n  if (!isDesktopTauri()) return saveFetchedBlob();\n\n  try {\n    // Without keys the native handler would write ciphertext.\n    if (encInfo && !(await setMediaEncryption(mediaUrl, encInfo, mimeType ?? ''))) {\n      return saveFetchedBlob();\n    }\n\n    const saved = await invoke<boolean>('save_media_download', { url: mediaUrl, filename });\n    if (saved) showToast('File saved');\n    return saved ? 'saved' : 'cancelled';\n  } catch (error) {\n    reportDownloadFailure(error, 'save', filename, mimeType);\n    return saveFetchedBlob();\n  }\n}\n\nexport const downloadJsonFile = (\n  content: string,\n  fileNamePrefix: string\n): Promise<'saved' | 'cancelled' | 'failed'> =>\n  saveFileToDevice(\n    new Blob([content], { type: 'application/json' }),\n    `${fileNamePrefix}-${Date.now()}.json`,\n    'application/json'\n  );\n","import type { ReactNode } from 'react';\nimport { useCallback, useState } from 'react';\nimport { Box, Button, Modal, Spinner, Text, Tooltip, as } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { ArrowRight, Download, sizedIcon, Warning } from '$components/icons/phosphor';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport type { IFileInfo } from '$types/matrix/common';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { bytesToSize } from '$utils/common';\nimport {\n  READABLE_EXT_TO_MIME_TYPE,\n  READABLE_TEXT_MIME_TYPES,\n  getFileNameExt,\n  mimeTypeToExt,\n} from '$utils/mimeTypes';\nimport { decryptFile, downloadEncryptedMedia, downloadMedia, mxcUrlToHttp } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useCreateObjectURL } from '$hooks/useObjectURL';\nimport { useDismissOnBack } from '$utils/androidBack';\nimport { ModalWide } from '$styles/Modal.css';\nimport { getDownloadFilename, reportDownloadFailure, saveMediaToDevice } from '$utils/download';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\nconst loadFileContent = (\n  mediaUrl: string,\n  mimeType: string,\n  encInfo?: EncryptedAttachmentInfo\n): Promise<Blob> =>\n  encInfo\n    ? downloadEncryptedMedia(mediaUrl, (encBuf) => decryptFile(encBuf, mimeType, encInfo))\n    : downloadMedia(mediaUrl);\n\nconst renderErrorButton = (retry: () => void, text: string) => (\n  <TooltipProvider\n    tooltip={\n      <Tooltip variant=\"Critical\">\n        <Text>Failed to load file!</Text>\n      </Tooltip>\n    }\n    position=\"Top\"\n    align=\"Center\"\n  >\n    {(triggerRef) => (\n      <Button\n        ref={triggerRef}\n        size=\"400\"\n        variant=\"Critical\"\n        fill=\"Soft\"\n        outlined\n        radii=\"300\"\n        onClick={retry}\n        before={sizedIcon(Warning, '100', { filled: true })}\n      >\n        <Text size=\"B400\" truncate>\n          {text}\n        </Text>\n      </Button>\n    )}\n  </TooltipProvider>\n);\n\ntype RenderTextViewerProps = {\n  name: string;\n  text: string;\n  langName: string;\n  requestClose: () => void;\n};\ntype ReadTextFileProps = {\n  body: string;\n  mimeType: string;\n  url: string;\n  encInfo?: EncryptedAttachmentInfo;\n  renderViewer: (props: RenderTextViewerProps) => ReactNode;\n};\nexport function ReadTextFile({ body, mimeType, url, encInfo, renderViewer }: ReadTextFileProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const [textViewer, setTextViewer] = useState(false);\n\n  // Android back closes the text viewer instead of navigating away.\n  useDismissOnBack(() => setTextViewer(false), textViewer);\n\n  const [textState, loadText] = useAsyncCallback(\n    useCallback(async () => {\n      const mediaUrl = mxcUrlToHttp(mx, url, useAuthentication);\n      if (!mediaUrl) throw new Error('Invalid media URL');\n      const fileContent = await loadFileContent(mediaUrl, mimeType, encInfo).catch((error) => {\n        reportDownloadFailure(error, 'fetch', getDownloadFilename(body), mimeType);\n        throw error;\n      });\n\n      const text = fileContent.text();\n      setTextViewer(true);\n      return text;\n    }, [mx, useAuthentication, mimeType, encInfo, url, body])\n  );\n\n  return (\n    <>\n      {textState.status === AsyncStatus.Success && (\n        <ModalOverlay open={textViewer} requestClose={() => setTextViewer(false)}>\n          <Modal\n            className={ModalWide}\n            size=\"500\"\n            onContextMenu={(evt: React.MouseEvent) => evt.stopPropagation()}\n          >\n            {renderViewer({\n              name: body,\n              text: textState.data,\n              langName: READABLE_TEXT_MIME_TYPES.includes(mimeType)\n                ? mimeTypeToExt(mimeType)\n                : mimeTypeToExt(READABLE_EXT_TO_MIME_TYPE[getFileNameExt(body)] ?? mimeType),\n              requestClose: () => setTextViewer(false),\n            })}\n          </Modal>\n        </ModalOverlay>\n      )}\n      {textState.status === AsyncStatus.Error ? (\n        renderErrorButton(loadText, 'Open File')\n      ) : (\n        <Button\n          variant=\"Secondary\"\n          fill=\"Solid\"\n          radii=\"300\"\n          size=\"400\"\n          onClick={() =>\n            textState.status === AsyncStatus.Success ? setTextViewer(true) : loadText()\n          }\n          disabled={textState.status === AsyncStatus.Loading}\n          before={\n            textState.status === AsyncStatus.Loading ? (\n              <Spinner fill=\"Solid\" size=\"100\" variant=\"Secondary\" />\n            ) : (\n              sizedIcon(ArrowRight, '100', { filled: true })\n            )\n          }\n        >\n          <Text size=\"B400\" truncate>\n            Open File\n          </Text>\n        </Button>\n      )}\n    </>\n  );\n}\n\ntype RenderPdfViewerProps = {\n  name: string;\n  src: string;\n  requestClose: () => void;\n};\nexport type ReadPdfFileProps = {\n  body: string;\n  mimeType: string;\n  url: string;\n  encInfo?: EncryptedAttachmentInfo;\n  renderViewer: (props: RenderPdfViewerProps) => ReactNode;\n};\nexport function ReadPdfFile({ body, mimeType, url, encInfo, renderViewer }: ReadPdfFileProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const [pdfViewer, setPdfViewer] = useState(false);\n\n  // Android back closes the PDF viewer instead of navigating away.\n  useDismissOnBack(() => setPdfViewer(false), pdfViewer);\n\n  const createObjectURL = useCreateObjectURL();\n\n  const [pdfState, loadPdf] = useAsyncCallback(\n    useCallback(async () => {\n      const mediaUrl = mxcUrlToHttp(mx, url, useAuthentication);\n      if (!mediaUrl) throw new Error('Invalid media URL');\n      const fileURL = await createObjectURL(loadFileContent(mediaUrl, mimeType, encInfo)).catch(\n        (error) => {\n          reportDownloadFailure(error, 'fetch', getDownloadFilename(body), mimeType);\n          throw error;\n        }\n      );\n      setPdfViewer(true);\n      return fileURL;\n    }, [mx, url, useAuthentication, mimeType, encInfo, createObjectURL, body])\n  );\n\n  return (\n    <>\n      {pdfState.status === AsyncStatus.Success && (\n        <ModalOverlay open={pdfViewer} requestClose={() => setPdfViewer(false)}>\n          <Modal\n            className={ModalWide}\n            size=\"500\"\n            onContextMenu={(evt: React.MouseEvent) => evt.stopPropagation()}\n          >\n            {renderViewer({\n              name: body,\n              src: pdfState.data,\n              requestClose: () => setPdfViewer(false),\n            })}\n          </Modal>\n        </ModalOverlay>\n      )}\n      {pdfState.status === AsyncStatus.Error ? (\n        renderErrorButton(loadPdf, 'Open PDF')\n      ) : (\n        <Button\n          variant=\"Secondary\"\n          fill=\"Solid\"\n          radii=\"300\"\n          size=\"400\"\n          onClick={() => (pdfState.status === AsyncStatus.Success ? setPdfViewer(true) : loadPdf())}\n          disabled={pdfState.status === AsyncStatus.Loading}\n          before={\n            pdfState.status === AsyncStatus.Loading ? (\n              <Spinner fill=\"Solid\" size=\"100\" variant=\"Secondary\" />\n            ) : (\n              sizedIcon(ArrowRight, '100', { filled: true })\n            )\n          }\n        >\n          <Text size=\"B400\" truncate>\n            Open PDF\n          </Text>\n        </Button>\n      )}\n    </>\n  );\n}\n\nexport type DownloadFileProps = {\n  body: string;\n  mimeType: string;\n  url: string;\n  info: IFileInfo;\n  encInfo?: EncryptedAttachmentInfo;\n};\nexport function DownloadFile({ body, mimeType, url, info, encInfo }: DownloadFileProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const [downloadState, download] = useAsyncCallback(\n    useCallback(async () => {\n      const mediaUrl = mxcUrlToHttp(mx, url, useAuthentication);\n      if (!mediaUrl) throw new Error('Invalid media URL');\n      return saveMediaToDevice({\n        mediaUrl,\n        filename: getDownloadFilename(body),\n        mimeType,\n        encInfo,\n        loadBlob: () => loadFileContent(mediaUrl, mimeType, encInfo),\n      });\n    }, [mx, url, useAuthentication, mimeType, encInfo, body])\n  );\n\n  return downloadState.status === AsyncStatus.Error ? (\n    renderErrorButton(download, `Retry Download (${bytesToSize(info.size ?? 0)})`)\n  ) : (\n    <Button\n      variant=\"Secondary\"\n      fill=\"Soft\"\n      radii=\"300\"\n      size=\"400\"\n      onClick={() => download()}\n      disabled={downloadState.status === AsyncStatus.Loading}\n      before={\n        downloadState.status === AsyncStatus.Loading ? (\n          <Spinner fill=\"Soft\" size=\"100\" variant=\"Secondary\" />\n        ) : (\n          sizedIcon(Download, '100', { filled: true })\n        )\n      }\n    >\n      <Text size=\"B400\" truncate>{`Download (${bytesToSize(info.size ?? 0)})`}</Text>\n    </Button>\n  );\n}\n\ntype FileContentProps = {\n  body: string;\n  mimeType: string;\n  renderAsTextFile: () => ReactNode;\n  renderAsPdfFile: () => ReactNode;\n};\nexport const FileContent = as<'div', FileContentProps>(\n  ({ body, mimeType, renderAsTextFile, renderAsPdfFile, children, ...props }, ref) => (\n    <Box direction=\"Column\" gap=\"300\" {...props} ref={ref}>\n      {(READABLE_TEXT_MIME_TYPES.includes(mimeType) ||\n        READABLE_EXT_TO_MIME_TYPE[getFileNameExt(body)]) &&\n        renderAsTextFile()}\n      {mimeType === 'application/pdf' && renderAsPdfFile()}\n      {children}\n    </Box>\n  )\n);\n","// Tauri adds a nonce to style-src, which makes strict CSP engines (Android WebView)\n// drop runtime-injected <style> that lack it. Reuse the nonce Tauri already stamped.\nlet cachedNonce: string | undefined;\n\nexport function getCspNonce(): string {\n  if (cachedNonce !== undefined) return cachedNonce;\n  const stamped = document.querySelector<HTMLElement>('style[nonce], script[nonce]');\n  cachedNonce = stamped?.nonce ?? '';\n  return cachedNonce;\n}\n\nexport function applyCspNonce(el: HTMLElement): void {\n  const nonce = getCspNonce();\n  if (nonce) el.setAttribute('nonce', nonce);\n}\n","const PROP_RE = /^\\s*(--(?:sable|tc)-[a-zA-Z0-9-]+)\\s*:\\s*([^;]+?)\\s*;?\\s*$/;\n\nconst DANGEROUS_VALUE = /url\\s*\\(|@import|expression\\s*\\(|javascript:|\\\\0|<!--|--!?>|<script/i;\n\nexport const PREVIEW_CARD_SAFE_CUSTOM_PROPERTIES: ReadonlySet<string> = new Set([\n  '--sable-bg-container',\n  '--sable-bg-on-container',\n  '--sable-primary-main',\n  '--sable-primary-on-main',\n  '--sable-surface-container',\n  '--sable-surface-container-line',\n  '--sable-surface-on-container',\n]);\n\nexport function extractSafePreviewCustomProperties(cssText: string): Record<string, string> {\n  const noComments = cssText.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n  const vars: Record<string, string> = {};\n  noComments.split(/\\r?\\n/).forEach((line) => {\n    const trimmed = line.trim();\n    if (trimmed && !trimmed.startsWith('@')) {\n      const m = trimmed.match(PROP_RE);\n      if (m && m[1] && m[2]) {\n        const name = m[1];\n        if (!PREVIEW_CARD_SAFE_CUSTOM_PROPERTIES.has(name)) return;\n        const val = m[2].trim();\n        if (!DANGEROUS_VALUE.test(val) && val.length <= 2000) {\n          vars[name] = val;\n        }\n      }\n    }\n  });\n  return vars;\n}\n\nexport function buildPreviewStyleBlock(\n  vars: Record<string, string>,\n  scopeClass = 'sable-theme-preview'\n): string {\n  const body = Object.entries(vars)\n    .map(([k, v]) => `  ${k}: ${v};`)\n    .join('\\n');\n  if (!body) return '';\n  return `.${scopeClass} {\\n${body}\\n}`;\n}\n","import type { ComponentProps, HTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\nimport classNames from 'classnames';\nimport { Box, Chip, Header, IconButton, Scroll, Text, as } from 'folds';\nimport { ArrowLeft, sizedIcon } from '$components/icons/phosphor';\nimport { CodeHighlightRenderer } from '$components/code-highlight';\nimport { copyToClipboard } from '$utils/dom';\nimport * as css from './TextViewer.css';\n\ntype TextViewerContentProps = {\n  text: string;\n  langName: string;\n  size?: ComponentProps<typeof Text>['size'];\n} & HTMLAttributes<HTMLPreElement>;\nexport const TextViewerContent = forwardRef<HTMLPreElement, TextViewerContentProps>(\n  ({ text, langName, size, className, ...props }, ref) => (\n    <Text\n      as=\"pre\"\n      size={size}\n      className={classNames(css.TextViewerPre, `language-${langName}`, className)}\n      {...props}\n      ref={ref}\n    >\n      <CodeHighlightRenderer code={text} language={langName} allowDetect />\n    </Text>\n  )\n);\n\nexport type TextViewerProps = {\n  name: string;\n  text: string;\n  langName: string;\n  requestClose: () => void;\n};\n\nexport const TextViewer = as<'div', TextViewerProps>(\n  ({ className, name, text, langName, requestClose, ...props }, ref) => {\n    const handleCopy = () => {\n      copyToClipboard(text);\n    };\n\n    return (\n      <Box\n        className={classNames(css.TextViewer, className)}\n        direction=\"Column\"\n        {...props}\n        ref={ref}\n      >\n        <Header className={css.TextViewerHeader} size=\"400\">\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            <IconButton size=\"300\" radii=\"300\" onClick={requestClose}>\n              {sizedIcon(ArrowLeft, '50')}\n            </IconButton>\n            <Text size=\"T300\" truncate>\n              {name}\n            </Text>\n          </Box>\n          <Box shrink=\"No\" alignItems=\"Center\" gap=\"200\">\n            <Chip variant=\"Primary\" radii=\"300\" onClick={handleCopy}>\n              <Text size=\"B300\">Copy All</Text>\n            </Chip>\n          </Box>\n        </Header>\n\n        <Box grow=\"Yes\" className={css.TextViewerContent} direction=\"Column\">\n          <Scroll hideTrack variant=\"Background\" visibility=\"Always\">\n            <TextViewerContent\n              className={css.TextViewerPrePadding}\n              text={text}\n              langName={langName}\n            />\n          </Scroll>\n        </Box>\n      </Box>\n    );\n  }\n);\n","import { useState } from 'react';\nimport { IconButton, Modal } from 'folds';\n\nimport { Code, sizedIcon } from '$components/icons/phosphor';\nimport { TextViewer } from '$components/text-viewer';\nimport { ModalWide } from '$styles/Modal.css';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\ntype CssViewerButtonProps = {\n  title: string;\n  cssText?: string;\n  loadCssText?: () => Promise<string>;\n  ariaLabel: string;\n};\n\nexport function CssViewerButton({ title, cssText, loadCssText, ariaLabel }: CssViewerButtonProps) {\n  const [open, setOpen] = useState(false);\n  const [loadedCssText, setLoadedCssText] = useState('');\n  const [loading, setLoading] = useState(false);\n  const viewerText = cssText?.trim() ? cssText : loadedCssText;\n\n  if (!cssText?.trim() && !loadCssText) return null;\n\n  const handleOpen = async () => {\n    if (viewerText) {\n      setOpen(true);\n      return;\n    }\n    if (!loadCssText || loading) return;\n    setLoading(true);\n    try {\n      const loaded = await loadCssText();\n      if (!loaded.trim()) return;\n      setLoadedCssText(loaded);\n      setOpen(true);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return (\n    <>\n      <IconButton\n        size=\"300\"\n        variant=\"Secondary\"\n        fill=\"Soft\"\n        outlined\n        radii=\"300\"\n        aria-label={ariaLabel}\n        disabled={loading}\n        onClick={() => {\n          handleOpen().catch(() => undefined);\n        }}\n      >\n        {sizedIcon(Code, '200')}\n      </IconButton>\n      {open && (\n        <ModalOverlay requestClose={() => setOpen(false)}>\n          <Modal className={ModalWide} size=\"500\">\n            <TextViewer\n              name={title}\n              text={viewerText}\n              langName=\"css\"\n              requestClose={() => setOpen(false)}\n            />\n          </Modal>\n        </ModalOverlay>\n      )}\n    </>\n  );\n}\n","import { type ReactNode, useCallback, useMemo } from 'react';\nimport { Box, Button, IconButton, Text, Tooltip, toRem, config } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { Check, Download, Link, Star, Warning, sizedIcon } from '$components/icons/phosphor';\n\nimport { useTimeoutToggle } from '$hooks/useTimeoutToggle';\nimport { copyToClipboard } from '$utils/dom';\nimport { getCspNonce } from '$utils/cspNonce';\nimport { buildPreviewStyleBlock, extractSafePreviewCustomProperties } from '../../theme/previewCss';\nimport { CssViewerButton } from './CssViewerButton';\n\nexport type ThemePreviewCardProps = {\n  title: string;\n  subtitle?: ReactNode;\n  beforePreview?: ReactNode;\n  previewCssText: string;\n  fullCssText?: string;\n  loadFullCssText?: () => Promise<string>;\n  scopeSlug: string;\n  sourceLabel?: string;\n  copyText?: string;\n  isFavorited?: boolean;\n  onToggleFavorite?: () => void | Promise<void>;\n\n  systemTheme: boolean;\n  onApplyLight?: () => void | Promise<void>;\n  onApplyDark?: () => void | Promise<void>;\n  onApplyManual?: () => void | Promise<void>;\n  isAppliedLight?: boolean;\n  isAppliedDark?: boolean;\n  isAppliedManual?: boolean;\n\n  onRevert?: () => void;\n  canRevert?: boolean;\n  thirdParty?: boolean;\n\n  onExport?: () => void;\n};\n\nfunction safeSlug(input: string): string {\n  return (input || 'theme').replace(/[^a-zA-Z0-9_-]/g, '-') || 'theme';\n}\n\nexport function ThemePreviewCard({\n  title,\n  subtitle,\n  beforePreview,\n  previewCssText,\n  fullCssText,\n  loadFullCssText,\n  scopeSlug,\n  sourceLabel,\n  copyText,\n  isFavorited,\n  onToggleFavorite,\n  systemTheme,\n  onApplyLight,\n  onApplyDark,\n  onApplyManual,\n  isAppliedLight,\n  isAppliedDark,\n  isAppliedManual,\n  onRevert,\n  canRevert,\n  thirdParty,\n  onExport,\n}: ThemePreviewCardProps) {\n  const [copied, setCopied] = useTimeoutToggle();\n\n  const scopeClass = useMemo(() => `sable-theme-preview--${safeSlug(scopeSlug)}`, [scopeSlug]);\n\n  const styleBlock = useMemo(() => {\n    const vars = extractSafePreviewCustomProperties(previewCssText);\n    return buildPreviewStyleBlock(vars, scopeClass);\n  }, [previewCssText, scopeClass]);\n\n  const handleCopy = useCallback(async () => {\n    if (!copyText) return;\n    if (await copyToClipboard(copyText)) setCopied();\n  }, [copyText, setCopied]);\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"300\"\n      style={{\n        padding: toRem(12),\n        borderRadius: config.radii.R300,\n        border: `${toRem(1)} solid var(--sable-surface-container-line)`,\n        background: 'var(--sable-surface-container)',\n        width: '100%',\n        maxWidth: '100%',\n      }}\n    >\n      <Box direction=\"Row\" alignItems=\"Start\" justifyContent=\"SpaceBetween\" gap=\"200\">\n        <Box direction=\"Column\" gap=\"100\" grow=\"Yes\">\n          <Box direction=\"Row\" alignItems=\"Center\" justifyContent=\"SpaceBetween\">\n            <Box gap=\"100\" wrap=\"Wrap\">\n              <Text size=\"H6\">{title}</Text>\n              {thirdParty && (\n                <TooltipProvider\n                  position=\"Top\"\n                  tooltip={\n                    <Tooltip style={{ maxWidth: toRem(280) }}>\n                      <Text size=\"T200\">\n                        Third-party theme. Only use themes from Providers you trust.\n                      </Text>\n                    </Tooltip>\n                  }\n                >\n                  {(triggerRef) => (\n                    <span\n                      ref={triggerRef}\n                      aria-label=\"Third-party theme\"\n                      style={{\n                        color: 'var(--sable-warn-on-container)',\n                        flexShrink: 0,\n                        display: 'inline-flex',\n                      }}\n                    >\n                      {sizedIcon(Warning, '100', { filled: true })}\n                    </span>\n                  )}\n                </TooltipProvider>\n              )}\n            </Box>\n            <Box gap=\"100\" shrink=\"No\">\n              <CssViewerButton\n                title={`${title} — CSS`}\n                cssText={fullCssText}\n                loadCssText={loadFullCssText}\n                ariaLabel=\"View theme CSS\"\n              />\n              {copyText && (\n                <IconButton\n                  size=\"300\"\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  radii=\"300\"\n                  aria-label={copied ? 'Copied theme link' : 'Copy theme link'}\n                  onClick={() => {\n                    handleCopy().catch(() => undefined);\n                  }}\n                >\n                  {sizedIcon(copied ? Check : Link, '200')}\n                </IconButton>\n              )}\n\n              {onExport && (\n                <IconButton\n                  size=\"300\"\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  radii=\"300\"\n                  aria-label=\"Export theme CSS\"\n                  onClick={() => {\n                    onExport();\n                  }}\n                >\n                  {sizedIcon(Download, '200')}\n                </IconButton>\n              )}\n\n              {typeof isFavorited === 'boolean' && onToggleFavorite && (\n                <IconButton\n                  size=\"300\"\n                  variant={isFavorited ? 'Primary' : 'Secondary'}\n                  fill=\"Soft\"\n                  outlined\n                  radii=\"300\"\n                  aria-label={isFavorited ? 'Remove from saved' : 'Save theme'}\n                  onClick={() => {\n                    Promise.resolve(onToggleFavorite()).catch(() => undefined);\n                  }}\n                >\n                  {sizedIcon(Star, '200', { filled: isFavorited })}\n                </IconButton>\n              )}\n            </Box>\n          </Box>\n          {subtitle && (\n            <Text size=\"T200\" priority=\"300\" style={{ wordBreak: 'break-word' }}>\n              {subtitle}\n            </Text>\n          )}\n          {sourceLabel && (\n            <Text size=\"T200\" priority=\"300\">\n              Source: {sourceLabel}\n            </Text>\n          )}\n        </Box>\n      </Box>\n\n      {beforePreview}\n\n      {styleBlock ? (\n        <>\n          <style nonce={getCspNonce()}>{styleBlock}</style>\n          <Box\n            className={scopeClass}\n            direction=\"Column\"\n            gap=\"200\"\n            style={{\n              padding: toRem(12),\n              borderRadius: config.radii.R300,\n              background: 'var(--sable-bg-container)',\n              border: `${toRem(1)} solid var(--sable-surface-container-line)`,\n            }}\n          >\n            <Text size=\"T300\" style={{ color: 'var(--sable-bg-on-container)' }}>\n              Sample text\n            </Text>\n            <Box direction=\"Row\" gap=\"200\" wrap=\"Wrap\">\n              <span\n                style={{\n                  display: 'inline-flex',\n                  alignItems: 'center',\n                  padding: `${toRem(6)} ${toRem(12)}`,\n                  borderRadius: config.radii.Pill,\n                  background: 'var(--sable-primary-main)',\n                  color: 'var(--sable-primary-on-main)',\n                  fontSize: toRem(12),\n                  fontWeight: 500,\n                }}\n              >\n                Primary\n              </span>\n              <span\n                style={{\n                  display: 'inline-flex',\n                  alignItems: 'center',\n                  padding: `${toRem(6)} ${toRem(12)}`,\n                  borderRadius: config.radii.Pill,\n                  background: 'var(--sable-surface-container)',\n                  color: 'var(--sable-surface-on-container)',\n                  fontSize: toRem(12),\n                }}\n              >\n                Surface\n              </span>\n            </Box>\n          </Box>\n        </>\n      ) : (\n        <Text size=\"T300\" priority=\"300\">\n          No preview tokens\n        </Text>\n      )}\n\n      <Box direction=\"Row\" gap=\"200\" wrap=\"Wrap\" alignItems=\"Center\" style={{ width: '100%' }}>\n        {systemTheme ? (\n          <>\n            {onApplyLight && (\n              <Button\n                variant={isAppliedLight ? 'Primary' : 'Secondary'}\n                fill=\"Soft\"\n                outlined\n                size=\"300\"\n                radii=\"300\"\n                style={{ flex: '1 1 0' }}\n                disabled={Boolean(isAppliedLight)}\n                onClick={() => Promise.resolve(onApplyLight()).catch(() => undefined)}\n              >\n                <Text size=\"B300\">Use when OS light</Text>\n              </Button>\n            )}\n            {onApplyDark && (\n              <Button\n                variant={isAppliedDark ? 'Primary' : 'Secondary'}\n                fill=\"Soft\"\n                outlined\n                size=\"300\"\n                radii=\"300\"\n                style={{ flex: '1 1 0' }}\n                disabled={Boolean(isAppliedDark)}\n                onClick={() => Promise.resolve(onApplyDark()).catch(() => undefined)}\n              >\n                <Text size=\"B300\">Use when OS dark</Text>\n              </Button>\n            )}\n          </>\n        ) : (\n          onApplyManual && (\n            <Button\n              variant={isAppliedManual ? 'Primary' : 'Secondary'}\n              fill=\"Soft\"\n              outlined\n              size=\"300\"\n              radii=\"300\"\n              style={{ flex: onRevert ? '1 1 0' : undefined, width: onRevert ? undefined : '100%' }}\n              disabled={Boolean(isAppliedManual)}\n              onClick={() => Promise.resolve(onApplyManual()).catch(() => undefined)}\n            >\n              <Text size=\"B300\">Use theme</Text>\n            </Button>\n          )\n        )}\n\n        {onRevert && (\n          <Button\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            outlined\n            size=\"300\"\n            radii=\"300\"\n            disabled={!canRevert}\n            style={{ flex: '1 1 0' }}\n            onClick={onRevert}\n          >\n            <Text size=\"B300\">Revert</Text>\n          </Button>\n        )}\n      </Box>\n    </Box>\n  );\n}\n","import { useCallback } from 'react';\nimport { useStore } from 'jotai/react';\n\nimport { settingsAtom, type Settings } from '$state/settings';\n\nexport function usePatchSettings() {\n  const store = useStore();\n  return useCallback(\n    (partial: Partial<Settings>) => {\n      const next = { ...store.get(settingsAtom), ...partial };\n      store.set(settingsAtom, next);\n    },\n    [store]\n  );\n}\n","const DB_NAME = 'sable-theme-cache';\nimport { fetch } from '$utils/fetch';\nconst DB_VERSION = 1;\nconst STORE = 'themes';\nconst UPDATE_CHANNEL = 'sable-theme-cache-updates';\n\ntype CachedThemeEntry = {\n  url: string;\n  cssText: string;\n  cachedAt: number;\n  checkedAt?: number;\n  contentHash?: string;\n  etag?: string;\n  lastModified?: string;\n};\n\nexport type ThemeCacheRevalidationResult =\n  | { status: 'updated'; url: string; previousHash?: string; contentHash: string }\n  | { status: 'unchanged'; url: string; contentHash: string }\n  | { status: 'skipped'; url: string; contentHash?: string }\n  | { status: 'failed'; url: string; error: string };\n\nexport type ThemeCacheUpdate = {\n  url: string;\n  contentHash: string;\n};\n\nconst updateListeners = new Set<(update: ThemeCacheUpdate) => void>();\nlet updateChannel: BroadcastChannel | undefined;\n\nfunction isThemeCacheUpdate(value: unknown): value is ThemeCacheUpdate {\n  if (!value || typeof value !== 'object') return false;\n  const update = value as Record<string, unknown>;\n  return typeof update.url === 'string' && typeof update.contentHash === 'string';\n}\n\nfunction getUpdateChannel(): BroadcastChannel | undefined {\n  if (typeof BroadcastChannel === 'undefined') return undefined;\n  if (!updateChannel) {\n    updateChannel = new BroadcastChannel(UPDATE_CHANNEL);\n    updateChannel.addEventListener('message', (event: MessageEvent<unknown>) => {\n      const update = event.data;\n      if (!isThemeCacheUpdate(update)) return;\n      updateListeners.forEach((listener) => listener(update));\n    });\n  }\n  return updateChannel;\n}\n\nfunction notifyThemeCacheUpdated(update: ThemeCacheUpdate): void {\n  updateListeners.forEach((listener) => listener(update));\n  getUpdateChannel()?.postMessage(update);\n}\n\nexport function subscribeThemeCacheUpdates(\n  listener: (update: ThemeCacheUpdate) => void\n): () => void {\n  updateListeners.add(listener);\n  getUpdateChannel();\n  return () => updateListeners.delete(listener);\n}\n\nfunction openDb(): Promise<IDBDatabase> {\n  return new Promise((resolve, reject) => {\n    const req = indexedDB.open(DB_NAME, DB_VERSION);\n    req.addEventListener('error', () => reject(req.error));\n    req.addEventListener('success', () => resolve(req.result));\n    req.addEventListener('upgradeneeded', () => {\n      if (!req.result.objectStoreNames.contains(STORE)) {\n        req.result.createObjectStore(STORE, { keyPath: 'url' });\n      }\n    });\n  });\n}\n\nlet dbPromise: Promise<IDBDatabase> | undefined;\n\nfunction getDb(): Promise<IDBDatabase> {\n  if (dbPromise) return dbPromise;\n  const pending = openDb()\n    .then((db) => {\n      const forget = () => {\n        if (dbPromise === pending) dbPromise = undefined;\n      };\n      db.addEventListener('close', forget);\n      db.addEventListener('versionchange', () => {\n        forget();\n        db.close();\n      });\n      return db;\n    })\n    .catch((error) => {\n      if (dbPromise === pending) dbPromise = undefined;\n      throw error;\n    });\n  dbPromise = pending;\n  return pending;\n}\n\nasync function hashThemeCss(cssText: string): Promise<string> {\n  try {\n    const bytes = new TextEncoder().encode(cssText);\n    const digest = await crypto.subtle.digest('SHA-256', bytes);\n    return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, '0')).join(\n      ''\n    );\n  } catch {\n    let hash = 0x811c9dc5;\n    for (let i = 0; i < cssText.length; i += 1) {\n      hash = Math.imul(hash ^ cssText.charCodeAt(i), 0x01000193);\n    }\n    return `fnv1a-${(hash >>> 0).toString(16).padStart(8, '0')}`;\n  }\n}\n\nasync function getCachedThemeEntry(url: string): Promise<CachedThemeEntry | undefined> {\n  const db = await getDb();\n  return new Promise((resolve, reject) => {\n    const tx = db.transaction(STORE, 'readonly');\n    const req = tx.objectStore(STORE).get(url);\n    req.addEventListener('error', () => reject(req.error));\n    req.addEventListener('success', () => resolve(req.result as CachedThemeEntry | undefined));\n  });\n}\n\nasync function writeCachedThemeEntry(entry: CachedThemeEntry): Promise<void> {\n  const db = await getDb();\n  return new Promise((resolve, reject) => {\n    const tx = db.transaction(STORE, 'readwrite');\n    tx.objectStore(STORE).put(entry);\n    tx.addEventListener('complete', () => resolve());\n    tx.addEventListener('error', () => reject(tx.error));\n  });\n}\n\nexport async function getCachedThemeCss(url: string): Promise<string | undefined> {\n  return (await getCachedThemeEntry(url))?.cssText;\n}\n\nexport async function putCachedThemeCss(url: string, cssText: string): Promise<void> {\n  const [existing, contentHash] = await Promise.all([\n    getCachedThemeEntry(url),\n    hashThemeCss(cssText),\n  ]);\n  const now = Date.now();\n  await writeCachedThemeEntry({\n    ...existing,\n    url,\n    cssText,\n    cachedAt: now,\n    checkedAt: now,\n    contentHash,\n    etag: undefined,\n    lastModified: undefined,\n  });\n  if (existing && existing.contentHash !== contentHash) {\n    notifyThemeCacheUpdated({ url, contentHash });\n  }\n}\n\nexport async function revalidateCachedThemeCss(\n  url: string,\n  maxAgeMs = 0\n): Promise<ThemeCacheRevalidationResult> {\n  try {\n    const existing = await getCachedThemeEntry(url);\n    const lastCheck = existing?.checkedAt ?? existing?.cachedAt ?? 0;\n    if (maxAgeMs > 0 && Date.now() - lastCheck < maxAgeMs) {\n      return { status: 'skipped', url, contentHash: existing?.contentHash };\n    }\n\n    const response = await fetch(url, { mode: 'cors', cache: 'no-cache' });\n    if (!response.ok) {\n      return { status: 'failed', url, error: `Theme update check failed (${response.status}).` };\n    }\n    const cssText = await response.text();\n    const contentHash = await hashThemeCss(cssText);\n    const previousHash =\n      existing?.contentHash ?? (existing ? await hashThemeCss(existing.cssText) : undefined);\n    const now = Date.now();\n\n    if (existing && previousHash === contentHash) {\n      await writeCachedThemeEntry({\n        ...existing,\n        checkedAt: now,\n        contentHash,\n        etag: response.headers.get('etag') ?? existing.etag,\n        lastModified: response.headers.get('last-modified') ?? existing.lastModified,\n      });\n      return { status: 'unchanged', url, contentHash };\n    }\n\n    await writeCachedThemeEntry({\n      url,\n      cssText,\n      cachedAt: now,\n      checkedAt: now,\n      contentHash,\n      etag: response.headers.get('etag') ?? undefined,\n      lastModified: response.headers.get('last-modified') ?? undefined,\n    });\n    notifyThemeCacheUpdated({ url, contentHash });\n    return { status: 'updated', url, previousHash, contentHash };\n  } catch (error) {\n    return {\n      status: 'failed',\n      url,\n      error: error instanceof Error ? error.message : 'Theme update check failed.',\n    };\n  }\n}\n","import { ThemeKind } from '$hooks/useTheme';\n\nexport type SableThemeContrast = 'low' | 'high';\n\nexport type SableThemeMetadata = {\n  id: string;\n  name: string;\n  author?: string;\n  kind: ThemeKind;\n  contrast: SableThemeContrast;\n  tags: string[];\n  fullThemeUrl?: string;\n};\n\nexport type SableTweakMetadata = {\n  id: string;\n  name: string;\n  description?: string;\n  author?: string;\n  tags: string[];\n};\n\nconst META_THEME = '@sable-theme';\nconst META_TWEAK = '@sable-tweak';\n\nexport function getSableCssPackageKind(cssText: string): 'theme' | 'tweak' | 'unknown' {\n  let pos = 0;\n  while (pos < cssText.length) {\n    const start = cssText.indexOf('/*', pos);\n    if (start === -1) break;\n    const end = cssText.indexOf('*/', start + 2);\n    if (end === -1) break;\n    const block = cssText.slice(start + 2, end);\n    if (block.indexOf(META_TWEAK) !== -1) return 'tweak';\n    if (block.indexOf(META_THEME) !== -1) return 'theme';\n    pos = end + 2;\n  }\n  return 'unknown';\n}\n\nfunction extractBlockCommentContaining(cssText: string, marker: string): string {\n  let pos = 0;\n  while (pos < cssText.length) {\n    const start = cssText.indexOf('/*', pos);\n    if (start === -1) return '';\n    const end = cssText.indexOf('*/', start + 2);\n    if (end === -1) return '';\n    const block = cssText.slice(start + 2, end);\n    if (block.indexOf(marker) !== -1) {\n      return block;\n    }\n    pos = end + 2;\n  }\n  return '';\n}\n\nfunction extractSableThemeBlockComment(cssText: string): string {\n  return extractBlockCommentContaining(cssText, META_THEME);\n}\n\nexport function parseSableThemeMetadata(cssText: string): Partial<SableThemeMetadata> {\n  const block = extractSableThemeBlockComment(cssText);\n  if (!block) return {};\n\n  const lines = block.split(/\\r?\\n/).map((l) => l.replace(/^\\s*\\*?\\s?/, '').trim());\n  const out: Partial<SableThemeMetadata> = {};\n  lines\n    .filter((line) => !(line.startsWith('@') || line === '---' || line === ''))\n    .filter((line) => line.indexOf(':') !== -1)\n    .forEach((line) => {\n      const idx = line.indexOf(':');\n      const key = line.slice(0, idx).trim().toLowerCase();\n      const value = line.slice(idx + 1).trim();\n      switch (key) {\n        case 'id':\n          out.id = value;\n          break;\n        case 'name':\n          out.name = value;\n          break;\n        case 'author':\n          out.author = value;\n          break;\n        case 'kind':\n          out.kind = value === 'dark' ? ThemeKind.Dark : ThemeKind.Light;\n          break;\n        case 'contrast':\n          out.contrast = value === 'high' ? 'high' : 'low';\n          break;\n        case 'tags':\n          out.tags = value\n            .split(',')\n            .map((t) => t.trim())\n            .filter(Boolean);\n          break;\n        case 'fullthemeurl':\n        case 'full_theme_url':\n          out.fullThemeUrl = value;\n          break;\n        default:\n          break;\n      }\n    });\n  return out;\n}\n\nexport function parseSableTweakMetadata(cssText: string): Partial<SableTweakMetadata> {\n  const block = extractBlockCommentContaining(cssText, META_TWEAK);\n  if (!block) return {};\n\n  const lines = block.split(/\\r?\\n/).map((l) => l.replace(/^\\s*\\*?\\s?/, '').trim());\n  const out: Partial<SableTweakMetadata> = {};\n  lines\n    .filter((line) => !(line.startsWith('@') || line === '---' || line === ''))\n    .filter((line) => line.indexOf(':') !== -1)\n    .forEach((line) => {\n      const idx = line.indexOf(':');\n      const key = line.slice(0, idx).trim().toLowerCase();\n      const value = line.slice(idx + 1).trim();\n      switch (key) {\n        case 'id':\n          out.id = value;\n          break;\n        case 'name':\n          out.name = value;\n          break;\n        case 'description':\n          out.description = value;\n          break;\n        case 'author':\n          out.author = value;\n          break;\n        case 'tags':\n          out.tags = value\n            .split(',')\n            .map((t) => t.trim())\n            .filter(Boolean);\n          break;\n        default:\n          break;\n      }\n    });\n  return out;\n}\n\nexport function extractFullThemeUrlFromPreview(cssText: string): string | undefined {\n  const meta = parseSableThemeMetadata(cssText);\n  if (meta.fullThemeUrl && /^https:\\/\\//i.test(meta.fullThemeUrl)) {\n    return meta.fullThemeUrl;\n  }\n  const block = extractSableThemeBlockComment(cssText);\n  if (!block) return undefined;\n  const m = block.match(/fullThemeUrl:\\s*(https:\\/\\/[^\\s*]+)/i);\n  return m?.[1];\n}\n","import { ThemeKind } from '$hooks/useTheme';\nimport { fetch } from '$utils/fetch';\n\nimport { putCachedThemeCss } from './cache';\nimport {\n  extractFullThemeUrlFromPreview,\n  getSableCssPackageKind,\n  parseSableThemeMetadata,\n  parseSableTweakMetadata,\n} from './metadata';\nimport {\n  localImportFullUrl,\n  localImportPreviewUrl,\n  localImportTweakFullUrl,\n  makeLocalImportThemeId,\n  makeLocalImportTweakId,\n} from './localImportUrls';\n\nexport type ProcessedThemeImport =\n  | {\n      ok: true;\n      role: 'theme';\n      fullUrl: string;\n      previewCssForCard: string;\n      displayName: string;\n      basename: string;\n      kind: 'light' | 'dark';\n      importedLocal: boolean;\n    }\n  | {\n      ok: true;\n      role: 'tweak';\n      fullUrl: string;\n      displayName: string;\n      basename: string;\n      description?: string;\n      importedLocal: boolean;\n      /** Present for pasted/uploaded local tweaks so callers can persist it with the favorite. */\n      cssText?: string;\n    }\n  | { ok: false; error: string };\n\nexport type ProcessedUploadedSableCss =\n  | {\n      ok: true;\n      role: 'theme';\n      fullUrl?: string;\n      previewCssForCard: string;\n      fullCssForCard?: string;\n      displayName: string;\n      basename: string;\n      kind: 'light' | 'dark';\n      importedLocal: boolean;\n      previewOnly: boolean;\n    }\n  | {\n      ok: true;\n      role: 'tweak';\n      fullUrl: string;\n      cssText: string;\n      displayName: string;\n      basename: string;\n      description?: string;\n      author?: string;\n      tags: string[];\n      importedLocal: true;\n    }\n  | { ok: false; error: string };\n\nexport function isSableCssAttachmentFileName(fileName: string): boolean {\n  return /\\.sable\\.css$/i.test(fileName);\n}\n\nfunction fallbackStableId(sourceKey: string): string {\n  let first = 0x811c9dc5;\n  let second = 0x9e3779b9;\n  for (let i = 0; i < sourceKey.length; i += 1) {\n    const code = sourceKey.charCodeAt(i);\n    first = Math.imul(first ^ code, 0x01000193);\n    second = Math.imul(second ^ code, 0x85ebca6b);\n  }\n  return `${(first >>> 0).toString(16).padStart(8, '0')}${(second >>> 0)\n    .toString(16)\n    .padStart(8, '0')}`;\n}\n\nasync function stableImportId(sourceKey: string): Promise<string> {\n  try {\n    const bytes = new TextEncoder().encode(sourceKey);\n    const digest = await crypto.subtle.digest('SHA-256', bytes);\n    return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, '0'))\n      .join('')\n      .slice(0, 32);\n  } catch {\n    return fallbackStableId(sourceKey);\n  }\n}\n\nfunction basenameFromHttpsUrl(url: string): string {\n  try {\n    const u = new URL(url);\n    const seg = u.pathname.split('/').pop() ?? 'theme';\n    return seg.replace(/\\.(preview\\.)?sable\\.css$/i, '');\n  } catch {\n    return 'theme';\n  }\n}\n\nfunction metaKindToLd(meta: ReturnType<typeof parseSableThemeMetadata>): 'light' | 'dark' {\n  if (meta.kind === ThemeKind.Dark) return 'dark';\n  if (meta.kind === ThemeKind.Light) return 'light';\n  return 'light';\n}\n\nfunction tweakBasename(\n  tweakMeta: ReturnType<typeof parseSableTweakMetadata>,\n  fileName?: string\n): string {\n  const raw =\n    tweakMeta.id?.trim() ||\n    tweakMeta.name?.trim() ||\n    (fileName ? fileName.replace(/\\.[^.]+$/, '') : '') ||\n    'tweak';\n  return raw.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-|-$/g, '') || 'tweak';\n}\n\nexport async function processImportedHttpsUrl(url: string): Promise<ProcessedThemeImport> {\n  const trimmed = url.trim();\n  if (!/^https:\\/\\//i.test(trimmed)) {\n    return { ok: false, error: 'URL must start with https://' };\n  }\n  try {\n    const res = await fetch(trimmed, { mode: 'cors' });\n    if (!res.ok) return { ok: false, error: `Download failed (${res.status}).` };\n    const text = await res.text();\n\n    const pkgKind = getSableCssPackageKind(text);\n    if (pkgKind === 'tweak') {\n      await putCachedThemeCss(trimmed, text);\n      const tm = parseSableTweakMetadata(text);\n      const displayName = tm.name?.trim() || basenameFromHttpsUrl(trimmed);\n      return {\n        ok: true,\n        role: 'tweak',\n        fullUrl: trimmed,\n        displayName,\n        basename: tweakBasename(tm),\n        description: tm.description?.trim(),\n        importedLocal: false,\n      };\n    }\n\n    const meta = parseSableThemeMetadata(text);\n    const fullFromMeta = extractFullThemeUrlFromPreview(text);\n    const isPreviewPath = /\\.preview\\.sable\\.css(\\?|#|$)/i.test(trimmed);\n\n    if (fullFromMeta && /^https:\\/\\//i.test(fullFromMeta)) {\n      if (fullFromMeta === trimmed) {\n        await putCachedThemeCss(trimmed, text);\n        const displayName = meta.name?.trim() || basenameFromHttpsUrl(trimmed);\n        return {\n          ok: true,\n          role: 'theme',\n          fullUrl: trimmed,\n          previewCssForCard: text,\n          displayName,\n          basename: basenameFromHttpsUrl(trimmed),\n          kind: metaKindToLd(meta),\n          importedLocal: false,\n        };\n      }\n      const fullRes = await fetch(fullFromMeta, { mode: 'cors' });\n      if (!fullRes.ok)\n        return { ok: false, error: `Full theme download failed (${fullRes.status}).` };\n      const fullCss = await fullRes.text();\n      await putCachedThemeCss(fullFromMeta, fullCss);\n      await putCachedThemeCss(trimmed, text);\n      const displayName = meta.name?.trim() || basenameFromHttpsUrl(fullFromMeta);\n      return {\n        ok: true,\n        role: 'theme',\n        fullUrl: fullFromMeta,\n        previewCssForCard: text,\n        displayName,\n        basename: basenameFromHttpsUrl(fullFromMeta),\n        kind: metaKindToLd(meta),\n        importedLocal: false,\n      };\n    }\n\n    if (isPreviewPath) {\n      const guessed = trimmed.replace(/\\.preview\\.sable\\.css(\\?|#|$)/i, '.sable.css$1');\n      if (guessed !== trimmed) {\n        const fullRes = await fetch(guessed, { mode: 'cors' });\n        if (fullRes.ok) {\n          const fullCss = await fullRes.text();\n          const fullPkg = getSableCssPackageKind(fullCss);\n          if (fullPkg === 'tweak') {\n            await putCachedThemeCss(guessed, fullCss);\n            await putCachedThemeCss(trimmed, text);\n            const tm = parseSableTweakMetadata(fullCss);\n            const displayName = tm.name?.trim() || basenameFromHttpsUrl(guessed);\n            return {\n              ok: true,\n              role: 'tweak',\n              fullUrl: guessed,\n              displayName,\n              basename: tweakBasename(tm),\n              description: tm.description?.trim(),\n              importedLocal: false,\n            };\n          }\n          await putCachedThemeCss(guessed, fullCss);\n          await putCachedThemeCss(trimmed, text);\n          const displayName = meta.name?.trim() || basenameFromHttpsUrl(guessed);\n          return {\n            ok: true,\n            role: 'theme',\n            fullUrl: guessed,\n            previewCssForCard: text,\n            displayName,\n            basename: basenameFromHttpsUrl(guessed),\n            kind: metaKindToLd(meta),\n            importedLocal: false,\n          };\n        }\n      }\n    }\n\n    await putCachedThemeCss(trimmed, text);\n    const displayName = meta.name?.trim() || basenameFromHttpsUrl(trimmed);\n    return {\n      ok: true,\n      role: 'theme',\n      fullUrl: trimmed,\n      previewCssForCard: text,\n      displayName,\n      basename: basenameFromHttpsUrl(trimmed),\n      kind: metaKindToLd(meta),\n      importedLocal: false,\n    };\n  } catch {\n    return { ok: false, error: 'Network error while downloading theme.' };\n  }\n}\n\nexport async function processPastedOrUploadedCss(\n  cssText: string,\n  fileName?: string\n): Promise<ProcessedThemeImport> {\n  const trimmed = cssText.trim();\n  if (!trimmed) return { ok: false, error: 'No CSS content.' };\n\n  const pkgKind = getSableCssPackageKind(trimmed);\n  if (pkgKind === 'tweak') {\n    const tweakMeta = parseSableTweakMetadata(trimmed);\n    const displayName =\n      tweakMeta.name?.trim() ||\n      (fileName ? fileName.replace(/\\.[^.]+$/, '') : '') ||\n      'Imported tweak';\n    const basename = tweakBasename(tweakMeta, fileName);\n    const id = makeLocalImportTweakId();\n    const fullU = localImportTweakFullUrl(id);\n    await putCachedThemeCss(fullU, trimmed);\n    return {\n      ok: true,\n      role: 'tweak',\n      fullUrl: fullU,\n      displayName,\n      basename,\n      description: tweakMeta.description?.trim(),\n      importedLocal: true,\n      cssText: trimmed,\n    };\n  }\n\n  const meta = parseSableThemeMetadata(trimmed);\n  const fullFromMeta = extractFullThemeUrlFromPreview(trimmed);\n  const displayName =\n    meta.name?.trim() || (fileName ? fileName.replace(/\\.[^.]+$/, '') : '') || 'Imported theme';\n  const basename = displayName.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-|-$/g, '') || 'imported';\n\n  if (fullFromMeta && /^https:\\/\\//i.test(fullFromMeta)) {\n    try {\n      const fullRes = await fetch(fullFromMeta, { mode: 'cors' });\n      if (fullRes.ok) {\n        const fullCss = await fullRes.text();\n        const remoteKind = getSableCssPackageKind(fullCss);\n        if (remoteKind === 'tweak') {\n          await putCachedThemeCss(fullFromMeta, fullCss);\n          const tm = parseSableTweakMetadata(fullCss);\n          return {\n            ok: true,\n            role: 'tweak',\n            fullUrl: fullFromMeta,\n            displayName: tm.name?.trim() || basenameFromHttpsUrl(fullFromMeta),\n            basename: tweakBasename(tm),\n            description: tm.description?.trim(),\n            importedLocal: false,\n          };\n        }\n        await putCachedThemeCss(fullFromMeta, fullCss);\n        const previewMeta = parseSableThemeMetadata(trimmed);\n        return {\n          ok: true,\n          role: 'theme',\n          fullUrl: fullFromMeta,\n          previewCssForCard: trimmed,\n          displayName: previewMeta.name?.trim() || basenameFromHttpsUrl(fullFromMeta),\n          basename: basenameFromHttpsUrl(fullFromMeta),\n          kind: metaKindToLd(meta),\n          importedLocal: false,\n        };\n      }\n    } catch {\n      /* unreachable URL / CORS — fall through to local import */\n    }\n  }\n\n  const id = makeLocalImportThemeId();\n  const fullU = localImportFullUrl(id);\n  const prevU = localImportPreviewUrl(id);\n  await putCachedThemeCss(fullU, trimmed);\n  await putCachedThemeCss(prevU, trimmed);\n\n  return {\n    ok: true,\n    role: 'theme',\n    fullUrl: fullU,\n    previewCssForCard: trimmed,\n    displayName,\n    basename,\n    kind: metaKindToLd(meta),\n    importedLocal: true,\n  };\n}\n\n/** Process a Matrix file attachment without treating a preview-only file as a full theme. */\nexport async function processUploadedSableCssAttachment(\n  cssText: string,\n  fileName: string,\n  sourceKey: string\n): Promise<ProcessedUploadedSableCss> {\n  const trimmed = cssText.trim();\n  if (!trimmed) return { ok: false, error: 'The uploaded CSS file is empty.' };\n\n  const packageKind = getSableCssPackageKind(trimmed);\n  if (packageKind === 'unknown') {\n    return {\n      ok: false,\n      error: 'This file does not contain @sable-theme or @sable-tweak metadata.',\n    };\n  }\n\n  const stableId = await stableImportId(sourceKey);\n\n  if (packageKind === 'tweak') {\n    const meta = parseSableTweakMetadata(trimmed);\n    const basename = tweakBasename(meta, fileName);\n    const fullUrl = localImportTweakFullUrl(stableId);\n    await putCachedThemeCss(fullUrl, trimmed);\n    return {\n      ok: true,\n      role: 'tweak',\n      fullUrl,\n      cssText: trimmed,\n      displayName: meta.name?.trim() || basename,\n      basename,\n      description: meta.description?.trim() || undefined,\n      author: meta.author?.trim() || undefined,\n      tags: meta.tags ?? [],\n      importedLocal: true,\n    };\n  }\n\n  const meta = parseSableThemeMetadata(trimmed);\n  const fileBasename = fileName\n    .replace(/\\.preview\\.sable\\.css$/i, '')\n    .replace(/\\.sable\\.css$/i, '');\n  const displayName = meta.name?.trim() || fileBasename || 'Uploaded theme';\n  const basename =\n    meta.id?.trim() ||\n    displayName.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-|-$/g, '') ||\n    'uploaded';\n  const isPreviewFile = /\\.preview\\.sable\\.css$/i.test(fileName);\n\n  if (isPreviewFile) {\n    const fullUrl = extractFullThemeUrlFromPreview(trimmed);\n    if (!fullUrl) {\n      return {\n        ok: true,\n        role: 'theme',\n        previewCssForCard: trimmed,\n        displayName,\n        basename,\n        kind: metaKindToLd(meta),\n        importedLocal: false,\n        previewOnly: true,\n      };\n    }\n\n    try {\n      const response = await fetch(fullUrl, { mode: 'cors' });\n      if (!response.ok) {\n        return {\n          ok: true,\n          role: 'theme',\n          previewCssForCard: trimmed,\n          displayName,\n          basename,\n          kind: metaKindToLd(meta),\n          importedLocal: false,\n          previewOnly: true,\n        };\n      }\n      const fullCss = await response.text();\n      if (getSableCssPackageKind(fullCss) === 'tweak') {\n        return { ok: false, error: 'The preview file points to a tweak instead of a full theme.' };\n      }\n      await putCachedThemeCss(fullUrl, fullCss);\n      return {\n        ok: true,\n        role: 'theme',\n        fullUrl,\n        previewCssForCard: trimmed,\n        fullCssForCard: fullCss,\n        displayName,\n        basename,\n        kind: metaKindToLd(meta),\n        importedLocal: false,\n        previewOnly: false,\n      };\n    } catch {\n      return {\n        ok: true,\n        role: 'theme',\n        previewCssForCard: trimmed,\n        displayName,\n        basename,\n        kind: metaKindToLd(meta),\n        importedLocal: false,\n        previewOnly: true,\n      };\n    }\n  }\n\n  const fullUrl = localImportFullUrl(stableId);\n  const previewUrl = localImportPreviewUrl(stableId);\n  await putCachedThemeCss(fullUrl, trimmed);\n  await putCachedThemeCss(previewUrl, trimmed);\n  return {\n    ok: true,\n    role: 'theme',\n    fullUrl,\n    previewCssForCard: trimmed,\n    fullCssForCard: trimmed,\n    displayName,\n    basename,\n    kind: metaKindToLd(meta),\n    importedLocal: true,\n    previewOnly: false,\n  };\n}\n","/** When listed in themeCatalogApprovedHostPrefixes, HTTPS theme/tweak CDN URLs match all origins (trust model: same as any remote CSS). */\nexport const APPROVED_THEME_PREFIX_ALLOW_ALL = '*';\n\nfunction trimmedPrefixes(prefixes: string[] | undefined): readonly string[] {\n  if (!prefixes?.length) return [];\n  return prefixes.map((p) => p.trim()).filter(Boolean);\n}\n\n/**\n * HTTPS URLs permitted as \"catalog-official\" for badges and banners.\n * - Undefined or empty ⇒ none (every matching URL is unofficial / third-party for UI).\n * - Include {@link APPROVED_THEME_PREFIX_ALLOW_ALL} ⇒ any https URL counts as permitted.\n */\nexport function isApprovedCatalogHostUrl(\n  url: string,\n  approvedHostPrefixes: string[] | undefined\n): boolean {\n  const u = url.trim();\n  if (!/^https:\\/\\//i.test(u)) return false;\n  const list = trimmedPrefixes(approvedHostPrefixes);\n  if (list.length === 0) return false;\n  if (list.some((p) => p === APPROVED_THEME_PREFIX_ALLOW_ALL)) return true;\n  return list.some((p) => u.startsWith(p));\n}\n\n/** True when the URL is https and does not satisfy {@link isApprovedCatalogHostUrl}. */\nexport function isThirdPartyThemeUrl(\n  url: string,\n  approvedHostPrefixes: string[] | undefined\n): boolean {\n  const u = url.trim();\n  if (!/^https:\\/\\//i.test(u)) return false;\n  return !isApprovedCatalogHostUrl(u, approvedHostPrefixes);\n}\n","import type { ThemeRemoteFavorite, ThemeRemoteTweakFavorite } from '$state/settings';\n\nexport function pruneThemeFavorites(\n  favorites: ThemeRemoteFavorite[],\n  activeUrls: Array<string | undefined>\n): ThemeRemoteFavorite[] {\n  const active = new Set(activeUrls.filter((url): url is string => Boolean(url)));\n  return favorites.filter((favorite) => favorite.pinned === true || active.has(favorite.fullUrl));\n}\n\nexport function pruneThemeTweakFavorites(\n  favorites: ThemeRemoteTweakFavorite[],\n  enabledUrls: string[]\n): ThemeRemoteTweakFavorite[] {\n  const enabled = new Set(enabledUrls);\n  return favorites.filter((favorite) => favorite.pinned === true || enabled.has(favorite.fullUrl));\n}\n\nexport function themeUrlHostLabel(url: string, fallback = 'Third-party source'): string {\n  try {\n    return new URL(url).hostname;\n  } catch {\n    return fallback;\n  }\n}\n\nexport function themeSourceLabel({\n  importedLocal,\n  official,\n  url,\n}: {\n  importedLocal?: boolean;\n  official?: boolean;\n  url?: string;\n}): string {\n  if (importedLocal) return 'Uploaded file';\n  if (official) return 'Official catalog';\n  if (url) return themeUrlHostLabel(url);\n  return 'Local theme';\n}\n","import { useCallback, useMemo } from 'react';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport { Box, Button, IconButton, Spinner, Switch, Text, config, toRem } from 'folds';\n\nimport { Star, sizedIcon } from '$components/icons/phosphor';\nimport { getCspNonce } from '$utils/cspNonce';\nimport { ThemePreviewCard } from '$components/theme/ThemePreviewCard';\nimport { CssViewerButton } from '$components/theme/CssViewerButton';\nimport { usePatchSettings } from '$features/settings/cosmetics/themeSettingsPatch';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useSetting } from '$state/hooks/settings';\nimport {\n  settingsAtom,\n  type Settings,\n  type ThemeRemoteFavorite,\n  type ThemeRemoteTweakFavorite,\n} from '$state/settings';\nimport {\n  processUploadedSableCssAttachment,\n  type ProcessedUploadedSableCss,\n} from '../../../theme/processThemeImport';\nimport { isThirdPartyThemeUrl } from '../../../theme/themeApproval';\nimport {\n  buildPreviewStyleBlock,\n  extractSafePreviewCustomProperties,\n} from '../../../theme/previewCss';\nimport {\n  pruneThemeFavorites,\n  pruneThemeTweakFavorites,\n  themeSourceLabel,\n} from '../../../theme/themeLibrary';\nimport { decryptFile, downloadEncryptedMedia, downloadMedia, mxcUrlToHttp } from '$utils/matrix';\n\nconst MAX_SABLE_CSS_ATTACHMENT_BYTES = 1024 * 1024;\n\ntype UploadedSableCssContentProps = {\n  body: string;\n  mimeType: string;\n  url: string;\n  size?: number;\n  encInfo?: EncryptedAttachmentInfo;\n};\n\ntype SuccessfulUpload = Extract<ProcessedUploadedSableCss, { ok: true }>;\n\nfunction UploadedTweakCard({ data }: { data: Extract<SuccessfulUpload, { role: 'tweak' }> }) {\n  const patchSettings = usePatchSettings();\n  const [favorites] = useSetting(settingsAtom, 'themeRemoteTweakFavorites');\n  const [enabledUrls] = useSetting(settingsAtom, 'themeRemoteEnabledTweakFullUrls');\n  const isFavorite = favorites.some((favorite) => favorite.fullUrl === data.fullUrl);\n  const isEnabled = enabledUrls.includes(data.fullUrl);\n  const scopeClass = useMemo(\n    () => `sable-uploaded-tweak--${data.basename.replace(/[^a-zA-Z0-9_-]/g, '-')}`,\n    [data.basename]\n  );\n  const styleBlock = useMemo(\n    () => buildPreviewStyleBlock(extractSafePreviewCustomProperties(data.cssText), scopeClass),\n    [data.cssText, scopeClass]\n  );\n\n  const makeFavorite = useCallback(\n    (pinned: boolean): ThemeRemoteTweakFavorite[] => {\n      const existing = favorites.find((favorite) => favorite.fullUrl === data.fullUrl);\n      if (existing) {\n        return favorites.map((favorite) =>\n          favorite.fullUrl === data.fullUrl\n            ? {\n                ...favorite,\n                pinned: pinned ? true : favorite.pinned,\n                cssText: favorite.cssText ?? data.cssText,\n              }\n            : favorite\n        );\n      }\n      return [\n        ...favorites,\n        {\n          fullUrl: data.fullUrl,\n          displayName: data.displayName,\n          basename: data.basename,\n          pinned,\n          importedLocal: true,\n          cssText: data.cssText,\n        },\n      ];\n    },\n    [data, favorites]\n  );\n\n  const toggleFavorite = useCallback(() => {\n    if (isFavorite) {\n      const nextEnabled = enabledUrls.filter((url) => url !== data.fullUrl);\n      patchSettings({\n        themeRemoteEnabledTweakFullUrls: nextEnabled,\n        themeRemoteTweakFavorites: pruneThemeTweakFavorites(\n          favorites.filter((favorite) => favorite.fullUrl !== data.fullUrl),\n          nextEnabled\n        ),\n      });\n      return;\n    }\n    patchSettings({ themeRemoteTweakFavorites: makeFavorite(true) });\n  }, [data.fullUrl, enabledUrls, favorites, isFavorite, makeFavorite, patchSettings]);\n\n  const setEnabled = useCallback(\n    (enabled: boolean) => {\n      const nextEnabled = enabled\n        ? Array.from(new Set([...enabledUrls, data.fullUrl]))\n        : enabledUrls.filter((url) => url !== data.fullUrl);\n      patchSettings({\n        themeRemoteEnabledTweakFullUrls: nextEnabled,\n        themeRemoteTweakFavorites: pruneThemeTweakFavorites(makeFavorite(false), nextEnabled),\n      });\n    },\n    [data.fullUrl, enabledUrls, makeFavorite, patchSettings]\n  );\n\n  const description = [\n    data.description,\n    data.author ? `by ${data.author}` : undefined,\n    data.tags.length > 0 ? data.tags.join(', ') : undefined,\n  ]\n    .filter(Boolean)\n    .join(' · ');\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"300\"\n      style={{\n        padding: toRem(12),\n        borderRadius: config.radii.R300,\n        border: `${toRem(1)} solid var(--sable-surface-container-line)`,\n        background: 'var(--sable-surface-container)',\n      }}\n    >\n      <Box direction=\"Row\" gap=\"200\" alignItems=\"Start\" justifyContent=\"SpaceBetween\">\n        <Box direction=\"Column\" gap=\"100\" grow=\"Yes\">\n          <Text size=\"H6\">{data.displayName}</Text>\n          <Text size=\"T200\" priority=\"300\">\n            {description || 'Uploaded tweak'}\n          </Text>\n          <Text size=\"T200\" priority=\"300\">\n            Source: Uploaded file\n          </Text>\n        </Box>\n        <Box direction=\"Row\" gap=\"100\" alignItems=\"Center\" shrink=\"No\">\n          <CssViewerButton\n            title={`${data.displayName} — CSS`}\n            cssText={data.cssText}\n            ariaLabel=\"View tweak CSS\"\n          />\n          <IconButton\n            size=\"300\"\n            variant={isFavorite ? 'Primary' : 'Secondary'}\n            fill=\"Soft\"\n            outlined\n            radii=\"300\"\n            aria-label={isFavorite ? 'Remove tweak from saved' : 'Save tweak'}\n            onClick={toggleFavorite}\n          >\n            {sizedIcon(Star, '200', { filled: isFavorite })}\n          </IconButton>\n          <Switch variant=\"Primary\" value={isEnabled} onChange={setEnabled} />\n        </Box>\n      </Box>\n      {styleBlock && (\n        <>\n          <style nonce={getCspNonce()}>{styleBlock}</style>\n          <Box\n            className={scopeClass}\n            style={{\n              padding: toRem(12),\n              borderRadius: config.radii.R300,\n              background: 'var(--sable-bg-container)',\n            }}\n          >\n            <Text size=\"T300\" style={{ color: 'var(--sable-bg-on-container)' }}>\n              Sample text\n            </Text>\n          </Box>\n        </>\n      )}\n    </Box>\n  );\n}\n\nfunction UploadedThemeCard({ data }: { data: Extract<SuccessfulUpload, { role: 'theme' }> }) {\n  const clientConfig = useClientConfig();\n  const patchSettings = usePatchSettings();\n  const [favorites] = useSetting(settingsAtom, 'themeRemoteFavorites');\n  const [systemTheme] = useSetting(settingsAtom, 'useSystemTheme');\n  const [manualUrl] = useSetting(settingsAtom, 'themeRemoteManualFullUrl');\n  const [lightUrl] = useSetting(settingsAtom, 'themeRemoteLightFullUrl');\n  const [darkUrl] = useSetting(settingsAtom, 'themeRemoteDarkFullUrl');\n  const fullUrl = data.fullUrl;\n  const isFavorite = fullUrl ? favorites.some((favorite) => favorite.fullUrl === fullUrl) : false;\n\n  const ensureFavorite = useCallback(\n    (pinned: boolean): ThemeRemoteFavorite[] => {\n      if (!fullUrl) return favorites;\n      const existing = favorites.find((favorite) => favorite.fullUrl === fullUrl);\n      if (existing) {\n        return favorites.map((favorite) =>\n          favorite.fullUrl === fullUrl && pinned ? { ...favorite, pinned: true } : favorite\n        );\n      }\n      return [\n        ...favorites,\n        {\n          fullUrl,\n          displayName: data.displayName,\n          basename: data.basename,\n          kind: data.kind,\n          pinned,\n          importedLocal: data.importedLocal,\n        },\n      ];\n    },\n    [data, favorites, fullUrl]\n  );\n\n  const toggleFavorite = useCallback(() => {\n    if (!fullUrl) return;\n    if (!isFavorite) {\n      patchSettings({ themeRemoteFavorites: ensureFavorite(true) });\n      return;\n    }\n    const partial: Partial<Settings> = {};\n    if (manualUrl === fullUrl) {\n      partial.themeRemoteManualFullUrl = undefined;\n      partial.themeRemoteManualKind = undefined;\n    }\n    if (lightUrl === fullUrl) {\n      partial.themeRemoteLightFullUrl = undefined;\n      partial.themeRemoteLightKind = undefined;\n    }\n    if (darkUrl === fullUrl) {\n      partial.themeRemoteDarkFullUrl = undefined;\n      partial.themeRemoteDarkKind = undefined;\n    }\n    patchSettings({\n      ...partial,\n      themeRemoteFavorites: pruneThemeFavorites(\n        favorites.filter((favorite) => favorite.fullUrl !== fullUrl),\n        [\n          manualUrl === fullUrl ? undefined : manualUrl,\n          lightUrl === fullUrl ? undefined : lightUrl,\n          darkUrl === fullUrl ? undefined : darkUrl,\n        ]\n      ),\n    });\n  }, [darkUrl, ensureFavorite, favorites, fullUrl, isFavorite, lightUrl, manualUrl, patchSettings]);\n\n  const apply = useCallback(\n    (slot: 'manual' | 'light' | 'dark') => {\n      if (!fullUrl) return;\n      const partial: Partial<Settings> = {\n        themeRemoteFavorites: pruneThemeFavorites(ensureFavorite(false), [\n          slot === 'manual' ? fullUrl : manualUrl,\n          slot === 'light' ? fullUrl : lightUrl,\n          slot === 'dark' ? fullUrl : darkUrl,\n        ]),\n      };\n      if (slot === 'manual') {\n        partial.themeRemoteManualFullUrl = fullUrl;\n        partial.themeRemoteManualKind = data.kind;\n      } else if (slot === 'light') {\n        partial.themeRemoteLightFullUrl = fullUrl;\n        partial.themeRemoteLightKind = data.kind;\n      } else {\n        partial.themeRemoteDarkFullUrl = fullUrl;\n        partial.themeRemoteDarkKind = data.kind;\n      }\n      patchSettings(partial);\n    },\n    [darkUrl, data.kind, ensureFavorite, fullUrl, lightUrl, manualUrl, patchSettings]\n  );\n\n  const kindLabel = data.kind === 'dark' ? 'Dark' : 'Light';\n  const subtitle = data.previewOnly\n    ? `${kindLabel} · Uploaded preview only — no reachable full theme was provided.`\n    : `${kindLabel} · ${data.importedLocal ? 'Uploaded theme' : 'Uploaded preview'}`;\n\n  return (\n    <ThemePreviewCard\n      title={data.displayName}\n      subtitle={subtitle}\n      previewCssText={data.previewCssForCard}\n      fullCssText={data.fullCssForCard}\n      scopeSlug={`upload-${data.basename}`}\n      sourceLabel={themeSourceLabel({ importedLocal: data.importedLocal, url: data.fullUrl })}\n      thirdParty={\n        fullUrl !== undefined &&\n        !data.importedLocal &&\n        isThirdPartyThemeUrl(fullUrl, clientConfig.themeCatalogApprovedHostPrefixes)\n      }\n      isFavorited={fullUrl ? isFavorite : undefined}\n      onToggleFavorite={fullUrl ? toggleFavorite : undefined}\n      systemTheme={systemTheme}\n      onApplyLight={systemTheme && fullUrl ? () => apply('light') : undefined}\n      onApplyDark={systemTheme && fullUrl ? () => apply('dark') : undefined}\n      onApplyManual={!systemTheme && fullUrl ? () => apply('manual') : undefined}\n      isAppliedLight={Boolean(fullUrl && lightUrl === fullUrl)}\n      isAppliedDark={Boolean(fullUrl && darkUrl === fullUrl)}\n      isAppliedManual={Boolean(fullUrl && manualUrl === fullUrl)}\n    />\n  );\n}\n\nexport function UploadedSableCssContent({\n  body,\n  mimeType,\n  url,\n  size,\n  encInfo,\n}: UploadedSableCssContentProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const [loadState, load] = useAsyncCallback(\n    useCallback(async (): Promise<SuccessfulUpload> => {\n      if (typeof size === 'number' && size > MAX_SABLE_CSS_ATTACHMENT_BYTES) {\n        throw new Error('Theme CSS attachments must be 1 MiB or smaller.');\n      }\n      const mediaUrl = mxcUrlToHttp(mx, url, useAuthentication);\n      if (!mediaUrl) throw new Error('Invalid media URL.');\n      const blob = encInfo\n        ? await downloadEncryptedMedia(mediaUrl, (encrypted) =>\n            decryptFile(encrypted, mimeType, encInfo)\n          )\n        : await downloadMedia(mediaUrl);\n      if (blob.size > MAX_SABLE_CSS_ATTACHMENT_BYTES) {\n        throw new Error('Theme CSS attachments must be 1 MiB or smaller.');\n      }\n      const result = await processUploadedSableCssAttachment(\n        await blob.text(),\n        body,\n        `${url}\\n${JSON.stringify(encInfo ?? null)}`\n      );\n      if (!result.ok) throw new Error(result.error);\n      return result;\n    }, [body, encInfo, mimeType, mx, size, url, useAuthentication])\n  );\n\n  if (loadState.status === AsyncStatus.Success) {\n    return loadState.data.role === 'theme' ? (\n      <UploadedThemeCard data={loadState.data} />\n    ) : (\n      <UploadedTweakCard data={loadState.data} />\n    );\n  }\n\n  return (\n    <Box direction=\"Column\" gap=\"200\">\n      <Button\n        variant={loadState.status === AsyncStatus.Error ? 'Critical' : 'Secondary'}\n        fill=\"Soft\"\n        outlined\n        radii=\"300\"\n        size=\"400\"\n        disabled={loadState.status === AsyncStatus.Loading}\n        before={\n          loadState.status === AsyncStatus.Loading ? (\n            <Spinner fill=\"Soft\" size=\"100\" variant=\"Secondary\" />\n          ) : undefined\n        }\n        onClick={() => load()}\n      >\n        <Text size=\"B400\">\n          {loadState.status === AsyncStatus.Loading\n            ? 'Loading theme preview…'\n            : loadState.status === AsyncStatus.Error\n              ? 'Retry theme preview'\n              : 'Load theme preview'}\n        </Text>\n      </Button>\n      {loadState.status === AsyncStatus.Error && (\n        <Text size=\"T200\" style={{ color: 'var(--sable-error)' }}>\n          {loadState.error instanceof Error ? loadState.error.message : 'Failed to load theme CSS.'}\n        </Text>\n      )}\n    </Box>\n  );\n}\n","import { Box, Text, as, color, config } from 'folds';\nimport type { MatrixClient } from '$types/matrix-sdk';\n\nimport { Lock, timelineIcon, Trash, Warning, X } from '$components/icons/phosphor';\nimport { ReactionKeyInline } from '../ReactionKeyInline';\nimport { BreakWord } from '$styles/Text.css';\n\nconst warningStyle = { color: color.Warning.Main, opacity: config.opacity.P300 };\nconst criticalStyle = { color: color.Critical.Main, opacity: config.opacity.P300 };\n\nexport const MessageDeletedContent = as<'div', { children?: never; reason?: string }>(\n  ({ reason, ...props }, ref) => (\n    <Box as=\"span\" alignItems=\"Center\" gap=\"100\" style={warningStyle} {...props} ref={ref}>\n      {timelineIcon(Trash, { style: warningStyle })}\n      {reason ? (\n        <i>This message has been deleted. {reason}</i>\n      ) : (\n        <i>This message has been deleted</i>\n      )}\n    </Box>\n  )\n);\n\nexport const ReactionDeletedContent = as<\n  'div',\n  {\n    children?: never;\n    reactionKey?: string;\n    shortcode?: string;\n    mx?: MatrixClient;\n    useAuthentication?: boolean;\n    reason?: string;\n    hideIcon?: boolean;\n  }\n>(({ reactionKey, shortcode, mx, useAuthentication, reason, hideIcon, ...props }, ref) => (\n  <Box as=\"span\" alignItems=\"Center\" gap=\"100\" style={warningStyle} {...props} ref={ref}>\n    {!hideIcon && timelineIcon(Trash, { style: warningStyle })}\n    {reactionKey || shortcode ? (\n      <i>\n        This reaction has been removed:{' '}\n        {mx ? (\n          <ReactionKeyInline\n            mx={mx}\n            reactionKey={reactionKey}\n            shortcode={shortcode}\n            useAuthentication={useAuthentication}\n          />\n        ) : (\n          (reactionKey ?? `:${shortcode}:`)\n        )}\n        {reason ? ` ${reason}` : ''}\n      </i>\n    ) : reason ? (\n      <i>This reaction has been removed. {reason}</i>\n    ) : (\n      <i>This reaction has been removed</i>\n    )}\n  </Box>\n));\n\nexport const MessageUnsupportedContent = as<'div', { children?: never; body?: string }>(\n  ({ body, ...props }, ref) => (\n    <Box\n      as=\"span\"\n      alignItems=\"Center\"\n      direction=\"Row\"\n      gap=\"100\"\n      style={criticalStyle}\n      {...props}\n      ref={ref}\n    >\n      {timelineIcon(Warning, { style: criticalStyle })}\n      <span className={BreakWord} style={{ flex: '1 1 auto', minWidth: 0 }}>\n        <i>Unsupported message</i>\n        {body && `: ${body}`}\n        {!body && ' (no body)'}\n      </span>\n    </Box>\n  )\n);\n\nexport const MessageFailedContent = as<'div', { children?: never }>(({ ...props }, ref) => (\n  <Box as=\"span\" alignItems=\"Center\" gap=\"100\" style={criticalStyle} {...props} ref={ref}>\n    {timelineIcon(Warning, { style: criticalStyle })}\n    <i>Failed to load message</i>\n  </Box>\n));\n\nexport const MessageBadEncryptedContent = as<'div', { children?: never }>(({ ...props }, ref) => (\n  <Box as=\"span\" alignItems=\"Center\" gap=\"100\" style={warningStyle} {...props} ref={ref}>\n    {timelineIcon(Lock, { style: warningStyle })}\n    <i>Unable to decrypt message</i>\n  </Box>\n));\n\nexport const MessageNotDecryptedContent = as<'div', { children?: never }>(({ ...props }, ref) => (\n  <Box as=\"span\" alignItems=\"Center\" gap=\"100\" style={warningStyle} {...props} ref={ref}>\n    {timelineIcon(Lock, { style: warningStyle })}\n    <i>This message is not decrypted yet</i>\n  </Box>\n));\n\n// display body of the message if it is available, as it may give some clue about why the message is broken\nexport const MessageBrokenContent = as<'div', { children?: never; body?: string }>(\n  ({ body, ...props }, ref) => (\n    <Box\n      as=\"span\"\n      alignItems=\"Center\"\n      direction=\"Row\"\n      gap=\"100\"\n      style={criticalStyle}\n      {...props}\n      ref={ref}\n    >\n      {timelineIcon(Warning, { style: criticalStyle })}\n      <span className={BreakWord} style={{ flex: '1 1 auto', minWidth: 0 }}>\n        <i>Broken message</i>\n        {body && `: ${body}`}\n        {!body && ' (no body)'}\n      </span>\n    </Box>\n  )\n);\n\nexport const MessageEmptyContent = as<'div', { children?: never }>(({ ...props }, ref) => (\n  <Box as=\"span\" alignItems=\"Center\" gap=\"100\" style={criticalStyle} {...props} ref={ref}>\n    {timelineIcon(Warning, { style: criticalStyle })}\n    <i>Empty message</i>\n  </Box>\n));\n\nexport const MessageBlockedContent = as<'div', { children?: never }>(({ ...props }, ref) => (\n  <Box as=\"span\" alignItems=\"Center\" gap=\"100\" style={warningStyle} {...props} ref={ref}>\n    {timelineIcon(X, { style: warningStyle })}\n    <i>Message from a blocked user</i>\n  </Box>\n));\n\nexport const MessageEditedContent = as<'span', { children?: never }>(({ ...props }, ref) => (\n  <Text as=\"span\" size=\"T200\" priority=\"300\" {...props} ref={ref}>\n    {' (edited)'}\n  </Text>\n));\n","import { Box } from 'folds';\nimport type { ReactNode } from 'react';\nimport { MessageLayout } from '$state/settings';\nimport { BubbleLayout, CompactLayout, ModernLayout } from '$components/message/layout';\n\nexport type EventContentProps = {\n  messageLayout: number;\n  time: ReactNode;\n  icon: ReactNode;\n  content: ReactNode;\n};\nexport function EventContent({ messageLayout, time, icon, content }: EventContentProps) {\n  const beforeJSX = (\n    <Box gap=\"300\" justifyContent=\"SpaceBetween\" alignItems=\"Center\" grow=\"Yes\">\n      {messageLayout === (MessageLayout.Compact as number) && time}\n      <Box\n        grow={messageLayout === (MessageLayout.Compact as number) ? undefined : 'Yes'}\n        alignItems=\"Center\"\n        justifyContent=\"Center\"\n      >\n        {icon}\n      </Box>\n    </Box>\n  );\n\n  const msgContentJSX = (\n    <Box justifyContent=\"SpaceBetween\" alignItems=\"Baseline\" gap=\"200\">\n      {content}\n      {messageLayout !== (MessageLayout.Compact as number) && time}\n    </Box>\n  );\n\n  if (messageLayout === (MessageLayout.Compact as number)) {\n    return <CompactLayout before={beforeJSX}>{msgContentJSX}</CompactLayout>;\n  }\n  if (messageLayout === (MessageLayout.Bubble as number)) {\n    return (\n      <BubbleLayout hideBubble before={beforeJSX}>\n        {msgContentJSX}\n      </BubbleLayout>\n    );\n  }\n  return <ModernLayout before={beforeJSX}>{msgContentJSX}</ModernLayout>;\n}\n","export type PronounSet = {\n  summary: string;\n  language?: string;\n  grammatical_gender?: string;\n};\n\nexport function parsePronounsInput(\n  pronouns?: string | null\n): { summary: string; language?: string }[] {\n  if (!pronouns || typeof pronouns !== 'string') return [];\n\n  return pronouns\n    .split(',')\n    .map((s) => s?.trim())\n    .filter(Boolean)\n    .map((s) => {\n      const parts = s.split(':');\n\n      if (parts.length === 1) {\n        return {\n          summary: (parts[0] ?? '').trim().slice(0, 16),\n          language: 'en',\n        };\n      }\n\n      const [language, summary] = parts;\n      return {\n        language: (language ?? 'en').trim().toLowerCase() || 'en',\n        summary: (summary ?? '').trim().slice(0, 16),\n      };\n    });\n}\n\nexport function parsePronounsStringToPronounsSetArray(pronouns?: string | null): PronounSet[] {\n  return parsePronounsInput(pronouns) as PronounSet[];\n}\n\nconst sanitize = (p: { summary: string; language?: string }) => ({\n  ...p,\n  summary: (p?.summary ?? '').slice(0, 16),\n});\n\nexport function filterPronounsByLanguage(\n  pronouns?: { summary: string; language?: string }[] | null,\n  enabled?: boolean,\n  languages?: (string | null | undefined)[]\n): { summary: string; language?: string }[] {\n  if (!Array.isArray(pronouns)) return [];\n\n  if (!enabled) {\n    return pronouns.map(sanitize);\n  }\n\n  const normalizedLanguages = new Set(\n    (languages ?? [])\n      .filter((lang): lang is string => typeof lang === 'string')\n      .map((lang) => lang.trim().toLowerCase())\n  );\n\n  const filteredPronouns = pronouns\n    .filter((p) => {\n      const lang = (p?.language ?? 'en').trim().toLowerCase();\n      return normalizedLanguages.has(lang);\n    })\n    .map(sanitize);\n\n  return filteredPronouns.length > 0 ? filteredPronouns : pronouns.map(sanitize);\n}\n\nconst pronounParseCache = new Map<\n  string,\n  { cleanedDisplayName: string; inlinePronoun: string | null }\n>();\n\nexport function getParsedPronouns(rawName?: string | null, parseSetting?: boolean) {\n  if (!parseSetting || !rawName || typeof rawName !== 'string') {\n    return { cleanedDisplayName: rawName ?? '', inlinePronoun: null };\n  }\n\n  const cached = pronounParseCache.get(rawName);\n  if (cached) return cached;\n\n  const regex =\n    /(?:\\(([a-zA-Z]+\\/[a-zA-Z]+(?:\\/[a-zA-Z]+)?)\\)|\\[([a-zA-Z]+\\/[a-zA-Z]+(?:\\/[a-zA-Z]+)?)\\])/;\n  const match = rawName.match(regex);\n\n  let result: { cleanedDisplayName: string; inlinePronoun: string | null } = {\n    cleanedDisplayName: rawName.trim(),\n    inlinePronoun: null,\n  };\n\n  if (match) {\n    const fullMatch = match[0];\n    const capturedPronoun = (match[1] ?? match[2] ?? '').toLowerCase().slice(0, 16);\n\n    const strippedName = rawName.replace(fullMatch, '').trim();\n\n    result = {\n      cleanedDisplayName: strippedName || rawName,\n      inlinePronoun: capturedPronoun || null,\n    };\n  }\n\n  if (pronounParseCache.size > 1000) {\n    pronounParseCache.clear();\n  }\n\n  pronounParseCache.set(rawName, result);\n  return result;\n}\n","import {\n  MATRIX_UNSTABLE_COLORS,\n  MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME,\n  MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME,\n} from '$unstable/prefixes';\nimport type { PerMessageProfileBeeperFormat, Persona } from './index';\nimport chroma from 'chroma-js';\nimport { ThemeKind } from '$hooks/useTheme';\nimport { accessibleColor } from '$plugins/color';\nimport { parsePronounsInput } from '$app/utils/pronouns';\nimport type { PerMessageProfilePluralkitFormat } from './pluralkit';\n\nexport function convertPerMessageProfileToBeeperFormat(\n  profile: Persona,\n  has_fallback: boolean\n): PerMessageProfileBeeperFormat {\n  const beeperPMP: PerMessageProfileBeeperFormat = {\n    id: profile.id,\n    displayname: profile.displayname,\n    avatar_url: profile.avatar_url,\n    [MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME]:\n      profile[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME],\n    [MATRIX_UNSTABLE_COLORS]: profile[MATRIX_UNSTABLE_COLORS],\n    has_fallback,\n  };\n  if (!profile.displayname || profile.displayname.trim().length === 0) delete beeperPMP.displayname;\n  if (!profile.avatar_url) delete beeperPMP.avatar_url;\n  if (\n    !profile[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME] ||\n    profile[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME]?.length === 0\n  )\n    delete beeperPMP[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME];\n  if (!profile[MATRIX_UNSTABLE_COLORS]) delete beeperPMP[MATRIX_UNSTABLE_COLORS];\n  if (!has_fallback) delete beeperPMP.has_fallback;\n  return beeperPMP;\n}\n\nexport function convertBeeperFormatToOurPerMessageProfile(\n  beeperProfile: PerMessageProfileBeeperFormat\n): Persona {\n  return {\n    id: beeperProfile.id,\n    displayname: beeperProfile.displayname ?? '',\n    avatar_url: beeperProfile.avatar_url,\n    [MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME]:\n      beeperProfile[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME],\n    [MATRIX_UNSTABLE_COLORS]: beeperProfile[MATRIX_UNSTABLE_COLORS],\n    triggers: [],\n  };\n}\n\n/** Projects a stored persona to the fields that may be sent with a message. */\nexport function projectPersona(persona: Persona): PerMessageProfileBeeperFormat {\n  return convertPerMessageProfileToBeeperFormat(persona, false);\n}\n\nexport function convertPluralkitFormatToOurPerMessageProfile(\n  pkitProfile: PerMessageProfilePluralkitFormat,\n  pkitAvatarUrl?: string\n): Persona {\n  // parse colors\n  const color = { [MATRIX_UNSTABLE_COLORS]: {} };\n  if (pkitProfile.color && chroma.valid(pkitProfile.color)) {\n    const lightness = chroma(pkitProfile.color).lab()[0];\n    const should_be_on_dark = lightness > 50;\n    if (should_be_on_dark) {\n      color[MATRIX_UNSTABLE_COLORS] = {\n        on_dark: '#' + pkitProfile.color,\n        on_light: accessibleColor(ThemeKind.Light, pkitProfile.color),\n      };\n    } else {\n      color[MATRIX_UNSTABLE_COLORS] = {\n        on_dark: accessibleColor(ThemeKind.Dark, pkitProfile.color),\n        on_light: '#' + pkitProfile.color,\n      };\n    }\n  }\n\n  // parse proxy tags\n  const triggers = pkitProfile.proxy_tags?.map(({ prefix, suffix }) => ({\n    prefix: prefix ?? undefined,\n    suffix: suffix ?? undefined,\n  }));\n\n  const profile: Persona = {\n    id: pkitProfile.name,\n    displayname: pkitProfile.display_name ?? pkitProfile.name,\n    avatar_url: pkitAvatarUrl,\n    triggers,\n    [MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME]: parsePronounsInput(pkitProfile.pronouns),\n    [MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME]: {\n      id: pkitProfile.id,\n      uuid: pkitProfile.uuid,\n      description: pkitProfile.description,\n      avatar_url: pkitProfile.avatar_url,\n    },\n    ...color,\n  };\n\n  if (!profile.avatar_url) delete profile.avatar_url;\n  if (\n    !profile[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME] ||\n    profile[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME].length === 0\n  )\n    delete profile[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME];\n  if (\n    !profile[MATRIX_UNSTABLE_COLORS] ||\n    !profile[MATRIX_UNSTABLE_COLORS].on_dark ||\n    !profile[MATRIX_UNSTABLE_COLORS].on_light\n  )\n    delete profile[MATRIX_UNSTABLE_COLORS];\n  if (!profile[MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME]?.avatar_url)\n    delete profile[MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME]?.avatar_url;\n  if (!profile[MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME]?.description)\n    delete profile[MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME]?.description;\n  if (!profile[MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME]?.uuid)\n    delete profile[MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME]?.uuid;\n  return profile;\n}\n\nexport function stripPerMessageProfilePlainBody(formatted_body: string, profile?: Persona): string {\n  if (profile) return formatted_body.replace(`${profile.displayname}: `, '');\n  return formatted_body.replace(/^.*?: /, '');\n}\n\nexport function stripPerMessageProfileFormattedBody(formatted_body: string): string {\n  return formatted_body.replace(/^<strong\\s+data-mx-profile-fallback[^>]*>.*?<\\/strong>/, '');\n}\n","import type { Persona } from './index';\n\n/** Resolves the first matching MSC4461 trigger and strips it. */\nexport function resolvePersonaProxy(personas: readonly Persona[], body: string) {\n  for (const persona of personas) {\n    const trigger = persona.triggers?.find(\n      ({ prefix, suffix }) => body.startsWith(prefix ?? '') && body.endsWith(suffix ?? '')\n    );\n\n    if (trigger) {\n      if (!trigger.keep_trigger) {\n        body = body.slice(trigger.prefix?.length ?? 0, body.length - (trigger.suffix?.length ?? 0));\n      }\n\n      return { persona, body };\n    }\n  }\n  return undefined;\n}\n","import type { Persona, ResolvedPersonaSelection } from './index';\n\nexport function resolvePersona({\n  proxy,\n  latched,\n  room,\n  account,\n  now,\n}: {\n  proxy?: Persona;\n  latched?: Persona;\n  room?: ResolvedPersonaSelection;\n  account?: ResolvedPersonaSelection;\n  now: number;\n}): Persona | undefined {\n  if (proxy) return proxy;\n  if (latched) return latched;\n  if (room && (room.validUntil === undefined || room.validUntil > now)) return room.persona;\n  if (account && (account.validUntil === undefined || account.validUntil > now))\n    return account.persona;\n  return undefined;\n}\n","/** Serializes operations per key so read-modify-write sequences cannot interleave. */\nexport function createKeyedQueue() {\n  const tails = new Map<string, Promise<void>>();\n\n  return function run<T>(key: string, operation: () => T | PromiseLike<T>): Promise<T> {\n    const previous = tails.get(key) ?? Promise.resolve();\n    const current = previous.catch(() => undefined).then(operation);\n    const tail = current.then(\n      () => undefined,\n      () => undefined\n    );\n\n    tails.set(key, tail);\n    void tail.then(() => {\n      if (tails.get(key) === tail) tails.delete(key);\n    });\n\n    return current;\n  };\n}\n","import type { AccountDataCompatVersion } from '$types/matrix/accountData';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\nimport type { ColorSet } from '$hooks/useUserProfile';\nimport { type PronounSet } from '$utils/pronouns';\nimport { createKeyedQueue } from '$utils/keyedQueue';\nimport type { MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME } from '$unstable/prefixes';\nimport {\n  MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_CIRCUMFIX_PROPERTY_NAME,\n  MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_SUFFIX_PROPERTY_NAME,\n  MATRIX_UNSTABLE_COLORS,\n  MATRIX_UNSTABLE_MSC4461_ACCOUNT_PER_MESSAGE_PROFILES_PROPERTY_NAME,\n  MATRIX_UNSTABLE_MSC4461_ACCOUNT_PER_MESSAGE_PROFILES_PROPERTY_NAME_V2,\n  MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME,\n} from '$unstable/prefixes';\nimport type {\n  Persona,\n  PerMessageProfileMsc4461,\n  ProfileTrigger,\n  ResolvedPersonaSelection,\n  PkitImport,\n} from './index';\n\nconst ACCOUNT_DATA_PREFIX = CustomAccountDataEvent.SablePerProfileMessageProfiles;\nconst enqueueProfilePersistence = createKeyedQueue();\n\ntype LegacyProfile = {\n  id: string;\n  name: string;\n  avatarUrl?: string;\n  pronouns?: PronounSet[];\n  compat?: AccountDataCompatVersion;\n  colors?: ColorSet;\n};\n\ntype LegacyProfileIndex = { profileIds: string[]; compat: AccountDataCompatVersion };\n\nexport type ProfileV2Trigger = {\n  prefix: string[];\n  [MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_SUFFIX_PROPERTY_NAME]?: string[];\n  [MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_CIRCUMFIX_PROPERTY_NAME]?: {\n    prefix: string;\n    suffix: string;\n  }[];\n};\n\nexport type PersonaV2 = {\n  id: string;\n  displayname: string;\n  avatar_url?: string;\n  [MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME]?: PronounSet[];\n  [MATRIX_UNSTABLE_COLORS]?: ColorSet;\n  [MATRIX_UNSTABLE_PROFILE_PKIT_IMPORT_PROPERTY_NAME]?: PkitImport;\n  trigger: ProfileV2Trigger;\n  compat?: AccountDataCompatVersion;\n};\n\nexport type PerMessageProfileIndexMsc4461 = {\n  type: 'm.per_message_profiles';\n  content: { profiles: PerMessageProfileMsc4461[] };\n};\n\nexport type PersonaCatalogContentV2 = { profiles: PersonaV2[] };\ntype InvalidPersonaCatalogContentV2 = {\n  type: 'm.per_message_profiles';\n  content: PersonaCatalogContentV2;\n};\n\nexport type PersonaCatalogContent = { profiles: Persona[] };\n\ntype ProfileAssociation = { profileId: string; validUntil?: number };\ntype RoomAssociationWrapper = {\n  associations: Map<string, ProfileAssociation> | Record<string, ProfileAssociation>;\n  compat?: AccountDataCompatVersion;\n};\ntype GlobalAssociationWrapper = {\n  association: ProfileAssociation;\n  compat?: AccountDataCompatVersion;\n};\n\ntype ProxyVariation =\n  | { prefix: string; suffix: undefined }\n  | { prefix: undefined; suffix: string }\n  | { prefix: string; suffix: string };\n\nexport type PerMessageProfileProxyAssociationV1 = {\n  profileId: string;\n  regexString: string;\n  setAt?: number;\n};\nexport type PerMessageProfileProxyAssociationV2 = {\n  profileId: string;\n  setAt?: number;\n  prefix: string | undefined;\n  suffix: string | undefined;\n};\nexport type PerMessageProfileProxyAssociation =\n  | PerMessageProfileProxyAssociationV1\n  | PerMessageProfileProxyAssociationV2;\nexport type InternalPerMessageProfileProxyAssociation = {\n  profileId: string;\n  regex: RegExp;\n  setAt?: number;\n};\ntype ProxyAssociationWrapper = {\n  associations:\n    | Map<string, PerMessageProfileProxyAssociation>\n    | Record<string, PerMessageProfileProxyAssociation>;\n  compat?: AccountDataCompatVersion;\n};\n\nexport function isPersonaAccountDataEvent(eventType: string) {\n  return (\n    eventType === MATRIX_UNSTABLE_MSC4461_ACCOUNT_PER_MESSAGE_PROFILES_PROPERTY_NAME ||\n    eventType === MATRIX_UNSTABLE_MSC4461_ACCOUNT_PER_MESSAGE_PROFILES_PROPERTY_NAME_V2 ||\n    eventType.startsWith(`${ACCOUNT_DATA_PREFIX}.`)\n  );\n}\n\nfunction accountData(mx: MatrixClient, eventType: string) {\n  return mx.getAccountData(eventType as Parameters<typeof mx.getAccountData>[0]);\n}\n\nfunction isTrigger(value: unknown): value is ProfileTrigger {\n  let trigger = value as {\n    prefix?: unknown;\n    suffix?: unknown;\n    keep_trigger?: unknown;\n  };\n\n  return (\n    typeof trigger === 'object' &&\n    trigger !== null &&\n    !Array.isArray(trigger) &&\n    (trigger.prefix === undefined || typeof trigger.prefix === 'string') &&\n    (trigger.suffix === undefined || typeof trigger.suffix === 'string') &&\n    (trigger.keep_trigger === undefined || typeof trigger.keep_trigger == 'boolean')\n  );\n}\n\nfunction isPersona(value: unknown): value is Persona {\n  const persona = value as {\n    id?: unknown;\n    displayname?: unknown;\n    triggers?: unknown;\n  };\n  const triggers = persona.triggers;\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof persona.id === 'string' &&\n    typeof persona.displayname === 'string' &&\n    (triggers === undefined || (Array.isArray(triggers) && triggers.every(isTrigger)))\n  );\n}\n\nfunction isCircumfixV2(value: unknown): value is { prefix: string; suffix: string } {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof (value as { prefix?: unknown }).prefix === 'string' &&\n    typeof (value as { suffix?: unknown }).suffix === 'string'\n  );\n}\n\nfunction isPersonaV2(value: unknown): value is PersonaV2 {\n  const persona = value as {\n    id?: unknown;\n    displayname?: unknown;\n    trigger?: Record<string, unknown>;\n  };\n  const trigger = persona.trigger;\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof persona.id === 'string' &&\n    typeof persona.displayname === 'string' &&\n    typeof trigger === 'object' &&\n    trigger !== null &&\n    Array.isArray(trigger.prefix) &&\n    trigger.prefix.every((entry) => typeof entry === 'string') &&\n    (trigger[MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_SUFFIX_PROPERTY_NAME] === undefined ||\n      (Array.isArray(trigger[MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_SUFFIX_PROPERTY_NAME]) &&\n        trigger[MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_SUFFIX_PROPERTY_NAME].every(\n          (entry) => typeof entry === 'string'\n        ))) &&\n    (trigger[MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_CIRCUMFIX_PROPERTY_NAME] === undefined ||\n      (Array.isArray(trigger[MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_CIRCUMFIX_PROPERTY_NAME]) &&\n        trigger[MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_CIRCUMFIX_PROPERTY_NAME].every(\n          isCircumfixV2\n        )))\n  );\n}\n\nfunction isCatalogContentV2(value: unknown): value is PersonaCatalogContentV2 {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'profiles' in value &&\n    Array.isArray(value.profiles)\n  );\n}\n\nfunction readCatalogV2(mx: MatrixClient): PersonaCatalogContentV2 | undefined {\n  const content = accountData(\n    mx,\n    MATRIX_UNSTABLE_MSC4461_ACCOUNT_PER_MESSAGE_PROFILES_PROPERTY_NAME_V2\n  )?.getContent();\n  if (isCatalogContentV2(content)) return { profiles: content.profiles.filter(isPersonaV2) };\n\n  const nested = content as InvalidPersonaCatalogContentV2 | undefined;\n  if (isCatalogContentV2(nested?.content)) {\n    return { profiles: nested.content.profiles.filter(isPersona) };\n  }\n  return undefined;\n}\n\nfunction isCatalogContent(value: unknown): value is PersonaCatalogContent {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'profiles' in value &&\n    Array.isArray(value.profiles)\n  );\n}\n\nfunction readCatalog(mx: MatrixClient): { profiles: Persona[] } | undefined {\n  const content = accountData(\n    mx,\n    MATRIX_UNSTABLE_MSC4461_ACCOUNT_PER_MESSAGE_PROFILES_PROPERTY_NAME\n  )?.getContent();\n  if (isCatalogContent(content)) return { profiles: content.profiles.filter(isPersona) };\n  return undefined;\n}\n\nasync function saveCatalog(mx: MatrixClient, profiles: Persona[]) {\n  await mx.setAccountData(\n    MATRIX_UNSTABLE_MSC4461_ACCOUNT_PER_MESSAGE_PROFILES_PROPERTY_NAME as Parameters<\n      typeof mx.setAccountData\n    >[0],\n    { profiles } as Parameters<typeof mx.setAccountData>[1]\n  );\n}\n\nfunction isLegacyProfile(value: unknown): value is LegacyProfile {\n  const profile = value as { id?: unknown; name?: unknown };\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof profile.id === 'string' &&\n    typeof profile.name === 'string'\n  );\n}\n\nfunction proxyAssociationMap(wrapper?: ProxyAssociationWrapper) {\n  if (!wrapper?.associations) return new Map<string, PerMessageProfileProxyAssociation>();\n  return wrapper.associations instanceof Map\n    ? wrapper.associations\n    : new Map(Object.entries(wrapper.associations));\n}\n\nfunction associationMap(wrapper?: RoomAssociationWrapper) {\n  if (!wrapper?.associations) return new Map<string, ProfileAssociation>();\n  return wrapper.associations instanceof Map\n    ? wrapper.associations\n    : new Map(Object.entries(wrapper.associations));\n}\n\nexport function extractCircumfixProxyTagsFromKey(proxyId: string): ProxyVariation | null {\n  const [prefix, suffix] = proxyId.split('text');\n  if (!prefix && !suffix) return null;\n  if (prefix && !suffix) return { prefix, suffix: undefined };\n  if (!prefix && suffix) return { prefix: undefined, suffix };\n  return { prefix: prefix!, suffix: suffix! };\n}\n\nexport function createProxyKey(prefix: string | undefined, suffix: string | undefined) {\n  return `${prefix || ''}text${suffix || ''}`;\n}\n\nexport function proxyNeedsMigration(assoc: PerMessageProfileProxyAssociation) {\n  return (assoc as PerMessageProfileProxyAssociationV1).regexString !== undefined;\n}\n\nexport function migratePmpProxyAssociation(\n  proxyId: string,\n  assoc: PerMessageProfileProxyAssociation\n): PerMessageProfileProxyAssociationV2 | null {\n  if ((assoc as PerMessageProfileProxyAssociationV1).regexString) {\n    const fixes = extractCircumfixProxyTagsFromKey(proxyId);\n    return fixes\n      ? { profileId: assoc.profileId, ...(assoc.setAt && { setAt: assoc.setAt }), ...fixes }\n      : null;\n  }\n  return assoc as PerMessageProfileProxyAssociationV2;\n}\n\nexport function parsePerMessageProfileProxyAssociation(\n  assoc: PerMessageProfileProxyAssociationV1\n): InternalPerMessageProfileProxyAssociation {\n  const match = assoc.regexString.match(/^\\/([\\s\\S]*)\\/([gimsuy]*)$/);\n  return {\n    profileId: assoc.profileId,\n    regex: new RegExp(match?.[1] ?? assoc.regexString, match?.[2] ?? ''),\n    setAt: assoc.setAt,\n  };\n}\n\nexport function convertMsc4461V2ToV3(profile: PersonaV2): Persona {\n  let { trigger: triggerV2, ...profile_other } = profile;\n  let triggerV3: ProfileTrigger[] = [];\n\n  for (let { prefix, suffix } of triggerV2[\n    MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_CIRCUMFIX_PROPERTY_NAME\n  ] ?? []) {\n    triggerV3.push({ prefix, suffix });\n  }\n\n  for (let prefix of triggerV2.prefix ?? []) {\n    triggerV3.push({ prefix });\n  }\n\n  for (let suffix of triggerV2[MATRIX_SABLE_UNSTABLE_MSC4461_TRIGGER_SUFFIX_PROPERTY_NAME] ?? []) {\n    triggerV3.push({ suffix });\n  }\n\n  return {\n    ...profile_other,\n    triggers: triggerV3,\n  };\n}\n\nexport function convertPmpToMsc4461(mx: MatrixClient, profile: LegacyProfile): Persona {\n  const triggers: ProfileTrigger[] = [];\n  proxyAssociationMap(\n    accountData(mx, `${ACCOUNT_DATA_PREFIX}.proxyassociation`)?.getContent() as\n      | ProxyAssociationWrapper\n      | undefined\n  )\n    .entries()\n    .filter(([, association]) => association.profileId === profile.id)\n    .forEach(([key, association]) => {\n      const migrated = migratePmpProxyAssociation(key, association);\n      if (!migrated) return;\n      if (migrated.prefix || migrated.suffix) {\n        triggers.push({ prefix: migrated.prefix, suffix: migrated.suffix });\n      }\n    });\n  const persona: Persona = {\n    id: profile.id,\n    displayname: profile.name,\n    avatar_url: profile.avatarUrl,\n    [MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME]: profile.pronouns,\n    [MATRIX_UNSTABLE_COLORS]: profile.colors,\n    triggers,\n  };\n  if (!profile.avatarUrl) delete persona.avatar_url;\n  if (!profile.pronouns?.length) delete persona[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME];\n  if (!profile.colors) delete persona[MATRIX_UNSTABLE_COLORS];\n  return persona;\n}\n\nexport class ProfileCatalog {\n  constructor(private readonly mx: MatrixClient) {}\n\n  private async load(migrate: boolean): Promise<Persona[]> {\n    const catalog = readCatalog(this.mx);\n    if (catalog) {\n      return catalog.profiles;\n    }\n\n    const catalogV2 = readCatalogV2(this.mx);\n    if (catalogV2) {\n      const profiles = catalogV2.profiles.map(convertMsc4461V2ToV3);\n      if (migrate) {\n        await saveCatalog(this.mx, profiles);\n      }\n      return profiles;\n    }\n\n    const index = accountData(this.mx, `${ACCOUNT_DATA_PREFIX}.index`);\n    if (!index) return [];\n    const profileIds = (index.getContent() as LegacyProfileIndex | undefined)?.profileIds;\n    const ids = Array.isArray(profileIds)\n      ? profileIds.filter((id): id is string => typeof id === 'string')\n      : [];\n    const profiles = ids\n      .map((id) => accountData(this.mx, `${ACCOUNT_DATA_PREFIX}.${id}`)?.getContent())\n      .filter(isLegacyProfile)\n      .map((profile) => convertPmpToMsc4461(this.mx, profile));\n\n    if (migrate) {\n      await saveCatalog(this.mx, profiles);\n      await this.mx.deleteAccountData(\n        `${ACCOUNT_DATA_PREFIX}.index` as Parameters<typeof this.mx.deleteAccountData>[0]\n      );\n      await Promise.all(\n        ids.map((id) =>\n          this.mx.deleteAccountData(\n            `${ACCOUNT_DATA_PREFIX}.${id}` as Parameters<typeof this.mx.deleteAccountData>[0]\n          )\n        )\n      );\n    }\n    return profiles;\n  }\n\n  async list({ migrate = true }: { migrate?: boolean } = {}): Promise<Persona[]> {\n    if (!migrate) return this.load(false);\n    return enqueueProfilePersistence('catalog', () => this.load(true));\n  }\n\n  async get(id: string): Promise<Persona | undefined> {\n    return (await this.list({ migrate: false })).find((persona) => persona.id === id);\n  }\n\n  async merge(persona: Persona): Promise<void> {\n    await enqueueProfilePersistence('catalog', async () => {\n      const personas = await this.load(true);\n      const index = personas.findIndex((existing) => existing.id === persona.id);\n      await saveCatalog(\n        this.mx,\n        index === -1\n          ? [...personas, persona]\n          : personas.map((existing) =>\n              existing.id === persona.id ? { ...existing, ...persona } : existing\n            )\n      );\n    });\n  }\n\n  async remove(id: string): Promise<void> {\n    await enqueueProfilePersistence('catalog', async () => {\n      await this.dropRoomAssociations(id);\n      await this.dropGlobalAssociation(id);\n      await saveCatalog(\n        this.mx,\n        (await this.load(true)).filter((persona) => persona.id !== id)\n      );\n    });\n  }\n\n  async rename(oldId: string, newId: string): Promise<void> {\n    await enqueueProfilePersistence('catalog', async () => {\n      const personas = await this.load(true);\n      if (!personas.some((persona) => persona.id === oldId)) throw new Error('Profile not found');\n      await saveCatalog(\n        this.mx,\n        personas.map((persona) => (persona.id === oldId ? { ...persona, id: newId } : persona))\n      );\n      await this.replaceAssociations(oldId, newId);\n    });\n  }\n\n  async overwrite(profiles: Persona[]): Promise<void> {\n    await enqueueProfilePersistence('catalog', async () => {\n      await saveCatalog(this.mx, profiles);\n    });\n  }\n\n  async getSelection(\n    scope: 'account' | { roomId: string }\n  ): Promise<ResolvedPersonaSelection | undefined> {\n    const association =\n      scope === 'account'\n        ? (\n            accountData(this.mx, `${ACCOUNT_DATA_PREFIX}.globalassociation`)?.getContent() as\n              | GlobalAssociationWrapper\n              | undefined\n          )?.association\n        : associationMap(\n            accountData(this.mx, `${ACCOUNT_DATA_PREFIX}.roomassociation`)?.getContent() as\n              | RoomAssociationWrapper\n              | undefined\n          ).get(scope.roomId);\n    if (!association) return undefined;\n    const persona = await this.get(association.profileId);\n    return persona ? { persona, validUntil: association.validUntil } : undefined;\n  }\n\n  async setSelection(\n    scope: 'account' | { roomId: string },\n    profileId: string | undefined,\n    validUntil?: number,\n    reset?: boolean\n  ) {\n    const key = scope === 'account' ? 'globalassociation' : 'roomassociation';\n    return enqueueProfilePersistence(key, async () => {\n      const eventType = `${ACCOUNT_DATA_PREFIX}.${key}`;\n      if (reset) {\n        if (scope === 'account')\n          await this.mx.deleteAccountData(\n            eventType as Parameters<typeof this.mx.deleteAccountData>[0]\n          );\n        else {\n          const associations = associationMap(\n            accountData(this.mx, eventType)?.getContent() as RoomAssociationWrapper | undefined\n          );\n          associations.delete(scope.roomId);\n          await this.mx.setAccountData(\n            eventType as Parameters<typeof this.mx.setAccountData>[0],\n            { associations: Object.fromEntries(associations) } as Parameters<\n              typeof this.mx.setAccountData\n            >[1]\n          );\n        }\n        return;\n      }\n      if (!profileId) throw new Error(\"profile Id is empty, yet it isn't a reset\");\n      if (scope === 'account') {\n        await this.mx.setAccountData(\n          eventType as Parameters<typeof this.mx.setAccountData>[0],\n          { association: { profileId, validUntil } } as Parameters<typeof this.mx.setAccountData>[1]\n        );\n      } else {\n        const associations = associationMap(\n          accountData(this.mx, eventType)?.getContent() as RoomAssociationWrapper | undefined\n        );\n        associations.set(scope.roomId, { profileId, validUntil });\n        await this.mx.setAccountData(\n          eventType as Parameters<typeof this.mx.setAccountData>[0],\n          { associations: Object.fromEntries(associations) } as Parameters<\n            typeof this.mx.setAccountData\n          >[1]\n        );\n      }\n    });\n  }\n\n  private async dropRoomAssociations(profileId: string) {\n    await enqueueProfilePersistence('roomassociation', async () => {\n      const eventType = `${ACCOUNT_DATA_PREFIX}.roomassociation`;\n      const content = accountData(this.mx, eventType)?.getContent() as\n        | RoomAssociationWrapper\n        | undefined;\n      if (!content) return;\n      const associations = associationMap(content);\n      let changed = false;\n      for (const [roomId, association] of associations) {\n        if (association?.profileId === profileId) {\n          associations.delete(roomId);\n          changed = true;\n        }\n      }\n      if (changed) {\n        await this.mx.setAccountData(\n          eventType as Parameters<typeof this.mx.setAccountData>[0],\n          { ...content, associations: Object.fromEntries(associations) } as Parameters<\n            typeof this.mx.setAccountData\n          >[1]\n        );\n      }\n    });\n  }\n\n  private async replaceAssociations(oldId: string, newId: string) {\n    await Promise.all([\n      this.replaceRoomAssociations(oldId, newId),\n      this.replaceGlobalAssociation(oldId, newId),\n    ]);\n  }\n\n  private async replaceRoomAssociations(oldId: string, newId: string) {\n    await enqueueProfilePersistence('roomassociation', async () => {\n      const eventType = `${ACCOUNT_DATA_PREFIX}.roomassociation`;\n      const content = accountData(this.mx, eventType)?.getContent() as\n        | RoomAssociationWrapper\n        | undefined;\n      if (!content) return;\n      const associations = associationMap(content);\n      let changed = false;\n      for (const association of associations.values()) {\n        if (association?.profileId === oldId) {\n          association.profileId = newId;\n          changed = true;\n        }\n      }\n      if (changed) {\n        await this.mx.setAccountData(\n          eventType as Parameters<typeof this.mx.setAccountData>[0],\n          { ...content, associations: Object.fromEntries(associations) } as Parameters<\n            typeof this.mx.setAccountData\n          >[1]\n        );\n      }\n    });\n  }\n\n  private async replaceGlobalAssociation(oldId: string, newId: string) {\n    await enqueueProfilePersistence('globalassociation', async () => {\n      const eventType = `${ACCOUNT_DATA_PREFIX}.globalassociation`;\n      const content = accountData(this.mx, eventType)?.getContent() as\n        | GlobalAssociationWrapper\n        | undefined;\n      if (content?.association?.profileId !== oldId) return;\n      await this.mx.setAccountData(\n        eventType as Parameters<MatrixClient['setAccountData']>[0],\n        {\n          ...content,\n          association: { ...content.association, profileId: newId },\n        } as Parameters<MatrixClient['setAccountData']>[1]\n      );\n    });\n  }\n\n  private async dropGlobalAssociation(profileId: string) {\n    await enqueueProfilePersistence('globalassociation', async () => {\n      const eventType = `${ACCOUNT_DATA_PREFIX}.globalassociation`;\n      const content = accountData(this.mx, eventType)?.getContent() as\n        | GlobalAssociationWrapper\n        | undefined;\n      if (content?.association?.profileId !== profileId) return;\n      await this.mx.deleteAccountData(\n        eventType as Parameters<MatrixClient['deleteAccountData']>[0]\n      );\n    });\n  }\n}\n\nexport async function getAllProxiesForPMP(\n  mx: MatrixClient,\n  profileId: string\n): Promise<PerMessageProfileProxyAssociationV2[]> {\n  return [\n    ...proxyAssociationMap(\n      accountData(mx, `${ACCOUNT_DATA_PREFIX}.proxyassociation`)?.getContent() as\n        | ProxyAssociationWrapper\n        | undefined\n    ).entries(),\n  ]\n    .filter(([, association]) => association.profileId === profileId)\n    .flatMap(([key, association]) => {\n      const migrated = migratePmpProxyAssociation(key, association);\n      return migrated ? [migrated] : [];\n    });\n}\n","import type { MatrixClient } from '$types/matrix-sdk';\nimport {\n  convertBeeperFormatToOurPerMessageProfile,\n  convertPerMessageProfileToBeeperFormat,\n  projectPersona,\n  stripPerMessageProfileFormattedBody,\n  stripPerMessageProfilePlainBody,\n} from '$app/persona/projection';\nimport { resolvePersonaProxy } from '$app/persona/proxy';\nimport { resolvePersona } from '$app/persona/selection';\nimport { ProfileCatalog } from '$app/persona/catalog';\nimport type { PerMessageProfileMsc4461, Persona } from '$app/persona';\nimport { useMediaAuthentication } from './useMediaAuthentication';\nimport { mxcUrlToHttp } from '$app/utils/mediaUrl';\nimport { useCallback } from 'react';\nimport { useAccessibleNameColor } from './useAccessibleNameColor';\nimport { useActiveTheme, ThemeKind } from './useTheme';\n\n// Compatibility exports for existing callers while persona persistence lives in the catalog.\nexport * from '$app/persona/catalog';\nexport {\n  convertBeeperFormatToOurPerMessageProfile,\n  convertPerMessageProfileToBeeperFormat,\n  projectPersona,\n  resolvePersona,\n  resolvePersonaProxy,\n  stripPerMessageProfileFormattedBody,\n  stripPerMessageProfilePlainBody,\n};\nexport type {\n  PerMessageProfileBeeperFormat,\n  PerMessageProfileMsc4461,\n  Persona,\n  ProfileTrigger,\n  ResolvedPersonaSelection,\n} from '$app/persona';\n\nexport async function getPerMessageProfileById(\n  mx: MatrixClient,\n  id: string\n): Promise<Persona | undefined> {\n  return new ProfileCatalog(mx).get(id);\n}\n\nexport async function getAllPerMessageProfiles(mx: MatrixClient): Promise<Persona[]> {\n  return new ProfileCatalog(mx).list();\n}\n\nexport async function addOrUpdatePerMessageProfile(\n  mx: MatrixClient,\n  profile: PerMessageProfileMsc4461\n) {\n  await new ProfileCatalog(mx).merge(profile);\n}\n\nexport async function deletePerMessageProfile(mx: MatrixClient, id: string) {\n  await new ProfileCatalog(mx).remove(id);\n}\n\nexport async function renamePerMessageProfile(mx: MatrixClient, oldId: string, newId: string) {\n  await new ProfileCatalog(mx).rename(oldId, newId);\n}\n\nexport async function setCurrentlyUsedPerMessageProfileIdForRoom(\n  mx: MatrixClient,\n  roomId: string,\n  profileId: string | undefined,\n  validUntil?: number,\n  reset?: boolean\n) {\n  return new ProfileCatalog(mx).setSelection({ roomId }, profileId, validUntil, reset);\n}\n\nexport async function setCurrentlyUsedPerMessageProfileIdForAccount(\n  mx: MatrixClient,\n  profileId: string | undefined,\n  validUntil?: number,\n  reset?: boolean\n) {\n  return new ProfileCatalog(mx).setSelection('account', profileId, validUntil, reset);\n}\n\nexport async function getCurrentlyUsedPerMessageProfileForRoom(\n  mx: MatrixClient,\n  roomId: string\n): Promise<PerMessageProfileMsc4461 | undefined> {\n  return (await new ProfileCatalog(mx).getSelection({ roomId }))?.persona;\n}\n\nexport async function getCurrentlyUsedPerMessageProfileForAccount(\n  mx: MatrixClient\n): Promise<PerMessageProfileMsc4461 | undefined> {\n  return (await new ProfileCatalog(mx).getSelection('account'))?.persona;\n}\n\nexport function usePersonaCosmetics(mx: MatrixClient | undefined, smallAvatar: boolean = true) {\n  const useAuthentication = useMediaAuthentication();\n  const activeTheme = useActiveTheme();\n  const accessibleNameColor = useAccessibleNameColor(activeTheme.kind);\n\n  const nameColor = useCallback(\n    (persona: PerMessageProfileMsc4461) =>\n      accessibleNameColor(\n        activeTheme.kind === ThemeKind.Dark\n          ? persona['eu.she-a.color']?.on_dark\n          : persona['eu.she-a.color']?.on_light\n      ),\n    [activeTheme, accessibleNameColor]\n  );\n\n  const avatarUrl = useCallback(\n    (profile: PerMessageProfileMsc4461) => {\n      if (profile.avatar_url !== undefined) {\n        return (\n          (smallAvatar\n            ? mxcUrlToHttp(mx!, profile.avatar_url, useAuthentication, 96, 96, 'crop')\n            : mxcUrlToHttp(mx!, profile.avatar_url, useAuthentication)) ?? undefined\n        );\n      } else {\n        return undefined;\n      }\n    },\n    [mx, useAuthentication, smallAvatar]\n  );\n\n  if (!mx) return { avatarUrl: undefined, nameColor: undefined };\n  return { nameColor, avatarUrl };\n}\n","import { Box, Chip, Text, as, color, toRem } from 'folds';\nimport type { EventTimelineSet, IMentions, Room } from '$types/matrix-sdk';\nimport { EventType, MsgType } from '$types/matrix-sdk';\nimport type { JSX, MouseEventHandler, ReactNode } from 'react';\nimport { useCallback, useMemo } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport classNames from 'classnames';\nimport parse from 'html-react-parser';\nimport { useAtomValue } from 'jotai';\nimport {\n  ArrowBendUpRightIcon,\n  ArrowsClockwise,\n  ChatCircle,\n  chipIcon,\n  Code,\n  Hash,\n  ListBullets,\n  menuIcon,\n  Phone,\n  PhoneDisconnect,\n  PushPin,\n  timelineIcon,\n  Trash,\n  Smiley,\n} from '$components/icons/phosphor';\nimport {\n  getMemberDisplayName,\n  trimReplyFromBody,\n  trimReplyFromFormattedBody,\n} from '$utils/room/display';\nimport { getReactionKey, getReactionShortcode, getRedactionTargetId } from '$utils/room/relations';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { randomNumberBetween } from '$utils/common';\nimport { sanitizeCustomHtml } from '$utils/sanitize';\nimport { getReactCustomHtmlParser, scaleSystemEmoji } from '$plugins/react-custom-html-parser';\nimport { useRoomEvent } from '$hooks/useRoomEvent';\nimport { useSableCosmetics } from '$hooks/useSableCosmetics';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useIgnoredUsers } from '$hooks/useIgnoredUsers';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport { useRoomMemberHydration } from '$hooks/useRoomMemberHydration';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMemberEventParser } from '$hooks/useMemberEventParser';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\n\nimport { useMentionClickHandler } from '$hooks/useMentionClickHandler';\nimport { useTranslation } from 'react-i18next';\nimport * as customHtmlCss from '$styles/CustomHtml.css';\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport {\n  MessageBadEncryptedContent,\n  MessageBlockedContent,\n  MessageDeletedContent,\n  MessageEmptyContent,\n  MessageFailedContent,\n  MessageUnsupportedContent,\n  ReactionDeletedContent,\n} from './content';\nimport * as css from './Reply.css';\nimport { LinePlaceholder } from './placeholder';\nimport { ReactionKeyInline } from './ReactionKeyInline';\nimport { M_POLL_START, M_TEXT } from 'matrix-js-sdk';\nimport type { PerMessageProfileBeeperFormat } from '$hooks/usePerMessageProfile';\nimport { ThemeKind, useActiveTheme } from '$hooks/useTheme';\nimport {\n  convertBeeperFormatToOurPerMessageProfile,\n  stripPerMessageProfileFormattedBody,\n} from '$hooks/usePerMessageProfile';\nimport { useAccessibleNameColor } from '$hooks/useAccessibleNameColor';\n\nconst ROOM_REPLY_TIMELINE_EVENT_TYPES = new Set<string>([\n  EventType.RoomMessage as string,\n  EventType.RoomMessageEncrypted as string,\n  EventType.Sticker as string,\n  EventType.Reaction as string,\n  EventType.RoomRedaction as string,\n]);\n\nconst nonEmptyTrimmed = (v: unknown): string | undefined => {\n  if (typeof v !== 'string') return undefined;\n  const t = v.trim();\n  return t.length > 0 ? t : undefined;\n};\n\nconst FORMATTED_EMOTICON_IMG_RE = /<img\\b[^>]*\\bdata-mx-emoticon\\b/i;\n\nexport const replyFormattedPreviewTextOnly = (sanitizedHtml: string): string =>\n  sanitizedHtml\n    .replaceAll(/<br\\s*\\/?>/gi, ' ')\n    .replaceAll(/<[^>]+>/g, '')\n    .replaceAll(/\\s+/g, ' ')\n    .trim();\n\nexport const shouldParseReplyFormattedPreview = (sanitizedHtml: string): boolean => {\n  const textOnly = replyFormattedPreviewTextOnly(sanitizedHtml);\n  return textOnly !== '' || FORMATTED_EMOTICON_IMG_RE.test(sanitizedHtml);\n};\n\nexport const replyPreviewBodyForTimelineEvent = (\n  eventType: string | undefined,\n  content: Record<string, unknown>,\n  isRedacted: boolean\n): ReactNode | undefined => {\n  if (!eventType) return undefined;\n\n  if (eventType === (EventType.RoomRedaction as string)) {\n    return 'redacted a message';\n  }\n\n  if (eventType === (EventType.Reaction as string)) {\n    if (isRedacted) {\n      return <ReactionDeletedContent hideIcon />;\n    }\n    return undefined;\n  }\n\n  if (!ROOM_REPLY_TIMELINE_EVENT_TYPES.has(eventType)) return undefined;\n\n  const effectiveContent =\n    content['m.new_content'] != null && typeof content['m.new_content'] === 'object'\n      ? (content['m.new_content'] as Record<string, unknown>)\n      : content;\n\n  if (isRedacted) return <MessageDeletedContent />;\n\n  if (eventType === (EventType.Sticker as string)) {\n    const stickerBody = nonEmptyTrimmed(effectiveContent.body);\n    if (stickerBody) return scaleSystemEmoji(stickerBody);\n    return 'Sticker';\n  }\n\n  const rawMsgtype = effectiveContent.msgtype;\n  if (typeof rawMsgtype !== 'string') {\n    return <MessageUnsupportedContent />;\n  }\n  const msgtype = rawMsgtype as MsgType;\n\n  const trimmedBody = nonEmptyTrimmed(\n    typeof effectiveContent.body === 'string' ? trimReplyFromBody(effectiveContent.body) : ''\n  );\n  const filename = nonEmptyTrimmed(effectiveContent.filename);\n  if (trimmedBody) return undefined;\n\n  const attachmentLabel = filename;\n\n  switch (msgtype) {\n    case MsgType.Image:\n      return attachmentLabel ?? 'Image';\n    case MsgType.Video:\n      return attachmentLabel ?? 'Video';\n    case MsgType.Audio:\n      return attachmentLabel ?? 'Audio';\n    case MsgType.File:\n      return attachmentLabel ?? 'Attachment';\n    case MsgType.Location:\n      return 'Location';\n    case MsgType.Text:\n    case MsgType.Emote:\n    case MsgType.Notice:\n      return <MessageEmptyContent />;\n    default:\n      return <MessageUnsupportedContent />;\n  }\n};\n\ntype ReplyLayoutProps = {\n  userColor?: string;\n  username?: ReactNode;\n  icon?: ReactNode;\n  mentioned: boolean;\n  replyIcon?: JSX.Element;\n};\nconst ReplyLayout = as<'div', ReplyLayoutProps>(\n  ({ username, userColor, icon, className, mentioned, children, replyIcon, ...props }, ref) => (\n    <Box\n      className={classNames(css.Reply, className)}\n      alignItems=\"Center\"\n      gap=\"100\"\n      {...props}\n      ref={ref}\n    >\n      <Box style={{ color: userColor }} alignItems=\"Center\" shrink=\"No\">\n        {replyIcon ?? menuIcon(ArrowBendUpRightIcon)}\n      </Box>\n      {icon}\n      <Box style={{ color: userColor, maxWidth: toRem(200) }} alignItems=\"Center\" shrink=\"No\">\n        {mentioned && '@'}\n        {username}\n      </Box>\n      <Box grow=\"Yes\" className={css.ReplyContent}>\n        {children}\n      </Box>\n    </Box>\n  )\n);\n\nexport const ThreadIndicator = as<'div'>(({ ...props }, ref) => (\n  <Box\n    shrink=\"No\"\n    className={css.ThreadIndicator}\n    alignItems=\"Center\"\n    gap=\"100\"\n    {...props}\n    ref={ref}\n  >\n    {chipIcon(ChatCircle)}\n    <Text size=\"L400\">Thread</Text>\n  </Box>\n));\n\ntype ReplyProps = {\n  room: Room;\n  timelineSet?: EventTimelineSet;\n  replyEventId: string;\n  threadRootId?: string;\n  mentions?: IMentions;\n  onClick?: MouseEventHandler;\n  replyIcon?: JSX.Element;\n  previewBodyOverride?: string;\n};\n\nexport const sanitizeReplyFormattedPreview = (formattedBody: string): string => {\n  const safeFormattedBody = sanitizeCustomHtml(formattedBody);\n  const strippedHtml = trimReplyFromFormattedBody(safeFormattedBody)\n    .replaceAll(/<br\\s*\\/?>/gi, ' ')\n    .replaceAll(/<\\/p>\\s*<p[^>]*>/gi, ' ')\n    .replaceAll(/<\\/?p[^>]*>/gi, '')\n    .replaceAll(/<\\/li>\\s*<li[^>]*>/gi, ' ')\n    .replaceAll(/<\\/?(ul|ol|li|blockquote|h[1-6]|pre|div)[^>]*>/gi, '')\n    .replaceAll(/(?:\\r\\n|\\r|\\n)/g, ' ');\n\n  return strippedHtml;\n};\n\nexport const Reply = as<'div', ReplyProps>(\n  (\n    {\n      room,\n      timelineSet,\n      replyEventId,\n      threadRootId,\n      mentions,\n      onClick,\n      replyIcon,\n      previewBodyOverride,\n      ...props\n    },\n    ref\n  ) => {\n    const placeholderWidth = useMemo(() => randomNumberBetween(40, 400), []);\n    const getFromLocalTimeline = useCallback(\n      () => timelineSet?.findEventById(replyEventId),\n      [timelineSet, replyEventId]\n    );\n    const replyEvent = useRoomEvent(room, replyEventId, getFromLocalTimeline);\n    const queryClient = useQueryClient();\n\n    const mx = useMatrixClient();\n\n    const rawContent = replyEvent?.getContent() ?? {};\n    const contentForPreview =\n      rawContent['m.new_content'] != null && typeof rawContent['m.new_content'] === 'object'\n        ? (rawContent['m.new_content'] as Record<string, unknown>)\n        : rawContent;\n\n    const { body, formatted_body: formattedBody, format } = contentForPreview;\n\n    // get pmp from message\n    const beeperProfile = rawContent['com.beeper.per_message_profile'] as\n      | PerMessageProfileBeeperFormat\n      | undefined;\n    const pmp = beeperProfile\n      ? convertBeeperFormatToOurPerMessageProfile(beeperProfile)\n      : undefined;\n\n    // strip the PMP fallback if it's there, to avoid displaying the PMP name twice\n    const formattedBodyStripped: string = pmp\n      ? stripPerMessageProfileFormattedBody(formattedBody ?? '')\n      : formattedBody;\n\n    const extensibleContent = contentForPreview[M_TEXT.name] as\n      | string\n      | { body: string }\n      | undefined;\n    const extensibleBody = (extensibleContent as { body: string })?.body ?? extensibleContent;\n    const sender = replyEvent?.getSender();\n    const eventType = replyEvent?.getType();\n    const isRedacted = replyEvent?.isRedacted() === true;\n\n    const ignoredUsers = useIgnoredUsers();\n    const isBlockedSender = !!sender && ignoredUsers.includes(sender);\n    const { t } = useTranslation();\n\n    const parseMemberEvent = useMemberEventParser();\n\n    const { color: usernameColor, font: usernameFont } = useSableCosmetics(sender ?? '', room);\n    const activeTheme = useActiveTheme();\n\n    const accessibleNameColor = useAccessibleNameColor(activeTheme.kind);\n    const pmpNameColor = useMemo(() => {\n      return activeTheme.kind === ThemeKind.Dark\n        ? pmp?.['eu.she-a.color']?.on_dark\n        : pmp?.['eu.she-a.color']?.on_light;\n    }, [activeTheme, pmp]);\n\n    const nicknames = useAtomValue(nicknamesAtom);\n    const cachedProfiles = useAtomValue(profilesCacheAtom);\n    useRoomMemberHydration(room, sender ?? '');\n    const useAuthentication = useMediaAuthentication();\n    const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n    const [incomingInlineImagesDefaultHeight] = useSetting(\n      settingsAtom,\n      'incomingInlineImagesDefaultHeight'\n    );\n    const [incomingInlineImagesMaxHeight] = useSetting(\n      settingsAtom,\n      'incomingInlineImagesMaxHeight'\n    );\n\n    const fallbackBody =\n      isRedacted && eventType === (EventType.Reaction as string) ? (\n        <ReactionDeletedContent\n          mx={mx}\n          reactionKey={replyEvent ? getReactionKey(replyEvent) : undefined}\n          shortcode={replyEvent ? getReactionShortcode(replyEvent) : undefined}\n          useAuthentication={useAuthentication}\n          hideIcon\n        />\n      ) : isRedacted ? (\n        <MessageDeletedContent />\n      ) : (\n        <MessageFailedContent />\n      );\n\n    const badEncryption = replyEvent?.getContent().msgtype === 'm.bad.encrypted';\n    const mentionClickHandler = useMentionClickHandler(room.roomId);\n    const isFormattedReply =\n      format === 'org.matrix.custom.html' && typeof formattedBodyStripped === 'string';\n    const hasPlainTextReply = typeof body === 'string' && body !== '';\n    const hasExtensibleBody = typeof extensibleBody === 'string' && extensibleBody !== '';\n    // An encrypted event that hasn't been decrypted yet (keys pending) has an\n    // empty result from getClearContent().  Treat it as still-loading rather\n    // than a failure so the UI shows a placeholder instead of MessageFailedContent\n    // until the MatrixEventEvent.Decrypted callback fires.\n    const isPendingDecrypt =\n      replyEvent !== undefined &&\n      replyEvent !== null &&\n      replyEvent.isEncrypted() &&\n      !replyEvent.isDecryptionFailure() &&\n      !replyEvent.getClearContent();\n\n    let bodyJSX: ReactNode = fallbackBody;\n    let image: ReactNode | undefined;\n    let mentioned = sender != null && (mentions?.user_ids?.includes(sender) ?? false);\n\n    if (eventType === M_POLL_START.name) {\n      const question = (\n        replyEvent?.getContent()[M_POLL_START.name] as {\n          question: { [M_TEXT.name]?: string; body?: string };\n        }\n      )?.question;\n      image = timelineIcon(ListBullets);\n      if (question)\n        bodyJSX = `'s poll asking ${(question[M_TEXT.name] as string) ?? question?.body ?? ''}`;\n    } else if (isFormattedReply && formattedBodyStripped !== '') {\n      const sanitizedHtml = sanitizeReplyFormattedPreview(formattedBodyStripped);\n      if (shouldParseReplyFormattedPreview(sanitizedHtml)) {\n        const parserOpts = getReactCustomHtmlParser(mx, room.roomId, {\n          settingsLinkBaseUrl,\n          linkifyOpts: undefined,\n          useAuthentication,\n          nicknames,\n          handleMentionClick: mentionClickHandler,\n          incomingInlineImagesDefaultHeight,\n          incomingInlineImagesMaxHeight,\n        });\n        bodyJSX = parse(sanitizedHtml, parserOpts) as JSX.Element;\n      } else if (hasPlainTextReply) {\n        const strippedBody = trimReplyFromBody(body).replaceAll(/(?:\\r\\n|\\r|\\n)/g, ' ');\n        bodyJSX = scaleSystemEmoji(strippedBody);\n      } else if (hasExtensibleBody) {\n        const strippedBody = trimReplyFromBody(extensibleBody).replaceAll(/(?:\\r\\n|\\r|\\n)/g, ' ');\n        bodyJSX = scaleSystemEmoji(strippedBody);\n      }\n    } else if (hasPlainTextReply) {\n      const strippedBody = trimReplyFromBody(body).replaceAll(/(?:\\r\\n|\\r|\\n)/g, ' ');\n      bodyJSX = scaleSystemEmoji(strippedBody);\n    } else if (hasExtensibleBody) {\n      const strippedBody = trimReplyFromBody(extensibleBody).replaceAll(/(?:\\r\\n|\\r|\\n)/g, ' ');\n      bodyJSX = scaleSystemEmoji(strippedBody);\n    } else if (eventType === EventType.RoomMember && !!replyEvent) {\n      const parsedMemberEvent = parseMemberEvent(replyEvent);\n      image = parsedMemberEvent.icon;\n      mentioned = false;\n      bodyJSX = (\n        <Box direction=\"Row\" style={{ columnGap: toRem(6) }}>\n          {' '}\n          {parsedMemberEvent.body}{' '}\n        </Box>\n      );\n    } else if (eventType === EventType.RoomName) {\n      image = timelineIcon(Hash);\n      bodyJSX = t('Organisms.RoomCommon.changed_room_name');\n    } else if (eventType === EventType.RoomTopic) {\n      image = timelineIcon(Hash);\n      bodyJSX = ' changed room topic';\n    } else if (eventType === EventType.RoomAvatar) {\n      image = timelineIcon(Hash);\n      bodyJSX = ' changed room avatar';\n    } else if (eventType === EventType.GroupCallMemberPrefix && !!replyEvent) {\n      const callJoined = replyEvent.getContent<Record<string, unknown>>().application;\n      image = callJoined ? timelineIcon(Phone) : timelineIcon(PhoneDisconnect);\n      bodyJSX = callJoined ? ' joined the call' : ' ended the call';\n    } else if (eventType === EventType.RoomRedaction && replyEvent) {\n      image = timelineIcon(Trash);\n      const redactionTargetId = getRedactionTargetId(replyEvent);\n      const redactionTarget = redactionTargetId\n        ? (timelineSet?.findEventById(redactionTargetId) ??\n          room.findEventById(redactionTargetId) ??\n          null)\n        : null;\n      bodyJSX =\n        redactionTarget?.getType() === (EventType.Reaction as string)\n          ? ' redacted a reaction'\n          : ' redacted a message';\n    } else if (eventType === EventType.Reaction && !!replyEvent) {\n      image = isRedacted ? timelineIcon(Trash) : timelineIcon(Smiley);\n      if (isRedacted) {\n        bodyJSX = (\n          <ReactionDeletedContent\n            mx={mx}\n            reactionKey={getReactionKey(replyEvent)}\n            shortcode={getReactionShortcode(replyEvent)}\n            useAuthentication={useAuthentication}\n            hideIcon\n          />\n        );\n      } else {\n        const reactionKey = getReactionKey(replyEvent);\n        const reactionShortcode = getReactionShortcode(replyEvent);\n        bodyJSX = (\n          <>\n            {' reacted with '}\n            <ReactionKeyInline\n              mx={mx}\n              reactionKey={reactionKey}\n              shortcode={reactionShortcode}\n              useAuthentication={useAuthentication}\n            />\n          </>\n        );\n      }\n    } else if (eventType === EventType.RoomPinnedEvents && replyEvent) {\n      const { pinned } = replyEvent.getContent();\n      const prevPinned = replyEvent.getPrevContent().pinned;\n      const pinsAdded =\n        prevPinned && pinned && pinned.filter((x: string) => !prevPinned.includes(x));\n      const pinsRemoved =\n        prevPinned && pinned && prevPinned.filter((x: string) => !pinned.includes(x));\n      image = timelineIcon(PushPin);\n      bodyJSX = (\n        <>\n          {(pinsAdded?.length > 0 &&\n            `pinned ${pinsAdded.length} message${pinsAdded.length > 1 ? 's' : ''}`) ||\n            ''}\n          {(pinsAdded?.length > 0 && pinsRemoved?.length > 0 && ` and `) || ''}\n          {(pinsRemoved?.length > 0 &&\n            `unpinned ${pinsRemoved.length} message${pinsRemoved.length > 1 ? 's' : ''}`) ||\n            ''}\n          {(!pinsAdded || pinsAdded.length <= 0) &&\n            (!pinsRemoved || pinsRemoved.length <= 0) &&\n            `has not changed the pins`}\n        </>\n      );\n    } else if (replyEvent && eventType) {\n      const timelinePreview = replyPreviewBodyForTimelineEvent(\n        eventType,\n        replyEvent.getContent() as Record<string, unknown>,\n        isRedacted\n      );\n      if (timelinePreview !== undefined) {\n        bodyJSX = timelinePreview;\n      } else if (replyEvent.isState()) {\n        image = timelineIcon(Code);\n        bodyJSX = (\n          <>\n            {' sent '}\n            <code className={customHtmlCss.Code}>{eventType}</code>\n            {' state event'}\n          </>\n        );\n      } else {\n        bodyJSX = <MessageUnsupportedContent />;\n      }\n    }\n    if (typeof previewBodyOverride === 'string' && previewBodyOverride.length > 0 && !isRedacted) {\n      const strippedOverride = trimReplyFromBody(previewBodyOverride).replaceAll(\n        /(?:\\r\\n|\\r|\\n)/g,\n        ' '\n      );\n      bodyJSX = scaleSystemEmoji(strippedOverride);\n    }\n\n    let replyContent = bodyJSX;\n    if (isBlockedSender) {\n      replyContent = <MessageBlockedContent />;\n    } else if (badEncryption) {\n      replyContent = <MessageBadEncryptedContent />;\n    }\n\n    return (\n      <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\" {...props} ref={ref}>\n        {threadRootId && (\n          <ThreadIndicator as=\"button\" data-event-id={threadRootId} onClick={onClick} />\n        )}\n        <ReplyLayout\n          as=\"button\"\n          userColor={accessibleNameColor(pmpNameColor) ?? usernameColor}\n          icon={image}\n          replyIcon={replyIcon}\n          mentioned={mentioned}\n          username={\n            sender &&\n            eventType !== EventType.RoomMember && (\n              <Text size=\"T300\" truncate style={{ fontFamily: usernameFont }}>\n                <b>\n                  {pmp?.displayname ??\n                    getMemberDisplayName(room, sender, nicknames) ??\n                    cachedProfiles[sender]?.displayName ??\n                    getMxIdLocalPart(sender)}\n                </b>\n              </Text>\n            )\n          }\n          data-event-id={replyEventId}\n          onClick={replyEvent !== null && !isBlockedSender ? onClick : undefined}\n        >\n          {replyEvent !== undefined && !isPendingDecrypt ? (\n            <Text size=\"T300\" truncate style={{ unicodeBidi: 'plaintext' }}>\n              {replyContent}\n            </Text>\n          ) : (\n            <LinePlaceholder\n              style={{\n                backgroundColor: color.SurfaceVariant.ContainerActive,\n                width: toRem(placeholderWidth),\n                maxWidth: '100%',\n              }}\n            />\n          )}\n        </ReplyLayout>\n        {replyEvent === null && (\n          <Chip\n            variant=\"Critical\"\n            radii=\"Pill\"\n            before={menuIcon(ArrowsClockwise)}\n            onClick={(evt) => {\n              evt.stopPropagation();\n              void queryClient.invalidateQueries({\n                queryKey: [room.roomId, replyEventId],\n              });\n            }}\n          />\n        )}\n      </Box>\n    );\n  }\n);\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,o){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=o():\"function\"==typeof define&&define.amd?define(o):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isToday=o()}(this,(function(){\"use strict\";return function(e,o,t){o.prototype.isToday=function(){var e=\"YYYY-MM-DD\",o=t();return this.format(e)===o.format(e)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isYesterday=t()}(this,(function(){\"use strict\";return function(e,t,n){t.prototype.isYesterday=function(){var e=\"YYYY-MM-DD\",t=n().subtract(1,\"day\");return this.format(e)===t.format(e)}}}));","import dayjs from 'dayjs';\nimport isToday from 'dayjs/plugin/isToday';\nimport isYesterday from 'dayjs/plugin/isYesterday';\n\ndayjs.extend(isToday);\ndayjs.extend(isYesterday);\n\nexport const today = (ts: number): boolean => dayjs(ts).isToday();\n\nexport const yesterday = (ts: number): boolean => dayjs(ts).isYesterday();\n\nexport const timeHourMinute = (ts: number, hour24Clock: boolean): string =>\n  dayjs(ts).format(hour24Clock ? 'HH:mm' : 'hh:mm A');\n\nexport const timeHourMinuteSecond = (ts: number, hour24Clock: boolean): string =>\n  dayjs(ts).format(hour24Clock ? 'HH:mm:ss' : 'hh:mm:ss A');\n\nexport const timeDayMonYear = (ts: number, dateFormatString: string): string =>\n  dayjs(ts).format(dateFormatString);\n\nexport const timeDayMonthYear = (ts: number): string => dayjs(ts).format('D MMMM YYYY');\n\nexport const daysInMonth = (month: number, year: number): number =>\n  dayjs(`${year}-${month}-1`).daysInMonth();\n\nexport const dateFor = (year: number, month: number, day: number): number =>\n  dayjs(`${year}-${month}-${day}`).valueOf();\n\nexport const inSameDay = (ts1: number, ts2: number): boolean => {\n  const dt1 = new Date(ts1);\n  const dt2 = new Date(ts2);\n  return (\n    dt2.getFullYear() === dt1.getFullYear() &&\n    dt2.getMonth() === dt1.getMonth() &&\n    dt2.getDate() === dt1.getDate()\n  );\n};\n\nexport const minuteDifference = (ts1: number, ts2: number): number => {\n  const dt1 = new Date(ts1);\n  const dt2 = new Date(ts2);\n\n  const diffMs = Math.abs(dt2.getTime() - dt1.getTime());\n  return Math.floor(diffMs / 1000 / 60);\n};\n\nexport const hour24to12 = (hour24: number): number => {\n  const h = hour24 % 12;\n\n  if (h === 0) return 12;\n  return h;\n};\n\nexport const hour12to24 = (hour: number, pm: boolean): number => {\n  if (hour === 12) {\n    return pm ? 12 : 0;\n  }\n  return pm ? hour + 12 : hour;\n};\n\nexport const secondsToMs = (seconds: number) => seconds * 1000;\n\nexport const minutesToMs = (minutes: number) => minutes * secondsToMs(60);\n\nexport const hoursToMs = (hour: number) => hour * minutesToMs(60);\n\nexport const daysToMs = (days: number) => days * hoursToMs(24);\n\nexport const getToday = () => {\n  const nowTs = Date.now();\n  const date = dayjs(nowTs);\n  return dateFor(date.year(), date.month() + 1, date.date());\n};\n\nexport const getYesterday = () => {\n  const nowTs = Date.now() - daysToMs(1);\n  const date = dayjs(nowTs);\n  return dateFor(date.year(), date.month() + 1, date.date());\n};\n","import type { ComponentProps } from 'react';\nimport { Text, as, Tooltip } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport {\n  timeDayMonYear,\n  timeHourMinute,\n  timeHourMinuteSecond,\n  today,\n  yesterday,\n} from '$utils/time';\n\nexport type TimeProps = {\n  compact?: boolean;\n  ts: number;\n  hour24Clock: boolean;\n  dateFormatString: string;\n};\n\n/**\n * Renders a formatted timestamp, supporting compact and full display modes.\n *\n * Displays the time in hour:minute format if the message is from today, yesterday, or if `compact` is true.\n * For older messages, it shows the date and time.\n *\n * @param {number} ts - The timestamp to display.\n * @param {boolean} [compact=false] - If true, always show only the time.\n * @param {boolean} hour24Clock - Whether to use 24-hour time format.\n * @param {string} dateFormatString - Format string for the date part.\n * @returns {React.ReactElement} A <Text as=\"time\"> element with the formatted date/time.\n */\nexport const Time = as<'span', TimeProps & ComponentProps<typeof Text>>(\n  ({ compact, hour24Clock, dateFormatString, ts, ...props }) => {\n    const formattedTime = timeHourMinute(ts, hour24Clock);\n\n    let time = '';\n    if (compact) {\n      time = formattedTime;\n    } else if (today(ts)) {\n      time = formattedTime;\n    } else if (yesterday(ts)) {\n      time = `Yesterday ${formattedTime}`;\n    } else {\n      time = `${timeDayMonYear(ts, dateFormatString)} ${formattedTime}`;\n    }\n\n    return (\n      <TooltipProvider\n        delay={400}\n        position=\"Top\"\n        style={{ textAlign: 'center' }}\n        tooltip={\n          <Tooltip>\n            <Text size=\"H5\">\n              {timeDayMonYear(ts, dateFormatString)}\n              <br />\n              {timeHourMinuteSecond(ts, hour24Clock)}\n            </Text>\n          </Tooltip>\n        }\n      >\n        {(triggerRef) => (\n          <Text\n            as=\"time\"\n            style={{ flexShrink: 0 }}\n            size=\"T200\"\n            priority=\"300\"\n            {...props}\n            ref={triggerRef}\n          >\n            {time}\n          </Text>\n        )}\n      </TooltipProvider>\n    );\n  }\n);\n","import { Badge, Box, IconButton, Spinner, Text, as, toRem } from 'folds';\nimport { Download, sizedIcon } from '$components/icons/phosphor';\nimport type { ReactNode } from 'react';\nimport { useCallback } from 'react';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport { mimeTypeToExt } from '$utils/mimeTypes';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { decryptFile, downloadEncryptedMedia, downloadMedia, mxcUrlToHttp } from '$utils/matrix';\nimport { getDownloadFilename, saveMediaToDevice } from '$utils/download';\n\nconst badgeStyles = { maxWidth: toRem(100) };\n\ntype FileDownloadButtonProps = {\n  filename: string;\n  url: string;\n  mimeType: string;\n  encInfo?: EncryptedAttachmentInfo;\n};\nexport function FileDownloadButton({ filename, url, mimeType, encInfo }: FileDownloadButtonProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const [downloadState, download] = useAsyncCallback(\n    useCallback(async () => {\n      const mediaUrl = mxcUrlToHttp(mx, url, useAuthentication);\n      if (!mediaUrl) throw new Error('Invalid media URL');\n      await saveMediaToDevice({\n        mediaUrl,\n        filename: getDownloadFilename(filename),\n        mimeType,\n        encInfo,\n        loadBlob: () =>\n          encInfo\n            ? downloadEncryptedMedia(mediaUrl, (encBuf) => decryptFile(encBuf, mimeType, encInfo))\n            : downloadMedia(mediaUrl),\n      });\n    }, [mx, url, useAuthentication, mimeType, encInfo, filename])\n  );\n\n  const downloading = downloadState.status === AsyncStatus.Loading;\n  const hasError = downloadState.status === AsyncStatus.Error;\n  return (\n    <IconButton\n      disabled={downloading}\n      onClick={download}\n      variant={hasError ? 'Critical' : 'SurfaceVariant'}\n      size=\"300\"\n      radii=\"300\"\n    >\n      {downloading ? (\n        <Spinner size=\"100\" variant={hasError ? 'Critical' : 'Secondary'} />\n      ) : (\n        sizedIcon(Download, '100')\n      )}\n    </IconButton>\n  );\n}\n\ntype FileHeaderProps = {\n  body: string;\n  mimeType: string;\n  after?: ReactNode;\n};\nexport const FileHeader = as<'div', FileHeaderProps>(({ body, mimeType, after, ...props }, ref) => (\n  <Box alignItems=\"Center\" gap=\"200\" grow=\"Yes\" {...props} ref={ref}>\n    <Box shrink=\"No\">\n      <Badge style={badgeStyles} variant=\"Secondary\" radii=\"Pill\">\n        <Text size=\"O400\" truncate>\n          {mimeTypeToExt(mimeType)}\n        </Text>\n      </Badge>\n    </Box>\n    <Box grow=\"Yes\">\n      <Text size=\"T300\" truncate>\n        {body}\n      </Text>\n    </Box>\n    {after}\n  </Box>\n));\n","import { atom } from 'jotai';\nimport type { MatrixEvent, Room, Relations } from '$types/matrix-sdk';\nimport type { OptionMenuProps } from '$components/message/modals/Options';\n\nexport enum ModalType {\n  MobileOptions = 'mobile_options',\n  ReactionPicker = 'reaction_picker',\n  ReproxyPicker = 'reproxy_picker',\n  Delete = 'delete',\n  // for forwarding a message to another room, not to be confused with the \"share\" action which is for sharing a message to another app\n  Forward = 'forward',\n  Report = 'report',\n  Source = 'source',\n  Reactions = 'reactions',\n  EditHistory = 'edit_history',\n  ReadReceipts = 'read_receipts',\n}\n\nexport type ModalState =\n  | { type: ModalType.MobileOptions; options: OptionMenuProps }\n  | {\n      type: ModalType.ReactionPicker;\n      mEvent: MatrixEvent;\n      imagePackRooms?: Room[];\n      onReactionToggle?: (targetEventId: string, key: string, shortcode?: string) => void;\n      closeMenu: () => void;\n    }\n  | { type: ModalType.ReproxyPicker; room: Room; mEvent: MatrixEvent; closeMenu: () => void }\n  | { type: ModalType.Delete; room: Room; mEvent: MatrixEvent }\n  | { type: ModalType.Forward; room: Room; mEvent: MatrixEvent }\n  | { type: ModalType.Report; room: Room; mEvent: MatrixEvent }\n  | { type: ModalType.Source; room: Room; mEvent: MatrixEvent }\n  | { type: ModalType.EditHistory; room: Room; mEvent: MatrixEvent }\n  | { type: ModalType.Reactions; room: Room; relations: Relations }\n  | { type: ModalType.ReadReceipts; room: Room; eventId: string }\n  | null;\n\nconst modalStackAtom = atom<NonNullable<ModalState>[]>([]);\n\nexport const modalAtom = atom(\n  (get) => get(modalStackAtom).at(-1) ?? null,\n  (_get, set, next: ModalState) => {\n    set(modalStackAtom, next ? [next] : []);\n  }\n);\n\nexport const pushModalAtom = atom(null, (get, set, next: NonNullable<ModalState>) => {\n  set(modalStackAtom, [...get(modalStackAtom), next]);\n});\n\nexport const popModalAtom = atom(null, (get, set) => {\n  set(modalStackAtom, get(modalStackAtom).slice(0, -1));\n});\n","import type { Room } from '$types/matrix-sdk';\nimport { useAtomValue } from 'jotai';\nimport { useCallback, useMemo } from 'react';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport const useAllJoinedRoomsSet = () => {\n  const allRooms = useAtomValue(allRoomsAtom);\n  const allJoinedRooms = useMemo(() => new Set(allRooms), [allRooms]);\n\n  return allJoinedRooms;\n};\n\nexport type GetRoomCallback = (roomId: string) => Room | undefined;\nexport const useGetRoom = (rooms: Set<string>): GetRoomCallback => {\n  const mx = useMatrixClient();\n\n  const getRoom: GetRoomCallback = useCallback(\n    (rId: string) => {\n      if (rooms.has(rId)) {\n        return mx.getRoom(rId) ?? undefined;\n      }\n      return undefined;\n    },\n    [mx, rooms]\n  );\n\n  return getRoom;\n};\n","import { useMemo } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { useAllJoinedRoomsSet, useGetRoom } from './useGetRoom';\nimport { factoryRoomIdByActivity } from '$utils/sort';\nimport { useMatrixClient } from './useMatrixClient';\n\n/**\n * Returns a sorted list of room IDs that can receive a forwarded/shared message.\n * Excludes space rooms and rooms where the user cannot send messages.\n */\nexport function useMessageTargetRooms(): string[] {\n  const mx = useMatrixClient();\n  const allRooms = useAtomValue(allRoomsAtom);\n  const allJoinedRooms = useAllJoinedRoomsSet();\n  const getRoom = useGetRoom(allJoinedRooms);\n\n  return useMemo(\n    () =>\n      allRooms\n        .filter((id) => {\n          const target = getRoom(id);\n          return !!target && !target.isSpaceRoom() && target.maySendMessage();\n        })\n        .sort(factoryRoomIdByActivity(mx)),\n    [allRooms, getRoom, mx]\n  );\n}\n","import type { Atom } from 'jotai';\nimport { useAtomValue } from 'jotai';\nimport { selectAtom } from 'jotai/utils';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { useCallback, useMemo } from 'react';\nimport { getAllParents, isRoom, isSpace } from '$utils/room/hierarchy';\nimport type { RoomToParents } from '$types/matrix/room';\nimport { compareRoomsEqual } from '$state/room-list/utils';\n\nexport type RoomsAtom = Atom<string[]>;\nexport type RoomSelector = (roomId: string) => boolean | undefined;\n\nconst selectedRoomsAtom = (\n  roomsAtom: RoomsAtom,\n  selector: (roomId: string) => boolean | undefined\n) => selectAtom(roomsAtom, (rooms) => rooms.filter(selector), compareRoomsEqual);\n\nconst useSelectedRooms = (roomsAtom: RoomsAtom, selector: RoomSelector) => {\n  const anAtom = useMemo(() => selectedRoomsAtom(roomsAtom, selector), [roomsAtom, selector]);\n\n  return useAtomValue(anAtom);\n};\n\nexport type SpaceChildSelectorFactory = (parentId: string) => RoomSelector;\n\nexport const useRecursiveChildScopeFactory = (\n  mx: MatrixClient,\n  roomToParents: RoomToParents\n): SpaceChildSelectorFactory =>\n  useCallback(\n    (parentId: string) => (roomId) =>\n      isRoom(mx.getRoom(roomId)) &&\n      roomToParents.has(roomId) &&\n      getAllParents(roomToParents, roomId).has(parentId),\n    [mx, roomToParents]\n  );\n\nexport const useRecursiveChildSpaceScopeFactory = (\n  mx: MatrixClient,\n  roomToParents: RoomToParents\n): SpaceChildSelectorFactory =>\n  useCallback(\n    (parentId: string) => (roomId) =>\n      isSpace(mx.getRoom(roomId)) &&\n      roomToParents.has(roomId) &&\n      getAllParents(roomToParents, roomId).has(parentId),\n    [mx, roomToParents]\n  );\n\nexport const useRecursiveChildRoomScopeFactory = (\n  mx: MatrixClient,\n  mDirects: Set<string>,\n  roomToParents: RoomToParents\n): SpaceChildSelectorFactory =>\n  useCallback(\n    (parentId: string) => (roomId) =>\n      isRoom(mx.getRoom(roomId)) &&\n      !mDirects.has(roomId) &&\n      roomToParents.has(roomId) &&\n      getAllParents(roomToParents, roomId).has(parentId),\n    [mx, mDirects, roomToParents]\n  );\n\nexport const useSpaceChildren = (\n  roomsAtom: RoomsAtom,\n  spaceId: string,\n  selectorFactory: SpaceChildSelectorFactory\n) => {\n  const recursiveChildRoomSelector = useMemo(\n    () => selectorFactory(spaceId),\n    [selectorFactory, spaceId]\n  );\n  return useSelectedRooms(roomsAtom, recursiveChildRoomSelector);\n};\n\nexport const useSpaces = (mx: MatrixClient, roomsAtom: RoomsAtom) => {\n  const selector: RoomSelector = useCallback((roomId) => isSpace(mx.getRoom(roomId)), [mx]);\n  return useSelectedRooms(roomsAtom, selector);\n};\n\nexport const useOrphanSpaces = (\n  mx: MatrixClient,\n  roomsAtom: RoomsAtom,\n  roomToParents: RoomToParents\n) => {\n  const selector: RoomSelector = useCallback(\n    (roomId) => isSpace(mx.getRoom(roomId)) && !roomToParents.has(roomId),\n    [mx, roomToParents]\n  );\n  return useSelectedRooms(roomsAtom, selector);\n};\n\nexport const useRooms = (mx: MatrixClient, roomsAtom: RoomsAtom, mDirects: Set<string>) => {\n  const selector: RoomSelector = useCallback(\n    (roomId: string) => isRoom(mx.getRoom(roomId)) && !mDirects.has(roomId),\n    [mx, mDirects]\n  );\n  return useSelectedRooms(roomsAtom, selector);\n};\n\nexport const useOrphanRooms = (\n  mx: MatrixClient,\n  roomsAtom: RoomsAtom,\n  mDirects: Set<string>,\n  roomToParents: RoomToParents,\n  isShowingAllRoomsInHome?: boolean\n) => {\n  const selector: RoomSelector = useCallback(\n    (roomId) =>\n      isRoom(mx.getRoom(roomId)) &&\n      !mDirects.has(roomId) &&\n      (isShowingAllRoomsInHome || !roomToParents.has(roomId)),\n    [mx, mDirects, roomToParents, isShowingAllRoomsInHome]\n  );\n  return useSelectedRooms(roomsAtom, selector);\n};\n\nexport const useDirects = (mx: MatrixClient, roomsAtom: RoomsAtom, mDirects: Set<string>) => {\n  const selector: RoomSelector = useCallback(\n    (roomId) => isRoom(mx.getRoom(roomId)) && mDirects.has(roomId),\n    [mx, mDirects]\n  );\n  return useSelectedRooms(roomsAtom, selector);\n};\n","export type NormalizeOption = {\n  caseSensitive?: boolean;\n  normalizeUnicode?: boolean;\n  ignoreWhitespace?: boolean;\n};\n\nexport type MatchQueryOption = {\n  contain?: boolean;\n};\n\nexport type AsyncSearchOption = {\n  limit?: number;\n};\n\nexport type MatchHandler<TSearchItem extends object | string | number> = (\n  item: TSearchItem,\n  query: string\n) => boolean;\nexport type ResultHandler<TSearchItem extends object | string | number> = (\n  results: TSearchItem[],\n  query: string\n) => void;\n\nexport type AsyncSearchHandler = (query: string) => void;\nexport type TerminateAsyncSearch = () => void;\n\nexport const normalize = (str: string, options?: NormalizeOption) => {\n  let nStr = str.normalize((options?.normalizeUnicode ?? true) ? 'NFKC' : 'NFC');\n  if (!options?.caseSensitive) nStr = nStr.toLocaleLowerCase();\n  if (options?.ignoreWhitespace ?? true) nStr = nStr.replaceAll(/\\s/g, '');\n  return nStr;\n};\n\nexport const matchQuery = (item: string, query: string, options?: MatchQueryOption): boolean => {\n  if (options?.contain) return item.includes(query);\n  return item.startsWith(query);\n};\n\nexport const AsyncSearch = <TSearchItem extends object | string | number>(\n  list: TSearchItem[],\n  match: MatchHandler<TSearchItem>,\n  onResult: ResultHandler<TSearchItem>,\n  options?: AsyncSearchOption\n): [AsyncSearchHandler, TerminateAsyncSearch] => {\n  let resultList: TSearchItem[] = [];\n\n  let searchIndex = 0;\n  let sessionStartTimestamp = 0;\n  let sessionScheduleId: ReturnType<typeof setTimeout> | undefined;\n\n  const terminateSearch: TerminateAsyncSearch = () => {\n    resultList = [];\n    searchIndex = 0;\n    sessionStartTimestamp = 0;\n    if (sessionScheduleId) clearTimeout(sessionScheduleId);\n    sessionScheduleId = undefined;\n  };\n\n  const find = (query: string, sessionTimestamp: number) => {\n    const findingCount = resultList.length;\n    sessionScheduleId = undefined;\n    // return if find session got reset\n    if (sessionTimestamp !== sessionStartTimestamp) return;\n\n    sessionStartTimestamp = globalThis.performance.now();\n    for (; searchIndex < list.length; searchIndex += 1) {\n      const item = list[searchIndex];\n      if (item !== undefined && match(item, query)) {\n        resultList.push(item);\n        if (typeof options?.limit === 'number' && resultList.length >= options.limit) {\n          break;\n        }\n      }\n\n      const matchFinishTime = globalThis.performance.now();\n      if (matchFinishTime - sessionStartTimestamp > 8) {\n        const currentFindingCount = resultList.length;\n        const thisSessionTimestamp = sessionStartTimestamp;\n        if (findingCount !== currentFindingCount) onResult(resultList, query);\n\n        searchIndex += 1;\n        sessionScheduleId = globalThis.setTimeout(() => find(query, thisSessionTimestamp), 1);\n        return;\n      }\n    }\n\n    if (findingCount !== resultList.length || findingCount === 0) {\n      onResult(resultList, query);\n    }\n    terminateSearch();\n  };\n\n  const search: AsyncSearchHandler = (query: string) => {\n    terminateSearch();\n    if (query === '') {\n      onResult(resultList, query);\n      return;\n    }\n    find(query, sessionStartTimestamp);\n  };\n\n  return [search, terminateSearch];\n};\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n  MatchHandler,\n  AsyncSearchHandler,\n  AsyncSearchOption,\n  MatchQueryOption,\n  NormalizeOption,\n  ResultHandler,\n} from '$utils/AsyncSearch';\nimport { AsyncSearch, normalize, matchQuery } from '$utils/AsyncSearch';\nimport { sanitizeForRegex } from '$utils/regex';\n\nexport type UseAsyncSearchOptions = AsyncSearchOption & {\n  matchOptions?: MatchQueryOption;\n  normalizeOptions?: NormalizeOption;\n};\n\nexport type SearchItemStrGetter<TSearchItem extends object | string | number> = (\n  searchItem: TSearchItem,\n  query: string\n) => string | string[];\n\nexport type UseAsyncSearchResult<TSearchItem extends object | string | number> = {\n  query: string;\n  items: TSearchItem[];\n};\n\nexport type SearchResetHandler = () => void;\n\nconst performMatch = (\n  target: string | string[],\n  query: string,\n  options?: UseAsyncSearchOptions\n): string | undefined => {\n  if (Array.isArray(target)) {\n    const matchTarget = target.find((i) =>\n      matchQuery(normalize(i, options?.normalizeOptions), query, options?.matchOptions)\n    );\n    return matchTarget ? normalize(matchTarget, options?.normalizeOptions) : undefined;\n  }\n\n  const normalizedTargetStr = normalize(target, options?.normalizeOptions);\n  const matches = matchQuery(normalizedTargetStr, query, options?.matchOptions);\n  return matches ? normalizedTargetStr : undefined;\n};\n\nconst orderSearchItems = <TSearchItem extends object | string | number>(\n  query: string,\n  items: TSearchItem[],\n  getItemStr: SearchItemStrGetter<TSearchItem>,\n  options?: UseAsyncSearchOptions\n): TSearchItem[] => {\n  const orderedItems: TSearchItem[] = Array.from(items);\n\n  // we will consider \"_\" as word boundary char.\n  // because in more use-cases it is used. (like: emojishortcode)\n  const boundaryRegex = new RegExp(`(\\\\b|_)${sanitizeForRegex(query)}`);\n  const perfectBoundaryRegex = new RegExp(`(\\\\b|_)${sanitizeForRegex(query)}(\\\\b|_)`);\n\n  orderedItems.sort((i1, i2) => {\n    const str1 = performMatch(getItemStr(i1, query), query, options);\n    const str2 = performMatch(getItemStr(i2, query), query, options);\n\n    if (str1 === undefined && str2 === undefined) return 0;\n    if (str1 === undefined) return 1;\n    if (str2 === undefined) return -1;\n\n    let points1 = 0;\n    let points2 = 0;\n\n    // short string should score more\n    const pointsToSmallStr = (points: number) => {\n      if (str1.length < str2.length) points1 += points;\n      else if (str2.length < str1.length) points2 += points;\n    };\n    pointsToSmallStr(1);\n\n    // closes query match should score more\n    const indexIn1 = str1.indexOf(query);\n    const indexIn2 = str2.indexOf(query);\n    if (indexIn1 < indexIn2) points1 += 2;\n    else if (indexIn2 < indexIn1) points2 += 2;\n    else pointsToSmallStr(2);\n\n    // query match word start on boundary should score more\n    const boundaryIn1 = str1.match(boundaryRegex);\n    const boundaryIn2 = str2.match(boundaryRegex);\n    if (boundaryIn1 && boundaryIn2) pointsToSmallStr(4);\n    else if (boundaryIn1) points1 += 4;\n    else if (boundaryIn2) points2 += 4;\n\n    // query match word start and end on boundary should score more\n    const perfectBoundaryIn1 = str1.match(perfectBoundaryRegex);\n    const perfectBoundaryIn2 = str2.match(perfectBoundaryRegex);\n    if (perfectBoundaryIn1 && perfectBoundaryIn2) pointsToSmallStr(8);\n    else if (perfectBoundaryIn1) points1 += 8;\n    else if (perfectBoundaryIn2) points2 += 8;\n\n    return points2 - points1;\n  });\n\n  return orderedItems;\n};\n\nexport const useAsyncSearch = <TSearchItem extends object | string | number>(\n  list: TSearchItem[],\n  getItemStr: SearchItemStrGetter<TSearchItem>,\n  options?: UseAsyncSearchOptions\n): [UseAsyncSearchResult<TSearchItem> | undefined, AsyncSearchHandler, SearchResetHandler] => {\n  const [result, setResult] = useState<UseAsyncSearchResult<TSearchItem>>();\n\n  const [searchCallback, terminateSearch] = useMemo(() => {\n    setResult(undefined);\n\n    const handleMatch: MatchHandler<TSearchItem> = (item, query) => {\n      const itemStr = getItemStr(item, query);\n\n      const strWithMatch = performMatch(itemStr, query, options);\n      return typeof strWithMatch === 'string';\n    };\n\n    const handleResult: ResultHandler<TSearchItem> = (results, query) =>\n      setResult({\n        query,\n        items: orderSearchItems(query, results, getItemStr, options),\n      });\n\n    return AsyncSearch(list, handleMatch, handleResult, options);\n  }, [list, options, getItemStr]);\n\n  const searchHandler: AsyncSearchHandler = useCallback(\n    (query) => {\n      const normalizedQuery = normalize(query, options?.normalizeOptions);\n      searchCallback(normalizedQuery);\n    },\n    [searchCallback, options?.normalizeOptions]\n  );\n\n  const resetHandler: SearchResetHandler = useCallback(() => {\n    terminateSearch();\n    setResult(undefined);\n  }, [terminateSearch]);\n\n  useEffect(\n    () => () => {\n      // terminate any ongoing search request on unmount.\n      terminateSearch();\n    },\n    [terminateSearch]\n  );\n\n  return [result, searchHandler, resetHandler];\n};\n","import { useCallback, useState } from 'react';\n\nexport const useListFocusIndex = (size: number, initialIndex: number) => {\n  const [index, setIndex] = useState(initialIndex);\n\n  const next = useCallback(() => {\n    setIndex((i) => {\n      const nextIndex = i + 1;\n      if (nextIndex >= size) {\n        return 0;\n      }\n      return nextIndex;\n    });\n  }, [size]);\n\n  const previous = useCallback(() => {\n    setIndex((i) => {\n      const previousIndex = i - 1;\n      if (previousIndex < 0) {\n        return size - 1;\n      }\n      return previousIndex;\n    });\n  }, [size]);\n\n  const reset = useCallback(() => {\n    setIndex(initialIndex);\n  }, [initialIndex]);\n\n  return {\n    index,\n    next,\n    previous,\n    reset,\n  };\n};\n","import type { MatrixClient, Room } from '$types/matrix-sdk';\nimport type { UnreadInfo } from '$types/matrix/room';\nimport { Direction, KnownMembership, NotificationCountType } from '$types/matrix-sdk';\nimport {\n  countTimelineUnread,\n  getFullyReadEventId,\n  hasAnyReadReceipt,\n  isReadBoundaryLoaded,\n} from './unread';\n\nconst PAGE_SIZE = 50;\nconst MAX_BACKFILLED_EVENTS = 250;\n\nexport type UnreadResolutionUpdate = (room: Room, unreadInfo?: UnreadInfo) => void;\n\ntype PendingRoom = {\n  room: Room;\n  initialEventCount: number;\n};\n\nconst lastLoadedEventId = (room: Room): string | undefined => {\n  const events = room.getLiveTimeline().getEvents();\n  return events[events.length - 1]?.getId();\n};\n\nexport class UnreadCountResolver {\n  private readonly pending = new Set<string>();\n\n  private readonly settled = new Map<string, string | undefined>();\n\n  private pumping = false;\n\n  private disposed = false;\n\n  public constructor(\n    private readonly mx: MatrixClient,\n    private readonly onUpdate: UnreadResolutionUpdate\n  ) {}\n\n  public queue(roomId: string): void {\n    if (this.disposed) return;\n    if (this.settled.has(roomId)) {\n      const room = this.mx.getRoom(roomId);\n      if (room && this.settled.get(roomId) === lastLoadedEventId(room)) return;\n      this.settled.delete(roomId);\n    }\n    this.pending.add(roomId);\n    void this.pump();\n  }\n\n  public dispose(): void {\n    this.disposed = true;\n    this.pending.clear();\n  }\n\n  private settle(room: Room): void {\n    this.settled.set(room.roomId, lastLoadedEventId(room));\n    this.pending.delete(room.roomId);\n  }\n\n  private async pump(): Promise<void> {\n    if (this.pumping || this.disposed) return;\n    this.pumping = true;\n    try {\n      while (this.pending.size > 0 && !this.disposed) {\n        const userId = this.mx.getUserId();\n        if (!userId) break;\n\n        const roomIds = [...this.pending];\n        this.pending.clear();\n\n        let active: PendingRoom[] = roomIds\n          .map((roomId) => this.mx.getRoom(roomId))\n          .filter(\n            (room): room is Room =>\n              !!room && room.getMyMembership() === (KnownMembership.Join as string)\n          )\n          .map((room) => ({\n            room,\n            initialEventCount: room.getLiveTimeline().getEvents().length,\n          }))\n          .toSorted((a, b) => b.room.getLastActiveTimestamp() - a.room.getLastActiveTimestamp());\n\n        while (active.length > 0 && !this.disposed) {\n          const next: PendingRoom[] = [];\n          for (const state of active) {\n            if (this.disposed) break;\n            // eslint-disable-next-line no-await-in-loop\n            if (await this.advanceRoom(state, userId)) next.push(state);\n          }\n          active = next;\n        }\n      }\n    } finally {\n      this.pumping = false;\n      if (this.pending.size > 0 && !this.disposed) void this.pump();\n    }\n  }\n\n  /** Backfills one page. Returns true while the room needs more pages. */\n  private async advanceRoom(state: PendingRoom, userId: string): Promise<boolean> {\n    const { room } = state;\n    if (room.getMyMembership() !== (KnownMembership.Join as string)) {\n      this.settle(room);\n      return false;\n    }\n\n    if (isReadBoundaryLoaded(room, userId)) {\n      this.settle(room);\n      this.onUpdate(room, undefined);\n      return false;\n    }\n\n    const loadedCount = room.getLiveTimeline().getEvents().length;\n    if (loadedCount >= state.initialEventCount + MAX_BACKFILLED_EVENTS) {\n      this.settle(room);\n      this.publishLowerBound(room, userId);\n      return false;\n    }\n\n    const tokenBefore = room.getLiveTimeline().getPaginationToken(Direction.Backward);\n    try {\n      await this.mx.scrollback(room, PAGE_SIZE);\n    } catch {\n      this.settle(room);\n      return false;\n    }\n    if (this.disposed) return false;\n\n    if (isReadBoundaryLoaded(room, userId)) {\n      this.settle(room);\n      this.onUpdate(room, undefined);\n      return false;\n    }\n    const tokenAfter = room.getLiveTimeline().getPaginationToken(Direction.Backward);\n    if (tokenAfter === tokenBefore) {\n      this.settle(room);\n      return false;\n    }\n    return true;\n  }\n\n  private publishLowerBound(room: Room, userId: string): void {\n    const fullyReadId = getFullyReadEventId(room);\n    if (fullyReadId && !hasAnyReadReceipt(room, userId)) return;\n\n    const counted = countTimelineUnread(room, userId, { stopAtOwnEvent: true });\n    if (counted.total === 0 && counted.highlight === 0) return;\n    if (counted.total <= room.getUnreadNotificationCount(NotificationCountType.Total)) return;\n    this.onUpdate(room, {\n      roomId: room.roomId,\n      highlight: counted.highlight,\n      total: counted.total,\n      estimated: true,\n    });\n  }\n}\n","import type { PushRuleAction } from '$types/matrix-sdk';\nimport { PushRuleActionName, TweakName } from '$types/matrix-sdk';\nimport { useCallback, useMemo } from 'react';\n\nexport enum NotificationMode {\n  OFF = 'OFF',\n  Notify = 'Notify',\n  NotifyLoud = 'NotifyLoud',\n}\n\nexport const getNotificationMode = (actions: PushRuleAction[]): NotificationMode => {\n  const soundTweak = actions.find(\n    (action) => typeof action === 'object' && action.set_tweak === TweakName.Sound\n  );\n  const notify = actions.find(\n    (action) => typeof action === 'string' && action === PushRuleActionName.Notify\n  );\n\n  if (notify && soundTweak) return NotificationMode.NotifyLoud;\n  if (notify) return NotificationMode.Notify;\n  return NotificationMode.OFF;\n};\n\nexport type NotificationModeOptions = {\n  soundValue?: string;\n  highlight?: boolean;\n};\nexport const getNotificationModeActions = (\n  mode: NotificationMode,\n  options?: NotificationModeOptions\n): PushRuleAction[] => {\n  if (mode === NotificationMode.OFF) return [];\n\n  const actions: PushRuleAction[] = [PushRuleActionName.Notify];\n\n  if (mode === NotificationMode.NotifyLoud) {\n    actions.push({\n      set_tweak: TweakName.Sound,\n      value: options?.soundValue ?? 'default',\n    });\n  }\n\n  if (options?.highlight) {\n    actions.push({\n      set_tweak: TweakName.Highlight,\n      value: true,\n    });\n  }\n\n  return actions;\n};\n\nexport type GetNotificationModeCallback = (mode: NotificationMode) => PushRuleAction[];\nexport const useNotificationModeActions = (\n  options?: NotificationModeOptions\n): GetNotificationModeCallback => {\n  const getAction: GetNotificationModeCallback = useCallback(\n    (mode) => getNotificationModeActions(mode, options),\n    [options]\n  );\n\n  return getAction;\n};\n\nexport const useNotificationActionsMode = (actions: PushRuleAction[]): NotificationMode => {\n  const mode: NotificationMode = useMemo(() => getNotificationMode(actions), [actions]);\n\n  return mode;\n};\n","import { createContext, useCallback, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport type { IPushRules, MatrixClient } from '$types/matrix-sdk';\nimport { ConditionKind, PushRuleKind, EventType } from '$types/matrix-sdk';\nimport type { IconProps } from '@phosphor-icons/react';\nimport { Bell, BellRinging, BellSlash, chipIcon, menuIcon } from '$components/icons/phosphor';\n\nimport { isRoomId } from '$utils/matrix';\nimport { useAccountData } from './useAccountData';\nimport {\n  getNotificationMode,\n  getNotificationModeActions,\n  NotificationMode,\n} from './useNotificationMode';\nimport { useAsyncCallback } from './useAsyncCallback';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport type RoomsNotificationPreferences = {\n  mute: Set<string>;\n  specialMessages: Set<string>;\n  allMessages: Set<string>;\n};\n\nconst RoomsNotificationPreferencesContext = createContext<RoomsNotificationPreferences | null>(\n  null\n);\nexport const RoomsNotificationPreferencesProvider = RoomsNotificationPreferencesContext.Provider;\n\nexport const useRoomsNotificationPreferencesContext = (): RoomsNotificationPreferences => {\n  const preferences = useContext(RoomsNotificationPreferencesContext);\n\n  if (!preferences) {\n    throw new Error('No RoomsNotificationPreferences provided!');\n  }\n\n  return preferences;\n};\n\nexport const useRoomsNotificationPreferences = (): RoomsNotificationPreferences => {\n  const pushRules = useAccountData(EventType.PushRules)?.getContent<IPushRules>();\n\n  const preferences: RoomsNotificationPreferences = useMemo(() => {\n    const global = pushRules?.global;\n    const room = global?.room ?? [];\n    const override = global?.override ?? [];\n\n    const pref: RoomsNotificationPreferences = {\n      mute: new Set(),\n      specialMessages: new Set(),\n      allMessages: new Set(),\n    };\n\n    override.forEach((rule) => {\n      if (isRoomId(rule.rule_id) && getNotificationMode(rule.actions) === NotificationMode.OFF) {\n        pref.mute.add(rule.rule_id);\n      }\n    });\n    room.forEach((rule) => {\n      if (getNotificationMode(rule.actions) === NotificationMode.OFF) {\n        pref.specialMessages.add(rule.rule_id);\n      }\n    });\n    room.forEach((rule) => {\n      if (getNotificationMode(rule.actions) !== NotificationMode.OFF) {\n        pref.allMessages.add(rule.rule_id);\n      }\n    });\n\n    return pref;\n  }, [pushRules]);\n\n  return preferences;\n};\n\nexport enum RoomNotificationMode {\n  Unset = 'Unset',\n  Mute = 'Mute',\n  SpecialMessages = 'SpecialMessages',\n  AllMessages = 'AllMessages',\n}\n\nexport const getRoomNotificationMode = (\n  preferences: RoomsNotificationPreferences,\n  roomId: string\n): RoomNotificationMode => {\n  if (preferences.mute.has(roomId)) {\n    return RoomNotificationMode.Mute;\n  }\n  if (preferences.specialMessages.has(roomId)) {\n    return RoomNotificationMode.SpecialMessages;\n  }\n  if (preferences.allMessages.has(roomId)) {\n    return RoomNotificationMode.AllMessages;\n  }\n\n  return RoomNotificationMode.Unset;\n};\nexport const roomNotificationModeIcon = (\n  mode?: RoomNotificationMode,\n  props?: IconProps\n): ReactNode => {\n  if (mode === RoomNotificationMode.Mute) return menuIcon(BellSlash, props);\n  if (mode === RoomNotificationMode.SpecialMessages) return menuIcon(Bell, props);\n  if (mode === RoomNotificationMode.AllMessages) return menuIcon(BellRinging, props);\n\n  return menuIcon(Bell, props);\n};\n\nexport const roomNotificationModeChipIcon = (mode?: RoomNotificationMode): ReactNode => {\n  if (mode === RoomNotificationMode.Mute) return chipIcon(BellSlash);\n  if (mode === RoomNotificationMode.SpecialMessages) return chipIcon(Bell);\n  if (mode === RoomNotificationMode.AllMessages) return chipIcon(BellRinging);\n\n  return chipIcon(Bell);\n};\n\nconst setRoomNotificationPreference = async (\n  mx: MatrixClient,\n  roomId: string,\n  mode: RoomNotificationMode,\n  previousMode: RoomNotificationMode\n): Promise<void> => {\n  // remove the old preference\n  if (\n    previousMode === RoomNotificationMode.AllMessages ||\n    previousMode === RoomNotificationMode.SpecialMessages\n  ) {\n    await mx.deletePushRule('global', PushRuleKind.RoomSpecific, roomId);\n  }\n  if (previousMode === RoomNotificationMode.Mute) {\n    await mx.deletePushRule('global', PushRuleKind.Override, roomId);\n  }\n\n  // set new preference\n  if (mode === RoomNotificationMode.Unset) {\n    return;\n  }\n\n  if (mode === RoomNotificationMode.Mute) {\n    await mx.addPushRule('global', PushRuleKind.Override, roomId, {\n      conditions: [\n        {\n          kind: ConditionKind.EventMatch,\n          key: 'room_id',\n          pattern: roomId,\n        },\n      ],\n      actions: getNotificationModeActions(NotificationMode.OFF),\n    });\n    return;\n  }\n\n  await mx.addPushRule('global', PushRuleKind.RoomSpecific, roomId, {\n    actions:\n      mode === RoomNotificationMode.AllMessages\n        ? getNotificationModeActions(NotificationMode.NotifyLoud)\n        : getNotificationModeActions(NotificationMode.OFF),\n  });\n};\n\nexport const useSetRoomNotificationPreference = (roomId: string) => {\n  const mx = useMatrixClient();\n\n  const [modeState, setMode] = useAsyncCallback(\n    useCallback(\n      (mode: RoomNotificationMode, previousMode: RoomNotificationMode) =>\n        setRoomNotificationPreference(mx, roomId, mode, previousMode),\n      [mx, roomId]\n    )\n  );\n\n  return {\n    modeState,\n    setMode,\n  };\n};\n","import { useEffect } from 'react';\n\n/**\n * Subscribes to an event on a Matrix SDK emitter and auto-cleans up.\n * Replaces hand-rolled `emitter.on(event, handler)` + `return () => emitter.removeListener(event, handler)` in useEffect.\n */\n// oxlint-disable typescript/no-explicit-any\nexport function useMatrixEvent(\n  emitter:\n    | {\n        on: (event: any, handler: (...args: any[]) => void) => any;\n        removeListener: (event: any, handler: (...args: any[]) => void) => any;\n      }\n    | undefined\n    | null,\n  eventName: string,\n  handler: (...args: any[]) => void\n): void {\n  useEffect(() => {\n    if (!emitter) return undefined;\n    emitter.on(eventName, handler);\n    return () => emitter.removeListener(eventName, handler);\n  }, [emitter, eventName, handler]);\n}\n","import { produce } from 'immer';\nimport { atom, useAtomValue, useSetAtom } from 'jotai';\nimport type {\n  IRoomTimelineData,\n  MatrixClient,\n  MatrixEvent,\n  Room,\n  RoomEventHandlerMap,\n  ReceiptType,\n} from '$types/matrix-sdk';\nimport { RoomEvent, SyncState, EventType, ClientEvent, KnownMembership } from '$types/matrix-sdk';\nimport { useCallback, useEffect, useRef } from 'react';\nimport type { RoomToUnread, UnreadInfo, Unread } from '$types/matrix/room';\nimport { NotificationType } from '$types/matrix/room';\nimport { getAllParents } from '$utils/room/hierarchy';\nimport {\n  getNotificationType,\n  getUnreadInfo,\n  getUnreadInfos,\n  getUnreadInfosForRooms,\n  isNotificationEvent,\n} from '$utils/room/unread';\nimport { UnreadCountResolver } from '$utils/room/unreadResolver';\nimport { useSyncState } from '$hooks/useSyncState';\nimport { useRoomsNotificationPreferencesContext } from '$hooks/useRoomsNotificationPreferences';\nimport { useMatrixEvent } from '$hooks/useMatrixEvent';\nimport { getClientSyncDiagnostics, getSlidingSyncManager } from '$client/initMatrix';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { roomToParentsAtom } from './roomToParents';\n\ntype RoomToUnreadAction =\n  | {\n      type: 'RESET';\n      unreadInfos: UnreadInfo[];\n    }\n  | {\n      type: 'PUT';\n      unreadInfo: UnreadInfo;\n    }\n  | {\n      type: 'DELETE';\n      roomId: string;\n    };\n\nconst unreadInfoToUnread = (unreadInfo: UnreadInfo): Unread => ({\n  highlight: unreadInfo.highlight,\n  total: unreadInfo.total,\n  from: null,\n});\n\nconst putUnreadInfo = (\n  roomToUnread: RoomToUnread,\n  allParents: Set<string>,\n  unreadInfo: UnreadInfo\n) => {\n  const oldUnread = roomToUnread.get(unreadInfo.roomId) ?? {\n    highlight: 0,\n    total: 0,\n    from: null,\n  };\n  roomToUnread.set(unreadInfo.roomId, unreadInfoToUnread(unreadInfo));\n\n  const newH = unreadInfo.highlight - oldUnread.highlight;\n  const newT = unreadInfo.total - oldUnread.total;\n\n  allParents.forEach((parentId) => {\n    const oldParentUnread = roomToUnread.get(parentId) ?? {\n      highlight: 0,\n      total: 0,\n      from: null,\n    };\n    roomToUnread.set(parentId, {\n      highlight: (oldParentUnread.highlight += newH),\n      total: (oldParentUnread.total += newT),\n      from: new Set([...(oldParentUnread.from ?? []), unreadInfo.roomId]),\n    });\n  });\n};\n\nconst deleteUnreadInfo = (roomToUnread: RoomToUnread, allParents: Set<string>, roomId: string) => {\n  const oldUnread = roomToUnread.get(roomId);\n  if (!oldUnread) return;\n  roomToUnread.delete(roomId);\n\n  allParents.forEach((parentId) => {\n    const oldParentUnread = roomToUnread.get(parentId);\n    if (!oldParentUnread) return;\n    const newFrom = new Set(oldParentUnread.from ?? roomId);\n    newFrom.delete(roomId);\n    if (newFrom.size === 0) {\n      roomToUnread.delete(parentId);\n      return;\n    }\n    roomToUnread.set(parentId, {\n      highlight: oldParentUnread.highlight - oldUnread.highlight,\n      total: oldParentUnread.total - oldUnread.total,\n      from: newFrom,\n    });\n  });\n};\n\nexport const unreadEqual = (u1: Unread, u2: Unread): boolean => {\n  const countEqual = u1.highlight === u2.highlight && u1.total === u2.total;\n\n  if (!countEqual) return false;\n\n  const f1 = u1.from;\n  const f2 = u2.from;\n  if (f1 === null && f2 === null) return true;\n  if (f1 === null || f2 === null) return false;\n\n  if (f1.size !== f2.size) return false;\n\n  let fromEqual = true;\n  f1?.forEach((item) => {\n    if (!f2?.has(item)) {\n      fromEqual = false;\n    }\n  });\n\n  return fromEqual;\n};\n\nconst baseRoomToUnread = atom(new Map());\nexport const roomToUnreadAtom = atom<RoomToUnread, [RoomToUnreadAction], undefined>(\n  (get) => get(baseRoomToUnread),\n  (get, set, action) => {\n    const allParentsOf = (roomId: string): Set<string> =>\n      getAllParents(get(roomToParentsAtom), roomId);\n\n    if (action.type === 'RESET') {\n      const draftRoomToUnread: RoomToUnread = new Map();\n      action.unreadInfos.forEach((unreadInfo) => {\n        putUnreadInfo(draftRoomToUnread, allParentsOf(unreadInfo.roomId), unreadInfo);\n      });\n      set(baseRoomToUnread, draftRoomToUnread);\n      return;\n    }\n    if (action.type === 'PUT') {\n      const { unreadInfo } = action;\n      const currentUnread = get(baseRoomToUnread).get(unreadInfo.roomId);\n      // Estimated results never replace counts resolved from read evidence.\n      if (unreadInfo.estimated && currentUnread && currentUnread.total >= unreadInfo.total) {\n        return;\n      }\n      if (unreadInfo.total <= 0 && unreadInfo.highlight <= 0) {\n        if (get(baseRoomToUnread).has(unreadInfo.roomId)) {\n          set(\n            baseRoomToUnread,\n            produce(get(baseRoomToUnread), (draftRoomToUnread) =>\n              deleteUnreadInfo(\n                draftRoomToUnread,\n                allParentsOf(unreadInfo.roomId),\n                unreadInfo.roomId\n              )\n            )\n          );\n        }\n        return;\n      }\n      if (currentUnread && unreadEqual(currentUnread, unreadInfoToUnread(unreadInfo))) {\n        // Do not update if unread data has not changed\n        // like total & highlight\n        return;\n      }\n      set(\n        baseRoomToUnread,\n        produce(get(baseRoomToUnread), (draftRoomToUnread) =>\n          putUnreadInfo(draftRoomToUnread, allParentsOf(unreadInfo.roomId), unreadInfo)\n        )\n      );\n      return;\n    }\n    if (action.type === 'DELETE' && get(baseRoomToUnread).has(action.roomId)) {\n      set(\n        baseRoomToUnread,\n        produce(get(baseRoomToUnread), (draftRoomToUnread) =>\n          deleteUnreadInfo(draftRoomToUnread, allParentsOf(action.roomId), action.roomId)\n        )\n      );\n    }\n  }\n);\n\nexport const useBindRoomToUnreadAtom = (mx: MatrixClient, unreadAtom: typeof roomToUnreadAtom) => {\n  const setUnreadAtom = useSetAtom(unreadAtom);\n  const roomsNotificationPreferences = useRoomsNotificationPreferencesContext();\n  const mDirects = useAtomValue(mDirectAtom);\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const shouldApplyUnreadFixup = useCallback(\n    () => getClientSyncDiagnostics(mx).transport === 'sliding',\n    [mx]\n  );\n  const resolverRef = useRef<UnreadCountResolver | null>(null);\n  const mDirectsRef = useRef(mDirects);\n  useEffect(() => {\n    mDirectsRef.current = mDirects;\n  }, [mDirects]);\n  const publishUnreadActionRef = useRef<(action: RoomToUnreadAction) => void>(() => {});\n  useEffect(() => {\n    if (getClientSyncDiagnostics(mx).transport !== 'sliding') return undefined;\n    const resolver = new UnreadCountResolver(mx, (room, unreadInfo) => {\n      const emit = () => {\n        const info =\n          unreadInfo ?? getUnreadInfo(room, { applyFixup: true, mDirects: mDirectsRef.current });\n        if (info.total > 0 || info.highlight > 0) {\n          publishUnreadActionRef.current({ type: 'PUT', unreadInfo: info });\n        } else {\n          publishUnreadActionRef.current({ type: 'DELETE', roomId: room.roomId });\n        }\n      };\n      const manager = getSlidingSyncManager(mx);\n      if (manager?.isResponseProcessing()) {\n        const unsubscribe = manager.subscribeToResponseSettled(() => {\n          unsubscribe();\n          emit();\n        });\n      } else {\n        emit();\n      }\n    });\n    resolverRef.current = resolver;\n    return () => {\n      resolver.dispose();\n      resolverRef.current = null;\n    };\n  }, [mx]);\n  const publishUnreadAction = useCallback(\n    (action: RoomToUnreadAction) => {\n      if (getClientSyncDiagnostics(mx).transport === 'sliding') {\n        const infos =\n          action.type === 'PUT'\n            ? [action.unreadInfo]\n            : action.type === 'RESET'\n              ? action.unreadInfos\n              : [];\n        infos.forEach((info) => {\n          if (info.estimated) resolverRef.current?.queue(info.roomId);\n        });\n        const manager = getSlidingSyncManager(mx);\n        if (manager?.isResponseProcessing()) return;\n      }\n      setUnreadAtom(action);\n    },\n    [mx, setUnreadAtom]\n  );\n  const resetUnread = useCallback(\n    () =>\n      publishUnreadAction({\n        type: 'RESET',\n        unreadInfos: getUnreadInfos(mx, {\n          applyFixup: shouldApplyUnreadFixup(),\n          mDirects,\n        }),\n      }),\n    [mx, publishUnreadAction, shouldApplyUnreadFixup, mDirects]\n  );\n  useEffect(() => {\n    publishUnreadActionRef.current = publishUnreadAction;\n  }, [publishUnreadAction]);\n\n  useEffect(() => {\n    const manager = getSlidingSyncManager(mx);\n    if (!manager) return undefined;\n\n    let cancelled = false;\n    void manager.waitForSidebarCacheHydration().then((hydrated) => {\n      if (!cancelled && hydrated) resetUnread();\n    });\n    return () => {\n      cancelled = true;\n    };\n  }, [mx, resetUnread]);\n\n  useEffect(() => {\n    const manager = getSlidingSyncManager(mx);\n    if (!manager) return undefined;\n    return manager.subscribeToResponseSettled((dirtyRoomIds) => {\n      if (dirtyRoomIds.size === 0) return;\n      const { unread, deleted } = getUnreadInfosForRooms(mx, dirtyRoomIds, {\n        applyFixup: true,\n        mDirects,\n      });\n      for (const roomId of deleted) {\n        publishUnreadAction({ type: 'DELETE', roomId });\n      }\n      for (const unreadInfo of unread) {\n        publishUnreadAction({ type: 'PUT', unreadInfo });\n      }\n    });\n  }, [mx, setUnreadAtom, publishUnreadAction, mDirects]);\n\n  useEffect(() => {\n    resetUnread();\n  }, [resetUnread, roomToParents]);\n\n  useSyncState(\n    mx,\n    useCallback(\n      (state, prevState) => {\n        if (\n          (state === SyncState.Prepared && prevState === null) ||\n          (state === SyncState.Syncing && prevState !== SyncState.Syncing)\n        ) {\n          resetUnread();\n        }\n      },\n      [resetUnread]\n    )\n  );\n\n  const handleTimelineEvent = useCallback(\n    (\n      mEvent: MatrixEvent,\n      room: Room | undefined,\n      toStartOfTimeline: boolean | undefined,\n      removed: boolean,\n      data: IRoomTimelineData\n    ) => {\n      if (!room || room.isSpaceRoom()) return;\n      if (getNotificationType(mx, room.roomId) === NotificationType.Mute) {\n        publishUnreadAction({\n          type: 'DELETE',\n          roomId: room.roomId,\n        });\n        return;\n      }\n\n      // Handle live events (new messages arriving in real-time)\n      if (data.liveEvent && isNotificationEvent(mEvent)) {\n        if (mEvent.getSender() === mx.getUserId()) return;\n        const unreadInfo = getUnreadInfo(room, {\n          applyFixup: shouldApplyUnreadFixup(),\n          mDirects,\n        });\n        publishUnreadAction({\n          type: 'PUT',\n          unreadInfo,\n        });\n        return;\n      }\n\n      // Handle non-live events (initial sync/sliding sync timeline population)\n      // For rooms without read receipts (unvisited in sliding sync), check if they need badges\n      const userId = mx.getUserId();\n      if (!data.liveEvent && userId && !room.getEventReadUpTo(userId)) {\n        // Room has no read receipt - check if timeline activity warrants a badge\n        const unreadInfo = getUnreadInfo(room, {\n          applyFixup: shouldApplyUnreadFixup(),\n          mDirects,\n        });\n        if (unreadInfo.total > 0 || unreadInfo.highlight > 0) {\n          publishUnreadAction({\n            type: 'PUT',\n            unreadInfo,\n          });\n        }\n      }\n    },\n    [mx, publishUnreadAction, shouldApplyUnreadFixup, mDirects]\n  );\n\n  useMatrixEvent(mx, RoomEvent.Timeline, handleTimelineEvent);\n\n  const handleReceipt = useCallback(\n    (mEvent: MatrixEvent, room: Room) => {\n      const myUserId = mx.getUserId();\n      if (!myUserId) return;\n      if (room.isSpaceRoom()) return;\n      const content = mEvent.getContent();\n\n      const isMyReceipt = Object.keys(content).find((eventId) =>\n        (Object.keys(content[eventId]) as ReceiptType[]).find(\n          (receiptType) => content[eventId][receiptType][myUserId]\n        )\n      );\n      if (isMyReceipt) {\n        const unreadInfo = getUnreadInfo(room, {\n          applyFixup: shouldApplyUnreadFixup(),\n          mDirects,\n        });\n        if (unreadInfo.total === 0 && unreadInfo.highlight === 0) {\n          publishUnreadAction({ type: 'DELETE', roomId: room.roomId });\n          return;\n        }\n        publishUnreadAction({ type: 'PUT', unreadInfo });\n      }\n    },\n    [mx, publishUnreadAction, shouldApplyUnreadFixup, mDirects]\n  );\n\n  useMatrixEvent(mx, RoomEvent.Receipt, handleReceipt);\n\n  useEffect(() => {\n    const roomListeners = new Map<Room, RoomEventHandlerMap[RoomEvent.UnreadNotifications]>();\n\n    const bindRoom = (room: Room) => {\n      if (roomListeners.has(room)) return;\n\n      const handleUnreadNotifications: RoomEventHandlerMap[RoomEvent.UnreadNotifications] = () => {\n        if (room.isSpaceRoom()) return;\n        if (room.getMyMembership() !== (KnownMembership.Join as string)) return;\n\n        const unreadInfo = getUnreadInfo(room, {\n          // Counts are already updated before this event would recurse if true\n          applyFixup: false,\n          mDirects,\n        });\n        if (unreadInfo.total === 0 && unreadInfo.highlight === 0) {\n          publishUnreadAction({ type: 'DELETE', roomId: room.roomId });\n          return;\n        }\n        publishUnreadAction({ type: 'PUT', unreadInfo });\n      };\n\n      room.on(RoomEvent.UnreadNotifications, handleUnreadNotifications);\n      roomListeners.set(room, handleUnreadNotifications);\n    };\n\n    mx.getRooms().forEach(bindRoom);\n    mx.on(ClientEvent.Room, bindRoom);\n\n    return () => {\n      mx.removeListener(ClientEvent.Room, bindRoom);\n      roomListeners.forEach((listener, room) => {\n        room.removeListener(RoomEvent.UnreadNotifications, listener);\n      });\n    };\n  }, [mx, publishUnreadAction, shouldApplyUnreadFixup, mDirects]);\n\n  const handleRoomAccountData = useCallback(\n    (mEvent: MatrixEvent, room: Room) => {\n      if (room.isSpaceRoom()) return;\n      if (mEvent.getType() !== (EventType.FullyRead as string)) return;\n\n      const unreadInfo = getUnreadInfo(room, {\n        applyFixup: shouldApplyUnreadFixup(),\n        mDirects,\n      });\n      if (unreadInfo.total === 0 && unreadInfo.highlight === 0) {\n        publishUnreadAction({ type: 'DELETE', roomId: room.roomId });\n        return;\n      }\n      publishUnreadAction({ type: 'PUT', unreadInfo });\n    },\n    [publishUnreadAction, shouldApplyUnreadFixup, mDirects]\n  );\n\n  useMatrixEvent(mx, RoomEvent.AccountData, handleRoomAccountData);\n\n  useEffect(() => {\n    resetUnread();\n  }, [resetUnread, roomsNotificationPreferences]);\n\n  const handleMembershipChange = useCallback(\n    (room: Room, membership: string) => {\n      if (membership !== (KnownMembership.Join as string)) {\n        publishUnreadAction({\n          type: 'DELETE',\n          roomId: room.roomId,\n        });\n      }\n    },\n    [publishUnreadAction]\n  );\n\n  useMatrixEvent(mx, RoomEvent.MyMembership, handleMembershipChange);\n\n  // Seed badge state immediately when a room is first registered with the client\n  // (e.g. after joining or receiving an invite that gets auto-accepted).\n  // This avoids the brief window after refresh where badges are invisible until\n  // the next timeline event arrives. Notifications are NOT triggered here —\n  // ClientNonUIFeatures handles live notification pop-ups via its own listener.\n  const handleRoomAdded = useCallback(\n    (room: Room) => {\n      if (room.isSpaceRoom() || room.getMyMembership() !== (KnownMembership.Join as string)) return;\n      const unreadInfo = getUnreadInfo(room, {\n        applyFixup: shouldApplyUnreadFixup(),\n        mDirects,\n      });\n      if (unreadInfo.total > 0 || unreadInfo.highlight > 0) {\n        publishUnreadAction({ type: 'PUT', unreadInfo });\n      }\n    },\n    [publishUnreadAction, shouldApplyUnreadFixup, mDirects]\n  );\n\n  useMatrixEvent(mx, ClientEvent.Room, handleRoomAdded);\n};\n","import type { CSSProperties, ReactNode } from 'react';\nimport { Box, Badge, toRem, Text } from 'folds';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\n\ntype UnreadBadgeProps = {\n  highlight?: boolean;\n  count: number;\n  /** Whether this badge belongs to a DM room. Used with the badgeCountDMsOnly setting. */\n  dm?: boolean;\n  mode?: UnreadBadgeMode;\n};\n\ntype ResolveUnreadBadgeModeOptions = Omit<UnreadBadgeProps, 'mode'> & {\n  showUnreadCounts: boolean;\n  badgeCountDMsOnly: boolean;\n  showPingCounts: boolean;\n};\n\nexport type UnreadBadgeMode = 'dot' | 'count';\n\n/**\n * Resolve whether an unread badge should render as a dot or a numeric count.\n *\n * @param options.count The unread count backing this badge. Non-positive counts always resolve to dot mode.\n * @param options.dm Whether the badge belongs to a direct message.\n * @param options.highlight Whether the badge represents a mention or keyword highlight.\n * @param options.showUnreadCounts Whether regular room unread badges should show counts.\n * @param options.badgeCountDMsOnly Whether direct message unread badges should show counts.\n * @param options.showPingCounts Whether highlight badges should show counts.\n * @returns `'count'` when the current badge context is allowed to show a number, otherwise `'dot'`.\n */\nexport function resolveUnreadBadgeMode({\n  highlight,\n  count,\n  dm,\n  showUnreadCounts,\n  badgeCountDMsOnly,\n  showPingCounts,\n}: ResolveUnreadBadgeModeOptions): UnreadBadgeMode {\n  const showNumber =\n    count > 0 &&\n    ((dm && badgeCountDMsOnly) || (!dm && showUnreadCounts) || (highlight && showPingCounts));\n\n  return showNumber ? 'count' : 'dot';\n}\n\nexport function formatUnreadBadgeCount(count: number, showEasterEggs: boolean): string {\n  if (count <= 999) {\n    return count.toString();\n  }\n\n  if (count === 1000) {\n    return '1k';\n  }\n\n  return showEasterEggs ? ':3' : '1k+';\n}\n\nconst styles: CSSProperties = {\n  minWidth: toRem(16),\n};\nexport function UnreadBadgeCenter({ children }: { children: ReactNode }) {\n  return (\n    <Box as=\"span\" style={styles} shrink=\"No\" alignItems=\"Center\" justifyContent=\"Center\">\n      {children}\n    </Box>\n  );\n}\n\nexport function UnreadBadge({ highlight, count, dm, mode }: UnreadBadgeProps) {\n  const [showUnreadCounts] = useSetting(settingsAtom, 'showUnreadCounts');\n  const [badgeCountDMsOnly] = useSetting(settingsAtom, 'badgeCountDMsOnly');\n  const [showPingCounts] = useSetting(settingsAtom, 'showPingCounts');\n  const [showEasterEggs] = useSetting(settingsAtom, 'showEasterEggs');\n  const resolvedMode =\n    mode ??\n    resolveUnreadBadgeMode({\n      highlight,\n      count,\n      dm,\n      showUnreadCounts,\n      badgeCountDMsOnly,\n      showPingCounts,\n    });\n\n  return (\n    <Badge\n      variant={highlight ? 'Success' : 'Secondary'}\n      size={resolvedMode === 'count' ? '400' : '200'}\n      fill=\"Solid\"\n      radii=\"Pill\"\n      outlined={false}\n    >\n      {resolvedMode === 'count' && (\n        <Text as=\"span\" size=\"L400\">\n          {formatUnreadBadgeCount(count, showEasterEggs)}\n        </Text>\n      )}\n    </Badge>\n  );\n}\n","import FocusTrap from 'focus-trap-react';\nimport {\n  Avatar,\n  Box,\n  color,\n  config,\n  IconButton,\n  Input,\n  Line,\n  MenuItem,\n  Modal,\n  OverlayCenter,\n  Scroll,\n  Text,\n  toRem,\n} from 'folds';\nimport { Overlay } from '$components/overlay-stack';\nimport { MagnifyingGlass, X, composerIcon, menuIcon } from '$components/icons/phosphor';\nimport type { ChangeEventHandler, KeyboardEventHandler, MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { useAtomValue } from 'jotai';\nimport type { Room } from '$types/matrix-sdk';\nimport { useDirects, useOrphanSpaces, useRooms, useSpaces } from '$state/hooks/roomList';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport type { SearchItemStrGetter, UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom';\nimport { RoomAvatar, RoomIcon } from '$components/room-avatar';\nimport { getAllParents, guessPerfectParent } from '$utils/room/hierarchy';\nimport { getDirectRoomAvatarUrl, getRoomAvatarUrl } from '$utils/room/display';\nimport { highlightText, makeHighlightRegex } from '$plugins/react-custom-html-parser';\nimport { factoryRoomIdByActivity } from '$utils/sort';\nimport { nameInitials } from '$utils/common';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { useListFocusIndex } from '$hooks/useListFocusIndex';\nimport { getMxIdLocalPart, guessDmRoomUserId } from '$utils/matrix';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { UnreadBadge, UnreadBadgeCenter } from '$components/unread-badge';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useSelectedSpace } from '$hooks/router/useSelectedSpace';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { formatShortcut, getShortcutBinding } from '../../keyboard/shortcuts';\n\nenum SearchRoomType {\n  Rooms = '#',\n  Spaces = '*',\n  Directs = '@',\n}\n\nconst getSearchPrefixToRoomType = (prefix: string): SearchRoomType | undefined => {\n  if (prefix === '#') return SearchRoomType.Rooms;\n  if (prefix === '*') return SearchRoomType.Spaces;\n  if (prefix === '@') return SearchRoomType.Directs;\n  return undefined;\n};\n\nconst useTopActiveRooms = (\n  searchRoomType: SearchRoomType | undefined,\n  rooms: string[],\n  directs: string[],\n  spaces: string[]\n) => {\n  const mx = useMatrixClient();\n\n  return useMemo(() => {\n    if (searchRoomType === SearchRoomType.Spaces) {\n      return spaces;\n    }\n    if (searchRoomType === SearchRoomType.Directs) {\n      return [...directs].toSorted(factoryRoomIdByActivity(mx)).slice(0, 20);\n    }\n    if (searchRoomType === SearchRoomType.Rooms) {\n      return [...rooms].toSorted(factoryRoomIdByActivity(mx)).slice(0, 20);\n    }\n    return [...rooms, ...directs].toSorted(factoryRoomIdByActivity(mx)).slice(0, 20);\n  }, [mx, rooms, directs, spaces, searchRoomType]);\n};\n\nconst getDmUserId = (\n  roomId: string,\n  getRoom: (roomId: string) => Room | undefined,\n  myUserId: string\n): string | undefined => {\n  const room = getRoom(roomId);\n  const targetUserId = room && guessDmRoomUserId(room, myUserId);\n  return targetUserId;\n};\n\nconst useSearchTargetRooms = (\n  searchRoomType: SearchRoomType | undefined,\n  rooms: string[],\n  directs: string[],\n  spaces: string[]\n) =>\n  useMemo(() => {\n    if (searchRoomType === undefined) {\n      return [...rooms, ...directs, ...spaces];\n    }\n    if (searchRoomType === SearchRoomType.Rooms) return rooms;\n    if (searchRoomType === SearchRoomType.Spaces) return spaces;\n    if (searchRoomType === SearchRoomType.Directs) return directs;\n\n    return [];\n  }, [rooms, spaces, directs, searchRoomType]);\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  matchOptions: {\n    contain: true,\n  },\n  normalizeOptions: {\n    ignoreWhitespace: false,\n  },\n};\n\nexport type RoomSearchPickRoomConfig = {\n  title: string;\n  eligibleRoomIds: readonly string[];\n  onPickRoom: (roomId: string) => void;\n  errorMessage?: string | null;\n  busy?: boolean;\n};\n\nexport type RoomSearchModalProps = {\n  requestClose?: () => void;\n  pickRoom?: RoomSearchPickRoomConfig;\n  isMobile?: boolean;\n  onNavigate?: () => void;\n};\n\nexport function RoomSearchModal({\n  requestClose,\n  pickRoom,\n  isMobile,\n  onNavigate,\n}: RoomSearchModalProps) {\n  const [shortcutOverrides] = useSetting(settingsAtom, 'shortcutOverrides');\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const { navigateRoom, navigateSpace } = useRoomNavigate();\n  const roomToUnread = useAtomValue(roomToUnreadAtom);\n\n  const [searchRoomType, setSearchRoomType] = useState<SearchRoomType>();\n\n  const allRoomsSet = useAllJoinedRoomsSet();\n  const getRoom = useGetRoom(allRoomsSet);\n\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const orphanSpaces = useOrphanSpaces(mx, allRoomsAtom, roomToParents);\n  const mDirects = useAtomValue(mDirectAtom);\n  const rooms = useRooms(mx, allRoomsAtom, mDirects);\n  const spaces = useSpaces(mx, allRoomsAtom);\n  const directs = useDirects(mx, allRoomsAtom, mDirects);\n\n  // keyed on the ids, not on pickRoom, whose callbacks change on every host render\n  const eligibleRoomIds = pickRoom?.eligibleRoomIds;\n  const eligibleSet = useMemo(\n    () => (eligibleRoomIds ? new Set(eligibleRoomIds) : null),\n    [eligibleRoomIds]\n  );\n\n  const rawTopActiveRooms = useTopActiveRooms(searchRoomType, rooms, directs, spaces);\n  const rawTargetRooms = useSearchTargetRooms(searchRoomType, rooms, directs, spaces);\n\n  const topActiveRooms = useMemo(() => {\n    if (!eligibleSet) return rawTopActiveRooms;\n    return rawTopActiveRooms.filter((id) => eligibleSet.has(id));\n  }, [eligibleSet, rawTopActiveRooms]);\n\n  const targetRooms = useMemo(() => {\n    if (!eligibleSet) return rawTargetRooms;\n    return rawTargetRooms.filter((id) => eligibleSet.has(id));\n  }, [eligibleSet, rawTargetRooms]);\n\n  const getTargetStr: SearchItemStrGetter<string> = useCallback(\n    (roomId: string) => {\n      const roomName = getRoom(roomId)?.name ?? roomId;\n      if (mDirects.has(roomId)) {\n        const targetUserId = getDmUserId(roomId, getRoom, mx.getSafeUserId());\n        const targetUsername = targetUserId && getMxIdLocalPart(targetUserId);\n        if (targetUsername) return [roomName, targetUsername];\n      }\n      return roomName;\n    },\n    [getRoom, mDirects, mx]\n  );\n\n  const [result, search, resetSearch] = useAsyncSearch(targetRooms, getTargetStr, SEARCH_OPTIONS);\n  const selectedSpaceId = useSelectedSpace();\n\n  const roomsToRender = useMemo(() => {\n    const items = result ? result.items : topActiveRooms;\n    if (!selectedSpaceId) return items;\n\n    return [...items].toSorted((a, b) => {\n      const aInSpace = getAllParents(roomToParents, a)?.has(selectedSpaceId) ? 1 : 0;\n      const bInSpace = getAllParents(roomToParents, b)?.has(selectedSpaceId) ? 1 : 0;\n      return bInSpace - aInSpace;\n    });\n  }, [result, topActiveRooms, selectedSpaceId, roomToParents]);\n\n  const listFocus = useListFocusIndex(roomsToRender.length, 0);\n\n  const queryHighlighRegex = result?.query\n    ? makeHighlightRegex(result.query.split(' '))\n    : undefined;\n\n  const handleActivateRoom = (roomId: string, isSpace: boolean) => {\n    if (pickRoom) {\n      if (pickRoom.busy) return;\n      pickRoom.onPickRoom(roomId);\n      return;\n    }\n    onNavigate?.();\n    if (isSpace) navigateSpace(roomId);\n    else navigateRoom(roomId);\n  };\n\n  const handleInputChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    listFocus.reset();\n\n    const target = evt.currentTarget;\n    let value = target.value.trim();\n    const prefix = value.match(/^[#@*]/)?.[0];\n    const searchType = typeof prefix === 'string' && getSearchPrefixToRoomType(prefix);\n    if (searchType) {\n      value = value.slice(1);\n      setSearchRoomType(searchType);\n    } else {\n      setSearchRoomType(undefined);\n    }\n\n    if (value === '') {\n      resetSearch();\n      return;\n    }\n    search(value);\n  };\n\n  const handleInputKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    const roomId = roomsToRender[listFocus.index];\n    if (isKeyHotkey('enter', evt) && roomId) {\n      handleActivateRoom(roomId, spaces.includes(roomId));\n      return;\n    }\n    if (isKeyHotkey('arrowdown', evt)) {\n      evt.preventDefault();\n      listFocus.next();\n      return;\n    }\n    if (isKeyHotkey('arrowup', evt)) {\n      evt.preventDefault();\n      listFocus.previous();\n    }\n  };\n\n  const handleRoomClick: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    const target = evt.currentTarget;\n    const roomId = target.getAttribute('data-room-id');\n    const isSpace = target.getAttribute('data-space') === 'true';\n    if (!roomId) return;\n    handleActivateRoom(roomId, isSpace);\n  };\n\n  useEffect(() => {\n    const scrollView = scrollRef.current;\n    const focusedItem = scrollView?.querySelector(`[data-focus-index=\"${listFocus.index}\"]`);\n\n    if (focusedItem && scrollView) {\n      focusedItem.scrollIntoView({\n        block: 'center',\n      });\n    }\n  }, [listFocus.index]);\n\n  return (\n    <Box direction=\"Column\" style={{ width: '100%', height: '100%' }}>\n      {pickRoom && (\n        <Box\n          shrink=\"No\"\n          direction=\"Row\"\n          alignItems=\"Center\"\n          justifyContent=\"SpaceBetween\"\n          style={{\n            padding: `${config.space.S400} ${config.space.S400} ${config.space.S200}`,\n          }}\n        >\n          <Text size=\"H4\">{pickRoom.title}</Text>\n          <IconButton\n            size=\"300\"\n            onClick={requestClose}\n            radii=\"300\"\n            aria-label=\"Close\"\n            disabled={pickRoom.busy}\n          >\n            {composerIcon(X)}\n          </IconButton>\n        </Box>\n      )}\n      {pickRoom?.errorMessage ? (\n        <Box shrink=\"No\" style={{ padding: `0 ${config.space.S400} ${config.space.S200}` }}>\n          <Text size=\"T200\" color=\"Critical600\">\n            {pickRoom.errorMessage}\n          </Text>\n        </Box>\n      ) : null}\n      <Box\n        shrink=\"No\"\n        grow=\"Yes\"\n        style={{\n          padding: `${config.space.S400} ${isMobile ? config.space.S0 : config.space.S400} 0`,\n          width: '100%',\n        }}\n        direction=\"Column\"\n      >\n        <Input\n          size=\"500\"\n          variant={isMobile ? 'Background' : 'SurfaceVariant'}\n          radii=\"400\"\n          outlined\n          placeholder={pickRoom ? 'Search rooms' : 'Search'}\n          before={menuIcon(MagnifyingGlass)}\n          onChange={handleInputChange}\n          onKeyDown={handleInputKeyDown}\n          disabled={pickRoom?.busy}\n          autoFocus\n        />\n      </Box>\n      <Scroll>\n        {roomsToRender.length === 0 && (\n          <Box\n            style={{ paddingTop: config.space.S700, width: '100%', height: '100%' }}\n            grow=\"Yes\"\n            alignItems=\"Center\"\n            justifyContent=\"Center\"\n            direction=\"Column\"\n            gap=\"100\"\n          >\n            <Text size=\"H6\" align=\"Center\">\n              {pickRoom\n                ? result\n                  ? 'No Match Found'\n                  : pickRoom.eligibleRoomIds.length === 0\n                    ? 'No rooms to forward to'\n                    : 'No rooms match this filter'\n                : result\n                  ? 'No Match Found'\n                  : 'No Rooms'}\n            </Text>\n            <Text size=\"T200\" align=\"Center\">\n              {pickRoom\n                ? result\n                  ? `No match found for \"${result.query}\".`\n                  : pickRoom.eligibleRoomIds.length === 0\n                    ? 'You cannot send messages in any joined room yet.'\n                    : 'Try another search, or use # for group rooms and @ for direct messages.'\n                : result\n                  ? `No match found for \"${result.query}\".`\n                  : 'You do not have any Rooms to display yet.'}\n            </Text>\n          </Box>\n        )}\n        {roomsToRender.length > 0 && (\n          <Scroll ref={scrollRef} size=\"300\" hideTrack>\n            <div\n              style={{\n                padding: config.space.S400,\n                paddingRight: config.space.S0,\n                width: '100%',\n                height: '100%',\n              }}\n            >\n              {roomsToRender.map((roomId, index) => {\n                const room = getRoom(roomId);\n                if (!room) return null;\n\n                const dm = mDirects.has(roomId);\n                const dmUserId = dm && getDmUserId(roomId, getRoom, mx.getSafeUserId());\n                const dmUsername = dmUserId && getMxIdLocalPart(dmUserId);\n                const dmUserServer = dmUserId && getMxIdServer(dmUserId);\n\n                const allParents = getAllParents(roomToParents, roomId);\n                const orphanParents = allParents && orphanSpaces.filter((o) => allParents.has(o));\n                const perfectOrphanParent =\n                  orphanParents && guessPerfectParent(mx, roomId, orphanParents);\n\n                const exactParents = roomToParents.get(roomId);\n                const perfectParent =\n                  exactParents && guessPerfectParent(mx, roomId, Array.from(exactParents));\n\n                const unread = roomToUnread.get(roomId);\n\n                return (\n                  <MenuItem\n                    key={roomId}\n                    as=\"button\"\n                    data-focus-index={index}\n                    data-room-id={roomId}\n                    data-space={room.isSpaceRoom()}\n                    onClick={handleRoomClick}\n                    disabled={pickRoom?.busy}\n                    variant={listFocus.index === index ? 'Primary' : undefined}\n                    aria-pressed={listFocus.index === index}\n                    radii=\"400\"\n                    style={{\n                      width: '100%',\n                      background: listFocus.index !== index ? 'transparent' : undefined,\n                    }}\n                    after={\n                      <Box gap=\"100\">\n                        {dmUserServer && (\n                          <Text size=\"T200\" priority=\"300\" truncate>\n                            <b>{dmUserServer}</b>\n                          </Text>\n                        )}\n                        {!dm && perfectOrphanParent && (\n                          <Text size=\"T200\" priority=\"300\" truncate>\n                            <b>{getRoom(perfectOrphanParent)?.name ?? perfectOrphanParent}</b>\n                          </Text>\n                        )}\n                        {unread && (\n                          <UnreadBadgeCenter>\n                            <UnreadBadge\n                              highlight={unread.highlight > 0}\n                              count={unread.highlight > 0 ? unread.highlight : unread.total}\n                            />\n                          </UnreadBadgeCenter>\n                        )}\n                      </Box>\n                    }\n                    before={\n                      <Avatar size=\"200\" radii={dm ? '400' : '300'}>\n                        {dm || room.isSpaceRoom() ? (\n                          <RoomAvatar\n                            roomId={room.roomId}\n                            src={\n                              dm\n                                ? getDirectRoomAvatarUrl(mx, room, 32, useAuthentication)\n                                : getRoomAvatarUrl(mx, room, 32, useAuthentication)\n                            }\n                            alt={room.name}\n                            renderFallback={() => (\n                              <Text as=\"span\" size=\"H6\">\n                                {nameInitials(room.name)}\n                              </Text>\n                            )}\n                          />\n                        ) : (\n                          <RoomIcon\n                            size=\"100\"\n                            joinRule={room.getJoinRule()}\n                            roomType={room.getType()}\n                          />\n                        )}\n                      </Avatar>\n                    }\n                  >\n                    <Box grow=\"Yes\" alignItems=\"Center\" gap=\"100\">\n                      <Text size=\"T400\" truncate>\n                        {queryHighlighRegex\n                          ? highlightText(queryHighlighRegex, [room.name])\n                          : room.name}\n                      </Text>\n                      {dmUsername && (\n                        <Text as=\"span\" size=\"T200\" priority=\"300\" truncate>\n                          @\n                          {queryHighlighRegex\n                            ? highlightText(queryHighlighRegex, [dmUsername])\n                            : dmUsername}\n                        </Text>\n                      )}\n                      {!dm && perfectParent && perfectParent !== perfectOrphanParent && (\n                        <Text size=\"T200\" priority=\"300\" truncate>\n                          — {getRoom(perfectParent)?.name ?? perfectParent}\n                        </Text>\n                      )}\n                    </Box>\n                  </MenuItem>\n                );\n              })}\n            </div>\n          </Scroll>\n        )}\n      </Scroll>\n      <Line size=\"300\" />\n      <Box shrink=\"No\" justifyContent=\"Center\" style={{ padding: config.space.S200 }}>\n        <Text size=\"T200\" priority=\"300\">\n          {pickRoom ? (\n            <>\n              Type <b>#</b> for rooms and <b>@</b> for direct messages. Choose a room to forward\n              this message.\n            </>\n          ) : (\n            <>\n              Type <b>#</b> for rooms, <b>@</b> for DMs and <b>*</b> for spaces. Hotkey:{' '}\n              <b>\n                {formatShortcut(getShortcutBinding('navigation.openRoomSearch', shortcutOverrides))}\n              </b>\n            </>\n          )}\n        </Text>\n      </Box>\n    </Box>\n  );\n}\n\nexport function SearchWrapper({ requestClose, pickRoom }: RoomSearchModalProps) {\n  const skipCloseOnDeactivate = useRef(false);\n\n  return (\n    <Overlay open>\n      <OverlayCenter>\n        <FocusTrap\n          focusTrapOptions={{\n            returnFocusOnDeactivate: true,\n            allowOutsideClick: true,\n            clickOutsideDeactivates: true,\n            onDeactivate: () => {\n              if (!skipCloseOnDeactivate.current) requestClose?.();\n            },\n            escapeDeactivates: (evt: KeyboardEvent) => {\n              evt.stopPropagation();\n              return true;\n            },\n          }}\n        >\n          <Modal\n            size=\"400\"\n            style={{\n              maxHeight: toRem(400),\n              borderRadius: config.radii.R500,\n              background: color.SurfaceVariant.Container,\n            }}\n          >\n            <RoomSearchModal\n              requestClose={requestClose}\n              pickRoom={pickRoom}\n              onNavigate={() => {\n                skipCloseOnDeactivate.current = true;\n              }}\n            />\n          </Modal>\n        </FocusTrap>\n      </OverlayCenter>\n    </Overlay>\n  );\n}\n","// Modal for message forwarding, which allows users to select a room to forward the message to\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { modalAtom, ModalType } from '$state/modal';\nimport { MenuItem, Text, as } from 'folds';\nimport { ArrowRight, menuIcon } from '$components/icons/phosphor';\nimport { useSetAtom } from 'jotai';\nimport { MsgType, type MatrixEvent, type Room } from '$types/matrix-sdk';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom';\nimport { useMessageTargetRooms } from '$hooks/useMessageTargetRooms';\nimport * as css from '$features/room/message/styles.css';\nimport { sanitizeCustomHtml, sanitizeText } from '$utils/sanitize';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport * as Sentry from '@sentry/react';\nimport { isRoomPrivate } from '$utils/roomVisibility';\nimport { canForwardEvent } from '$utils/room/relations';\nimport * as prefix from '$unstable/prefixes';\nimport { SearchWrapper } from '$features/navigate';\nimport { useDismissOnBack } from '$utils/androidBack';\nconst debugLog = createDebugLogger('MessageForward');\n\n// Message forwarding component\nexport const MessageForwardItem = as<'button', MessageForwardItemProps>(\n  ({ room, mEvent, onClose, ...props }: MessageForwardItemProps) => {\n    const setModal = useSetAtom(modalAtom);\n\n    if (!canForwardEvent(mEvent)) return null;\n\n    const handleClick = () => {\n      setModal({\n        type: ModalType.Forward,\n        room,\n        mEvent,\n      });\n      onClose?.();\n    };\n\n    return (\n      <MenuItem\n        size=\"300\"\n        after={menuIcon(ArrowRight)}\n        radii=\"300\"\n        {...props}\n        onClick={handleClick}\n      >\n        <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n          Forward\n        </Text>\n      </MenuItem>\n    );\n  }\n);\n\nexport const unwrapForwardedContent = (content: string) => {\n  // unwrap the content of a forwarded message if it was wrapped in a blockquote with the data-forward-marker attribute\n  const parser = new DOMParser();\n  const doc = parser.parseFromString(content, 'text/html');\n  const forwardMarker = doc.querySelector('[data-forward-marker]');\n  if (forwardMarker) {\n    const blockquote = forwardMarker.querySelector('blockquote');\n    if (blockquote) {\n      return blockquote.innerHTML;\n    }\n  }\n  return content;\n};\n\ntype MessageForwardInternalProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  onClose: () => void;\n};\n\ntype ForwardMeta = {\n  v: 1;\n  is_forwarded: true;\n  original_timestamp: number;\n  original_room_id?: string;\n  original_event_id?: string;\n  // to mark that event_id and room_id are not present\n  original_event_private: boolean;\n};\n\n// see https://github.com/hummlbach/matrix-doc/blob/acea0854a1c9489599295a858b068ce02a6b2b20/proposals/2723-add-forward-info.md\ntype MSC2723ForwardMeta = {\n  event_id?: string;\n  room_id?: string;\n  sender?: string; // we won't set this field\n  origin_server_ts: number;\n};\n\nexport function MessageForwardInternal({\n  room,\n  mEvent,\n  onClose,\n}: Readonly<MessageForwardInternalProps>) {\n  const mx = useMatrixClient();\n  const forwardable = canForwardEvent(mEvent);\n  const [isForwarding, setIsForwarding] = useState(false);\n  const [forwardError, setForwardError] = useState<string | null>(null);\n  const allJoinedRooms = useAllJoinedRoomsSet();\n  const getRoom = useGetRoom(allJoinedRooms);\n\n  useEffect(() => {\n    if (!forwardable) onClose();\n  }, [forwardable, onClose]);\n\n  // Android back closes the forward picker instead of navigating away.\n  useDismissOnBack(onClose);\n\n  // possible targets to forward the message to\n  const forwardTargets = useMessageTargetRooms();\n\n  const forwardToRoom = useCallback(\n    (targetRoomId: string) => {\n      setIsForwarding(true);\n      setForwardError(null);\n\n      const targetRoom = getRoom(targetRoomId);\n      const eventId = mEvent.getId();\n      if (!targetRoom || !eventId) {\n        setIsForwarding(false);\n        return;\n      }\n\n      type SendEventType = Parameters<typeof mx.sendEvent>[2];\n      type SendEventContent = Parameters<typeof mx.sendEvent>[3];\n\n      const eventType = mEvent.getType() as SendEventType;\n      const originalContent = mEvent.getContent();\n      const isTextMessage = originalContent.msgtype === MsgType.Text;\n\n      const originalBody = typeof originalContent.body === 'string' ? originalContent.body : '';\n      const originalFormattedBody =\n        originalContent.format === 'org.matrix.custom.html' &&\n        typeof originalContent.formatted_body === 'string'\n          ? originalContent.formatted_body\n          : undefined;\n\n      const bodyModifText = `(Forwarded message from ${\n        isRoomPrivate(mx, room) ? 'a private room' : (getRoom(room.roomId)?.name ?? 'a room')\n      })`;\n\n      let newBodyPlain = '';\n      let newBodyHtml = '';\n      // transform if msgtype is m.text\n      if (isTextMessage) {\n        const quotedBody = originalBody\n          .split('\\n')\n          .map((line) => `> ${line}`)\n          .join('\\n');\n\n        newBodyPlain =\n          originalBody.length > 0 ? `${bodyModifText}\\n\\n${quotedBody}` : bodyModifText;\n\n        const safeHtml =\n          originalFormattedBody === undefined\n            ? sanitizeText(originalBody).replaceAll('\\n', '<br>')\n            : sanitizeCustomHtml(originalFormattedBody);\n\n        newBodyHtml =\n          `<div data-forward-marker>` +\n          `<p>${sanitizeText(bodyModifText)}</p>` +\n          `<blockquote>${safeHtml}</blockquote>` +\n          `</div>`;\n      }\n      // the quoted body\n      const forwardedTextContent = isTextMessage\n        ? {\n            body: newBodyPlain,\n            format: 'org.matrix.custom.html',\n            formatted_body: newBodyHtml,\n          }\n        : {};\n      const baseContent = { ...mEvent.getContent() };\n      delete baseContent['m.relates_to']; // remove relations from the forwarded message\n      delete baseContent['m.mentions']; // remove mentions from forwarded message\n      delete baseContent[prefix.MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME]; // remove per-message profile as that could confuse clients in the target room\n      let content;\n      // handle privacy stuff\n      if (isRoomPrivate(mx, room)) {\n        // if the message is from a private room, we should strip any media or mentions to avoid leaking information to the target room\n        // we can still include the original message content in the body of the message, so we'll just use a fallback text/plain content with the original message body\n        content = {\n          ...baseContent,\n          ...forwardedTextContent,\n          [prefix.MATRIX_SABLE_UNSTABLE_MESSAGE_FORWARD_META_PROPERTY_NAME]: {\n            v: 1,\n            is_forwarded: true,\n            original_timestamp: mEvent.getTs(),\n            original_event_private: true,\n          } satisfies ForwardMeta,\n          [prefix.MATRIX_UNSTABLE_MESSAGE_FORWARD_META_PROPERTY_NAME]: {\n            origin_server_ts: mEvent.getTs(),\n          } satisfies MSC2723ForwardMeta,\n        };\n      } else {\n        content = {\n          ...baseContent,\n          ...forwardedTextContent,\n          [prefix.MATRIX_SABLE_UNSTABLE_MESSAGE_FORWARD_META_PROPERTY_NAME]: {\n            v: 1,\n            is_forwarded: true,\n            original_timestamp: mEvent.getTs(),\n            original_room_id: room.roomId,\n            original_event_id: eventId,\n            original_event_private: false,\n          } satisfies ForwardMeta,\n          [prefix.MATRIX_UNSTABLE_MESSAGE_FORWARD_META_PROPERTY_NAME]: {\n            event_id: eventId,\n            room_id: room.roomId,\n            origin_server_ts: mEvent.getTs(),\n          } satisfies MSC2723ForwardMeta,\n        };\n      }\n\n      const msgtype = originalContent.msgtype ?? 'unknown';\n      debugLog.info('ui', 'Forwarding message', {\n        sourceRoomId: room.roomId,\n        targetRoomId: targetRoom.roomId,\n        msgtype,\n        isPrivate: isRoomPrivate(mx, room),\n      });\n      Sentry.metrics.count('sable.message.forward.attempt', 1, { attributes: { msgtype } });\n      mx.sendEvent(targetRoom.roomId, null, eventType, content as unknown as SendEventContent)\n        .then(() => {\n          debugLog.info('ui', 'Message forwarded successfully', {\n            sourceRoomId: room.roomId,\n            targetRoomId: targetRoom.roomId,\n          });\n          Sentry.metrics.count('sable.message.forward.success', 1);\n          setIsForwarding(false);\n          onClose();\n        })\n        .catch((err: unknown) => {\n          const message = err instanceof Error ? err.message : String(err);\n          debugLog.error('ui', 'Message forward failed', {\n            sourceRoomId: room.roomId,\n            targetRoomId: targetRoom.roomId,\n            error: message,\n          });\n          Sentry.metrics.count('sable.message.forward.error', 1);\n          setIsForwarding(false);\n          setForwardError(message);\n        });\n    },\n    [getRoom, mEvent, mx, onClose, room]\n  );\n\n  const pickRoom = useMemo(\n    () => ({\n      title: 'Forward message',\n      eligibleRoomIds: forwardTargets,\n      onPickRoom: (roomId: string) => {\n        forwardToRoom(roomId);\n      },\n      errorMessage: forwardError ? `Failed to forward: ${forwardError}` : null,\n      busy: isForwarding,\n    }),\n    [forwardError, forwardTargets, forwardToRoom, isForwarding]\n  );\n\n  if (!forwardable) return null;\n\n  return <SearchWrapper requestClose={onClose} pickRoom={pickRoom} />;\n}\n\ntype MessageForwardItemProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  onClose?: () => void;\n};\n","import type { ReactNode } from 'react';\nimport * as css from './AutocompleteMenu.css';\n\ntype BaseAutocompleteMenuProps = {\n  children: ReactNode;\n};\nexport function BaseAutocompleteMenu({ children }: BaseAutocompleteMenuProps) {\n  return (\n    <div className={css.AutocompleteMenuBase}>\n      <div className={css.AutocompleteMenuContainer} data-autocomplete-menu=\"true\">\n        {children}\n      </div>\n    </div>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport FocusTrap from 'focus-trap-react';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { Header, Menu, Scroll, config } from 'folds';\n\nimport { preventScrollWithArrowKey, stopPropagation } from '$utils/keyboard';\nimport { useAlive } from '$hooks/useAlive';\nimport * as css from './AutocompleteMenu.css';\nimport { BaseAutocompleteMenu } from './BaseAutocompleteMenu';\n\ntype AutocompleteMenuProps = {\n  requestClose: () => void;\n  headerContent: ReactNode;\n  children: ReactNode;\n};\nexport function AutocompleteMenu({ headerContent, requestClose, children }: AutocompleteMenuProps) {\n  const alive = useAlive();\n  const itemsRef = useRef<HTMLDivElement>(null);\n\n  const handleDeactivate = () => {\n    if (alive()) {\n      // The component is unmounted so we will not call for `requestClose`\n      requestClose();\n    }\n  };\n  const [isActive, setIsActive] = useState(true);\n  function handleInput(evt: KeyboardEvent) {\n    if (!evt) return;\n    if (\n      isKeyHotkey('arrowdown', evt) ||\n      isKeyHotkey('arrowup', evt) ||\n      isKeyHotkey('tab', evt) ||\n      isKeyHotkey('esc', evt) ||\n      isKeyHotkey('Enter', evt)\n    )\n      return;\n    setIsActive(false);\n  }\n\n  return (\n    <BaseAutocompleteMenu>\n      <FocusTrap\n        active={isActive}\n        focusTrapOptions={{\n          initialFocus: false,\n          fallbackFocus: () => itemsRef.current!,\n          onPostDeactivate: handleDeactivate,\n          returnFocusOnDeactivate: false,\n          clickOutsideDeactivates: true,\n          allowOutsideClick: true,\n          isKeyForward: (evt: KeyboardEvent) => isKeyHotkey('arrowdown', evt),\n          isKeyBackward: (evt: KeyboardEvent) => isKeyHotkey('arrowup', evt),\n          escapeDeactivates: stopPropagation,\n        }}\n      >\n        <Menu\n          className={css.AutocompleteMenu}\n          onKeyDown={(evt) => handleInput(evt as unknown as KeyboardEvent)}\n        >\n          <Header className={css.AutocompleteMenuHeader} size=\"400\">\n            {headerContent}\n          </Header>\n          <Scroll style={{ flexGrow: 1 }} onKeyDown={preventScrollWithArrowKey}>\n            <div ref={itemsRef} tabIndex={-1} style={{ padding: config.space.S200 }}>\n              {children}\n            </div>\n          </Scroll>\n        </Menu>\n      </FocusTrap>\n    </BaseAutocompleteMenu>\n  );\n}\n","export enum AutocompletePrefix {\n  RoomMention = '#',\n  UserMention = '@',\n  Emoticon = ':',\n  Command = '/',\n  Reaction = '+:',\n}\n\nexport const ANYWHERE_AUTOCOMPLETE_PREFIXES: readonly AutocompletePrefix[] = [\n  AutocompletePrefix.RoomMention,\n  AutocompletePrefix.UserMention,\n  AutocompletePrefix.Emoticon,\n];\n\nexport const BEGINNING_AUTOCOMPLETE_PREFIXES: readonly AutocompletePrefix[] = [\n  AutocompletePrefix.Command,\n  AutocompletePrefix.Reaction,\n];\n","import { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\nimport type {\n  EditorAutocompleteQuery,\n  ProseMirrorEditorController,\n} from '../prosemirrorController';\nimport type { AutocompletePrefix } from './autocompleteQuery';\n\nexport function useAutocompleteQuery(editor: ProseMirrorEditorController) {\n  const [query, setQuery] = useState<EditorAutocompleteQuery<AutocompletePrefix>>();\n  const refocusEditor = useRef(false);\n\n  useLayoutEffect(() => {\n    if (query !== undefined || !refocusEditor.current) return;\n    refocusEditor.current = false;\n    editor.focus();\n  }, [query, editor]);\n\n  const close = useCallback(() => {\n    if (query === undefined) return;\n    refocusEditor.current = true;\n    setQuery(undefined);\n  }, [query]);\n\n  return [query, setQuery, close] as const;\n}\n","export enum BlockType {\n  Paragraph = 'paragraph',\n  Mention = 'mention',\n  Emoticon = 'emoticon',\n  Link = 'link',\n  Command = 'command',\n}\n","import type { Room } from '$types/matrix-sdk';\nimport type { Nicknames } from '$state/nicknames';\nimport { getMxIdLocalPart, isUserId } from '$utils/matrix';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { BlockType } from './types';\nimport type { CommandToken, EditorText, EmoticonToken, LinkToken, MentionToken } from './model';\n\nexport type MentionResolveOptions = {\n  room?: Room;\n  nicknames?: Nicknames;\n  mxUserId?: string;\n};\n\n/** Same @-prefix rule as {@link UserMentionAutocomplete} and timeline mention insertion. */\nexport const formatUserMentionDisplayName = (name: string): string =>\n  name.startsWith('@') ? name : `@${name}`;\n\nexport const resolveUserMentionName = (userId: string, options?: MentionResolveOptions): string => {\n  const base =\n    (options?.room && getMemberDisplayName(options.room, userId, options.nicknames)) ??\n    getMxIdLocalPart(userId) ??\n    userId;\n  return formatUserMentionDisplayName(base);\n};\n\n/** {@link UserMentionAutocomplete} passes a display label, @room must stay literal, not resolved as a user. */\nexport const mentionNameForUserAutocomplete = (\n  id: string,\n  displayName: string,\n  options?: MentionResolveOptions\n): string => {\n  if (displayName === '@room') return '@room';\n  return resolveUserMentionName(id, options);\n};\n\n/** Same #-prefix rule as {@link RoomMentionAutocomplete}. */\nconst formatRoomMentionDisplayName = (name: string): string => {\n  if (name === '@room') return '@room';\n  return name.startsWith('#') ? name : `#${name}`;\n};\n\nexport const resolveRoomMentionName = (\n  roomIdOrAlias: string,\n  label: string,\n  options?: MentionResolveOptions\n): string => {\n  const trimmed = label.trim();\n  if (trimmed === '@room') return '@room';\n  if (trimmed) return formatRoomMentionDisplayName(trimmed);\n  if (\n    options?.room &&\n    (options.room.roomId === roomIdOrAlias || options.room.getCanonicalAlias() === roomIdOrAlias)\n  ) {\n    return formatRoomMentionDisplayName(options.room.name || roomIdOrAlias);\n  }\n  return formatRoomMentionDisplayName(roomIdOrAlias);\n};\n\nexport const resolveUserMentionHighlight = (\n  userId: string,\n  options?: MentionResolveOptions\n): boolean => options?.mxUserId === userId;\n\nexport const resolveRoomMentionHighlight = (\n  roomIdOrAlias: string,\n  options?: MentionResolveOptions\n): boolean => {\n  if (!options?.room) return true;\n  const { roomId } = options.room;\n  const alias = options.room.getCanonicalAlias();\n  return roomId === roomIdOrAlias || alias === roomIdOrAlias;\n};\n\nexport const formatMentionElementDisplayName = (element: MentionToken): string => {\n  if (isUserId(element.id)) {\n    return formatUserMentionDisplayName(element.name);\n  }\n  if (element.name === '@room') return '@room';\n  return formatRoomMentionDisplayName(element.name);\n};\n\nexport const createMentionElement = (\n  id: string,\n  name: string,\n  highlight: boolean,\n  eventId?: string,\n  viaServers?: string[]\n): MentionToken => ({\n  type: BlockType.Mention,\n  id,\n  eventId,\n  viaServers,\n  highlight,\n  name,\n  children: [{ text: '' }],\n});\n\nexport const createEmoticonElement = (key: string, shortcode: string): EmoticonToken => ({\n  type: BlockType.Emoticon,\n  key,\n  shortcode,\n  children: [{ text: '' }],\n});\n\nexport const createLinkElement = (href: string, children: string | EditorText[]): LinkToken => ({\n  type: BlockType.Link,\n  href,\n  children: typeof children === 'string' ? [{ text: children }] : children,\n});\n\nexport const createCommandElement = (command: string): CommandToken => ({\n  type: BlockType.Command,\n  command,\n  children: [{ text: '' }],\n});\n\nexport const getMarkdownCodeSpanRanges = (text: string): [number, number][] => {\n  const ranges: [number, number][] = [];\n  let openRun: { start: number; length: number } | undefined;\n\n  for (let index = 0; index < text.length; index += 1) {\n    if (text[index] === '`') {\n      let runEnd = index;\n      while (runEnd < text.length && text[runEnd] === '`') {\n        runEnd += 1;\n      }\n\n      const runLength = runEnd - index;\n      if (!openRun) {\n        openRun = { start: index, length: runLength };\n      } else if (openRun.length === runLength) {\n        ranges.push([openRun.start, runEnd]);\n        openRun = undefined;\n      }\n\n      index = runEnd - 1;\n    }\n  }\n\n  return ranges;\n};\n\nexport const isInsideMarkdownCodeSpan = (\n  start: number,\n  end: number,\n  codeSpanRanges: [number, number][]\n): boolean => codeSpanRanges.some(([rangeStart, rangeEnd]) => start > rangeStart && end < rangeEnd);\n","import type { KeyboardEvent as ReactKeyboardEvent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { Avatar, MenuItem, Text } from 'folds';\nimport { Hash, sizedIcon } from '$components/icons/phosphor';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { JoinRule } from '$types/matrix-sdk';\nimport { useAtomValue } from 'jotai';\n\nimport { getDirectRoomAvatarUrl } from '$utils/room/display';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { isRoomAlias } from '$utils/matrix';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport type { UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { onTabPress } from '$utils/keyboard';\nimport { useKeyDown } from '$hooks/useKeyDown';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { factoryRoomIdByActivity } from '$utils/sort';\nimport { RoomAvatar, RoomIcon } from '$components/room-avatar';\nimport { getViaServers } from '$plugins/via-servers';\nimport { createMentionElement } from '$components/editor/utils';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport { AutocompleteMenu } from './AutocompleteMenu';\nimport type {\n  EditorAutocompleteQuery,\n  ProseMirrorEditorController,\n} from '../prosemirrorController';\n\ntype MentionAutoCompleteHandler = (roomAliasOrId: string, name: string) => void;\n\nconst roomAliasFromQueryText = (mx: MatrixClient, text: string) =>\n  isRoomAlias(`#${text}`)\n    ? `#${text}`\n    : `#${text}${text.endsWith(':') ? '' : ':'}${getMxIdServer(mx.getUserId() ?? '')}`;\n\nfunction UnknownRoomMentionItem({\n  query,\n  handleAutocomplete,\n}: {\n  query: EditorAutocompleteQuery<string>;\n  handleAutocomplete: MentionAutoCompleteHandler;\n}) {\n  const mx = useMatrixClient();\n  const roomAlias: string = roomAliasFromQueryText(mx, query.text);\n\n  const handleSelect = () => handleAutocomplete(roomAlias, roomAlias);\n\n  return (\n    <MenuItem\n      as=\"button\"\n      radii=\"300\"\n      onKeyDown={(evt: ReactKeyboardEvent<HTMLButtonElement>) => onTabPress(evt, handleSelect)}\n      onMouseDown={(evt: ReactMouseEvent<HTMLButtonElement>) => evt.preventDefault()}\n      onClick={handleSelect}\n      before={<Avatar size=\"200\">{sizedIcon(Hash, '100')}</Avatar>}\n    >\n      <Text style={{ flexGrow: 1 }} size=\"B400\">\n        {roomAlias}\n      </Text>\n    </MenuItem>\n  );\n}\n\ntype RoomMentionAutocompleteProps = {\n  roomId: string;\n  controller: ProseMirrorEditorController;\n  query: EditorAutocompleteQuery<string>;\n  requestClose: () => void;\n};\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  matchOptions: {\n    contain: true,\n  },\n};\n\nexport function RoomMentionAutocomplete({\n  roomId,\n  controller,\n  query,\n  requestClose,\n}: RoomMentionAutocompleteProps) {\n  const mx = useMatrixClient();\n  const mDirects = useAtomValue(mDirectAtom);\n\n  const allRoomsFromAtom = useAtomValue(allRoomsAtom);\n  const allRooms = useMemo(\n    () => allRoomsFromAtom.toSorted(factoryRoomIdByActivity(mx)),\n    [allRoomsFromAtom, mx]\n  );\n\n  const [result, search, resetSearch] = useAsyncSearch(\n    allRooms,\n    useCallback(\n      (rId) => {\n        const r = mx.getRoom(rId);\n        if (!r) return 'Unknown Room';\n        const alias = r.getCanonicalAlias();\n        if (alias) return [r.name, alias];\n        return r.name;\n      },\n      [mx]\n    ),\n    SEARCH_OPTIONS\n  );\n\n  const autoCompleteRoomIds = result ? result.items.slice(0, 20) : allRooms.slice(0, 20);\n\n  useEffect(() => {\n    if (query.text) search(query.text);\n    else resetSearch();\n  }, [query.text, search, resetSearch]);\n\n  const handleAutocomplete: MentionAutoCompleteHandler = (roomAliasOrId, name) => {\n    const mentionRoom = mx.getRoom(roomAliasOrId);\n    const viaServers = mentionRoom ? getViaServers(mentionRoom) : undefined;\n    const mentionEl = createMentionElement(\n      roomAliasOrId,\n      name.startsWith('#') ? name : `#${name}`,\n      roomId === roomAliasOrId || mx.getRoom(roomId)?.getCanonicalAlias() === roomAliasOrId,\n      undefined,\n      viaServers\n    );\n    controller.insertInline(mentionEl, query.from, query.to);\n    controller.insertText(' ');\n    requestClose();\n  };\n\n  useKeyDown(window, (evt: KeyboardEvent) => {\n    onTabPress(evt, () => {\n      if (autoCompleteRoomIds.length === 0) {\n        const alias = roomAliasFromQueryText(mx, query.text);\n        handleAutocomplete(alias, alias);\n        return;\n      }\n      const rId = autoCompleteRoomIds[0];\n      const r = mx.getRoom(rId);\n      const name = r?.name ?? rId;\n      handleAutocomplete(r?.getCanonicalAlias() ?? rId ?? '', name as string);\n    });\n  });\n\n  return (\n    <AutocompleteMenu headerContent={<Text size=\"L400\">Rooms</Text>} requestClose={requestClose}>\n      {autoCompleteRoomIds.length === 0 ? (\n        <UnknownRoomMentionItem query={query} handleAutocomplete={handleAutocomplete} />\n      ) : (\n        autoCompleteRoomIds.map((rId) => {\n          const room = mx.getRoom(rId);\n          if (!room) return null;\n          const dm = mDirects.has(room.roomId);\n\n          const handleSelect = () => handleAutocomplete(room.getCanonicalAlias() ?? rId, room.name);\n\n          return (\n            <MenuItem\n              key={rId}\n              as=\"button\"\n              radii=\"300\"\n              onKeyDown={(evt: ReactKeyboardEvent<HTMLButtonElement>) =>\n                onTabPress(evt, handleSelect)\n              }\n              onMouseDown={(evt: ReactMouseEvent<HTMLButtonElement>) => evt.preventDefault()}\n              onClick={handleSelect}\n              after={\n                <Text size=\"T200\" priority=\"300\" truncate>\n                  {room.getCanonicalAlias() ?? ''}\n                </Text>\n              }\n              before={\n                <Avatar size=\"200\">\n                  {dm ? (\n                    <RoomAvatar\n                      roomId={room.roomId}\n                      src={getDirectRoomAvatarUrl(mx, room)}\n                      alt={room.name}\n                      renderFallback={() => (\n                        <RoomIcon\n                          size=\"50\"\n                          joinRule={room.getJoinRule() ?? JoinRule.Restricted}\n                          roomType={room.getType()}\n                          filled\n                        />\n                      )}\n                    />\n                  ) : (\n                    <RoomIcon size=\"100\" joinRule={room.getJoinRule()} roomType={room.getType()} />\n                  )}\n                </Avatar>\n              }\n            >\n              <Text style={{ flexGrow: 1 }} size=\"B400\" truncate>\n                {room.name}\n              </Text>\n            </MenuItem>\n          );\n        })\n      )}\n    </AutocompleteMenu>\n  );\n}\n","import type { KeyboardEvent as ReactKeyboardEvent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Avatar, MenuItem, Text } from 'folds';\nimport { userFallbackIcon } from '$components/icons/phosphor';\nimport type { MatrixClient, Room, RoomMember } from '$types/matrix-sdk';\n\nimport { useRoomMembers } from '$hooks/useRoomMembers';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { SearchItemStrGetter, UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport { onTabPress } from '$utils/keyboard';\nimport { useKeyDown } from '$hooks/useKeyDown';\nimport { getMxIdLocalPart, isUserId } from '$utils/matrix';\nimport { getAvatarUrl, getMemberDisplayName, getMemberSearchStr } from '$utils/room/display';\nimport { UserAvatar } from '$components/user-avatar';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\n\nimport { useAtomValue } from 'jotai';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { createMentionElement, mentionNameForUserAutocomplete } from '$components/editor/utils';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport { AutocompleteMenu } from './AutocompleteMenu';\nimport type {\n  EditorAutocompleteQuery,\n  ProseMirrorEditorController,\n} from '../prosemirrorController';\nimport { KnownMembership } from '$types/matrix-sdk';\n\ntype MentionAutoCompleteHandler = (userId: string, name: string) => void;\ntype UserDirectoryEntry = {\n  userId: string;\n  displayName?: string;\n  avatarUrl?: string;\n};\n\nconst userIdFromQueryText = (mx: MatrixClient, text: string) =>\n  isUserId(`@${text}`)\n    ? `@${text}`\n    : `@${text}${text.endsWith(':') ? '' : ':'}${getMxIdServer(mx.getUserId() ?? '')}`;\n\nfunction UnknownMentionItem({\n  userId,\n  name,\n  handleAutocomplete,\n}: {\n  userId: string;\n  name: string;\n  handleAutocomplete: MentionAutoCompleteHandler;\n}) {\n  return (\n    <MenuItem\n      as=\"button\"\n      radii=\"300\"\n      onKeyDown={(evt: ReactKeyboardEvent<HTMLButtonElement>) =>\n        onTabPress(evt, () => handleAutocomplete(userId, name))\n      }\n      onMouseDown={(evt: ReactMouseEvent<HTMLButtonElement>) => evt.preventDefault()}\n      onClick={() => handleAutocomplete(userId, name)}\n      before={\n        <Avatar size=\"200\">\n          <UserAvatar userId={userId} renderFallback={() => userFallbackIcon('sm')} />\n        </Avatar>\n      }\n    >\n      <Text style={{ flexGrow: 1 }} size=\"B400\">\n        {name}\n      </Text>\n    </MenuItem>\n  );\n}\n\ntype UserMentionAutocompleteProps = {\n  room: Room;\n  controller: ProseMirrorEditorController;\n  query: EditorAutocompleteQuery<string>;\n  requestClose: () => void;\n};\n\nconst withAllowedMembership = (member: RoomMember): boolean =>\n  member.membership === KnownMembership.Join ||\n  member.membership === KnownMembership.Invite ||\n  member.membership === KnownMembership.Knock;\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  // The menu only displays 20 members; continuing to search reorders its visible results.\n  limit: 20,\n  matchOptions: {\n    contain: true,\n  },\n};\nconst MAX_MENTION_RESULTS = 20;\nconst DIRECTORY_SEARCH_DELAY_MS = 200;\n\nconst mxIdToName = (mxId: string) => getMxIdLocalPart(mxId) ?? mxId;\n\nexport function UserMentionAutocomplete({\n  room,\n  controller,\n  query,\n  requestClose,\n}: UserMentionAutocompleteProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const nicknames = useAtomValue(nicknamesAtom);\n  const roomId: string = room.roomId;\n  const roomAliasOrId = room.getCanonicalAlias() || roomId;\n  const memberListComplete = room.membersLoaded();\n  const members = useRoomMembers(mx, roomId);\n  const mentionableMembers = useMemo(() => members.filter(withAllowedMembership), [members]);\n  const [directoryResults, setDirectoryResults] = useState<UserDirectoryEntry[]>([]);\n\n  const getRoomMemberStr = useCallback<SearchItemStrGetter<RoomMember>>(\n    (m, searchQuery) => getMemberSearchStr(m, searchQuery, mxIdToName, nicknames),\n    [nicknames]\n  );\n\n  const [result, search, resetSearch] = useAsyncSearch(\n    mentionableMembers,\n    getRoomMemberStr,\n    SEARCH_OPTIONS\n  );\n  const autoCompleteMembers = result?.items ?? mentionableMembers.slice(0, MAX_MENTION_RESULTS);\n  const directoryMatches = useMemo(() => {\n    const memberIds = new Set(autoCompleteMembers.map((member) => member.userId));\n    return directoryResults\n      .filter((member) => !memberIds.has(member.userId))\n      .slice(0, MAX_MENTION_RESULTS - autoCompleteMembers.length);\n  }, [autoCompleteMembers, directoryResults]);\n\n  useEffect(() => {\n    if (query.text) search(query.text);\n    else resetSearch();\n  }, [query.text, search, resetSearch]);\n\n  useEffect(() => {\n    if (!query.text || query.text === 'room' || memberListComplete) {\n      setDirectoryResults([]);\n      return undefined;\n    }\n\n    let disposed = false;\n    setDirectoryResults([]);\n    const searchId = window.setTimeout(() => {\n      void mx\n        .searchUserDirectory({ term: query.text, limit: MAX_MENTION_RESULTS })\n        .then(({ results }) => {\n          if (disposed) return;\n          setDirectoryResults(\n            results.map(\n              ({ user_id: userId, display_name: displayName, avatar_url: avatarUrl }) => ({\n                userId,\n                displayName,\n                avatarUrl,\n              })\n            )\n          );\n        })\n        .catch(() => {\n          if (!disposed) setDirectoryResults([]);\n        });\n    }, DIRECTORY_SEARCH_DELAY_MS);\n\n    return () => {\n      disposed = true;\n      window.clearTimeout(searchId);\n    };\n  }, [memberListComplete, mx, query.text]);\n\n  const handleAutocomplete: MentionAutoCompleteHandler = (id, displayName) => {\n    const isRoomPing = displayName === '@room';\n    const isCurrentRoom = roomId === id || room.getCanonicalAlias() === id || roomAliasOrId === id;\n    const mentionEl = createMentionElement(\n      id,\n      mentionNameForUserAutocomplete(id, displayName, { room, nicknames }),\n      isRoomPing ? isCurrentRoom : mx.getUserId() === id || isCurrentRoom\n    );\n    controller.insertInline(mentionEl, query.from, query.to);\n    controller.insertText(' ');\n    requestClose();\n  };\n\n  function getName(member: RoomMember) {\n    return (\n      getMemberDisplayName(room, member.userId, nicknames) ??\n      getMxIdLocalPart(member.userId) ??\n      member.userId\n    );\n  }\n\n  useKeyDown(window, (evt: KeyboardEvent) => {\n    onTabPress(evt, () => {\n      if (query.text === 'room') {\n        handleAutocomplete(roomAliasOrId, '@room');\n        return;\n      }\n      if (autoCompleteMembers.length === 0 && directoryMatches.length === 0) {\n        const userId = userIdFromQueryText(mx, query.text);\n        handleAutocomplete(userId, userId);\n        return;\n      }\n      const roomMember = autoCompleteMembers[0];\n      if (roomMember) {\n        handleAutocomplete(roomMember.userId, getName(roomMember));\n        return;\n      }\n      const directoryMember = directoryMatches[0]!;\n      handleAutocomplete(\n        directoryMember.userId,\n        directoryMember.displayName ??\n          getMxIdLocalPart(directoryMember.userId) ??\n          directoryMember.userId\n      );\n    });\n  });\n\n  return (\n    <AutocompleteMenu headerContent={<Text size=\"L400\">Mentions</Text>} requestClose={requestClose}>\n      {query.text === 'room' && (\n        <UnknownMentionItem\n          userId={roomAliasOrId}\n          name=\"@room\"\n          handleAutocomplete={handleAutocomplete}\n        />\n      )}\n      {autoCompleteMembers.length === 0 && directoryMatches.length === 0 ? (\n        <UnknownMentionItem\n          userId={userIdFromQueryText(mx, query.text)}\n          name={userIdFromQueryText(mx, query.text)}\n          handleAutocomplete={handleAutocomplete}\n        />\n      ) : (\n        <>\n          {autoCompleteMembers.map((roomMember) => {\n            const avatarMxcUrl = roomMember.getMxcAvatarUrl();\n            const avatarUrl = getAvatarUrl(mx, avatarMxcUrl, 32, useAuthentication);\n            return (\n              <MenuItem\n                key={roomMember.userId}\n                as=\"button\"\n                radii=\"300\"\n                onKeyDown={(evt: ReactKeyboardEvent<HTMLButtonElement>) =>\n                  onTabPress(evt, () => handleAutocomplete(roomMember.userId, getName(roomMember)))\n                }\n                onMouseDown={(evt: ReactMouseEvent<HTMLButtonElement>) => evt.preventDefault()}\n                onClick={() => handleAutocomplete(roomMember.userId, getName(roomMember))}\n                after={\n                  <Text size=\"T200\" priority=\"300\" truncate>\n                    {roomMember.userId}\n                  </Text>\n                }\n                before={\n                  <Avatar size=\"200\">\n                    <UserAvatar\n                      userId={roomMember.userId}\n                      src={avatarUrl ?? undefined}\n                      alt={getName(roomMember)}\n                      renderFallback={() => userFallbackIcon('sm')}\n                    />\n                  </Avatar>\n                }\n              >\n                <Text style={{ flexGrow: 1 }} size=\"B400\" truncate>\n                  {getName(roomMember)}\n                </Text>\n              </MenuItem>\n            );\n          })}\n          {directoryMatches.map((directoryMember) => {\n            const name =\n              directoryMember.displayName ??\n              getMxIdLocalPart(directoryMember.userId) ??\n              directoryMember.userId;\n            const avatarUrl = getAvatarUrl(mx, directoryMember.avatarUrl, 32, useAuthentication);\n            return (\n              <MenuItem\n                key={directoryMember.userId}\n                as=\"button\"\n                radii=\"300\"\n                onKeyDown={(evt: ReactKeyboardEvent<HTMLButtonElement>) =>\n                  onTabPress(evt, () => handleAutocomplete(directoryMember.userId, name))\n                }\n                onMouseDown={(evt: ReactMouseEvent<HTMLButtonElement>) => evt.preventDefault()}\n                onClick={() => handleAutocomplete(directoryMember.userId, name)}\n                after={\n                  <Text size=\"T200\" priority=\"300\" truncate>\n                    {directoryMember.userId}\n                  </Text>\n                }\n                before={\n                  <Avatar size=\"200\">\n                    <UserAvatar\n                      userId={directoryMember.userId}\n                      src={avatarUrl ?? undefined}\n                      alt={name}\n                      renderFallback={() => userFallbackIcon('sm')}\n                    />\n                  </Avatar>\n                }\n              >\n                <Text style={{ flexGrow: 1 }} size=\"B400\" truncate>\n                  {name}\n                </Text>\n              </MenuItem>\n            );\n          })}\n        </>\n      )}\n    </AutocompleteMenu>\n  );\n}\n","import type { MatrixClient } from '$types/matrix-sdk';\n\nimport { getAccountData } from '$utils/room/hierarchy';\nimport type { IEmoji } from './emoji';\nimport { emojis } from './emoji';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\n\ntype EmojiUnicode = string;\ntype EmojiUsageCount = number;\n\ntype RecentEmojiEntry =\n  | { emoji: EmojiUnicode; total: EmojiUsageCount }\n  | [EmojiUnicode, EmojiUsageCount];\n\nexport type IRecentEmojiContent = {\n  recent_emoji?: { emoji: EmojiUnicode; total: EmojiUsageCount }[];\n};\n\nconst isTuple = (entry: RecentEmojiEntry): entry is [EmojiUnicode, EmojiUsageCount] =>\n  Array.isArray(entry) &&\n  entry.length === 2 &&\n  typeof entry[0] === 'string' &&\n  typeof entry[1] === 'number';\n\nconst isValidEntry = (\n  entry: RecentEmojiEntry\n): entry is { emoji: EmojiUnicode; total: EmojiUsageCount } =>\n  typeof entry === 'object' &&\n  entry !== null &&\n  !Array.isArray(entry) &&\n  typeof (entry as { emoji?: unknown }).emoji === 'string' &&\n  typeof (entry as { total?: unknown }).total === 'number';\n\nconst normalizeEntries = (\n  raw: RecentEmojiEntry[]\n): { emoji: EmojiUnicode; total: EmojiUsageCount }[] =>\n  raw\n    .map((entry) => {\n      if (isTuple(entry)) return { emoji: entry[0], total: entry[1] };\n      if (isValidEntry(entry)) return { emoji: entry.emoji, total: entry.total };\n      return null;\n    })\n    .filter((e): e is { emoji: EmojiUnicode; total: EmojiUsageCount } => e !== null);\n\nexport const getRecentEmojis = (mx: MatrixClient, limit?: number): IEmoji[] => {\n  let recentEmojiEvent = getAccountData(mx, CustomAccountDataEvent.RecentEmoji);\n  let isLegacy = false;\n  if (!recentEmojiEvent) {\n    recentEmojiEvent = getAccountData(mx, CustomAccountDataEvent.LegacyElementRecentEmoji);\n    isLegacy = true;\n  }\n  const raw = recentEmojiEvent?.getContent<IRecentEmojiContent>().recent_emoji;\n\n  if (!Array.isArray(raw)) return [];\n\n  const hasTuples = raw.some((e) => isTuple(e as RecentEmojiEntry));\n  const entries = normalizeEntries(raw as RecentEmojiEntry[]);\n\n  if ((isLegacy || hasTuples) && entries.length > 0) {\n    mx.setAccountData(CustomAccountDataEvent.RecentEmoji, {\n      recent_emoji: entries,\n    }).catch(() => {});\n  }\n\n  return entries\n    .toSorted((a, b) => b.total - a.total)\n    .slice(0, limit)\n    .reduce<IEmoji[]>((list, { emoji: unicode }) => {\n      const emoji = emojis.find((e) => e.unicode === unicode);\n      if (emoji) list.push(emoji);\n      return list;\n    }, []);\n};\n\nexport function addRecentEmoji(mx: MatrixClient, unicode: string) {\n  let recentEmojiEvent = getAccountData(mx, CustomAccountDataEvent.RecentEmoji);\n  if (!recentEmojiEvent) {\n    recentEmojiEvent = getAccountData(mx, CustomAccountDataEvent.LegacyElementRecentEmoji);\n  }\n  const raw = recentEmojiEvent?.getContent<IRecentEmojiContent>().recent_emoji;\n  const recentEmoji = Array.isArray(raw) ? normalizeEntries(raw as RecentEmojiEntry[]) : [];\n\n  const existingIndex = recentEmoji.findIndex((e) => e.emoji === unicode);\n  if (existingIndex < 0) {\n    recentEmoji.unshift({ emoji: unicode, total: 1 });\n  } else {\n    const [entry] = recentEmoji.splice(existingIndex, 1);\n    if (entry) {\n      entry.total += 1;\n      recentEmoji.unshift(entry);\n    } else {\n      recentEmoji.unshift({ emoji: unicode, total: 1 });\n    }\n  }\n\n  mx.setAccountData(CustomAccountDataEvent.RecentEmoji, {\n    recent_emoji: recentEmoji.slice(0, 100),\n  });\n}\n","import { useCallback, useState } from 'react';\nimport type { MatrixClient, MatrixEvent } from '$types/matrix-sdk';\nimport { ClientEvent } from '$types/matrix-sdk';\nimport { useMatrixEvent } from '$hooks/useMatrixEvent';\n\nimport { getRecentEmojis } from '$plugins/recent-emoji';\nimport type { IEmoji } from '$plugins/emoji';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\n\nexport const useRecentEmoji = (mx: MatrixClient, limit?: number): IEmoji[] => {\n  const [recentEmoji, setRecentEmoji] = useState(() => getRecentEmojis(mx, limit));\n\n  const handleAccountData = useCallback(\n    (event: MatrixEvent) => {\n      if (\n        event.getType() !== (CustomAccountDataEvent.RecentEmoji as string) &&\n        event.getType() !== (CustomAccountDataEvent.LegacyElementRecentEmoji as string)\n      ) {\n        return;\n      }\n      setRecentEmoji(getRecentEmojis(mx, limit));\n    },\n    [mx, limit]\n  );\n\n  useMatrixEvent(mx, ClientEvent.AccountData, handleAccountData);\n\n  return recentEmoji;\n};\n","import type { Room } from '$types/matrix-sdk';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport type { ImagePack, ImageUsage } from '$plugins/custom-emoji';\nimport {\n  getGlobalImagePacks,\n  getGlobalImagePackRoomIds,\n  getRoomImagePack,\n  getRoomImagePacks,\n  getUserImagePack,\n  globalPacksScope,\n  readCachedPack,\n  readCachedPacks,\n  roomPacksScope,\n  userPackScope,\n  writeCachedPack,\n  writeCachedPacks,\n} from '$plugins/custom-emoji';\nimport { getSlidingSyncManager } from '$client/initMatrix';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useAccountDataCallback } from './useAccountDataCallback';\nimport { useStateEventCallback } from './useStateEventCallback';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\nimport { CustomStateEvent } from '$types/matrix/room';\n\nconst imagePackEqual = (a: ImagePack | undefined, b: ImagePack | undefined): boolean => {\n  if (!a && !b) return true;\n  if (!a || !b) return false;\n  const aImages = Array.from(a.images.collection.entries());\n  const bImages = Array.from(b.images.collection.entries());\n  if (aImages.length !== bImages.length) return false;\n  const sameImages = aImages.every(([shortcode, image], index) => {\n    const other = bImages[index];\n    if (!other) return false;\n    const [otherShortcode, otherImage] = other;\n    if (shortcode !== otherShortcode) return false;\n    return (\n      image.url === otherImage.url &&\n      image.body === otherImage.body &&\n      JSON.stringify(image.usage) === JSON.stringify(otherImage.usage) &&\n      JSON.stringify(image.info) === JSON.stringify(otherImage.info)\n    );\n  });\n  if (!sameImages) return false;\n  return (\n    a.id === b.id &&\n    a.deleted === b.deleted &&\n    a.meta.name === b.meta.name &&\n    a.meta.avatar === b.meta.avatar &&\n    a.meta.attribution === b.meta.attribution &&\n    JSON.stringify(a.meta.usage) === JSON.stringify(b.meta.usage)\n  );\n};\n\nconst imagePackListEqual = (a: ImagePack[], b: ImagePack[]): boolean => {\n  if (a.length !== b.length) return false;\n  return a.every((pack, index) => imagePackEqual(pack, b[index]));\n};\n\nconst roomIdListEqual = (a: string[], b: string[]): boolean =>\n  a.length === b.length && a.every((roomId, index) => roomId === b[index]);\n\nexport const useUserImagePack = (): ImagePack | undefined => {\n  const mx = useMatrixClient();\n  // Seed from cache during initial state when live data is not available yet.\n  const [userPack, setUserPack] = useState<ImagePack | undefined>(() => {\n    const livePack = getUserImagePack(mx);\n    if (livePack) return livePack;\n    const userId = mx.getUserId();\n    if (!userId) return undefined;\n    return readCachedPack(userId, userPackScope()) ?? undefined;\n  });\n\n  useEffect(() => {\n    const userId = mx.getUserId();\n    if (userId) writeCachedPack(userId, userPackScope(), userPack);\n  }, [mx, userPack]);\n\n  useAccountDataCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (mEvent.getType() === (CustomAccountDataEvent.PoniesUserEmotes as string)) {\n          setUserPack((prev) => {\n            const next = getUserImagePack(mx);\n            return imagePackEqual(prev, next) ? prev : next;\n          });\n        }\n      },\n      [mx]\n    )\n  );\n\n  return userPack;\n};\n\nexport const useGlobalImagePacks = (): ImagePack[] => {\n  const mx = useMatrixClient();\n  // Seed from cache during initial state when live data is not available yet.\n  const [globalPacks, setGlobalPacks] = useState<ImagePack[]>(() => {\n    const livePacks = getGlobalImagePacks(mx);\n    if (livePacks.length > 0) return livePacks;\n    const userId = mx.getUserId();\n    if (!userId) return livePacks;\n    const cachedPacks = readCachedPacks(userId, globalPacksScope());\n    return cachedPacks.length > 0 ? cachedPacks : livePacks;\n  });\n  const [packRoomIds, setPackRoomIds] = useState<string[]>(() => getGlobalImagePackRoomIds(mx));\n\n  useEffect(() => {\n    const manager = getSlidingSyncManager(mx);\n    if (!manager) return undefined;\n\n    const refresh = () => {\n      setGlobalPacks((prev) => {\n        const next = getGlobalImagePacks(mx);\n        return imagePackListEqual(prev, next) ? prev : next;\n      });\n    };\n\n    manager.setImagePackSubscriptions(packRoomIds);\n    const listeners = packRoomIds.map((roomId) => manager.onRoomData(roomId, refresh));\n\n    return () => listeners.forEach((unsubscribe) => unsubscribe());\n  }, [mx, packRoomIds]);\n\n  useEffect(() => {\n    const userId = mx.getUserId();\n    if (userId) writeCachedPacks(userId, globalPacksScope(), globalPacks);\n  }, [mx, globalPacks]);\n\n  useAccountDataCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (\n          mEvent.getType() === (CustomAccountDataEvent.ImagePackRooms as string) ||\n          mEvent.getType() === (CustomAccountDataEvent.PoniesEmoteRooms as string)\n        ) {\n          const manager = getSlidingSyncManager(mx);\n          const nextPackRoomIds = getGlobalImagePackRoomIds(mx);\n          manager?.setImagePackSubscriptions(nextPackRoomIds);\n          setPackRoomIds((current) =>\n            roomIdListEqual(current, nextPackRoomIds) ? current : nextPackRoomIds\n          );\n          setGlobalPacks((prev) => {\n            const next = getGlobalImagePacks(mx);\n            return imagePackListEqual(prev, next) ? prev : next;\n          });\n        }\n      },\n      [mx]\n    )\n  );\n\n  useStateEventCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        const eventType = mEvent.getType();\n        const roomId = mEvent.getRoomId();\n        if (\n          (eventType === (CustomStateEvent.ImagePack as string) ||\n            eventType === (CustomStateEvent.PoniesRoomEmotes as string)) &&\n          roomId &&\n          packRoomIds.includes(roomId)\n        ) {\n          setGlobalPacks((prev) => {\n            const next = getGlobalImagePacks(mx);\n            return imagePackListEqual(prev, next) ? prev : next;\n          });\n        }\n      },\n      [mx, packRoomIds]\n    )\n  );\n\n  return globalPacks;\n};\n\nexport const useRoomImagePack = (room: Room, stateKey: string): ImagePack | undefined => {\n  const mx = useMatrixClient();\n  // Seed from cache during initial state when live data is not available yet.\n  const [roomPack, setRoomPack] = useState<ImagePack | undefined>(() => {\n    const livePack = getRoomImagePack(room, stateKey);\n    if (livePack) return livePack;\n    const userId = mx.getUserId();\n    if (!userId) return undefined;\n    return readCachedPacks(userId, roomPacksScope(room.roomId)).find(\n      (pack) => pack.address?.stateKey === stateKey\n    );\n  });\n\n  useEffect(() => {\n    const userId = mx.getUserId();\n    if (!userId) return;\n    // Persist all packs for this room whenever this single-pack state changes\n    const scope = roomPacksScope(room.roomId);\n    writeCachedPack(userId, scope, roomPack);\n  }, [mx, room.roomId, roomPack]);\n\n  useStateEventCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (\n          mEvent.getRoomId() === room.roomId &&\n          (mEvent.getType() === (CustomStateEvent.ImagePack as string) ||\n            mEvent.getType() === (CustomStateEvent.PoniesRoomEmotes as string)) &&\n          mEvent.getStateKey() === stateKey\n        ) {\n          setRoomPack((prev) => {\n            const next = getRoomImagePack(room, stateKey);\n            return imagePackEqual(prev, next) ? prev : next;\n          });\n        }\n      },\n      [room, stateKey]\n    )\n  );\n\n  return roomPack;\n};\n\nexport const useRoomImagePacks = (room: Room): ImagePack[] => {\n  const mx = useMatrixClient();\n  // Seed from cache during initial state when live data is not available yet.\n  const [roomPacks, setRoomPacks] = useState<ImagePack[]>(() => {\n    const livePacks = getRoomImagePacks(room);\n    if (livePacks.length > 0) return livePacks;\n    const userId = mx.getUserId();\n    if (!userId) return livePacks;\n    const cachedPacks = readCachedPacks(userId, roomPacksScope(room.roomId));\n    return cachedPacks.length > 0 ? cachedPacks : livePacks;\n  });\n\n  useEffect(() => {\n    const userId = mx.getUserId();\n    if (userId) writeCachedPacks(userId, roomPacksScope(room.roomId), roomPacks);\n  }, [mx, room.roomId, roomPacks]);\n\n  useStateEventCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (\n          mEvent.getRoomId() === room.roomId &&\n          (mEvent.getType() === (CustomStateEvent.ImagePack as string) ||\n            mEvent.getType() === (CustomStateEvent.PoniesRoomEmotes as string))\n        ) {\n          setRoomPacks((prev) => {\n            const next = getRoomImagePacks(room);\n            return imagePackListEqual(prev, next) ? prev : next;\n          });\n        }\n      },\n      [room]\n    )\n  );\n\n  return roomPacks;\n};\n\nexport const useRoomsImagePacks = (rooms: Room[]) => {\n  const mx = useMatrixClient();\n  // Seed from cache during initial state when live data is not available yet.\n  const [roomPacks, setRoomPacks] = useState<ImagePack[]>(() => {\n    const livePacks = rooms.flatMap(getRoomImagePacks);\n    if (livePacks.length > 0) return livePacks;\n    const userId = mx.getUserId();\n    if (!userId) return livePacks;\n    const cachedPacks = rooms.flatMap((room) => {\n      const roomLivePacks = getRoomImagePacks(room);\n      if (roomLivePacks.length > 0) return roomLivePacks;\n      return readCachedPacks(userId, roomPacksScope(room.roomId));\n    });\n    return cachedPacks.length > 0 ? cachedPacks : livePacks;\n  });\n\n  useEffect(() => {\n    const userId = mx.getUserId();\n    if (!userId) return;\n    // Persist per-room — group packs by roomId and write each bucket\n    const byRoom = new Map<string, ImagePack[]>();\n    roomPacks.forEach((pack) => {\n      if (!pack.address) return;\n      const bucket = byRoom.get(pack.address.roomId) ?? [];\n      bucket.push(pack);\n      byRoom.set(pack.address.roomId, bucket);\n    });\n    byRoom.forEach((packs, roomId) => {\n      writeCachedPacks(userId, roomPacksScope(roomId), packs);\n    });\n  }, [mx, roomPacks]);\n\n  useStateEventCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (\n          rooms.find((room) => room.roomId === mEvent.getRoomId()) &&\n          (mEvent.getType() === (CustomStateEvent.ImagePack as string) ||\n            mEvent.getType() === (CustomStateEvent.PoniesRoomEmotes as string))\n        ) {\n          setRoomPacks((prev) => {\n            const next = rooms.flatMap(getRoomImagePacks);\n            return imagePackListEqual(prev, next) ? prev : next;\n          });\n        }\n      },\n      [rooms]\n    )\n  );\n\n  return roomPacks;\n};\n\nexport const useRelevantImagePacks = (usage: ImageUsage, rooms: Room[]): ImagePack[] => {\n  const userPack = useUserImagePack();\n  const globalPacks = useGlobalImagePacks();\n  const roomsPacks = useRoomsImagePacks(rooms);\n\n  const relevantPacks = useMemo(() => {\n    const packs = userPack ? [userPack] : [];\n    const globalPackIds = new Set(globalPacks.map((pack) => pack.id));\n\n    const relPacks = packs.concat(\n      globalPacks,\n      roomsPacks.filter((pack) => !globalPackIds.has(pack.id))\n    );\n\n    return relPacks.filter((pack) => pack.getImages(usage).length > 0);\n  }, [userPack, globalPacks, roomsPacks, usage]);\n\n  return relevantPacks;\n};\n","import type { SearchItemStrGetter } from '$hooks/useAsyncSearch';\nimport { PackImageReader } from './custom-emoji';\nimport type { IEmoji } from './emoji';\n\nexport const getEmoticonSearchStr: SearchItemStrGetter<PackImageReader | IEmoji> = (item) => {\n  const shortcode = `:${item.shortcode}:`;\n  if (item instanceof PackImageReader) {\n    if (item.body) {\n      return [shortcode, item.body];\n    }\n    return shortcode;\n  }\n\n  const names = [shortcode, item.label];\n  if (Array.isArray(item.shortcodes)) {\n    return names.concat(item.shortcodes);\n  }\n  return names;\n};\n","import type { KeyboardEvent as ReactKeyboardEvent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useEffect, useMemo } from 'react';\nimport { Box, MenuItem, Text, toRem } from 'folds';\nimport type { Room } from '$types/matrix-sdk';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport { onTabPress } from '$utils/keyboard';\nimport { useRecentEmoji } from '$hooks/useRecentEmoji';\nimport { useRelevantImagePacks } from '$hooks/useImagePacks';\nimport type { IEmoji } from '$plugins/emoji';\nimport { emojis } from '$plugins/emoji';\nimport { useKeyDown } from '$hooks/useKeyDown';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport type { PackImageReader } from '$plugins/custom-emoji';\nimport { ImageUsage } from '$plugins/custom-emoji';\nimport { getEmoticonSearchStr } from '$plugins/utils';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { createEmoticonElement } from '$components/editor/utils';\nimport type {\n  EditorAutocompleteQuery,\n  ProseMirrorEditorController,\n} from '$components/editor/prosemirrorController';\nimport { AutocompleteMenu } from './AutocompleteMenu';\n\ntype EmoticonCompleteHandler = (key: string, shortcode: string) => void;\n\ntype EmoticonSearchItem = PackImageReader | IEmoji;\n\ntype EmoticonAutocompleteProps = {\n  title?: string;\n  imagePackRooms: Room[];\n  controller: ProseMirrorEditorController;\n  query: EditorAutocompleteQuery<string>;\n  requestClose: () => void;\n  // this allows you to override the default behaviour of inserting the selection\n  // used to implement the +: reaction shortcut\n  onEmoticonSelected?: EmoticonCompleteHandler;\n};\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  matchOptions: {\n    contain: true,\n  },\n};\n\nexport function EmoticonAutocomplete({\n  title,\n  imagePackRooms,\n  controller,\n  query,\n  requestClose,\n  onEmoticonSelected,\n}: EmoticonAutocompleteProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const imagePacks = useRelevantImagePacks(ImageUsage.Emoticon, imagePackRooms);\n  const recentEmoji = useRecentEmoji(mx, 20);\n\n  const [emojiThreshold] = useSetting(settingsAtom, 'emojiSuggestThreshold');\n\n  const searchList = useMemo<Array<EmoticonSearchItem>>(\n    () => [...imagePacks.flatMap((pack) => pack.getImages(ImageUsage.Emoticon)), ...emojis],\n    [imagePacks]\n  );\n\n  const [result, search, resetSearch] = useAsyncSearch(\n    searchList,\n    getEmoticonSearchStr,\n    SEARCH_OPTIONS\n  );\n  const autoCompleteEmoticon = useMemo(() => {\n    if (query.text.length < emojiThreshold) {\n      return [];\n    }\n    return result ? result.items.slice(0, 20) : recentEmoji;\n  }, [query.text.length, emojiThreshold, result, recentEmoji]);\n\n  useEffect(() => {\n    if (query.text && query.text.length >= emojiThreshold) {\n      search(query.text);\n    } else {\n      resetSearch();\n    }\n  }, [query.text, search, resetSearch, emojiThreshold]);\n\n  const handleAutocomplete: EmoticonCompleteHandler =\n    onEmoticonSelected ??\n    ((key, shortcode) => {\n      controller.insertInline(createEmoticonElement(key, shortcode), query.from, query.to);\n      controller.insertText(' ');\n      requestClose();\n    });\n\n  useKeyDown(window, (evt: KeyboardEvent) => {\n    onTabPress(evt, () => {\n      if (autoCompleteEmoticon.length === 0) return;\n      const emoticon = autoCompleteEmoticon[0]!;\n      const key = 'url' in emoticon ? emoticon.url : emoticon.unicode;\n      handleAutocomplete(key, emoticon.shortcode);\n    });\n  });\n\n  if (query.text.length < emojiThreshold) return null;\n\n  return (\n    <AutocompleteMenu\n      headerContent={<Text size=\"L400\">{title ?? 'Emojis'}</Text>}\n      requestClose={requestClose}\n    >\n      {autoCompleteEmoticon.length === 0 ? (\n        <Text size=\"B400\">No emojis found</Text>\n      ) : (\n        autoCompleteEmoticon.map((emoticon) => {\n          const isCustomEmoji = 'url' in emoticon;\n          const key = isCustomEmoji ? emoticon.url : emoticon.unicode;\n          const customEmojiUrl = mxcUrlToHttp(mx, key, useAuthentication);\n\n          return (\n            <MenuItem\n              key={emoticon.shortcode + key}\n              as=\"button\"\n              radii=\"300\"\n              onKeyDown={(evt: ReactKeyboardEvent<HTMLButtonElement>) =>\n                onTabPress(evt, () => handleAutocomplete(key, emoticon.shortcode))\n              }\n              onMouseDown={(evt: ReactMouseEvent<HTMLButtonElement>) => evt.preventDefault()}\n              onClick={() => handleAutocomplete(key, emoticon.shortcode)}\n              before={\n                isCustomEmoji && customEmojiUrl ? (\n                  <Box\n                    shrink=\"No\"\n                    as=\"img\"\n                    src={customEmojiUrl}\n                    alt={emoticon.shortcode}\n                    style={{\n                      width: toRem(24),\n                      height: toRem(24),\n                      objectFit: 'contain',\n                    }}\n                  />\n                ) : (\n                  <Box\n                    shrink=\"No\"\n                    as=\"span\"\n                    display=\"InlineFlex\"\n                    style={{ fontSize: toRem(24), lineHeight: toRem(24) }}\n                  >\n                    {key}\n                  </Box>\n                )\n              }\n            >\n              <Text style={{ flexGrow: 1 }} size=\"B400\" truncate>\n                :{emoticon.shortcode}:\n              </Text>\n            </MenuItem>\n          );\n        })\n      )}\n    </AutocompleteMenu>\n  );\n}\n","import type { HTMLAttributes, KeyboardEventHandler } from 'react';\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport type { EditorDocument } from './model';\nimport type { ProseMirrorEditorController } from './prosemirrorController';\n\nexport type ProseMirrorEditableHandle = {\n  clear: () => void;\n  focus: () => void;\n  getDocument: () => EditorDocument;\n  setDocument: (document: EditorDocument) => void;\n};\n\ntype ProseMirrorEditableProps = Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> & {\n  controller: ProseMirrorEditorController;\n  editableName?: string;\n  editorClassName?: string;\n  onHostChange?: (element: HTMLDivElement | null) => void;\n  onDocumentChange?: (document: EditorDocument) => void;\n  placeholder?: string;\n};\n\n/** React host for the private ProseMirror controller seam. */\nexport const ProseMirrorEditable = forwardRef<ProseMirrorEditableHandle, ProseMirrorEditableProps>(\n  (\n    {\n      controller,\n      editorClassName,\n      onHostChange,\n      onDocumentChange,\n      onKeyDown,\n      placeholder,\n      enterKeyHint,\n      editableName,\n      ...props\n    },\n    ref\n  ) => {\n    const rootRef = useRef<HTMLDivElement | null>(null);\n\n    // ProseMirror does not bind Enter; a consumer that sends calls\n    // preventDefault, so anything left over is a line break.\n    const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = (event) => {\n      onKeyDown?.(event);\n      if (event.defaultPrevented || event.key !== 'Enter') return;\n      if (event.nativeEvent.isComposing) return;\n      event.preventDefault();\n      controller.insertNewline();\n    };\n\n    const setRootRef = (element: HTMLDivElement | null) => {\n      rootRef.current = element;\n      onHostChange?.(element);\n    };\n\n    useImperativeHandle(\n      ref,\n      () => ({\n        clear: () => controller.clear(),\n        focus: () => controller.focus(),\n        getDocument: () => controller.getDocument(),\n        setDocument: (document) => controller.setDocument(document),\n      }),\n      [controller]\n    );\n\n    // ProseMirror owns these; React must not also render them.\n    const attributes = useMemo(\n      () => ({\n        ...(editorClassName ? { class: editorClassName } : {}),\n        ...(placeholder ? { 'data-placeholder': placeholder, 'aria-label': placeholder } : {}),\n        ...(editableName ? { 'data-editable-name': editableName } : {}),\n        ...(enterKeyHint ? { enterkeyhint: enterKeyHint } : {}),\n        role: 'textbox',\n      }),\n      [editableName, editorClassName, enterKeyHint, placeholder]\n    );\n    const attributesRef = useRef(attributes);\n    attributesRef.current = attributes;\n\n    useEffect(() => {\n      const root = rootRef.current;\n      if (!root) return undefined;\n      return controller.mount(root, attributesRef.current);\n    }, [controller]);\n\n    useEffect(() => {\n      controller.setAttributes(attributes);\n    }, [attributes, controller]);\n\n    useEffect(\n      () => controller.subscribe((document) => onDocumentChange?.(document)),\n      [controller, onDocumentChange]\n    );\n\n    return <div {...props} onKeyDownCapture={handleKeyDown} ref={setRootRef} />;\n  }\n);\n","// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n  this.content = content;\n}\n\nOrderedMap.prototype = {\n  constructor: OrderedMap,\n\n  find: function(key) {\n    for (var i = 0; i < this.content.length; i += 2)\n      if (this.content[i] === key) return i\n    return -1\n  },\n\n  // :: (string) → ?any\n  // Retrieve the value stored under `key`, or return undefined when\n  // no such key exists.\n  get: function(key) {\n    var found = this.find(key);\n    return found == -1 ? undefined : this.content[found + 1]\n  },\n\n  // :: (string, any, ?string) → OrderedMap\n  // Create a new map by replacing the value of `key` with a new\n  // value, or adding a binding to the end of the map. If `newKey` is\n  // given, the key of the binding will be replaced with that key.\n  update: function(key, value, newKey) {\n    var self = newKey && newKey != key ? this.remove(newKey) : this;\n    var found = self.find(key), content = self.content.slice();\n    if (found == -1) {\n      content.push(newKey || key, value);\n    } else {\n      content[found + 1] = value;\n      if (newKey) content[found] = newKey;\n    }\n    return new OrderedMap(content)\n  },\n\n  // :: (string) → OrderedMap\n  // Return a map with the given key removed, if it existed.\n  remove: function(key) {\n    var found = this.find(key);\n    if (found == -1) return this\n    var content = this.content.slice();\n    content.splice(found, 2);\n    return new OrderedMap(content)\n  },\n\n  // :: (string, any) → OrderedMap\n  // Add a new key to the start of the map.\n  addToStart: function(key, value) {\n    return new OrderedMap([key, value].concat(this.remove(key).content))\n  },\n\n  // :: (string, any) → OrderedMap\n  // Add a new key to the end of the map.\n  addToEnd: function(key, value) {\n    var content = this.remove(key).content.slice();\n    content.push(key, value);\n    return new OrderedMap(content)\n  },\n\n  // :: (string, string, any) → OrderedMap\n  // Add a key after the given key. If `place` is not found, the new\n  // key is added to the end.\n  addBefore: function(place, key, value) {\n    var without = this.remove(key), content = without.content.slice();\n    var found = without.find(place);\n    content.splice(found == -1 ? content.length : found, 0, key, value);\n    return new OrderedMap(content)\n  },\n\n  // :: ((key: string, value: any))\n  // Call the given function for each key/value pair in the map, in\n  // order.\n  forEach: function(f) {\n    for (var i = 0; i < this.content.length; i += 2)\n      f(this.content[i], this.content[i + 1]);\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a new map by prepending the keys in this map that don't\n  // appear in `map` before the keys in `map`.\n  prepend: function(map) {\n    map = OrderedMap.from(map);\n    if (!map.size) return this\n    return new OrderedMap(map.content.concat(this.subtract(map).content))\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a new map by appending the keys in this map that don't\n  // appear in `map` after the keys in `map`.\n  append: function(map) {\n    map = OrderedMap.from(map);\n    if (!map.size) return this\n    return new OrderedMap(this.subtract(map).content.concat(map.content))\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a map containing all the keys in this map that don't\n  // appear in `map`.\n  subtract: function(map) {\n    var result = this;\n    map = OrderedMap.from(map);\n    for (var i = 0; i < map.content.length; i += 2)\n      result = result.remove(map.content[i]);\n    return result\n  },\n\n  // :: () → Object\n  // Turn ordered map into a plain object.\n  toObject: function() {\n    var result = {};\n    this.forEach(function(key, value) { result[key] = value; });\n    return result\n  },\n\n  // :: number\n  // The amount of keys in this map.\n  get size() {\n    return this.content.length >> 1\n  }\n};\n\n// :: (?union<Object, OrderedMap>) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n  if (value instanceof OrderedMap) return value\n  var content = [];\n  if (value) for (var prop in value) content.push(prop, value[prop]);\n  return new OrderedMap(content)\n};\n\nexport default OrderedMap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n    for (let i = 0;; i++) {\n        if (i == a.childCount || i == b.childCount)\n            return a.childCount == b.childCount ? null : pos;\n        let childA = a.child(i), childB = b.child(i);\n        if (childA == childB) {\n            pos += childA.nodeSize;\n            continue;\n        }\n        if (!childA.sameMarkup(childB))\n            return pos;\n        if (childA.isText && childA.text != childB.text) {\n            let tA = childA.text, tB = childB.text, j = 0;\n            for (; tA[j] == tB[j]; j++)\n                pos++;\n            if (j && j < tA.length && j < tB.length && surrogateHigh(tA.charCodeAt(j - 1)) && surrogateLow(tA.charCodeAt(j)))\n                pos--;\n            return pos;\n        }\n        if (childA.content.size || childB.content.size) {\n            let inner = findDiffStart(childA.content, childB.content, pos + 1);\n            if (inner != null)\n                return inner;\n        }\n        pos += childA.nodeSize;\n    }\n}\nfunction findDiffEnd(a, b, posA, posB) {\n    for (let iA = a.childCount, iB = b.childCount;;) {\n        if (iA == 0 || iB == 0)\n            return iA == iB ? null : { a: posA, b: posB };\n        let childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n        if (childA == childB) {\n            posA -= size;\n            posB -= size;\n            continue;\n        }\n        if (!childA.sameMarkup(childB))\n            return { a: posA, b: posB };\n        if (childA.isText && childA.text != childB.text) {\n            let tA = childA.text, tB = childB.text, iA = tA.length, iB = tB.length;\n            while (iA > 0 && iB > 0 && tA[iA - 1] == tB[iB - 1]) {\n                iA--;\n                iB--;\n                posA--;\n                posB--;\n            }\n            if (iA && iB && iA < tA.length && surrogateHigh(tA.charCodeAt(iA - 1)) && surrogateLow(tA.charCodeAt(iA))) {\n                posA++;\n                posB++;\n            }\n            return { a: posA, b: posB };\n        }\n        if (childA.content.size || childB.content.size) {\n            let inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n            if (inner)\n                return inner;\n        }\n        posA -= size;\n        posB -= size;\n    }\n}\nfunction surrogateLow(ch) { return ch >= 0xDC00 && ch < 0xE000; }\nfunction surrogateHigh(ch) { return ch >= 0xD800 && ch < 0xDC00; }\n\n/**\nA fragment represents a node's collection of child nodes.\n\nLike nodes, fragments are persistent data structures, and you\nshould not mutate them or their content. Rather, you create new\ninstances whenever needed. The API tries to make this easy.\n*/\nclass Fragment {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The child nodes in this fragment.\n    */\n    content, size) {\n        this.content = content;\n        this.size = size || 0;\n        if (size == null)\n            for (let i = 0; i < content.length; i++)\n                this.size += content[i].nodeSize;\n    }\n    /**\n    Invoke a callback for all descendant nodes between the given two\n    positions (relative to start of this fragment). Doesn't descend\n    into a node when the callback returns `false`.\n    */\n    nodesBetween(from, to, f, nodeStart = 0, parent) {\n        for (let i = 0, pos = 0; pos < to; i++) {\n            let child = this.content[i], end = pos + child.nodeSize;\n            if (end > from && f(child, nodeStart + pos, parent || null, i) !== false && child.content.size) {\n                let start = pos + 1;\n                child.nodesBetween(Math.max(0, from - start), Math.min(child.content.size, to - start), f, nodeStart + start);\n            }\n            pos = end;\n        }\n    }\n    /**\n    Call the given callback for every descendant node. `pos` will be\n    relative to the start of the fragment. The callback may return\n    `false` to prevent traversal of a given node's children.\n    */\n    descendants(f) {\n        this.nodesBetween(0, this.size, f);\n    }\n    /**\n    Extract the text between `from` and `to`. See the same method on\n    [`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween).\n    */\n    textBetween(from, to, blockSeparator, leafText) {\n        let text = \"\", first = true;\n        this.nodesBetween(from, to, (node, pos) => {\n            let nodeText = node.isText ? node.text.slice(Math.max(from, pos) - pos, to - pos)\n                : !node.isLeaf ? \"\"\n                    : leafText ? (typeof leafText === \"function\" ? leafText(node) : leafText)\n                        : node.type.spec.leafText ? node.type.spec.leafText(node)\n                            : \"\";\n            if (node.isBlock && (node.isLeaf && nodeText || node.isTextblock) && blockSeparator) {\n                if (first)\n                    first = false;\n                else\n                    text += blockSeparator;\n            }\n            text += nodeText;\n        }, 0);\n        return text;\n    }\n    /**\n    Create a new fragment containing the combined content of this\n    fragment and the other.\n    */\n    append(other) {\n        if (!other.size)\n            return this;\n        if (!this.size)\n            return other;\n        let last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n        if (last.isText && last.sameMarkup(first)) {\n            content[content.length - 1] = last.withText(last.text + first.text);\n            i = 1;\n        }\n        for (; i < other.content.length; i++)\n            content.push(other.content[i]);\n        return new Fragment(content, this.size + other.size);\n    }\n    /**\n    Cut out the sub-fragment between the two given positions.\n    */\n    cut(from, to = this.size) {\n        if (from == 0 && to == this.size)\n            return this;\n        let result = [], size = 0;\n        if (to > from)\n            for (let i = 0, pos = 0; pos < to; i++) {\n                let child = this.content[i], end = pos + child.nodeSize;\n                if (end > from) {\n                    if (pos < from || end > to) {\n                        if (child.isText)\n                            child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos));\n                        else\n                            child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1));\n                    }\n                    result.push(child);\n                    size += child.nodeSize;\n                }\n                pos = end;\n            }\n        return new Fragment(result, size);\n    }\n    /**\n    @internal\n    */\n    cutByIndex(from, to) {\n        if (from == to)\n            return Fragment.empty;\n        if (from == 0 && to == this.content.length)\n            return this;\n        return new Fragment(this.content.slice(from, to));\n    }\n    /**\n    Create a new fragment in which the node at the given index is\n    replaced by the given node.\n    */\n    replaceChild(index, node) {\n        let current = this.content[index];\n        if (current == node)\n            return this;\n        let copy = this.content.slice();\n        let size = this.size + node.nodeSize - current.nodeSize;\n        copy[index] = node;\n        return new Fragment(copy, size);\n    }\n    /**\n    Create a new fragment by prepending the given node to this\n    fragment.\n    */\n    addToStart(node) {\n        return new Fragment([node].concat(this.content), this.size + node.nodeSize);\n    }\n    /**\n    Create a new fragment by appending the given node to this\n    fragment.\n    */\n    addToEnd(node) {\n        return new Fragment(this.content.concat(node), this.size + node.nodeSize);\n    }\n    /**\n    Compare this fragment to another one.\n    */\n    eq(other) {\n        if (this.content.length != other.content.length)\n            return false;\n        for (let i = 0; i < this.content.length; i++)\n            if (!this.content[i].eq(other.content[i]))\n                return false;\n        return true;\n    }\n    /**\n    The first child of the fragment, or `null` if it is empty.\n    */\n    get firstChild() { return this.content.length ? this.content[0] : null; }\n    /**\n    The last child of the fragment, or `null` if it is empty.\n    */\n    get lastChild() { return this.content.length ? this.content[this.content.length - 1] : null; }\n    /**\n    The number of child nodes in this fragment.\n    */\n    get childCount() { return this.content.length; }\n    /**\n    Get the child node at the given index. Raise an error when the\n    index is out of range.\n    */\n    child(index) {\n        let found = this.content[index];\n        if (!found)\n            throw new RangeError(\"Index \" + index + \" out of range for \" + this);\n        return found;\n    }\n    /**\n    Get the child node at the given index, if it exists.\n    */\n    maybeChild(index) {\n        return this.content[index] || null;\n    }\n    /**\n    Call `f` for every child node, passing the node, its offset\n    into this parent node, and its index.\n    */\n    forEach(f) {\n        for (let i = 0, p = 0; i < this.content.length; i++) {\n            let child = this.content[i];\n            f(child, p, i);\n            p += child.nodeSize;\n        }\n    }\n    /**\n    Find the first position at which this fragment and another\n    fragment differ, or `null` if they are the same.\n    */\n    findDiffStart(other, pos = 0) {\n        return findDiffStart(this, other, pos);\n    }\n    /**\n    Find the first position, searching from the end, at which this\n    fragment and the given fragment differ, or `null` if they are\n    the same. Since this position will not be the same in both\n    nodes, an object with two separate positions is returned.\n    */\n    findDiffEnd(other, pos = this.size, otherPos = other.size) {\n        return findDiffEnd(this, other, pos, otherPos);\n    }\n    /**\n    Find the index and inner offset corresponding to a given relative\n    position in this fragment. The result object will be reused\n    (overwritten) the next time the function is called. @internal\n    */\n    findIndex(pos) {\n        if (pos == 0)\n            return retIndex(0, pos);\n        if (pos == this.size)\n            return retIndex(this.content.length, pos);\n        if (pos > this.size || pos < 0)\n            throw new RangeError(`Position ${pos} outside of fragment (${this})`);\n        for (let i = 0, curPos = 0;; i++) {\n            let cur = this.child(i), end = curPos + cur.nodeSize;\n            if (end >= pos) {\n                if (end == pos)\n                    return retIndex(i + 1, end);\n                return retIndex(i, curPos);\n            }\n            curPos = end;\n        }\n    }\n    /**\n    Return a debugging string that describes this fragment.\n    */\n    toString() { return \"<\" + this.toStringInner() + \">\"; }\n    /**\n    @internal\n    */\n    toStringInner() { return this.content.join(\", \"); }\n    /**\n    Create a JSON-serializeable representation of this fragment.\n    */\n    toJSON() {\n        return this.content.length ? this.content.map(n => n.toJSON()) : null;\n    }\n    /**\n    Deserialize a fragment from its JSON representation.\n    */\n    static fromJSON(schema, value) {\n        if (!value)\n            return Fragment.empty;\n        if (!Array.isArray(value))\n            throw new RangeError(\"Invalid input for Fragment.fromJSON\");\n        return Fragment.fromArray(value.map(schema.nodeFromJSON));\n    }\n    /**\n    Build a fragment from an array of nodes. Ensures that adjacent\n    text nodes with the same marks are joined together.\n    */\n    static fromArray(array) {\n        if (!array.length)\n            return Fragment.empty;\n        let joined, size = 0;\n        for (let i = 0; i < array.length; i++) {\n            let node = array[i];\n            size += node.nodeSize;\n            if (i && node.isText && array[i - 1].sameMarkup(node)) {\n                if (!joined)\n                    joined = array.slice(0, i);\n                joined[joined.length - 1] = node\n                    .withText(joined[joined.length - 1].text + node.text);\n            }\n            else if (joined) {\n                joined.push(node);\n            }\n        }\n        return new Fragment(joined || array, size);\n    }\n    /**\n    Create a fragment from something that can be interpreted as a\n    set of nodes. For `null`, it returns the empty fragment. For a\n    fragment, the fragment itself. For a node or array of nodes, a\n    fragment containing those nodes.\n    */\n    static from(nodes) {\n        if (!nodes)\n            return Fragment.empty;\n        if (nodes instanceof Fragment)\n            return nodes;\n        if (Array.isArray(nodes))\n            return this.fromArray(nodes);\n        if (nodes.attrs)\n            return new Fragment([nodes], nodes.nodeSize);\n        throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n            (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"));\n    }\n}\n/**\nAn empty fragment. Intended to be reused whenever a node doesn't\ncontain anything (rather than allocating a new empty fragment for\neach leaf node).\n*/\nFragment.empty = new Fragment([], 0);\nconst found = { index: 0, offset: 0 };\nfunction retIndex(index, offset) {\n    found.index = index;\n    found.offset = offset;\n    return found;\n}\n\nfunction compareDeep(a, b) {\n    if (a === b)\n        return true;\n    if (!(a && typeof a == \"object\") ||\n        !(b && typeof b == \"object\"))\n        return false;\n    let array = Array.isArray(a);\n    if (Array.isArray(b) != array)\n        return false;\n    if (array) {\n        if (a.length != b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (!compareDeep(a[i], b[i]))\n                return false;\n    }\n    else {\n        for (let p in a)\n            if (!(p in b) || !compareDeep(a[p], b[p]))\n                return false;\n        for (let p in b)\n            if (!(p in a))\n                return false;\n    }\n    return true;\n}\n\n/**\nA mark is a piece of information that can be attached to a node,\nsuch as it being emphasized, in code font, or a link. It has a\ntype and optionally a set of attributes that provide further\ninformation (such as the target of the link). Marks are created\nthrough a `Schema`, which controls which types exist and which\nattributes they have.\n*/\nclass Mark {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The type of this mark.\n    */\n    type, \n    /**\n    The attributes associated with this mark.\n    */\n    attrs) {\n        this.type = type;\n        this.attrs = attrs;\n    }\n    /**\n    Given a set of marks, create a new set which contains this one as\n    well, in the right position. If this mark is already in the set,\n    the set itself is returned. If any marks that are set to be\n    [exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present,\n    those are replaced by this one.\n    */\n    addToSet(set) {\n        let copy, placed = false;\n        for (let i = 0; i < set.length; i++) {\n            let other = set[i];\n            if (this.eq(other))\n                return set;\n            if (this.type.excludes(other.type)) {\n                if (!copy)\n                    copy = set.slice(0, i);\n            }\n            else if (other.type.excludes(this.type)) {\n                return set;\n            }\n            else {\n                if (!placed && other.type.rank > this.type.rank) {\n                    if (!copy)\n                        copy = set.slice(0, i);\n                    copy.push(this);\n                    placed = true;\n                }\n                if (copy)\n                    copy.push(other);\n            }\n        }\n        if (!copy)\n            copy = set.slice();\n        if (!placed)\n            copy.push(this);\n        return copy;\n    }\n    /**\n    Remove this mark from the given set, returning a new set. If this\n    mark is not in the set, the set itself is returned.\n    */\n    removeFromSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (this.eq(set[i]))\n                return set.slice(0, i).concat(set.slice(i + 1));\n        return set;\n    }\n    /**\n    Test whether this mark is in the given set of marks.\n    */\n    isInSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (this.eq(set[i]))\n                return true;\n        return false;\n    }\n    /**\n    Test whether this mark has the same type and attributes as\n    another mark.\n    */\n    eq(other) {\n        return this == other ||\n            (this.type == other.type && compareDeep(this.attrs, other.attrs));\n    }\n    /**\n    Convert this mark to a JSON-serializeable representation.\n    */\n    toJSON() {\n        let obj = { type: this.type.name };\n        for (let _ in this.attrs) {\n            obj.attrs = this.attrs;\n            break;\n        }\n        return obj;\n    }\n    /**\n    Deserialize a mark from JSON.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            throw new RangeError(\"Invalid input for Mark.fromJSON\");\n        let type = schema.marks[json.type];\n        if (!type)\n            throw new RangeError(`There is no mark type ${json.type} in this schema`);\n        let mark = type.create(json.attrs);\n        type.checkAttrs(mark.attrs);\n        return mark;\n    }\n    /**\n    Test whether two sets of marks are identical.\n    */\n    static sameSet(a, b) {\n        if (a == b)\n            return true;\n        if (a.length != b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (!a[i].eq(b[i]))\n                return false;\n        return true;\n    }\n    /**\n    Create a properly sorted mark set from null, a single mark, or an\n    unsorted array of marks.\n    */\n    static setFrom(marks) {\n        if (!marks || Array.isArray(marks) && marks.length == 0)\n            return Mark.none;\n        if (marks instanceof Mark)\n            return [marks];\n        let copy = marks.slice();\n        copy.sort((a, b) => a.type.rank - b.type.rank);\n        return copy;\n    }\n}\n/**\nThe empty set of marks.\n*/\nMark.none = [];\n\n/**\nError type raised by [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) when\ngiven an invalid replacement.\n*/\nclass ReplaceError extends Error {\n}\n/**\nA slice represents a piece cut out of a larger document. It\nstores not only a fragment, but also the depth up to which nodes on\nboth side are ‘open’ (cut through).\n*/\nclass Slice {\n    /**\n    Create a slice. When specifying a non-zero open depth, you must\n    make sure that there are nodes of at least that depth at the\n    appropriate side of the fragment—i.e. if the fragment is an\n    empty paragraph node, `openStart` and `openEnd` can't be greater\n    than 1.\n    \n    It is not necessary for the content of open nodes to conform to\n    the schema's content constraints, though it should be a valid\n    start/end/middle for such a node, depending on which sides are\n    open.\n    */\n    constructor(\n    /**\n    The slice's content.\n    */\n    content, \n    /**\n    The open depth at the start of the fragment.\n    */\n    openStart, \n    /**\n    The open depth at the end.\n    */\n    openEnd) {\n        this.content = content;\n        this.openStart = openStart;\n        this.openEnd = openEnd;\n    }\n    /**\n    The size this slice would add when inserted into a document.\n    */\n    get size() {\n        return this.content.size - this.openStart - this.openEnd;\n    }\n    /**\n    @internal\n    */\n    insertAt(pos, fragment) {\n        let content = insertInto(this.content, pos + this.openStart, fragment, this.openStart + 1, this.openEnd + 1);\n        return content && new Slice(content, this.openStart, this.openEnd);\n    }\n    /**\n    @internal\n    */\n    removeBetween(from, to) {\n        return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd);\n    }\n    /**\n    Tests whether this slice is equal to another slice.\n    */\n    eq(other) {\n        return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\";\n    }\n    /**\n    Convert a slice to a JSON-serializable representation.\n    */\n    toJSON() {\n        if (!this.content.size)\n            return null;\n        let json = { content: this.content.toJSON() };\n        if (this.openStart > 0)\n            json.openStart = this.openStart;\n        if (this.openEnd > 0)\n            json.openEnd = this.openEnd;\n        return json;\n    }\n    /**\n    Deserialize a slice from its JSON representation.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            return Slice.empty;\n        let openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n        if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n            throw new RangeError(\"Invalid input for Slice.fromJSON\");\n        return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd);\n    }\n    /**\n    Create a slice from a fragment by taking the maximum possible\n    open value on both side of the fragment.\n    */\n    static maxOpen(fragment, openIsolating = true) {\n        let openStart = 0, openEnd = 0;\n        for (let n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild)\n            openStart++;\n        for (let n = fragment.lastChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.lastChild)\n            openEnd++;\n        return new Slice(fragment, openStart, openEnd);\n    }\n}\n/**\nThe empty slice.\n*/\nSlice.empty = new Slice(Fragment.empty, 0, 0);\nfunction removeRange(content, from, to) {\n    let { index, offset } = content.findIndex(from), child = content.maybeChild(index);\n    let { index: indexTo, offset: offsetTo } = content.findIndex(to);\n    if (offset == from || child.isText) {\n        if (offsetTo != to && !content.child(indexTo).isText)\n            throw new RangeError(\"Removing non-flat range\");\n        return content.cut(0, from).append(content.cut(to));\n    }\n    if (index != indexTo)\n        throw new RangeError(\"Removing non-flat range\");\n    return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)));\n}\nfunction insertInto(content, dist, insert, openStart, openEnd, parent) {\n    let { index, offset } = content.findIndex(dist), child = content.maybeChild(index);\n    if (offset == dist || child.isText) {\n        if (parent && openStart <= 0 && openEnd <= 0 && !parent.canReplace(index, index, insert))\n            return null;\n        return content.cut(0, dist).append(insert).append(content.cut(dist));\n    }\n    let inner = insertInto(child.content, dist - offset - 1, insert, index == 0 ? openStart - 1 : 0, index == content.childCount - 1 ? openEnd - 1 : 0, child);\n    return inner && content.replaceChild(index, child.copy(inner));\n}\nfunction replace($from, $to, slice) {\n    if (slice.openStart > $from.depth)\n        throw new ReplaceError(\"Inserted content deeper than insertion position\");\n    if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n        throw new ReplaceError(\"Inconsistent open depths\");\n    return replaceOuter($from, $to, slice, 0);\n}\nfunction replaceOuter($from, $to, slice, depth) {\n    let index = $from.index(depth), node = $from.node(depth);\n    if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n        let inner = replaceOuter($from, $to, slice, depth + 1);\n        return node.copy(node.content.replaceChild(index, inner));\n    }\n    else if (!slice.content.size) {\n        return close(node, replaceTwoWay($from, $to, depth));\n    }\n    else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n        let parent = $from.parent, content = parent.content;\n        return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)));\n    }\n    else {\n        let { start, end } = prepareSliceForReplace(slice, $from);\n        return close(node, replaceThreeWay($from, start, end, $to, depth));\n    }\n}\nfunction checkJoin(main, sub) {\n    if (!sub.type.compatibleContent(main.type))\n        throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name);\n}\nfunction joinable($before, $after, depth) {\n    let node = $before.node(depth);\n    checkJoin(node, $after.node(depth));\n    return node;\n}\nfunction addNode(child, target) {\n    let last = target.length - 1;\n    if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n        target[last] = child.withText(target[last].text + child.text);\n    else\n        target.push(child);\n}\nfunction addRange($start, $end, depth, target) {\n    let node = ($end || $start).node(depth);\n    let startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n    if ($start) {\n        startIndex = $start.index(depth);\n        if ($start.depth > depth) {\n            startIndex++;\n        }\n        else if ($start.textOffset) {\n            addNode($start.nodeAfter, target);\n            startIndex++;\n        }\n    }\n    for (let i = startIndex; i < endIndex; i++)\n        addNode(node.child(i), target);\n    if ($end && $end.depth == depth && $end.textOffset)\n        addNode($end.nodeBefore, target);\n}\nfunction close(node, content) {\n    if (!node.type.validContent(content))\n        throw new ReplaceError(\"Invalid content for node \" + node.type.name);\n    return node.copy(content);\n}\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n    let openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n    let openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n    let content = [];\n    addRange(null, $from, depth, content);\n    if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n        checkJoin(openStart, openEnd);\n        addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n    }\n    else {\n        if (openStart)\n            addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content);\n        addRange($start, $end, depth, content);\n        if (openEnd)\n            addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content);\n    }\n    addRange($to, null, depth, content);\n    return new Fragment(content);\n}\nfunction replaceTwoWay($from, $to, depth) {\n    let content = [];\n    addRange(null, $from, depth, content);\n    if ($from.depth > depth) {\n        let type = joinable($from, $to, depth + 1);\n        addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n    }\n    addRange($to, null, depth, content);\n    return new Fragment(content);\n}\nfunction prepareSliceForReplace(slice, $along) {\n    let extra = $along.depth - slice.openStart, parent = $along.node(extra);\n    let node = parent.copy(slice.content);\n    for (let i = extra - 1; i >= 0; i--)\n        node = $along.node(i).copy(Fragment.from(node));\n    return { start: node.resolveNoCache(slice.openStart + extra),\n        end: node.resolveNoCache(node.content.size - slice.openEnd - extra) };\n}\n\n/**\nYou can [_resolve_](https://prosemirror.net/docs/ref/#model.Node.resolve) a position to get more\ninformation about it. Objects of this class represent such a\nresolved position, providing various pieces of context\ninformation, and some helper methods.\n\nThroughout this interface, methods that take an optional `depth`\nparameter will interpret undefined as `this.depth` and negative\nnumbers as `this.depth + value`.\n*/\nclass ResolvedPos {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The position that was resolved.\n    */\n    pos, \n    /**\n    @internal\n    */\n    path, \n    /**\n    The offset this position has into its parent node.\n    */\n    parentOffset) {\n        this.pos = pos;\n        this.path = path;\n        this.parentOffset = parentOffset;\n        this.depth = path.length / 3 - 1;\n    }\n    /**\n    @internal\n    */\n    resolveDepth(val) {\n        if (val == null)\n            return this.depth;\n        if (val < 0)\n            return this.depth + val;\n        return val;\n    }\n    /**\n    The parent node that the position points into. Note that even if\n    a position points into a text node, that node is not considered\n    the parent—text nodes are ‘flat’ in this model, and have no content.\n    */\n    get parent() { return this.node(this.depth); }\n    /**\n    The root node in which the position was resolved.\n    */\n    get doc() { return this.node(0); }\n    /**\n    The ancestor node at the given level. `p.node(p.depth)` is the\n    same as `p.parent`.\n    */\n    node(depth) { return this.path[this.resolveDepth(depth) * 3]; }\n    /**\n    The index into the ancestor at the given level. If this points\n    at the 3rd node in the 2nd paragraph on the top level, for\n    example, `p.index(0)` is 1 and `p.index(1)` is 2.\n    */\n    index(depth) { return this.path[this.resolveDepth(depth) * 3 + 1]; }\n    /**\n    The index pointing after this position into the ancestor at the\n    given level.\n    */\n    indexAfter(depth) {\n        depth = this.resolveDepth(depth);\n        return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1);\n    }\n    /**\n    The (absolute) position at the start of the node at the given\n    level.\n    */\n    start(depth) {\n        depth = this.resolveDepth(depth);\n        return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n    }\n    /**\n    The (absolute) position at the end of the node at the given\n    level.\n    */\n    end(depth) {\n        depth = this.resolveDepth(depth);\n        return this.start(depth) + this.node(depth).content.size;\n    }\n    /**\n    The (absolute) position directly before the wrapping node at the\n    given level, or, when `depth` is `this.depth + 1`, the original\n    position.\n    */\n    before(depth) {\n        depth = this.resolveDepth(depth);\n        if (!depth)\n            throw new RangeError(\"There is no position before the top-level node\");\n        return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1];\n    }\n    /**\n    The (absolute) position directly after the wrapping node at the\n    given level, or the original position when `depth` is `this.depth + 1`.\n    */\n    after(depth) {\n        depth = this.resolveDepth(depth);\n        if (!depth)\n            throw new RangeError(\"There is no position after the top-level node\");\n        return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize;\n    }\n    /**\n    When this position points into a text node, this returns the\n    distance between the position and the start of the text node.\n    Will be zero for positions that point between nodes.\n    */\n    get textOffset() { return this.pos - this.path[this.path.length - 1]; }\n    /**\n    Get the node directly after the position, if any. If the position\n    points into a text node, only the part of that node after the\n    position is returned.\n    */\n    get nodeAfter() {\n        let parent = this.parent, index = this.index(this.depth);\n        if (index == parent.childCount)\n            return null;\n        let dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n        return dOff ? parent.child(index).cut(dOff) : child;\n    }\n    /**\n    Get the node directly before the position, if any. If the\n    position points into a text node, only the part of that node\n    before the position is returned.\n    */\n    get nodeBefore() {\n        let index = this.index(this.depth);\n        let dOff = this.pos - this.path[this.path.length - 1];\n        if (dOff)\n            return this.parent.child(index).cut(0, dOff);\n        return index == 0 ? null : this.parent.child(index - 1);\n    }\n    /**\n    Get the position at the given index in the parent node at the\n    given depth (which defaults to `this.depth`).\n    */\n    posAtIndex(index, depth) {\n        depth = this.resolveDepth(depth);\n        let node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n        for (let i = 0; i < index; i++)\n            pos += node.child(i).nodeSize;\n        return pos;\n    }\n    /**\n    Get the marks at this position, factoring in the surrounding\n    marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the\n    position is at the start of a non-empty node, the marks of the\n    node after it (if any) are returned.\n    */\n    marks() {\n        let parent = this.parent, index = this.index();\n        // In an empty parent, return the empty array\n        if (parent.content.size == 0)\n            return Mark.none;\n        // When inside a text node, just return the text node's marks\n        if (this.textOffset)\n            return parent.child(index).marks;\n        let main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n        // If the `after` flag is true of there is no node before, make\n        // the node after this position the main reference.\n        if (!main) {\n            let tmp = main;\n            main = other;\n            other = tmp;\n        }\n        // Use all marks in the main node, except those that have\n        // `inclusive` set to false and are not present in the other node.\n        let marks = main.marks;\n        for (var i = 0; i < marks.length; i++)\n            if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n                marks = marks[i--].removeFromSet(marks);\n        return marks;\n    }\n    /**\n    Get the marks after the current position, if any, except those\n    that are non-inclusive and not present at position `$end`. This\n    is mostly useful for getting the set of marks to preserve after a\n    deletion. Will return `null` if this position is at the end of\n    its parent node or its parent node isn't a textblock (in which\n    case no marks should be preserved).\n    */\n    marksAcross($end) {\n        let after = this.parent.maybeChild(this.index());\n        if (!after || !after.isInline)\n            return null;\n        let marks = after.marks, next = $end.parent.maybeChild($end.index());\n        for (var i = 0; i < marks.length; i++)\n            if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n                marks = marks[i--].removeFromSet(marks);\n        return marks;\n    }\n    /**\n    The depth up to which this position and the given (non-resolved)\n    position share the same parent nodes.\n    */\n    sharedDepth(pos) {\n        for (let depth = this.depth; depth > 0; depth--)\n            if (this.start(depth) <= pos && this.end(depth) >= pos)\n                return depth;\n        return 0;\n    }\n    /**\n    Returns a range based on the place where this position and the\n    given position diverge around block content. If both point into\n    the same textblock, for example, a range around that textblock\n    will be returned. If they point into different blocks, the range\n    around those blocks in their shared ancestor is returned. You can\n    pass in an optional predicate that will be called with a parent\n    node to see if a range into that parent is acceptable.\n    */\n    blockRange(other = this, pred) {\n        if (other.pos < this.pos)\n            return other.blockRange(this);\n        for (let d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n            if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n                return new NodeRange(this, other, d);\n        return null;\n    }\n    /**\n    Query whether the given position shares the same parent node.\n    */\n    sameParent(other) {\n        return this.pos - this.parentOffset == other.pos - other.parentOffset;\n    }\n    /**\n    Return the greater of this and the given position.\n    */\n    max(other) {\n        return other.pos > this.pos ? other : this;\n    }\n    /**\n    Return the smaller of this and the given position.\n    */\n    min(other) {\n        return other.pos < this.pos ? other : this;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let str = \"\";\n        for (let i = 1; i <= this.depth; i++)\n            str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1);\n        return str + \":\" + this.parentOffset;\n    }\n    /**\n    @internal\n    */\n    static resolve(doc, pos) {\n        if (!(pos >= 0 && pos <= doc.content.size))\n            throw new RangeError(\"Position \" + pos + \" out of range\");\n        let path = [];\n        let start = 0, parentOffset = pos;\n        for (let node = doc;;) {\n            let { index, offset } = node.content.findIndex(parentOffset);\n            let rem = parentOffset - offset;\n            path.push(node, index, start + offset);\n            if (!rem)\n                break;\n            node = node.child(index);\n            if (node.isText)\n                break;\n            parentOffset = rem - 1;\n            start += offset + 1;\n        }\n        return new ResolvedPos(pos, path, parentOffset);\n    }\n    /**\n    @internal\n    */\n    static resolveCached(doc, pos) {\n        let cache = resolveCache.get(doc);\n        if (cache) {\n            for (let i = 0; i < cache.elts.length; i++) {\n                let elt = cache.elts[i];\n                if (elt.pos == pos)\n                    return elt;\n            }\n        }\n        else {\n            resolveCache.set(doc, cache = new ResolveCache);\n        }\n        let result = cache.elts[cache.i] = ResolvedPos.resolve(doc, pos);\n        cache.i = (cache.i + 1) % resolveCacheSize;\n        return result;\n    }\n}\nclass ResolveCache {\n    constructor() {\n        this.elts = [];\n        this.i = 0;\n    }\n}\nconst resolveCacheSize = 12, resolveCache = new WeakMap();\n/**\nRepresents a flat range of content, i.e. one that starts and\nends in the same node.\n*/\nclass NodeRange {\n    /**\n    Construct a node range. `$from` and `$to` should point into the\n    same node until at least the given `depth`, since a node range\n    denotes an adjacent set of nodes in a single parent node.\n    */\n    constructor(\n    /**\n    A resolved position along the start of the content. May have a\n    `depth` greater than this object's `depth` property, since\n    these are the positions that were used to compute the range,\n    not re-resolved positions directly at its boundaries.\n    */\n    $from, \n    /**\n    A position along the end of the content. See\n    caveat for [`$from`](https://prosemirror.net/docs/ref/#model.NodeRange.$from).\n    */\n    $to, \n    /**\n    The depth of the node that this range points into.\n    */\n    depth) {\n        this.$from = $from;\n        this.$to = $to;\n        this.depth = depth;\n    }\n    /**\n    The position at the start of the range.\n    */\n    get start() { return this.$from.before(this.depth + 1); }\n    /**\n    The position at the end of the range.\n    */\n    get end() { return this.$to.after(this.depth + 1); }\n    /**\n    The parent node that the range points into.\n    */\n    get parent() { return this.$from.node(this.depth); }\n    /**\n    The start index of the range in the parent node.\n    */\n    get startIndex() { return this.$from.index(this.depth); }\n    /**\n    The end index of the range in the parent node.\n    */\n    get endIndex() { return this.$to.indexAfter(this.depth); }\n}\n\nconst emptyAttrs = Object.create(null);\n/**\nThis class represents a node in the tree that makes up a\nProseMirror document. So a document is an instance of `Node`, with\nchildren that are also instances of `Node`.\n\nNodes are persistent data structures. Instead of changing them, you\ncreate new ones with the content you want. Old ones keep pointing\nat the old document shape. This is made cheaper by sharing\nstructure between the old and new data as much as possible, which a\ntree shape like this (without back pointers) makes easy.\n\n**Do not** directly mutate the properties of a `Node` object. See\n[the guide](https://prosemirror.net/docs/guide/#doc) for more information.\n*/\nclass Node {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The type of node that this is.\n    */\n    type, \n    /**\n    An object mapping attribute names to values. The kind of\n    attributes allowed and required are\n    [determined](https://prosemirror.net/docs/ref/#model.NodeSpec.attrs) by the node type.\n    */\n    attrs, \n    // A fragment holding the node's children.\n    content, \n    /**\n    The marks (things like whether it is emphasized or part of a\n    link) applied to this node.\n    */\n    marks = Mark.none) {\n        this.type = type;\n        this.attrs = attrs;\n        this.marks = marks;\n        this.content = content || Fragment.empty;\n    }\n    /**\n    The array of this node's child nodes.\n    */\n    get children() { return this.content.content; }\n    /**\n    The size of this node, as defined by the integer-based [indexing\n    scheme](https://prosemirror.net/docs/guide/#doc.indexing). For text nodes, this is the\n    amount of characters. For other leaf nodes, it is one. For\n    non-leaf nodes, it is the size of the content plus two (the\n    start and end token).\n    */\n    get nodeSize() { return this.isLeaf ? 1 : 2 + this.content.size; }\n    /**\n    The number of children that the node has.\n    */\n    get childCount() { return this.content.childCount; }\n    /**\n    Get the child node at the given index. Raises an error when the\n    index is out of range.\n    */\n    child(index) { return this.content.child(index); }\n    /**\n    Get the child node at the given index, if it exists.\n    */\n    maybeChild(index) { return this.content.maybeChild(index); }\n    /**\n    Call `f` for every child node, passing the node, its offset\n    into this parent node, and its index.\n    */\n    forEach(f) { this.content.forEach(f); }\n    /**\n    Invoke a callback for all descendant nodes recursively overlapping\n    the given two positions that are relative to start of this\n    node's content. This includes all ancestors of the nodes\n    containing the two positions. The callback is invoked with the\n    node, its position relative to the original node (method receiver),\n    its parent node, and its child index. When the callback returns\n    false for a given node, that node's children will not be\n    recursed over. The last parameter can be used to specify a\n    starting position to count from.\n    */\n    nodesBetween(from, to, f, startPos = 0) {\n        this.content.nodesBetween(from, to, f, startPos, this);\n    }\n    /**\n    Call the given callback for every descendant node. Doesn't\n    descend into a node when the callback returns `false`.\n    */\n    descendants(f) {\n        this.nodesBetween(0, this.content.size, f);\n    }\n    /**\n    Concatenates all the text nodes found in this fragment and its\n    children.\n    */\n    get textContent() {\n        return (this.isLeaf && this.type.spec.leafText)\n            ? this.type.spec.leafText(this)\n            : this.textBetween(0, this.content.size, \"\");\n    }\n    /**\n    Get all text between positions `from` and `to`. When\n    `blockSeparator` is given, it will be inserted to separate text\n    from different block nodes. If `leafText` is given, it'll be\n    inserted for every non-text leaf node encountered, otherwise\n    [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec.leafText) will be used.\n    */\n    textBetween(from, to, blockSeparator, leafText) {\n        return this.content.textBetween(from, to, blockSeparator, leafText);\n    }\n    /**\n    Returns this node's first child, or `null` if there are no\n    children.\n    */\n    get firstChild() { return this.content.firstChild; }\n    /**\n    Returns this node's last child, or `null` if there are no\n    children.\n    */\n    get lastChild() { return this.content.lastChild; }\n    /**\n    Test whether two nodes represent the same piece of document.\n    */\n    eq(other) {\n        return this == other || (this.sameMarkup(other) && this.content.eq(other.content));\n    }\n    /**\n    Compare the markup (type, attributes, and marks) of this node to\n    those of another. Returns `true` if both have the same markup.\n    */\n    sameMarkup(other) {\n        return this.hasMarkup(other.type, other.attrs, other.marks);\n    }\n    /**\n    Check whether this node's markup correspond to the given type,\n    attributes, and marks.\n    */\n    hasMarkup(type, attrs, marks) {\n        return this.type == type &&\n            compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n            Mark.sameSet(this.marks, marks || Mark.none);\n    }\n    /**\n    Create a new node with the same markup as this node, containing\n    the given content (or empty, if no content is given).\n    */\n    copy(content = null) {\n        if (content == this.content)\n            return this;\n        return new Node(this.type, this.attrs, content, this.marks);\n    }\n    /**\n    Create a copy of this node, with the given set of marks instead\n    of the node's own marks.\n    */\n    mark(marks) {\n        return marks == this.marks ? this : new Node(this.type, this.attrs, this.content, marks);\n    }\n    /**\n    Create a copy of this node with only the content between the\n    given positions. If `to` is not given, it defaults to the end of\n    the node.\n    */\n    cut(from, to = this.content.size) {\n        if (from == 0 && to == this.content.size)\n            return this;\n        return this.copy(this.content.cut(from, to));\n    }\n    /**\n    Cut out the part of the document between the given positions, and\n    return it as a `Slice` object.\n    */\n    slice(from, to = this.content.size, includeParents = false) {\n        if (from == to)\n            return Slice.empty;\n        let $from = this.resolve(from), $to = this.resolve(to);\n        let depth = includeParents ? 0 : $from.sharedDepth(to);\n        let start = $from.start(depth), node = $from.node(depth);\n        let content = node.content.cut($from.pos - start, $to.pos - start);\n        return new Slice(content, $from.depth - depth, $to.depth - depth);\n    }\n    /**\n    Replace the part of the document between the given positions with\n    the given slice. The slice must 'fit', meaning its open sides\n    must be able to connect to the surrounding content, and its\n    content nodes must be valid children for the node they are placed\n    into. If any of this is violated, an error of type\n    [`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown.\n    */\n    replace(from, to, slice) {\n        return replace(this.resolve(from), this.resolve(to), slice);\n    }\n    /**\n    Find the node directly after the given position.\n    */\n    nodeAt(pos) {\n        for (let node = this;;) {\n            let { index, offset } = node.content.findIndex(pos);\n            node = node.maybeChild(index);\n            if (!node)\n                return null;\n            if (offset == pos || node.isText)\n                return node;\n            pos -= offset + 1;\n        }\n    }\n    /**\n    Find the (direct) child node after the given offset, if any,\n    and return it along with its index and offset relative to this\n    node.\n    */\n    childAfter(pos) {\n        let { index, offset } = this.content.findIndex(pos);\n        return { node: this.content.maybeChild(index), index, offset };\n    }\n    /**\n    Find the (direct) child node before the given offset, if any,\n    and return it along with its index and offset relative to this\n    node.\n    */\n    childBefore(pos) {\n        if (pos == 0)\n            return { node: null, index: 0, offset: 0 };\n        let { index, offset } = this.content.findIndex(pos);\n        if (offset < pos)\n            return { node: this.content.child(index), index, offset };\n        let node = this.content.child(index - 1);\n        return { node, index: index - 1, offset: offset - node.nodeSize };\n    }\n    /**\n    Resolve the given position in the document, returning an\n    [object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context.\n    */\n    resolve(pos) { return ResolvedPos.resolveCached(this, pos); }\n    /**\n    @internal\n    */\n    resolveNoCache(pos) { return ResolvedPos.resolve(this, pos); }\n    /**\n    Test whether a given mark or mark type occurs in this document\n    between the two given positions.\n    */\n    rangeHasMark(from, to, type) {\n        let found = false;\n        if (to > from)\n            this.nodesBetween(from, to, node => {\n                if (type.isInSet(node.marks))\n                    found = true;\n                return !found;\n            });\n        return found;\n    }\n    /**\n    True when this is a block (non-inline node)\n    */\n    get isBlock() { return this.type.isBlock; }\n    /**\n    True when this is a textblock node, a block node with inline\n    content.\n    */\n    get isTextblock() { return this.type.isTextblock; }\n    /**\n    True when this node allows inline content.\n    */\n    get inlineContent() { return this.type.inlineContent; }\n    /**\n    True when this is an inline node (a text node or a node that can\n    appear among text).\n    */\n    get isInline() { return this.type.isInline; }\n    /**\n    True when this is a text node.\n    */\n    get isText() { return this.type.isText; }\n    /**\n    True when this is a leaf node.\n    */\n    get isLeaf() { return this.type.isLeaf; }\n    /**\n    True when this is an atom, i.e. when it does not have directly\n    editable content. This is usually the same as `isLeaf`, but can\n    be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom)\n    on a node's spec (typically used when the node is displayed as\n    an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)).\n    */\n    get isAtom() { return this.type.isAtom; }\n    /**\n    Return a string representation of this node for debugging\n    purposes.\n    */\n    toString() {\n        if (this.type.spec.toDebugString)\n            return this.type.spec.toDebugString(this);\n        let name = this.type.name;\n        if (this.content.size)\n            name += \"(\" + this.content.toStringInner() + \")\";\n        return wrapMarks(this.marks, name);\n    }\n    /**\n    Get the content match in this node at the given index.\n    */\n    contentMatchAt(index) {\n        let match = this.type.contentMatch.matchFragment(this.content, 0, index);\n        if (!match)\n            throw new Error(\"Called contentMatchAt on a node with invalid content\");\n        return match;\n    }\n    /**\n    Test whether replacing the range between `from` and `to` (by\n    child index) with the given replacement fragment (which defaults\n    to the empty fragment) would leave the node's content valid. You\n    can optionally pass `start` and `end` indices into the\n    replacement fragment.\n    */\n    canReplace(from, to, replacement = Fragment.empty, start = 0, end = replacement.childCount) {\n        let one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n        let two = one && one.matchFragment(this.content, to);\n        if (!two || !two.validEnd)\n            return false;\n        for (let i = start; i < end; i++)\n            if (!this.type.allowsMarks(replacement.child(i).marks))\n                return false;\n        return true;\n    }\n    /**\n    Test whether replacing the range `from` to `to` (by index) with\n    a node of the given type would leave the node's content valid.\n    */\n    canReplaceWith(from, to, type, marks) {\n        if (marks && !this.type.allowsMarks(marks))\n            return false;\n        let start = this.contentMatchAt(from).matchType(type);\n        let end = start && start.matchFragment(this.content, to);\n        return end ? end.validEnd : false;\n    }\n    /**\n    Test whether the given node's content could be appended to this\n    node. If that node is empty, this will only return true if there\n    is at least one node type that can appear in both nodes (to avoid\n    merging completely incompatible nodes).\n    */\n    canAppend(other) {\n        if (other.content.size)\n            return this.canReplace(this.childCount, this.childCount, other.content);\n        else\n            return this.type.compatibleContent(other.type);\n    }\n    /**\n    Check whether this node and its descendants conform to the\n    schema, and raise an exception when they do not.\n    */\n    check() {\n        this.type.checkContent(this.content);\n        this.type.checkAttrs(this.attrs);\n        let copy = Mark.none;\n        for (let i = 0; i < this.marks.length; i++) {\n            let mark = this.marks[i];\n            mark.type.checkAttrs(mark.attrs);\n            copy = mark.addToSet(copy);\n        }\n        if (!Mark.sameSet(copy, this.marks))\n            throw new RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map(m => m.type.name)}`);\n        this.content.forEach(node => node.check());\n    }\n    /**\n    Return a JSON-serializeable representation of this node.\n    */\n    toJSON() {\n        let obj = { type: this.type.name };\n        for (let _ in this.attrs) {\n            obj.attrs = this.attrs;\n            break;\n        }\n        if (this.content.size)\n            obj.content = this.content.toJSON();\n        if (this.marks.length)\n            obj.marks = this.marks.map(n => n.toJSON());\n        return obj;\n    }\n    /**\n    Deserialize a node from its JSON representation.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            throw new RangeError(\"Invalid input for Node.fromJSON\");\n        let marks = undefined;\n        if (json.marks) {\n            if (!Array.isArray(json.marks))\n                throw new RangeError(\"Invalid mark data for Node.fromJSON\");\n            marks = json.marks.map(schema.markFromJSON);\n        }\n        if (json.type == \"text\") {\n            if (typeof json.text != \"string\")\n                throw new RangeError(\"Invalid text node in JSON\");\n            return schema.text(json.text, marks);\n        }\n        let content = Fragment.fromJSON(schema, json.content);\n        let node = schema.nodeType(json.type).create(json.attrs, content, marks);\n        node.type.checkAttrs(node.attrs);\n        return node;\n    }\n}\nNode.prototype.text = undefined;\nclass TextNode extends Node {\n    /**\n    @internal\n    */\n    constructor(type, attrs, content, marks) {\n        super(type, attrs, null, marks);\n        if (!content)\n            throw new RangeError(\"Empty text nodes are not allowed\");\n        this.text = content;\n    }\n    toString() {\n        if (this.type.spec.toDebugString)\n            return this.type.spec.toDebugString(this);\n        return wrapMarks(this.marks, JSON.stringify(this.text));\n    }\n    get textContent() { return this.text; }\n    textBetween(from, to) { return this.text.slice(from, to); }\n    get nodeSize() { return this.text.length; }\n    mark(marks) {\n        return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks);\n    }\n    withText(text) {\n        if (text == this.text)\n            return this;\n        return new TextNode(this.type, this.attrs, text, this.marks);\n    }\n    cut(from = 0, to = this.text.length) {\n        if (from == 0 && to == this.text.length)\n            return this;\n        return this.withText(this.text.slice(from, to));\n    }\n    eq(other) {\n        return this.sameMarkup(other) && this.text == other.text;\n    }\n    toJSON() {\n        let base = super.toJSON();\n        base.text = this.text;\n        return base;\n    }\n}\nfunction wrapMarks(marks, str) {\n    for (let i = marks.length - 1; i >= 0; i--)\n        str = marks[i].type.name + \"(\" + str + \")\";\n    return str;\n}\n\n/**\nInstances of this class represent a match state of a node type's\n[content expression](https://prosemirror.net/docs/ref/#model.NodeSpec.content), and can be used to\nfind out whether further content matches here, and whether a given\nposition is a valid end of the node.\n*/\nclass ContentMatch {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    True when this match state represents a valid end of the node.\n    */\n    validEnd) {\n        this.validEnd = validEnd;\n        /**\n        @internal\n        */\n        this.next = [];\n        /**\n        @internal\n        */\n        this.wrapCache = [];\n    }\n    /**\n    @internal\n    */\n    static parse(string, nodeTypes) {\n        let stream = new TokenStream(string, nodeTypes);\n        if (stream.next == null)\n            return ContentMatch.empty;\n        let expr = parseExpr(stream);\n        if (stream.next)\n            stream.err(\"Unexpected trailing text\");\n        let match = dfa(nfa(expr));\n        checkForDeadEnds(match, stream);\n        return match;\n    }\n    /**\n    Match a node type, returning a match after that node if\n    successful.\n    */\n    matchType(type) {\n        for (let i = 0; i < this.next.length; i++)\n            if (this.next[i].type == type)\n                return this.next[i].next;\n        return null;\n    }\n    /**\n    Try to match a fragment. Returns the resulting match when\n    successful.\n    */\n    matchFragment(frag, start = 0, end = frag.childCount) {\n        let cur = this;\n        for (let i = start; cur && i < end; i++)\n            cur = cur.matchType(frag.child(i).type);\n        return cur;\n    }\n    /**\n    @internal\n    */\n    get inlineContent() {\n        return this.next.length != 0 && this.next[0].type.isInline;\n    }\n    /**\n    Get the first matching node type at this match position that can\n    be generated.\n    */\n    get defaultType() {\n        for (let i = 0; i < this.next.length; i++) {\n            let { type } = this.next[i];\n            if (!(type.isText || type.hasRequiredAttrs()))\n                return type;\n        }\n        return null;\n    }\n    /**\n    @internal\n    */\n    compatible(other) {\n        for (let i = 0; i < this.next.length; i++)\n            for (let j = 0; j < other.next.length; j++)\n                if (this.next[i].type == other.next[j].type)\n                    return true;\n        return false;\n    }\n    /**\n    Try to match the given fragment, and if that fails, see if it can\n    be made to match by inserting nodes in front of it. When\n    successful, return a fragment of inserted nodes (which may be\n    empty if nothing had to be inserted). When `toEnd` is true, only\n    return a fragment if the resulting match goes to the end of the\n    content expression.\n    */\n    fillBefore(after, toEnd = false, startIndex = 0) {\n        let seen = [this];\n        function search(match, types) {\n            let finished = match.matchFragment(after, startIndex);\n            if (finished && (!toEnd || finished.validEnd))\n                return Fragment.from(types.map(tp => tp.createAndFill()));\n            for (let i = 0; i < match.next.length; i++) {\n                let { type, next } = match.next[i];\n                if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n                    seen.push(next);\n                    let found = search(next, types.concat(type));\n                    if (found)\n                        return found;\n                }\n            }\n            return null;\n        }\n        return search(this, []);\n    }\n    /**\n    Find a set of wrapping node types that would allow a node of the\n    given type to appear at this position. The result may be empty\n    (when it fits directly) and will be null when no such wrapping\n    exists.\n    */\n    findWrapping(target) {\n        for (let i = 0; i < this.wrapCache.length; i += 2)\n            if (this.wrapCache[i] == target)\n                return this.wrapCache[i + 1];\n        let computed = this.computeWrapping(target);\n        this.wrapCache.push(target, computed);\n        return computed;\n    }\n    /**\n    @internal\n    */\n    computeWrapping(target) {\n        let seen = Object.create(null), active = [{ match: this, type: null, via: null }];\n        while (active.length) {\n            let current = active.shift(), match = current.match;\n            if (match.matchType(target)) {\n                let result = [];\n                for (let obj = current; obj.type; obj = obj.via)\n                    result.push(obj.type);\n                return result.reverse();\n            }\n            for (let i = 0; i < match.next.length; i++) {\n                let { type, next } = match.next[i];\n                if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || next.validEnd)) {\n                    active.push({ match: type.contentMatch, type, via: current });\n                    seen[type.name] = true;\n                }\n            }\n        }\n        return null;\n    }\n    /**\n    The number of outgoing edges this node has in the finite\n    automaton that describes the content expression.\n    */\n    get edgeCount() {\n        return this.next.length;\n    }\n    /**\n    Get the _n_​th outgoing edge from this node in the finite\n    automaton that describes the content expression.\n    */\n    edge(n) {\n        if (n >= this.next.length)\n            throw new RangeError(`There's no ${n}th edge in this content match`);\n        return this.next[n];\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let seen = [];\n        function scan(m) {\n            seen.push(m);\n            for (let i = 0; i < m.next.length; i++)\n                if (seen.indexOf(m.next[i].next) == -1)\n                    scan(m.next[i].next);\n        }\n        scan(this);\n        return seen.map((m, i) => {\n            let out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n            for (let i = 0; i < m.next.length; i++)\n                out += (i ? \", \" : \"\") + m.next[i].type.name + \"->\" + seen.indexOf(m.next[i].next);\n            return out;\n        }).join(\"\\n\");\n    }\n}\n/**\n@internal\n*/\nContentMatch.empty = new ContentMatch(true);\nclass TokenStream {\n    constructor(string, nodeTypes) {\n        this.string = string;\n        this.nodeTypes = nodeTypes;\n        this.inline = null;\n        this.pos = 0;\n        this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n        if (this.tokens[this.tokens.length - 1] == \"\")\n            this.tokens.pop();\n        if (this.tokens[0] == \"\")\n            this.tokens.shift();\n    }\n    get next() { return this.tokens[this.pos]; }\n    eat(tok) { return this.next == tok && (this.pos++ || true); }\n    err(str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\"); }\n}\nfunction parseExpr(stream) {\n    let exprs = [];\n    do {\n        exprs.push(parseExprSeq(stream));\n    } while (stream.eat(\"|\"));\n    return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n}\nfunction parseExprSeq(stream) {\n    let exprs = [];\n    do {\n        exprs.push(parseExprSubscript(stream));\n    } while (stream.next && stream.next != \")\" && stream.next != \"|\");\n    return exprs.length == 1 ? exprs[0] : { type: \"seq\", exprs };\n}\nfunction parseExprSubscript(stream) {\n    let expr = parseExprAtom(stream);\n    for (;;) {\n        if (stream.eat(\"+\"))\n            expr = { type: \"plus\", expr };\n        else if (stream.eat(\"*\"))\n            expr = { type: \"star\", expr };\n        else if (stream.eat(\"?\"))\n            expr = { type: \"opt\", expr };\n        else if (stream.eat(\"{\"))\n            expr = parseExprRange(stream, expr);\n        else\n            break;\n    }\n    return expr;\n}\nfunction parseNum(stream) {\n    if (/\\D/.test(stream.next))\n        stream.err(\"Expected number, got '\" + stream.next + \"'\");\n    let result = Number(stream.next);\n    stream.pos++;\n    return result;\n}\nfunction parseExprRange(stream, expr) {\n    let min = parseNum(stream), max = min;\n    if (stream.eat(\",\")) {\n        if (stream.next != \"}\")\n            max = parseNum(stream);\n        else\n            max = -1;\n    }\n    if (!stream.eat(\"}\"))\n        stream.err(\"Unclosed braced range\");\n    return { type: \"range\", min, max, expr };\n}\nfunction resolveName(stream, name) {\n    let types = stream.nodeTypes, type = types[name];\n    if (type)\n        return [type];\n    let result = [];\n    for (let typeName in types) {\n        let type = types[typeName];\n        if (type.isInGroup(name))\n            result.push(type);\n    }\n    if (result.length == 0)\n        stream.err(\"No node type or group '\" + name + \"' found\");\n    return result;\n}\nfunction parseExprAtom(stream) {\n    if (stream.eat(\"(\")) {\n        let expr = parseExpr(stream);\n        if (!stream.eat(\")\"))\n            stream.err(\"Missing closing paren\");\n        return expr;\n    }\n    else if (!/\\W/.test(stream.next)) {\n        let exprs = resolveName(stream, stream.next).map(type => {\n            if (stream.inline == null)\n                stream.inline = type.isInline;\n            else if (stream.inline != type.isInline)\n                stream.err(\"Mixing inline and block content\");\n            return { type: \"name\", value: type };\n        });\n        stream.pos++;\n        return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n    }\n    else {\n        stream.err(\"Unexpected token '\" + stream.next + \"'\");\n    }\n}\n// Construct an NFA from an expression as returned by the parser. The\n// NFA is represented as an array of states, which are themselves\n// arrays of edges, which are `{term, to}` objects. The first state is\n// the entry state and the last node is the success state.\n//\n// Note that unlike typical NFAs, the edge ordering in this one is\n// significant, in that it is used to contruct filler content when\n// necessary.\nfunction nfa(expr) {\n    let nfa = [[]];\n    connect(compile(expr, 0), node());\n    return nfa;\n    function node() { return nfa.push([]) - 1; }\n    function edge(from, to, term) {\n        let edge = { term, to };\n        nfa[from].push(edge);\n        return edge;\n    }\n    function connect(edges, to) {\n        edges.forEach(edge => edge.to = to);\n    }\n    function compile(expr, from) {\n        if (expr.type == \"choice\") {\n            return expr.exprs.reduce((out, expr) => out.concat(compile(expr, from)), []);\n        }\n        else if (expr.type == \"seq\") {\n            for (let i = 0;; i++) {\n                let next = compile(expr.exprs[i], from);\n                if (i == expr.exprs.length - 1)\n                    return next;\n                connect(next, from = node());\n            }\n        }\n        else if (expr.type == \"star\") {\n            let loop = node();\n            edge(from, loop);\n            connect(compile(expr.expr, loop), loop);\n            return [edge(loop)];\n        }\n        else if (expr.type == \"plus\") {\n            let loop = node();\n            connect(compile(expr.expr, from), loop);\n            connect(compile(expr.expr, loop), loop);\n            return [edge(loop)];\n        }\n        else if (expr.type == \"opt\") {\n            return [edge(from)].concat(compile(expr.expr, from));\n        }\n        else if (expr.type == \"range\") {\n            let cur = from;\n            for (let i = 0; i < expr.min; i++) {\n                let next = node();\n                connect(compile(expr.expr, cur), next);\n                cur = next;\n            }\n            if (expr.max == -1) {\n                connect(compile(expr.expr, cur), cur);\n            }\n            else {\n                for (let i = expr.min; i < expr.max; i++) {\n                    let next = node();\n                    edge(cur, next);\n                    connect(compile(expr.expr, cur), next);\n                    cur = next;\n                }\n            }\n            return [edge(cur)];\n        }\n        else if (expr.type == \"name\") {\n            return [edge(from, undefined, expr.value)];\n        }\n        else {\n            throw new Error(\"Unknown expr type\");\n        }\n    }\n}\nfunction cmp(a, b) { return b - a; }\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n    let result = [];\n    scan(node);\n    return result.sort(cmp);\n    function scan(node) {\n        let edges = nfa[node];\n        if (edges.length == 1 && !edges[0].term)\n            return scan(edges[0].to);\n        result.push(node);\n        for (let i = 0; i < edges.length; i++) {\n            let { term, to } = edges[i];\n            if (!term && result.indexOf(to) == -1)\n                scan(to);\n        }\n    }\n}\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n    let labeled = Object.create(null);\n    return explore(nullFrom(nfa, 0));\n    function explore(states) {\n        let out = [];\n        states.forEach(node => {\n            nfa[node].forEach(({ term, to }) => {\n                if (!term)\n                    return;\n                let set;\n                for (let i = 0; i < out.length; i++)\n                    if (out[i][0] == term)\n                        set = out[i][1];\n                nullFrom(nfa, to).forEach(node => {\n                    if (!set)\n                        out.push([term, set = []]);\n                    if (set.indexOf(node) == -1)\n                        set.push(node);\n                });\n            });\n        });\n        let state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n        for (let i = 0; i < out.length; i++) {\n            let states = out[i][1].sort(cmp);\n            state.next.push({ type: out[i][0], next: labeled[states.join(\",\")] || explore(states) });\n        }\n        return state;\n    }\n}\nfunction checkForDeadEnds(match, stream) {\n    for (let i = 0, work = [match]; i < work.length; i++) {\n        let state = work[i], dead = !state.validEnd, nodes = [];\n        for (let j = 0; j < state.next.length; j++) {\n            let { type, next } = state.next[j];\n            nodes.push(type.name);\n            if (dead && !(type.isText || type.hasRequiredAttrs()))\n                dead = false;\n            if (work.indexOf(next) == -1)\n                work.push(next);\n        }\n        if (dead)\n            stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\");\n    }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n    let defaults = Object.create(null);\n    for (let attrName in attrs) {\n        let attr = attrs[attrName];\n        if (!attr.hasDefault)\n            return null;\n        defaults[attrName] = attr.default;\n    }\n    return defaults;\n}\nfunction computeAttrs(attrs, value) {\n    let built = Object.create(null);\n    for (let name in attrs) {\n        let given = value && value[name];\n        if (given === undefined) {\n            let attr = attrs[name];\n            if (attr.hasDefault)\n                given = attr.default;\n            else\n                throw new RangeError(\"No value supplied for attribute \" + name);\n        }\n        built[name] = given;\n    }\n    return built;\n}\nfunction checkAttrs(attrs, values, type, name) {\n    for (let attr in values)\n        if (!(attr in attrs))\n            throw new RangeError(`Unsupported attribute ${attr} for ${type} of type ${name}`);\n    for (let attr in attrs) {\n        if (attrs[attr].validate)\n            attrs[attr].validate(values[attr]);\n    }\n}\nfunction initAttrs(typeName, attrs) {\n    let result = Object.create(null);\n    if (attrs)\n        for (let name in attrs)\n            result[name] = new Attribute(typeName, name, attrs[name]);\n    return result;\n}\n/**\nNode types are objects allocated once per `Schema` and used to\n[tag](https://prosemirror.net/docs/ref/#model.Node.type) `Node` instances. They contain information\nabout the node type, such as its name and what kind of node it\nrepresents.\n*/\nclass NodeType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name the node type has in this schema.\n    */\n    name, \n    /**\n    A link back to the `Schema` the node type belongs to.\n    */\n    schema, \n    /**\n    The spec that this type is based on\n    */\n    spec) {\n        this.name = name;\n        this.schema = schema;\n        this.spec = spec;\n        /**\n        The set of marks allowed in this node. `null` means all marks\n        are allowed.\n        */\n        this.markSet = null;\n        this.groups = spec.group ? spec.group.split(\" \") : [];\n        this.attrs = initAttrs(name, spec.attrs);\n        this.defaultAttrs = defaultAttrs(this.attrs);\n        this.contentMatch = null;\n        this.inlineContent = null;\n        this.isBlock = !(spec.inline || name == \"text\");\n        this.isText = name == \"text\";\n    }\n    /**\n    True if this is an inline type.\n    */\n    get isInline() { return !this.isBlock; }\n    /**\n    True if this is a textblock type, a block that contains inline\n    content.\n    */\n    get isTextblock() { return this.isBlock && this.inlineContent; }\n    /**\n    True for node types that allow no content.\n    */\n    get isLeaf() { return this.contentMatch == ContentMatch.empty; }\n    /**\n    True when this node is an atom, i.e. when it does not have\n    directly editable content.\n    */\n    get isAtom() { return this.isLeaf || !!this.spec.atom; }\n    /**\n    Return true when this node type is part of the given\n    [group](https://prosemirror.net/docs/ref/#model.NodeSpec.group).\n    */\n    isInGroup(group) {\n        return this.groups.indexOf(group) > -1;\n    }\n    /**\n    The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option.\n    */\n    get whitespace() {\n        return this.spec.whitespace || (this.spec.code ? \"pre\" : \"normal\");\n    }\n    /**\n    Tells you whether this node type has any required attributes.\n    */\n    hasRequiredAttrs() {\n        for (let n in this.attrs)\n            if (this.attrs[n].isRequired)\n                return true;\n        return false;\n    }\n    /**\n    Indicates whether this node allows some of the same content as\n    the given node type.\n    */\n    compatibleContent(other) {\n        return this == other || this.contentMatch.compatible(other.contentMatch);\n    }\n    /**\n    @internal\n    */\n    computeAttrs(attrs) {\n        if (!attrs && this.defaultAttrs)\n            return this.defaultAttrs;\n        else\n            return computeAttrs(this.attrs, attrs);\n    }\n    /**\n    Create a `Node` of this type. The given attributes are\n    checked and defaulted (you can pass `null` to use the type's\n    defaults entirely, if no required attributes exist). `content`\n    may be a `Fragment`, a node, an array of nodes, or\n    `null`. Similarly `marks` may be `null` to default to the empty\n    set of marks.\n    */\n    create(attrs = null, content, marks) {\n        if (this.isText)\n            throw new Error(\"NodeType.create can't construct text nodes\");\n        return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks));\n    }\n    /**\n    Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content\n    against the node type's content restrictions, and throw an error\n    if it doesn't match.\n    */\n    createChecked(attrs = null, content, marks) {\n        content = Fragment.from(content);\n        this.checkContent(content);\n        return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks));\n    }\n    /**\n    Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is\n    necessary to add nodes to the start or end of the given fragment\n    to make it fit the node. If no fitting wrapping can be found,\n    return null. Note that, due to the fact that required nodes can\n    always be created, this will always succeed if you pass null or\n    `Fragment.empty` as content.\n    */\n    createAndFill(attrs = null, content, marks) {\n        attrs = this.computeAttrs(attrs);\n        content = Fragment.from(content);\n        if (content.size) {\n            let before = this.contentMatch.fillBefore(content);\n            if (!before)\n                return null;\n            content = before.append(content);\n        }\n        let matched = this.contentMatch.matchFragment(content);\n        let after = matched && matched.fillBefore(Fragment.empty, true);\n        if (!after)\n            return null;\n        return new Node(this, attrs, content.append(after), Mark.setFrom(marks));\n    }\n    /**\n    Returns true if the given fragment is valid content for this node\n    type.\n    */\n    validContent(content) {\n        let result = this.contentMatch.matchFragment(content);\n        if (!result || !result.validEnd)\n            return false;\n        for (let i = 0; i < content.childCount; i++)\n            if (!this.allowsMarks(content.child(i).marks))\n                return false;\n        return true;\n    }\n    /**\n    Throws a RangeError if the given fragment is not valid content for this\n    node type.\n    @internal\n    */\n    checkContent(content) {\n        if (!this.validContent(content))\n            throw new RangeError(`Invalid content for node ${this.name}: ${content.toString().slice(0, 50)}`);\n    }\n    /**\n    @internal\n    */\n    checkAttrs(attrs) {\n        checkAttrs(this.attrs, attrs, \"node\", this.name);\n    }\n    /**\n    Check whether the given mark type is allowed in this node.\n    */\n    allowsMarkType(markType) {\n        return this.markSet == null || this.markSet.indexOf(markType) > -1;\n    }\n    /**\n    Test whether the given set of marks are allowed in this node.\n    */\n    allowsMarks(marks) {\n        if (this.markSet == null)\n            return true;\n        for (let i = 0; i < marks.length; i++)\n            if (!this.allowsMarkType(marks[i].type))\n                return false;\n        return true;\n    }\n    /**\n    Removes the marks that are not allowed in this node from the given set.\n    */\n    allowedMarks(marks) {\n        if (this.markSet == null)\n            return marks;\n        let copy;\n        for (let i = 0; i < marks.length; i++) {\n            if (!this.allowsMarkType(marks[i].type)) {\n                if (!copy)\n                    copy = marks.slice(0, i);\n            }\n            else if (copy) {\n                copy.push(marks[i]);\n            }\n        }\n        return !copy ? marks : copy.length ? copy : Mark.none;\n    }\n    /**\n    @internal\n    */\n    static compile(nodes, schema) {\n        let result = Object.create(null);\n        nodes.forEach((name, spec) => result[name] = new NodeType(name, schema, spec));\n        let topType = schema.spec.topNode || \"doc\";\n        if (!result[topType])\n            throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\");\n        if (!result.text)\n            throw new RangeError(\"Every schema needs a 'text' type\");\n        for (let _ in result.text.attrs)\n            throw new RangeError(\"The text node type should not have attributes\");\n        return result;\n    }\n}\nfunction validateType(typeName, attrName, type) {\n    let types = type.split(\"|\");\n    return (value) => {\n        let name = value === null ? \"null\" : typeof value;\n        if (types.indexOf(name) < 0)\n            throw new RangeError(`Expected value of type ${types} for attribute ${attrName} on type ${typeName}, got ${name}`);\n    };\n}\n// Attribute descriptors\nclass Attribute {\n    constructor(typeName, attrName, options) {\n        this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n        this.default = options.default;\n        this.validate = typeof options.validate == \"string\" ? validateType(typeName, attrName, options.validate) : options.validate;\n    }\n    get isRequired() {\n        return !this.hasDefault;\n    }\n}\n// Marks\n/**\nLike nodes, marks (which are associated with nodes to signify\nthings like emphasis or being part of a link) are\n[tagged](https://prosemirror.net/docs/ref/#model.Mark.type) with type objects, which are\ninstantiated once per `Schema`.\n*/\nclass MarkType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name of the mark type.\n    */\n    name, \n    /**\n    @internal\n    */\n    rank, \n    /**\n    The schema that this mark type instance is part of.\n    */\n    schema, \n    /**\n    The spec on which the type is based.\n    */\n    spec) {\n        this.name = name;\n        this.rank = rank;\n        this.schema = schema;\n        this.spec = spec;\n        this.attrs = initAttrs(name, spec.attrs);\n        this.excluded = null;\n        let defaults = defaultAttrs(this.attrs);\n        this.instance = defaults ? new Mark(this, defaults) : null;\n    }\n    /**\n    Create a mark of this type. `attrs` may be `null` or an object\n    containing only some of the mark's attributes. The others, if\n    they have defaults, will be added.\n    */\n    create(attrs = null) {\n        if (!attrs && this.instance)\n            return this.instance;\n        return new Mark(this, computeAttrs(this.attrs, attrs));\n    }\n    /**\n    @internal\n    */\n    static compile(marks, schema) {\n        let result = Object.create(null), rank = 0;\n        marks.forEach((name, spec) => result[name] = new MarkType(name, rank++, schema, spec));\n        return result;\n    }\n    /**\n    When there is a mark of this type in the given set, a new set\n    without it is returned. Otherwise, the input set is returned.\n    */\n    removeFromSet(set) {\n        for (var i = 0; i < set.length; i++)\n            if (set[i].type == this) {\n                set = set.slice(0, i).concat(set.slice(i + 1));\n                i--;\n            }\n        return set;\n    }\n    /**\n    Tests whether there is a mark of this type in the given set.\n    */\n    isInSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (set[i].type == this)\n                return set[i];\n    }\n    /**\n    @internal\n    */\n    checkAttrs(attrs) {\n        checkAttrs(this.attrs, attrs, \"mark\", this.name);\n    }\n    /**\n    Queries whether a given mark type is\n    [excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one.\n    */\n    excludes(other) {\n        return this.excluded.indexOf(other) > -1;\n    }\n}\n/**\nA document schema. Holds [node](https://prosemirror.net/docs/ref/#model.NodeType) and [mark\ntype](https://prosemirror.net/docs/ref/#model.MarkType) objects for the nodes and marks that may\noccur in conforming documents, and provides functionality for\ncreating and deserializing such documents.\n\nWhen given, the type parameters provide the names of the nodes and\nmarks in this schema.\n*/\nclass Schema {\n    /**\n    Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec).\n    */\n    constructor(spec) {\n        /**\n        The [linebreak\n        replacement](https://prosemirror.net/docs/ref/#model.NodeSpec.linebreakReplacement) node defined\n        in this schema, if any.\n        */\n        this.linebreakReplacement = null;\n        /**\n        An object for storing whatever values modules may want to\n        compute and cache per schema. (If you want to store something\n        in it, try to use property names unlikely to clash.)\n        */\n        this.cached = Object.create(null);\n        let instanceSpec = this.spec = {};\n        for (let prop in spec)\n            instanceSpec[prop] = spec[prop];\n        instanceSpec.nodes = OrderedMap.from(spec.nodes),\n            instanceSpec.marks = OrderedMap.from(spec.marks || {}),\n            this.nodes = NodeType.compile(this.spec.nodes, this);\n        this.marks = MarkType.compile(this.spec.marks, this);\n        let contentExprCache = Object.create(null);\n        for (let prop in this.nodes) {\n            if (prop in this.marks)\n                throw new RangeError(prop + \" can not be both a node and a mark\");\n            let type = this.nodes[prop], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n            type.contentMatch = contentExprCache[contentExpr] ||\n                (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n            type.inlineContent = type.contentMatch.inlineContent;\n            if (type.spec.linebreakReplacement) {\n                if (this.linebreakReplacement)\n                    throw new RangeError(\"Multiple linebreak nodes defined\");\n                if (!type.isInline || !type.isLeaf)\n                    throw new RangeError(\"Linebreak replacement nodes must be inline leaf nodes\");\n                this.linebreakReplacement = type;\n            }\n            type.markSet = markExpr == \"_\" ? null :\n                markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n                    markExpr == \"\" || !type.inlineContent ? [] : null;\n        }\n        for (let prop in this.marks) {\n            let type = this.marks[prop], excl = type.spec.excludes;\n            type.excluded = excl == null ? [type] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n        }\n        this.nodeFromJSON = json => Node.fromJSON(this, json);\n        this.markFromJSON = json => Mark.fromJSON(this, json);\n        this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n        this.cached.wrappings = Object.create(null);\n    }\n    /**\n    Create a node in this schema. The `type` may be a string or a\n    `NodeType` instance. Attributes will be extended with defaults,\n    `content` may be a `Fragment`, `null`, a `Node`, or an array of\n    nodes.\n    */\n    node(type, attrs = null, content, marks) {\n        if (typeof type == \"string\")\n            type = this.nodeType(type);\n        else if (!(type instanceof NodeType))\n            throw new RangeError(\"Invalid node type: \" + type);\n        else if (type.schema != this)\n            throw new RangeError(\"Node type from different schema used (\" + type.name + \")\");\n        return type.createChecked(attrs, content, marks);\n    }\n    /**\n    Create a text node in the schema. Empty text nodes are not\n    allowed.\n    */\n    text(text, marks) {\n        let type = this.nodes.text;\n        return new TextNode(type, type.defaultAttrs, text, Mark.setFrom(marks));\n    }\n    /**\n    Create a mark with the given type and attributes.\n    */\n    mark(type, attrs) {\n        if (typeof type == \"string\")\n            type = this.marks[type];\n        return type.create(attrs);\n    }\n    /**\n    @internal\n    */\n    nodeType(name) {\n        let found = this.nodes[name];\n        if (!found)\n            throw new RangeError(\"Unknown node type: \" + name);\n        return found;\n    }\n}\nfunction gatherMarks(schema, marks) {\n    let found = [];\n    for (let i = 0; i < marks.length; i++) {\n        let name = marks[i], mark = schema.marks[name], ok = mark;\n        if (mark) {\n            found.push(mark);\n        }\n        else {\n            for (let prop in schema.marks) {\n                let mark = schema.marks[prop];\n                if (name == \"_\" || (mark.spec.group && mark.spec.group.split(\" \").indexOf(name) > -1))\n                    found.push(ok = mark);\n            }\n        }\n        if (!ok)\n            throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\");\n    }\n    return found;\n}\n\nfunction isTagRule(rule) { return rule.tag != null; }\nfunction isStyleRule(rule) { return rule.style != null; }\n/**\nA DOM parser represents a strategy for parsing DOM content into a\nProseMirror document conforming to a given schema. Its behavior is\ndefined by an array of [rules](https://prosemirror.net/docs/ref/#model.ParseRule).\n*/\nclass DOMParser {\n    /**\n    Create a parser that targets the given schema, using the given\n    parsing rules.\n    */\n    constructor(\n    /**\n    The schema into which the parser parses.\n    */\n    schema, \n    /**\n    The set of [parse rules](https://prosemirror.net/docs/ref/#model.ParseRule) that the parser\n    uses, in order of precedence.\n    */\n    rules) {\n        this.schema = schema;\n        this.rules = rules;\n        /**\n        @internal\n        */\n        this.tags = [];\n        /**\n        @internal\n        */\n        this.styles = [];\n        let matchedStyles = this.matchedStyles = [];\n        rules.forEach(rule => {\n            if (isTagRule(rule)) {\n                this.tags.push(rule);\n            }\n            else if (isStyleRule(rule)) {\n                let prop = /[^=]*/.exec(rule.style)[0];\n                if (matchedStyles.indexOf(prop) < 0)\n                    matchedStyles.push(prop);\n                this.styles.push(rule);\n            }\n        });\n        // Only normalize list elements when lists in the schema can't directly contain themselves\n        this.normalizeLists = !this.tags.some(r => {\n            if (!/^(ul|ol)\\b/.test(r.tag) || !r.node)\n                return false;\n            let node = schema.nodes[r.node];\n            return node.contentMatch.matchType(node);\n        });\n    }\n    /**\n    Parse a document from the content of a DOM node.\n    */\n    parse(dom, options = {}) {\n        let context = new ParseContext(this, options, false);\n        context.addAll(dom, Mark.none, options.from, options.to);\n        return context.finish();\n    }\n    /**\n    Parses the content of the given DOM node, like\n    [`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of\n    options. But unlike that method, which produces a whole node,\n    this one returns a slice that is open at the sides, meaning that\n    the schema constraints aren't applied to the start of nodes to\n    the left of the input and the end of nodes at the end.\n    */\n    parseSlice(dom, options = {}) {\n        let context = new ParseContext(this, options, true);\n        context.addAll(dom, Mark.none, options.from, options.to);\n        return Slice.maxOpen(context.finish());\n    }\n    /**\n    @internal\n    */\n    matchTag(dom, context, after) {\n        for (let i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n            let rule = this.tags[i];\n            if (matches(dom, rule.tag) &&\n                (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n                (!rule.context || context.matchesContext(rule.context))) {\n                if (rule.getAttrs) {\n                    let result = rule.getAttrs(dom);\n                    if (result === false)\n                        continue;\n                    rule.attrs = result || undefined;\n                }\n                return rule;\n            }\n        }\n    }\n    /**\n    @internal\n    */\n    matchStyle(prop, value, context, after) {\n        for (let i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n            let rule = this.styles[i], style = rule.style;\n            if (style.indexOf(prop) != 0 ||\n                rule.context && !context.matchesContext(rule.context) ||\n                // Test that the style string either precisely matches the prop,\n                // or has an '=' sign after the prop, followed by the given\n                // value.\n                style.length > prop.length &&\n                    (style.charCodeAt(prop.length) != 61 || style.slice(prop.length + 1) != value))\n                continue;\n            if (rule.getAttrs) {\n                let result = rule.getAttrs(value);\n                if (result === false)\n                    continue;\n                rule.attrs = result || undefined;\n            }\n            return rule;\n        }\n    }\n    /**\n    @internal\n    */\n    static schemaRules(schema) {\n        let result = [];\n        function insert(rule) {\n            let priority = rule.priority == null ? 50 : rule.priority, i = 0;\n            for (; i < result.length; i++) {\n                let next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n                if (nextPriority < priority)\n                    break;\n            }\n            result.splice(i, 0, rule);\n        }\n        for (let name in schema.marks) {\n            let rules = schema.marks[name].spec.parseDOM;\n            if (rules)\n                rules.forEach(rule => {\n                    insert(rule = copy(rule));\n                    if (!(rule.mark || rule.ignore || rule.clearMark))\n                        rule.mark = name;\n                });\n        }\n        for (let name in schema.nodes) {\n            let rules = schema.nodes[name].spec.parseDOM;\n            if (rules)\n                rules.forEach(rule => {\n                    insert(rule = copy(rule));\n                    if (!(rule.node || rule.ignore || rule.mark))\n                        rule.node = name;\n                });\n        }\n        return result;\n    }\n    /**\n    Construct a DOM parser using the parsing rules listed in a\n    schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by\n    [priority](https://prosemirror.net/docs/ref/#model.GenericParseRule.priority).\n    */\n    static fromSchema(schema) {\n        return schema.cached.domParser ||\n            (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)));\n    }\n}\nconst blockTags = {\n    address: true, article: true, aside: true, blockquote: true, body: true, canvas: true,\n    dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n    footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n    h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n    output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\nconst ignoreTags = {\n    head: true, noscript: true, object: true, script: true, style: true, title: true\n};\nconst listTags = { ol: true, ul: true };\n// Using a bitfield for node context options\nconst OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\nfunction wsOptionsFor(type, preserveWhitespace, base) {\n    if (preserveWhitespace != null)\n        return (preserveWhitespace ? OPT_PRESERVE_WS : 0) |\n            (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0);\n    return type && type.whitespace == \"pre\" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base & ~OPT_OPEN_LEFT;\n}\nclass NodeContext {\n    constructor(type, attrs, marks, solid, match, options) {\n        this.type = type;\n        this.attrs = attrs;\n        this.marks = marks;\n        this.solid = solid;\n        this.options = options;\n        this.content = [];\n        // Marks applied to the node's children\n        this.activeMarks = Mark.none;\n        this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n    }\n    findWrapping(node) {\n        if (!this.match) {\n            if (!this.type)\n                return [];\n            let fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n            if (fill) {\n                this.match = this.type.contentMatch.matchFragment(fill);\n            }\n            else {\n                let start = this.type.contentMatch, wrap;\n                if (wrap = start.findWrapping(node.type)) {\n                    this.match = start;\n                    return wrap;\n                }\n                else {\n                    return null;\n                }\n            }\n        }\n        return this.match.findWrapping(node.type);\n    }\n    finish(openEnd) {\n        if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n            let last = this.content[this.content.length - 1], m;\n            if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n                let text = last;\n                if (last.text.length == m[0].length)\n                    this.content.pop();\n                else\n                    this.content[this.content.length - 1] = text.withText(text.text.slice(0, text.text.length - m[0].length));\n            }\n        }\n        let content = Fragment.from(this.content);\n        if (!openEnd && this.match)\n            content = content.append(this.match.fillBefore(Fragment.empty, true));\n        return this.type ? this.type.create(this.attrs, content, this.marks) : content;\n    }\n    inlineContext(node) {\n        if (this.type)\n            return this.type.inlineContent;\n        if (this.content.length)\n            return this.content[0].isInline;\n        return node.parentNode && !blockTags.hasOwnProperty(node.parentNode.nodeName.toLowerCase());\n    }\n}\nclass ParseContext {\n    constructor(\n    // The parser we are using.\n    parser, \n    // The options passed to this parse.\n    options, isOpen) {\n        this.parser = parser;\n        this.options = options;\n        this.isOpen = isOpen;\n        this.open = 0;\n        this.localPreserveWS = false;\n        let topNode = options.topNode, topContext;\n        let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0);\n        if (topNode)\n            topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, true, options.topMatch || topNode.type.contentMatch, topOptions);\n        else if (isOpen)\n            topContext = new NodeContext(null, null, Mark.none, true, null, topOptions);\n        else\n            topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, true, null, topOptions);\n        this.nodes = [topContext];\n        this.find = options.findPositions;\n        this.needsBlock = false;\n    }\n    get top() {\n        return this.nodes[this.open];\n    }\n    // Add a DOM node to the content. Text is inserted as text node,\n    // otherwise, the node is passed to `addElement` or, if it has a\n    // `style` attribute, `addElementWithStyles`.\n    addDOM(dom, marks) {\n        if (dom.nodeType == 3)\n            this.addTextNode(dom, marks);\n        else if (dom.nodeType == 1)\n            this.addElement(dom, marks);\n    }\n    addTextNode(dom, marks) {\n        let value = dom.nodeValue;\n        let top = this.top, preserveWS = (top.options & OPT_PRESERVE_WS_FULL) ? \"full\"\n            : this.localPreserveWS || (top.options & OPT_PRESERVE_WS) > 0;\n        let { schema } = this.parser;\n        if (preserveWS === \"full\" ||\n            top.inlineContext(dom) ||\n            /[^ \\t\\r\\n\\u000c]/.test(value)) {\n            if (!preserveWS) {\n                value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n                // If this starts with whitespace, and there is no node before it, or\n                // a hard break, or a text node that ends with whitespace, strip the\n                // leading space.\n                if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n                    let nodeBefore = top.content[top.content.length - 1];\n                    let domNodeBefore = dom.previousSibling;\n                    if (!nodeBefore ||\n                        (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n                        (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n                        value = value.slice(1);\n                }\n            }\n            else if (preserveWS === \"full\") {\n                value = value.replace(/\\r\\n?/g, \"\\n\");\n            }\n            else if (schema.linebreakReplacement && /[\\r\\n]/.test(value) && this.top.findWrapping(schema.linebreakReplacement.create())) {\n                let lines = value.split(/\\r?\\n|\\r/);\n                for (let i = 0; i < lines.length; i++) {\n                    if (i)\n                        this.insertNode(schema.linebreakReplacement.create(), marks, true);\n                    if (lines[i])\n                        this.insertNode(schema.text(lines[i]), marks, !/\\S/.test(lines[i]));\n                }\n                value = \"\";\n            }\n            else {\n                value = value.replace(/\\r?\\n|\\r/g, \" \");\n            }\n            if (value)\n                this.insertNode(schema.text(value), marks, !/\\S/.test(value));\n            this.findInText(dom);\n        }\n        else {\n            this.findInside(dom);\n        }\n    }\n    // Try to find a handler for the given tag and use that to parse. If\n    // none is found, the element's content nodes are added directly.\n    addElement(dom, marks, matchAfter) {\n        let outerWS = this.localPreserveWS, top = this.top;\n        if (dom.tagName == \"PRE\" || /pre/.test(dom.style && dom.style.whiteSpace))\n            this.localPreserveWS = true;\n        let name = dom.nodeName.toLowerCase(), ruleID;\n        if (listTags.hasOwnProperty(name) && this.parser.normalizeLists)\n            normalizeList(dom);\n        let rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n            (ruleID = this.parser.matchTag(dom, this, matchAfter));\n        out: if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n            this.findInside(dom);\n            this.ignoreFallback(dom, marks);\n        }\n        else if (!rule || rule.skip || rule.closeParent) {\n            if (rule && rule.closeParent)\n                this.open = Math.max(0, this.open - 1);\n            else if (rule && rule.skip.nodeType)\n                dom = rule.skip;\n            let sync, oldNeedsBlock = this.needsBlock;\n            if (blockTags.hasOwnProperty(name)) {\n                if (top.content.length && top.content[0].isInline && this.open) {\n                    this.open--;\n                    top = this.top;\n                }\n                sync = true;\n                if (!top.type)\n                    this.needsBlock = true;\n            }\n            else if (!dom.firstChild) {\n                this.leafFallback(dom, marks);\n                break out;\n            }\n            let innerMarks = rule && rule.skip ? marks : this.readStyles(dom, marks);\n            if (innerMarks)\n                this.addAll(dom, innerMarks);\n            if (sync)\n                this.sync(top);\n            this.needsBlock = oldNeedsBlock;\n        }\n        else {\n            let innerMarks = this.readStyles(dom, marks);\n            if (innerMarks)\n                this.addElementByRule(dom, rule, innerMarks, rule.consuming === false ? ruleID : undefined);\n        }\n        this.localPreserveWS = outerWS;\n    }\n    // Called for leaf DOM nodes that would otherwise be ignored\n    leafFallback(dom, marks) {\n        if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n            this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\"), marks);\n    }\n    // Called for ignored nodes\n    ignoreFallback(dom, marks) {\n        // Ignored BR nodes should at least create an inline context\n        if (dom.nodeName == \"BR\" && (!this.top.type || !this.top.type.inlineContent))\n            this.findPlace(this.parser.schema.text(\"-\"), marks, true);\n    }\n    // Run any style parser associated with the node's styles. Either\n    // return an updated array of marks, or null to indicate some of the\n    // styles had a rule with `ignore` set.\n    readStyles(dom, marks) {\n        let styles = dom.style;\n        // Because many properties will only show up in 'normalized' form\n        // in `style.item` (i.e. text-decoration becomes\n        // text-decoration-line, text-decoration-color, etc), we directly\n        // query the styles mentioned in our rules instead of iterating\n        // over the items.\n        if (styles && styles.length)\n            for (let i = 0; i < this.parser.matchedStyles.length; i++) {\n                let name = this.parser.matchedStyles[i], value = styles.getPropertyValue(name);\n                if (value)\n                    for (let after = undefined;;) {\n                        let rule = this.parser.matchStyle(name, value, this, after);\n                        if (!rule)\n                            break;\n                        if (rule.ignore)\n                            return null;\n                        if (rule.clearMark)\n                            marks = marks.filter(m => !rule.clearMark(m));\n                        else\n                            marks = marks.concat(this.parser.schema.marks[rule.mark].create(rule.attrs));\n                        if (rule.consuming === false)\n                            after = rule;\n                        else\n                            break;\n                    }\n            }\n        return marks;\n    }\n    // Look up a handler for the given node. If none are found, return\n    // false. Otherwise, apply it, use its return value to drive the way\n    // the node's content is wrapped, and return true.\n    addElementByRule(dom, rule, marks, continueAfter) {\n        let sync, nodeType;\n        if (rule.node) {\n            nodeType = this.parser.schema.nodes[rule.node];\n            if (!nodeType.isLeaf) {\n                let inner = this.enter(nodeType, rule.attrs || null, marks, rule.preserveWhitespace);\n                if (inner) {\n                    sync = true;\n                    marks = inner;\n                }\n            }\n            else if (!this.insertNode(nodeType.create(rule.attrs), marks, dom.nodeName == \"BR\")) {\n                this.leafFallback(dom, marks);\n            }\n        }\n        else {\n            let markType = this.parser.schema.marks[rule.mark];\n            marks = marks.concat(markType.create(rule.attrs));\n        }\n        let startIn = this.top;\n        if (nodeType && nodeType.isLeaf) {\n            this.findInside(dom);\n        }\n        else if (continueAfter) {\n            this.addElement(dom, marks, continueAfter);\n        }\n        else if (rule.getContent) {\n            this.findInside(dom);\n            rule.getContent(dom, this.parser.schema).forEach(node => this.insertNode(node, marks, false));\n        }\n        else {\n            let contentDOM = dom;\n            if (typeof rule.contentElement == \"string\")\n                contentDOM = dom.querySelector(rule.contentElement);\n            else if (typeof rule.contentElement == \"function\")\n                contentDOM = rule.contentElement(dom);\n            else if (rule.contentElement)\n                contentDOM = rule.contentElement;\n            this.findAround(dom, contentDOM, true);\n            this.addAll(contentDOM, marks);\n            this.findAround(dom, contentDOM, false);\n        }\n        if (sync && this.sync(startIn))\n            this.open--;\n    }\n    // Add all child nodes between `startIndex` and `endIndex` (or the\n    // whole node, if not given). If `sync` is passed, use it to\n    // synchronize after every block element.\n    addAll(parent, marks, startIndex, endIndex) {\n        let index = startIndex || 0;\n        for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end = endIndex == null ? null : parent.childNodes[endIndex]; dom != end; dom = dom.nextSibling, ++index) {\n            this.findAtPoint(parent, index);\n            this.addDOM(dom, marks);\n        }\n        this.findAtPoint(parent, index);\n    }\n    // Try to find a way to fit the given node type into the current\n    // context. May add intermediate wrappers and/or leave non-solid\n    // nodes that we're in.\n    findPlace(node, marks, cautious) {\n        let route, sync;\n        for (let depth = this.open, penalty = 0; depth >= 0; depth--) {\n            let cx = this.nodes[depth];\n            let found = cx.findWrapping(node);\n            if (found && (!route || route.length > found.length + penalty)) {\n                route = found;\n                sync = cx;\n                if (!found.length)\n                    break;\n            }\n            if (cx.solid) {\n                if (cautious)\n                    break;\n                penalty += 2;\n            }\n        }\n        if (!route)\n            return null;\n        this.sync(sync);\n        for (let i = 0; i < route.length; i++)\n            marks = this.enterInner(route[i], null, marks, false);\n        return marks;\n    }\n    // Try to insert the given node, adjusting the context when needed.\n    insertNode(node, marks, cautious) {\n        if (node.isInline && this.needsBlock && !this.top.type) {\n            let block = this.textblockFromContext();\n            if (block)\n                marks = this.enterInner(block, null, marks);\n        }\n        let innerMarks = this.findPlace(node, marks, cautious);\n        if (innerMarks) {\n            this.closeExtra();\n            let top = this.top;\n            if (top.match)\n                top.match = top.match.matchType(node.type);\n            let nodeMarks = Mark.none;\n            for (let m of innerMarks.concat(node.marks))\n                if (top.type ? top.type.allowsMarkType(m.type) : markMayApply(m.type, node.type))\n                    nodeMarks = m.addToSet(nodeMarks);\n            top.content.push(node.mark(nodeMarks));\n            return true;\n        }\n        return false;\n    }\n    // Try to start a node of the given type, adjusting the context when\n    // necessary.\n    enter(type, attrs, marks, preserveWS) {\n        let innerMarks = this.findPlace(type.create(attrs), marks, false);\n        if (innerMarks)\n            innerMarks = this.enterInner(type, attrs, marks, true, preserveWS);\n        return innerMarks;\n    }\n    // Open a node of the given type\n    enterInner(type, attrs, marks, solid = false, preserveWS) {\n        this.closeExtra();\n        let top = this.top;\n        top.match = top.match && top.match.matchType(type);\n        let options = wsOptionsFor(type, preserveWS, top.options);\n        if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0)\n            options |= OPT_OPEN_LEFT;\n        let applyMarks = Mark.none;\n        marks = marks.filter(m => {\n            if (top.type ? top.type.allowsMarkType(m.type) : markMayApply(m.type, type)) {\n                applyMarks = m.addToSet(applyMarks);\n                return false;\n            }\n            return true;\n        });\n        this.nodes.push(new NodeContext(type, attrs, applyMarks, solid, null, options));\n        this.open++;\n        return marks;\n    }\n    // Make sure all nodes above this.open are finished and added to\n    // their parents\n    closeExtra(openEnd = false) {\n        let i = this.nodes.length - 1;\n        if (i > this.open) {\n            for (; i > this.open; i--)\n                this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd));\n            this.nodes.length = this.open + 1;\n        }\n    }\n    finish() {\n        this.open = 0;\n        this.closeExtra(this.isOpen);\n        return this.nodes[0].finish(!!(this.isOpen || this.options.topOpen));\n    }\n    sync(to) {\n        for (let i = this.open; i >= 0; i--) {\n            if (this.nodes[i] == to) {\n                this.open = i;\n                return true;\n            }\n            else if (this.localPreserveWS) {\n                this.nodes[i].options |= OPT_PRESERVE_WS;\n            }\n        }\n        return false;\n    }\n    get currentPos() {\n        this.closeExtra();\n        let pos = 0;\n        for (let i = this.open; i >= 0; i--) {\n            let content = this.nodes[i].content;\n            for (let j = content.length - 1; j >= 0; j--)\n                pos += content[j].nodeSize;\n            if (i)\n                pos++;\n        }\n        return pos;\n    }\n    findAtPoint(parent, offset) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].node == parent && this.find[i].offset == offset)\n                    this.find[i].pos = this.currentPos;\n            }\n    }\n    findInside(parent) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n                    this.find[i].pos = this.currentPos;\n            }\n    }\n    findAround(parent, content, before) {\n        if (parent != content && this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n                    let pos = content.compareDocumentPosition(this.find[i].node);\n                    if (pos & (before ? 2 : 4))\n                        this.find[i].pos = this.currentPos;\n                }\n            }\n    }\n    findInText(textNode) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].node == textNode)\n                    this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset);\n            }\n    }\n    // Determines whether the given context string matches this context.\n    matchesContext(context) {\n        if (context.indexOf(\"|\") > -1)\n            return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this);\n        let parts = context.split(\"/\");\n        let option = this.options.context;\n        let useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n        let minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n        let match = (i, depth) => {\n            for (; i >= 0; i--) {\n                let part = parts[i];\n                if (part == \"\") {\n                    if (i == parts.length - 1 || i == 0)\n                        continue;\n                    for (; depth >= minDepth; depth--)\n                        if (match(i - 1, depth))\n                            return true;\n                    return false;\n                }\n                else {\n                    let next = depth > 0 || (depth == 0 && useRoot) ? this.nodes[depth].type\n                        : option && depth >= minDepth ? option.node(depth - minDepth).type\n                            : null;\n                    if (!next || (next.name != part && !next.isInGroup(part)))\n                        return false;\n                    depth--;\n                }\n            }\n            return true;\n        };\n        return match(parts.length - 1, this.open);\n    }\n    textblockFromContext() {\n        let $context = this.options.context;\n        if ($context)\n            for (let d = $context.depth; d >= 0; d--) {\n                let deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n                if (deflt && deflt.isTextblock && deflt.defaultAttrs)\n                    return deflt;\n            }\n        for (let name in this.parser.schema.nodes) {\n            let type = this.parser.schema.nodes[name];\n            if (type.isTextblock && type.defaultAttrs)\n                return type;\n        }\n    }\n}\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n    for (let child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n        let name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n        if (name && listTags.hasOwnProperty(name) && prevItem) {\n            prevItem.appendChild(child);\n            child = prevItem;\n        }\n        else if (name == \"li\") {\n            prevItem = child;\n        }\n        else if (name) {\n            prevItem = null;\n        }\n    }\n}\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n    return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector);\n}\nfunction copy(obj) {\n    let copy = {};\n    for (let prop in obj)\n        copy[prop] = obj[prop];\n    return copy;\n}\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n    let nodes = nodeType.schema.nodes;\n    for (let name in nodes) {\n        let parent = nodes[name];\n        if (!parent.allowsMarkType(markType))\n            continue;\n        let seen = [], scan = (match) => {\n            seen.push(match);\n            for (let i = 0; i < match.edgeCount; i++) {\n                let { type, next } = match.edge(i);\n                if (type == nodeType)\n                    return true;\n                if (seen.indexOf(next) < 0 && scan(next))\n                    return true;\n            }\n        };\n        if (scan(parent.contentMatch))\n            return true;\n    }\n}\n\n/**\nA DOM serializer knows how to convert ProseMirror nodes and\nmarks of various types to DOM nodes.\n*/\nclass DOMSerializer {\n    /**\n    Create a serializer. `nodes` should map node names to functions\n    that take a node and return a description of the corresponding\n    DOM. `marks` does the same for mark names, but also gets an\n    argument that tells it whether the mark's content is block or\n    inline content (for typical use, it'll always be inline). A mark\n    serializer may be `null` to indicate that marks of that type\n    should not be serialized.\n    */\n    constructor(\n    /**\n    The node serialization functions.\n    */\n    nodes, \n    /**\n    The mark serialization functions.\n    */\n    marks) {\n        this.nodes = nodes;\n        this.marks = marks;\n    }\n    /**\n    Serialize the content of this fragment to a DOM fragment. When\n    not in the browser, the `document` option, containing a DOM\n    document, should be passed so that the serializer can create\n    nodes.\n    */\n    serializeFragment(fragment, options = {}, target) {\n        if (!target)\n            target = doc(options).createDocumentFragment();\n        let top = target, active = [];\n        fragment.forEach(node => {\n            if (active.length || node.marks.length) {\n                let keep = 0, rendered = 0;\n                while (keep < active.length && rendered < node.marks.length) {\n                    let next = node.marks[rendered];\n                    if (!this.marks[next.type.name]) {\n                        rendered++;\n                        continue;\n                    }\n                    if (!next.eq(active[keep][0]) || next.type.spec.spanning === false)\n                        break;\n                    keep++;\n                    rendered++;\n                }\n                while (keep < active.length)\n                    top = active.pop()[1];\n                while (rendered < node.marks.length) {\n                    let add = node.marks[rendered++];\n                    let markDOM = this.serializeMark(add, node.isInline, options);\n                    if (markDOM) {\n                        active.push([add, top]);\n                        top.appendChild(markDOM.dom);\n                        top = markDOM.contentDOM || markDOM.dom;\n                    }\n                }\n            }\n            top.appendChild(this.serializeNodeInner(node, options));\n        });\n        return target;\n    }\n    /**\n    @internal\n    */\n    serializeNodeInner(node, options) {\n        if (node.isText)\n            return doc(options).createTextNode(node.text);\n        let { dom, contentDOM } = renderSpec(doc(options), this.nodes[node.type.name](node), null, node.attrs);\n        if (contentDOM) {\n            if (node.isLeaf)\n                throw new RangeError(\"Content hole not allowed in a leaf node spec\");\n            this.serializeFragment(node.content, options, contentDOM);\n        }\n        return dom;\n    }\n    /**\n    Serialize this node to a DOM node. This can be useful when you\n    need to serialize a part of a document, as opposed to the whole\n    document. To serialize a whole document, use\n    [`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on\n    its [content](https://prosemirror.net/docs/ref/#model.Node.content).\n    */\n    serializeNode(node, options = {}) {\n        let dom = this.serializeNodeInner(node, options);\n        for (let i = node.marks.length - 1; i >= 0; i--) {\n            let wrap = this.serializeMark(node.marks[i], node.isInline, options);\n            if (wrap) {\n                (wrap.contentDOM || wrap.dom).appendChild(dom);\n                dom = wrap.dom;\n            }\n        }\n        return dom;\n    }\n    /**\n    @internal\n    */\n    serializeMark(mark, inline, options = {}) {\n        let toDOM = this.marks[mark.type.name];\n        return toDOM && renderSpec(doc(options), toDOM(mark, inline), null, mark.attrs);\n    }\n    static renderSpec(doc, structure, xmlNS = null, blockArraysIn) {\n        // Kludge for backwards-compatibility with accidental original behavious\n        if (typeof structure == \"string\")\n            return { dom: doc.createTextNode(structure) };\n        return renderSpec(doc, structure, xmlNS, blockArraysIn);\n    }\n    /**\n    Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM)\n    properties in a schema's node and mark specs.\n    */\n    static fromSchema(schema) {\n        return schema.cached.domSerializer ||\n            (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)));\n    }\n    /**\n    Gather the serializers in a schema's node specs into an object.\n    This can be useful as a base to build a custom serializer from.\n    */\n    static nodesFromSchema(schema) {\n        let result = gatherToDOM(schema.nodes);\n        if (!result.text)\n            result.text = node => node.text;\n        return result;\n    }\n    /**\n    Gather the serializers in a schema's mark specs into an object.\n    */\n    static marksFromSchema(schema) {\n        return gatherToDOM(schema.marks);\n    }\n}\nfunction gatherToDOM(obj) {\n    let result = {};\n    for (let name in obj) {\n        let toDOM = obj[name].spec.toDOM;\n        if (toDOM)\n            result[name] = toDOM;\n    }\n    return result;\n}\nfunction doc(options) {\n    return options.document || window.document;\n}\nconst suspiciousAttributeCache = new WeakMap();\nfunction suspiciousAttributes(attrs) {\n    let value = suspiciousAttributeCache.get(attrs);\n    if (value === undefined)\n        suspiciousAttributeCache.set(attrs, value = suspiciousAttributesInner(attrs));\n    return value;\n}\nfunction suspiciousAttributesInner(attrs) {\n    let result = null;\n    function scan(value) {\n        if (value && typeof value == \"object\") {\n            if (Array.isArray(value)) {\n                if (typeof value[0] == \"string\") {\n                    if (!result)\n                        result = [];\n                    result.push(value);\n                }\n                else {\n                    for (let i = 0; i < value.length; i++)\n                        scan(value[i]);\n                }\n            }\n            else {\n                for (let prop in value)\n                    scan(value[prop]);\n            }\n        }\n    }\n    scan(attrs);\n    return result;\n}\nfunction renderSpec(doc, structure, xmlNS, blockArraysIn) {\n    if (structure.nodeType == 1)\n        return { dom: structure };\n    if (structure.dom && structure.dom.nodeType == 1)\n        return structure;\n    let tagName = structure[0], suspicious;\n    if (typeof tagName != \"string\")\n        throw new RangeError(\"Invalid array passed to renderSpec\");\n    if (blockArraysIn && (suspicious = suspiciousAttributes(blockArraysIn)) &&\n        suspicious.indexOf(structure) > -1)\n        throw new RangeError(\"Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.\");\n    let space = tagName.indexOf(\" \");\n    if (space > 0) {\n        xmlNS = tagName.slice(0, space);\n        tagName = tagName.slice(space + 1);\n    }\n    let contentDOM;\n    let dom = (xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName));\n    let attrs = structure[1], start = 1;\n    if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n        start = 2;\n        for (let name in attrs)\n            if (attrs[name] != null) {\n                let space = name.indexOf(\" \");\n                if (space > 0)\n                    dom.setAttributeNS(name.slice(0, space), name.slice(space + 1), attrs[name]);\n                else if (name == \"style\" && dom.style)\n                    dom.style.cssText = attrs[name];\n                else\n                    dom.setAttribute(name, attrs[name]);\n            }\n    }\n    for (let i = start; i < structure.length; i++) {\n        let child = structure[i];\n        if (child === 0) {\n            if (i < structure.length - 1 || i > start)\n                throw new RangeError(\"Content hole must be the only child of its parent node\");\n            return { dom, contentDOM: dom };\n        }\n        else if (typeof child == \"string\") {\n            dom.appendChild(doc.createTextNode(child));\n        }\n        else {\n            let { dom: inner, contentDOM: innerContent } = renderSpec(doc, child, xmlNS, blockArraysIn);\n            dom.appendChild(inner);\n            if (innerContent) {\n                if (contentDOM)\n                    throw new RangeError(\"Multiple content holes\");\n                contentDOM = innerContent;\n            }\n        }\n    }\n    return { dom, contentDOM };\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n","import { ReplaceError, Slice, Fragment, MarkType, Mark } from 'prosemirror-model';\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\nconst lower16 = 0xffff;\nconst factor16 = Math.pow(2, 16);\nfunction makeRecover(index, offset) { return index + offset * factor16; }\nfunction recoverIndex(value) { return value & lower16; }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16; }\nconst DEL_BEFORE = 1, DEL_AFTER = 2, DEL_ACROSS = 4, DEL_SIDE = 8;\n/**\nAn object representing a mapped position with extra\ninformation.\n*/\nclass MapResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The mapped version of the position.\n    */\n    pos, \n    /**\n    @internal\n    */\n    delInfo, \n    /**\n    @internal\n    */\n    recover) {\n        this.pos = pos;\n        this.delInfo = delInfo;\n        this.recover = recover;\n    }\n    /**\n    Tells you whether the position was deleted, that is, whether the\n    step removed the token on the side queried (via the `assoc`)\n    argument from the document.\n    */\n    get deleted() { return (this.delInfo & DEL_SIDE) > 0; }\n    /**\n    Tells you whether the token before the mapped position was deleted.\n    */\n    get deletedBefore() { return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; }\n    /**\n    True when the token after the mapped position was deleted.\n    */\n    get deletedAfter() { return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; }\n    /**\n    Tells whether any of the steps mapped through deletes across the\n    position (including both the token before and after the\n    position).\n    */\n    get deletedAcross() { return (this.delInfo & DEL_ACROSS) > 0; }\n}\n/**\nA map describing the deletions and insertions made by a step, which\ncan be used to find the correspondence between positions in the\npre-step version of a document and the same position in the\npost-step version.\n*/\nclass StepMap {\n    /**\n    Create a position map. The modifications to the document are\n    represented as an array of numbers, in which each group of three\n    represents a modified chunk as `[start, oldSize, newSize]`.\n    */\n    constructor(\n    /**\n    @internal\n    */\n    ranges, \n    /**\n    @internal\n    */\n    inverted = false) {\n        this.ranges = ranges;\n        this.inverted = inverted;\n        if (!ranges.length && StepMap.empty)\n            return StepMap.empty;\n    }\n    /**\n    @internal\n    */\n    recover(value) {\n        let diff = 0, index = recoverIndex(value);\n        if (!this.inverted)\n            for (let i = 0; i < index; i++)\n                diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1];\n        return this.ranges[index * 3] + diff + recoverOffset(value);\n    }\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    map(pos, assoc = 1) { return this._map(pos, assoc, true); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n            if (pos <= end) {\n                let side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n                let result = start + diff + (side < 0 ? 0 : newSize);\n                if (simple)\n                    return result;\n                let recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n                let del = pos == start ? DEL_AFTER : pos == end ? DEL_BEFORE : DEL_ACROSS;\n                if (assoc < 0 ? pos != start : pos != end)\n                    del |= DEL_SIDE;\n                return new MapResult(result, del, recover);\n            }\n            diff += newSize - oldSize;\n        }\n        return simple ? pos + diff : new MapResult(pos + diff, 0, null);\n    }\n    /**\n    @internal\n    */\n    touches(pos, recover) {\n        let diff = 0, index = recoverIndex(recover);\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n            if (pos <= end && i == index * 3)\n                return true;\n            diff += this.ranges[i + newIndex] - oldSize;\n        }\n        return false;\n    }\n    /**\n    Calls the given function on each of the changed ranges included in\n    this map.\n    */\n    forEach(f) {\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0, diff = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n            f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n            diff += newSize - oldSize;\n        }\n    }\n    /**\n    Create an inverted version of this map. The result can be used to\n    map positions in the post-step document to the pre-step document.\n    */\n    invert() {\n        return new StepMap(this.ranges, !this.inverted);\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges);\n    }\n    /**\n    Create a map that moves all positions by offset `n` (which may be\n    negative). This can be useful when applying steps meant for a\n    sub-document to a larger document, or vice-versa.\n    */\n    static offset(n) {\n        return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]);\n    }\n}\n/**\nA StepMap that contains no changed ranges.\n*/\nStepMap.empty = new StepMap([]);\n/**\nA mapping represents a pipeline of zero or more [step\nmaps](https://prosemirror.net/docs/ref/#transform.StepMap). It has special provisions for losslessly\nhandling mapping positions through a series of steps in which some\nsteps are inverted versions of earlier steps. (This comes up when\n‘[rebasing](https://prosemirror.net/docs/guide/#transform.rebasing)’ steps for\ncollaboration or history management.)\n*/\nclass Mapping {\n    /**\n    Create a new mapping with the given position maps.\n    */\n    constructor(maps, \n    /**\n    @internal\n    */\n    mirror, \n    /**\n    The starting position in the `maps` array, used when `map` or\n    `mapResult` is called.\n    */\n    from = 0, \n    /**\n    The end position in the `maps` array.\n    */\n    to = maps ? maps.length : 0) {\n        this.mirror = mirror;\n        this.from = from;\n        this.to = to;\n        this._maps = maps || [];\n        this.ownData = !(maps || mirror);\n    }\n    /**\n    The step maps in this mapping.\n    */\n    get maps() { return this._maps; }\n    /**\n    Create a mapping that maps only through a part of this one.\n    */\n    slice(from = 0, to = this.maps.length) {\n        return new Mapping(this._maps, this.mirror, from, to);\n    }\n    /**\n    Add a step map to the end of this mapping. If `mirrors` is\n    given, it should be the index of the step map that is the mirror\n    image of this one.\n    */\n    appendMap(map, mirrors) {\n        if (!this.ownData) {\n            this._maps = this._maps.slice();\n            this.mirror = this.mirror && this.mirror.slice();\n            this.ownData = true;\n        }\n        this.to = this._maps.push(map);\n        if (mirrors != null)\n            this.setMirror(this._maps.length - 1, mirrors);\n    }\n    /**\n    Add all the step maps in a given mapping to this one (preserving\n    mirroring information).\n    */\n    appendMapping(mapping) {\n        for (let i = 0, startSize = this._maps.length; i < mapping._maps.length; i++) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping._maps[i], mirr != null && mirr < i ? startSize + mirr : undefined);\n        }\n    }\n    /**\n    Finds the offset of the step map that mirrors the map at the\n    given offset, in this mapping (as per the second argument to\n    `appendMap`).\n    */\n    getMirror(n) {\n        if (this.mirror)\n            for (let i = 0; i < this.mirror.length; i++)\n                if (this.mirror[i] == n)\n                    return this.mirror[i + (i % 2 ? -1 : 1)];\n    }\n    /**\n    @internal\n    */\n    setMirror(n, m) {\n        if (!this.mirror)\n            this.mirror = [];\n        this.mirror.push(n, m);\n    }\n    /**\n    Append the inverse of the given mapping to this one.\n    */\n    appendMappingInverted(mapping) {\n        for (let i = mapping.maps.length - 1, totalSize = this._maps.length + mapping._maps.length; i >= 0; i--) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping._maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : undefined);\n        }\n    }\n    /**\n    Create an inverted version of this mapping.\n    */\n    invert() {\n        let inverse = new Mapping;\n        inverse.appendMappingInverted(this);\n        return inverse;\n    }\n    /**\n    Map a position through this mapping.\n    */\n    map(pos, assoc = 1) {\n        if (this.mirror)\n            return this._map(pos, assoc, true);\n        for (let i = this.from; i < this.to; i++)\n            pos = this._maps[i].map(pos, assoc);\n        return pos;\n    }\n    /**\n    Map a position through this mapping, returning a mapping\n    result.\n    */\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let delInfo = 0;\n        for (let i = this.from; i < this.to; i++) {\n            let map = this._maps[i], result = map.mapResult(pos, assoc);\n            if (result.recover != null) {\n                let corr = this.getMirror(i);\n                if (corr != null && corr > i && corr < this.to) {\n                    i = corr;\n                    pos = this._maps[corr].recover(result.recover);\n                    continue;\n                }\n            }\n            delInfo |= result.delInfo;\n            pos = result.pos;\n        }\n        return simple ? pos : new MapResult(pos, delInfo, null);\n    }\n}\n\nconst stepsByID = Object.create(null);\n/**\nA step object represents an atomic change. It generally applies\nonly to the document it was created for, since the positions\nstored in it will only make sense for that document.\n\nNew steps are defined by creating classes that extend `Step`,\noverriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\nmethods, and registering your class with a unique\nJSON-serialization identifier using\n[`Step.jsonID`](https://prosemirror.net/docs/ref/#transform.Step^jsonID).\n*/\nclass Step {\n    /**\n    Get the step map that represents the changes made by this step,\n    and which can be used to transform between positions in the old\n    and the new document.\n    */\n    getMap() { return StepMap.empty; }\n    /**\n    Try to merge this step with another one, to be applied directly\n    after it. Returns the merged step when possible, null if the\n    steps can't be merged.\n    */\n    merge(other) { return null; }\n    /**\n    Deserialize a step from its JSON representation. Will call\n    through to the step class' own implementation of this method.\n    */\n    static fromJSON(schema, json) {\n        if (!json || !json.stepType)\n            throw new RangeError(\"Invalid input for Step.fromJSON\");\n        let type = stepsByID[json.stepType];\n        if (!type)\n            throw new RangeError(`No step type ${json.stepType} defined`);\n        return type.fromJSON(schema, json);\n    }\n    /**\n    To be able to serialize steps to JSON, each step needs a string\n    ID to attach to its JSON representation. Use this method to\n    register an ID for your step classes. Try to pick something\n    that's unlikely to clash with steps from other modules.\n    */\n    static jsonID(id, stepClass) {\n        if (id in stepsByID)\n            throw new RangeError(\"Duplicate use of step JSON ID \" + id);\n        stepsByID[id] = stepClass;\n        stepClass.prototype.jsonID = id;\n        return stepClass;\n    }\n}\n/**\nThe result of [applying](https://prosemirror.net/docs/ref/#transform.Step.apply) a step. Contains either a\nnew document or a failure value.\n*/\nclass StepResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The transformed document, if successful.\n    */\n    doc, \n    /**\n    The failure message, if unsuccessful.\n    */\n    failed) {\n        this.doc = doc;\n        this.failed = failed;\n    }\n    /**\n    Create a successful step result.\n    */\n    static ok(doc) { return new StepResult(doc, null); }\n    /**\n    Create a failed step result.\n    */\n    static fail(message) { return new StepResult(null, message); }\n    /**\n    Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given\n    arguments. Create a successful result if it succeeds, and a\n    failed one if it throws a `ReplaceError`.\n    */\n    static fromReplace(doc, from, to, slice) {\n        try {\n            return StepResult.ok(doc.replace(from, to, slice));\n        }\n        catch (e) {\n            if (e instanceof ReplaceError)\n                return StepResult.fail(e.message);\n            throw e;\n        }\n    }\n}\n\nfunction mapFragment(fragment, f, parent) {\n    let mapped = [];\n    for (let i = 0; i < fragment.childCount; i++) {\n        let child = fragment.child(i);\n        if (child.content.size)\n            child = child.copy(mapFragment(child.content, f, child));\n        if (child.isInline)\n            child = f(child, parent, i);\n        mapped.push(child);\n    }\n    return Fragment.fromArray(mapped);\n}\n/**\nAdd a mark to all inline content between two positions.\n*/\nclass AddMarkStep extends Step {\n    /**\n    Create a mark step.\n    */\n    constructor(\n    /**\n    The start of the marked range.\n    */\n    from, \n    /**\n    The end of the marked range.\n    */\n    to, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n        let parent = $from.node($from.sharedDepth(this.to));\n        let slice = new Slice(mapFragment(oldSlice.content, (node, parent) => {\n            if (!node.isAtom || !parent.type.allowsMarkType(this.mark.type))\n                return node;\n            return node.mark(this.mark.addToSet(node.marks));\n        }, parent), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new RemoveMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new AddMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof AddMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"addMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\");\n        return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addMark\", AddMarkStep);\n/**\nRemove a mark from all inline content between two positions.\n*/\nclass RemoveMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The start of the unmarked range.\n    */\n    from, \n    /**\n    The end of the unmarked range.\n    */\n    to, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to);\n        let slice = new Slice(mapFragment(oldSlice.content, node => {\n            return node.mark(this.mark.removeFromSet(node.marks));\n        }, doc), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new AddMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new RemoveMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof RemoveMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"removeMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\");\n        return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n/**\nAdd a mark to a specific node.\n*/\nclass AddNodeMarkStep extends Step {\n    /**\n    Create a node mark step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (node) {\n            let newSet = this.mark.addToSet(node.marks);\n            if (newSet.length == node.marks.length) {\n                for (let i = 0; i < node.marks.length; i++)\n                    if (!node.marks[i].isInSet(newSet))\n                        return new AddNodeMarkStep(this.pos, node.marks[i]);\n                return new AddNodeMarkStep(this.pos, this.mark);\n            }\n        }\n        return new RemoveNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"addNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for AddNodeMarkStep.fromJSON\");\n        return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addNodeMark\", AddNodeMarkStep);\n/**\nRemove a mark from a specific node.\n*/\nclass RemoveNodeMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node || !this.mark.isInSet(node.marks))\n            return this;\n        return new AddNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"removeNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for RemoveNodeMarkStep.fromJSON\");\n        return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeNodeMark\", RemoveNodeMarkStep);\n\n/**\nReplace a part of the document with a slice of new content.\n*/\nclass ReplaceStep extends Step {\n    /**\n    The given `slice` should fit the 'gap' between `from` and\n    `to`—the depths must line up, and the surrounding nodes must be\n    able to be joined with the open sides of the slice. When\n    `structure` is true, the step will fail if the content between\n    from and to is not just a sequence of closing and then opening\n    tokens (this is to guard against rebased replace steps\n    overwriting something they weren't supposed to).\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.slice = slice;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && contentBetween(doc, this.from, this.to))\n            return StepResult.fail(\"Structure replace would overwrite content\");\n        return StepResult.fromReplace(doc, this.from, this.to, this.slice);\n    }\n    getMap() {\n        return new StepMap([this.from, this.to - this.from, this.slice.size]);\n    }\n    invert(doc) {\n        return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to));\n    }\n    map(mapping) {\n        let to = mapping.mapResult(this.to, -1);\n        let from = this.from == this.to && ReplaceStep.MAP_BIAS < 0 ? to : mapping.mapResult(this.from, 1);\n        if (from.deletedAcross && to.deletedAcross)\n            return null;\n        return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice, this.structure);\n    }\n    merge(other) {\n        if (!(other instanceof ReplaceStep) || other.structure || this.structure)\n            return null;\n        if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n            return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure);\n        }\n        else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n            return new ReplaceStep(other.from, this.to, slice, this.structure);\n        }\n        else {\n            return null;\n        }\n    }\n    toJSON() {\n        let json = { stepType: \"replace\", from: this.from, to: this.to };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\");\n        return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure);\n    }\n}\n/**\nBy default, for backwards compatibility, an inserting step\nmapped over an insertion at that same position fill move after\nthe inserted content. In a collaborative editing situation, that\ncan make redone insertions appear in unexpected places. You can\nset this to -1 to make such mapping keep the step before the\ninsertion instead.\n*/\nReplaceStep.MAP_BIAS = 1;\nStep.jsonID(\"replace\", ReplaceStep);\n/**\nReplace a part of the document with a slice of content, but\npreserve a range of the replaced content by moving it into the\nslice.\n*/\nclass ReplaceAroundStep extends Step {\n    /**\n    Create a replace-around step with the given range and gap.\n    `insert` should be the point in the slice into which the content\n    of the gap should be moved. `structure` has the same meaning as\n    it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class.\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The start of preserved range.\n    */\n    gapFrom, \n    /**\n    The end of preserved range.\n    */\n    gapTo, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    The position in the slice where the preserved range should be\n    inserted.\n    */\n    insert, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.gapFrom = gapFrom;\n        this.gapTo = gapTo;\n        this.slice = slice;\n        this.insert = insert;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n            contentBetween(doc, this.gapTo, this.to)))\n            return StepResult.fail(\"Structure gap-replace would overwrite content\");\n        let gap = doc.slice(this.gapFrom, this.gapTo);\n        if (gap.openStart || gap.openEnd)\n            return StepResult.fail(\"Gap is not a flat range\");\n        let inserted = this.slice.insertAt(this.insert, gap.content);\n        if (!inserted)\n            return StepResult.fail(\"Content does not fit in gap\");\n        return StepResult.fromReplace(doc, this.from, this.to, inserted);\n    }\n    getMap() {\n        return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n            this.gapTo, this.to - this.gapTo, this.slice.size - this.insert]);\n    }\n    invert(doc) {\n        let gap = this.gapTo - this.gapFrom;\n        return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        let gapFrom = this.from == this.gapFrom ? from.pos : mapping.map(this.gapFrom, -1);\n        let gapTo = this.to == this.gapTo ? to.pos : mapping.map(this.gapTo, 1);\n        if ((from.deletedAcross && to.deletedAcross) || gapFrom < from.pos || gapTo > to.pos)\n            return null;\n        return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure);\n    }\n    toJSON() {\n        let json = { stepType: \"replaceAround\", from: this.from, to: this.to,\n            gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n            typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\");\n        return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo, Slice.fromJSON(schema, json.slice), json.insert, !!json.structure);\n    }\n}\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\nfunction contentBetween(doc, from, to) {\n    let $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n    while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n        depth--;\n        dist--;\n    }\n    if (dist > 0) {\n        let next = $from.node(depth).maybeChild($from.indexAfter(depth));\n        while (dist > 0) {\n            if (!next || next.isLeaf)\n                return true;\n            next = next.firstChild;\n            dist--;\n        }\n    }\n    return false;\n}\n\nfunction addMark(tr, from, to, mark) {\n    let removed = [], added = [];\n    let removing, adding;\n    tr.doc.nodesBetween(from, to, (node, pos, parent) => {\n        if (!node.isInline)\n            return;\n        let marks = node.marks;\n        if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n            let start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n            let newSet = mark.addToSet(marks);\n            for (let i = 0; i < marks.length; i++) {\n                if (!marks[i].isInSet(newSet)) {\n                    if (removing && removing.to == start && removing.mark.eq(marks[i]))\n                        removing.to = end;\n                    else\n                        removed.push(removing = new RemoveMarkStep(start, end, marks[i]));\n                }\n            }\n            if (adding && adding.to == start)\n                adding.to = end;\n            else\n                added.push(adding = new AddMarkStep(start, end, mark));\n        }\n    });\n    removed.forEach(s => tr.step(s));\n    added.forEach(s => tr.step(s));\n}\nfunction removeMark(tr, from, to, mark) {\n    let matched = [], step = 0;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (!node.isInline)\n            return;\n        step++;\n        let toRemove = null;\n        if (mark instanceof MarkType) {\n            let set = node.marks, found;\n            while (found = mark.isInSet(set)) {\n                (toRemove || (toRemove = [])).push(found);\n                set = found.removeFromSet(set);\n            }\n        }\n        else if (mark) {\n            if (mark.isInSet(node.marks))\n                toRemove = [mark];\n        }\n        else {\n            toRemove = node.marks;\n        }\n        if (toRemove && toRemove.length) {\n            let end = Math.min(pos + node.nodeSize, to);\n            for (let i = 0; i < toRemove.length; i++) {\n                let style = toRemove[i], found;\n                for (let j = 0; j < matched.length; j++) {\n                    let m = matched[j];\n                    if (m.step == step - 1 && style.eq(matched[j].style))\n                        found = m;\n                }\n                if (found) {\n                    found.to = end;\n                    found.step = step;\n                }\n                else {\n                    matched.push({ style, from: Math.max(pos, from), to: end, step });\n                }\n            }\n        }\n    });\n    matched.forEach(m => tr.step(new RemoveMarkStep(m.from, m.to, m.style)));\n}\nfunction clearIncompatible(tr, pos, parentType, match = parentType.contentMatch, clearNewlines = true) {\n    let node = tr.doc.nodeAt(pos);\n    let replSteps = [], cur = pos + 1;\n    for (let i = 0; i < node.childCount; i++) {\n        let child = node.child(i), end = cur + child.nodeSize;\n        let allowed = match.matchType(child.type);\n        if (!allowed) {\n            replSteps.push(new ReplaceStep(cur, end, Slice.empty));\n        }\n        else {\n            match = allowed;\n            for (let j = 0; j < child.marks.length; j++)\n                if (!parentType.allowsMarkType(child.marks[j].type))\n                    tr.step(new RemoveMarkStep(cur, end, child.marks[j]));\n            if (clearNewlines && child.isText && parentType.whitespace != \"pre\") {\n                let m, newline = /\\r?\\n|\\r/g, slice;\n                while (m = newline.exec(child.text)) {\n                    if (!slice)\n                        slice = new Slice(Fragment.from(parentType.schema.text(\" \", parentType.allowedMarks(child.marks))), 0, 0);\n                    replSteps.push(new ReplaceStep(cur + m.index, cur + m.index + m[0].length, slice));\n                }\n            }\n        }\n        cur = end;\n    }\n    if (!match.validEnd) {\n        let fill = match.fillBefore(Fragment.empty, true);\n        tr.replace(cur, cur, new Slice(fill, 0, 0));\n    }\n    for (let i = replSteps.length - 1; i >= 0; i--)\n        tr.step(replSteps[i]);\n}\n\nfunction canCut(node, start, end) {\n    return (start == 0 || node.canReplace(start, node.childCount)) &&\n        (end == node.childCount || node.canReplace(0, end));\n}\n/**\nTry to find a target depth to which the content in the given range\ncan be lifted. Will not go across\n[isolating](https://prosemirror.net/docs/ref/#model.NodeSpec.isolating) parent nodes.\n*/\nfunction liftTarget(range) {\n    let parent = range.parent;\n    let content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n    for (let depth = range.depth, contentBefore = 0, contentAfter = 0;; --depth) {\n        let node = range.$from.node(depth);\n        let index = range.$from.index(depth) + contentBefore, endIndex = range.$to.indexAfter(depth) - contentAfter;\n        if (depth < range.depth && node.canReplace(index, endIndex, content))\n            return depth;\n        if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex))\n            break;\n        if (index)\n            contentBefore = 1;\n        if (endIndex < node.childCount)\n            contentAfter = 1;\n    }\n    return null;\n}\nfunction lift(tr, range, target) {\n    let { $from, $to, depth } = range;\n    let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n    let start = gapStart, end = gapEnd;\n    let before = Fragment.empty, openStart = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $from.index(d) > 0) {\n            splitting = true;\n            before = Fragment.from($from.node(d).copy(before));\n            openStart++;\n        }\n        else {\n            start--;\n        }\n    let after = Fragment.empty, openEnd = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $to.after(d + 1) < $to.end(d)) {\n            splitting = true;\n            after = Fragment.from($to.node(d).copy(after));\n            openEnd++;\n        }\n        else {\n            end++;\n        }\n    tr.step(new ReplaceAroundStep(start, end, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true));\n}\n/**\nTry to find a valid way to wrap the content in the given range in a\nnode of the given type. May introduce extra nodes around and inside\nthe wrapper node, if necessary. Returns null if no valid wrapping\ncould be found. When `innerRange` is given, that range's content is\nused as the content to fit into the wrapping, instead of the\ncontent of `range`.\n*/\nfunction findWrapping(range, nodeType, attrs = null, innerRange = range) {\n    let around = findWrappingOutside(range, nodeType);\n    let inner = around && findWrappingInside(innerRange, nodeType);\n    if (!inner)\n        return null;\n    return around.map(withAttrs)\n        .concat({ type: nodeType, attrs }).concat(inner.map(withAttrs));\n}\nfunction withAttrs(type) { return { type, attrs: null }; }\nfunction findWrappingOutside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let around = parent.contentMatchAt(startIndex).findWrapping(type);\n    if (!around)\n        return null;\n    let outer = around.length ? around[0] : type;\n    return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null;\n}\nfunction findWrappingInside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let inner = parent.child(startIndex);\n    let inside = type.contentMatch.findWrapping(inner.type);\n    if (!inside)\n        return null;\n    let lastType = inside.length ? inside[inside.length - 1] : type;\n    let innerMatch = lastType.contentMatch;\n    for (let i = startIndex; innerMatch && i < endIndex; i++)\n        innerMatch = innerMatch.matchType(parent.child(i).type);\n    if (!innerMatch || !innerMatch.validEnd)\n        return null;\n    return inside;\n}\nfunction wrap(tr, range, wrappers) {\n    let content = Fragment.empty;\n    for (let i = wrappers.length - 1; i >= 0; i--) {\n        if (content.size) {\n            let match = wrappers[i].type.contentMatch.matchFragment(content);\n            if (!match || !match.validEnd)\n                throw new RangeError(\"Wrapper type given to Transform.wrap does not form valid content of its parent wrapper\");\n        }\n        content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n    }\n    let start = range.start, end = range.end;\n    tr.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true));\n}\nfunction setBlockType(tr, from, to, type, attrs) {\n    if (!type.isTextblock)\n        throw new RangeError(\"Type given to setBlockType should be a textblock\");\n    let mapFrom = tr.steps.length;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        let attrsHere = typeof attrs == \"function\" ? attrs(node) : attrs;\n        if (node.isTextblock && !node.hasMarkup(type, attrsHere) &&\n            canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {\n            let convertNewlines = null;\n            if (type.schema.linebreakReplacement) {\n                let pre = type.whitespace == \"pre\", supportLinebreak = !!type.contentMatch.matchType(type.schema.linebreakReplacement);\n                if (pre && !supportLinebreak)\n                    convertNewlines = false;\n                else if (!pre && supportLinebreak)\n                    convertNewlines = true;\n            }\n            // Ensure all markup that isn't allowed in the new node type is cleared\n            if (convertNewlines === false)\n                replaceLinebreaks(tr, node, pos, mapFrom);\n            clearIncompatible(tr, tr.mapping.slice(mapFrom).map(pos, 1), type, undefined, convertNewlines === null);\n            let mapping = tr.mapping.slice(mapFrom);\n            let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n            tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrsHere, null, node.marks)), 0, 0), 1, true));\n            if (convertNewlines === true)\n                replaceNewlines(tr, node, pos, mapFrom);\n            return false;\n        }\n    });\n}\nfunction replaceNewlines(tr, node, pos, mapFrom) {\n    node.forEach((child, offset) => {\n        if (child.isText) {\n            let m, newline = /\\r?\\n|\\r/g;\n            while (m = newline.exec(child.text)) {\n                let start = tr.mapping.slice(mapFrom).map(pos + 1 + offset + m.index);\n                tr.replaceWith(start, start + 1, node.type.schema.linebreakReplacement.create());\n            }\n        }\n    });\n}\nfunction replaceLinebreaks(tr, node, pos, mapFrom) {\n    node.forEach((child, offset) => {\n        if (child.type == child.type.schema.linebreakReplacement) {\n            let start = tr.mapping.slice(mapFrom).map(pos + 1 + offset);\n            tr.replaceWith(start, start + 1, node.type.schema.text(\"\\n\"));\n        }\n    });\n}\nfunction canChangeType(doc, pos, type) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return $pos.parent.canReplaceWith(index, index + 1, type);\n}\n/**\nChange the type, attributes, and/or marks of the node at `pos`.\nWhen `type` isn't given, the existing node type is preserved,\n*/\nfunction setNodeMarkup(tr, pos, type, attrs, marks) {\n    let node = tr.doc.nodeAt(pos);\n    if (!node)\n        throw new RangeError(\"No node at given position\");\n    if (!type)\n        type = node.type;\n    let newNode = type.create(attrs, null, marks || node.marks);\n    if (node.isLeaf)\n        return tr.replaceWith(pos, pos + node.nodeSize, newNode);\n    if (!type.validContent(node.content))\n        throw new RangeError(\"Invalid content for node type \" + type.name);\n    tr.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode), 0, 0), 1, true));\n}\n/**\nCheck whether splitting at the given position is allowed.\n*/\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n    let $pos = doc.resolve(pos), base = $pos.depth - depth;\n    let innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n    if (base < 0 || $pos.parent.type.spec.isolating ||\n        !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n        !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n        return false;\n    for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n        let node = $pos.node(d), index = $pos.index(d);\n        if (node.type.spec.isolating)\n            return false;\n        let rest = node.content.cutByIndex(index, node.childCount);\n        let overrideChild = typesAfter && typesAfter[i + 1];\n        if (overrideChild)\n            rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs));\n        let after = (typesAfter && typesAfter[i]) || node;\n        if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n            return false;\n    }\n    let index = $pos.indexAfter(base);\n    let baseType = typesAfter && typesAfter[0];\n    return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n}\nfunction split(tr, pos, depth = 1, typesAfter) {\n    let $pos = tr.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n    for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n        before = Fragment.from($pos.node(d).copy(before));\n        let typeAfter = typesAfter && typesAfter[i];\n        after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n    }\n    tr.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true));\n}\n/**\nTest whether the blocks before and after a given position can be\njoined.\n*/\nfunction canJoin(doc, pos) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n        $pos.parent.canReplace(index, index + 1);\n}\nfunction canAppendWithSubstitutedLinebreaks(a, b) {\n    if (!b.content.size)\n        a.type.compatibleContent(b.type);\n    let match = a.contentMatchAt(a.childCount);\n    let { linebreakReplacement } = a.type.schema;\n    for (let i = 0; i < b.childCount; i++) {\n        let child = b.child(i);\n        let type = child.type == linebreakReplacement ? a.type.schema.nodes.text : child.type;\n        match = match.matchType(type);\n        if (!match)\n            return false;\n        if (!a.type.allowsMarks(child.marks))\n            return false;\n    }\n    return match.validEnd;\n}\nfunction joinable(a, b) {\n    return !!(a && b && !a.isLeaf && canAppendWithSubstitutedLinebreaks(a, b));\n}\n/**\nFind an ancestor of the given position that can be joined to the\nblock before (or after if `dir` is positive). Returns the joinable\npoint, if any.\n*/\nfunction joinPoint(doc, pos, dir = -1) {\n    let $pos = doc.resolve(pos);\n    for (let d = $pos.depth;; d--) {\n        let before, after, index = $pos.index(d);\n        if (d == $pos.depth) {\n            before = $pos.nodeBefore;\n            after = $pos.nodeAfter;\n        }\n        else if (dir > 0) {\n            before = $pos.node(d + 1);\n            index++;\n            after = $pos.node(d).maybeChild(index);\n        }\n        else {\n            before = $pos.node(d).maybeChild(index - 1);\n            after = $pos.node(d + 1);\n        }\n        if (before && !before.isTextblock && joinable(before, after) &&\n            $pos.node(d).canReplace(index, index + 1))\n            return pos;\n        if (d == 0)\n            break;\n        pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n    }\n}\nfunction join(tr, pos, depth) {\n    let convertNewlines = null;\n    let { linebreakReplacement } = tr.doc.type.schema;\n    let $before = tr.doc.resolve(pos - depth), beforeType = $before.node().type;\n    if (linebreakReplacement && beforeType.inlineContent) {\n        let pre = beforeType.whitespace == \"pre\";\n        let supportLinebreak = !!beforeType.contentMatch.matchType(linebreakReplacement);\n        if (pre && !supportLinebreak)\n            convertNewlines = false;\n        else if (!pre && supportLinebreak)\n            convertNewlines = true;\n    }\n    let mapFrom = tr.steps.length;\n    if (convertNewlines === false) {\n        let $after = tr.doc.resolve(pos + depth);\n        replaceLinebreaks(tr, $after.node(), $after.before(), mapFrom);\n    }\n    if (beforeType.inlineContent)\n        clearIncompatible(tr, pos + depth - 1, beforeType, $before.node().contentMatchAt($before.index()), convertNewlines == null);\n    let mapping = tr.mapping.slice(mapFrom), start = mapping.map(pos - depth);\n    tr.step(new ReplaceStep(start, mapping.map(pos + depth, -1), Slice.empty, true));\n    if (convertNewlines === true) {\n        let $full = tr.doc.resolve(start);\n        replaceNewlines(tr, $full.node(), $full.before(), tr.steps.length);\n    }\n    return tr;\n}\n/**\nTry to find a point where a node of the given type can be inserted\nnear `pos`, by searching up the node hierarchy when `pos` itself\nisn't a valid place but is at the start or end of a node. Return\nnull if no position was found.\n*/\nfunction insertPoint(doc, pos, nodeType) {\n    let $pos = doc.resolve(pos);\n    if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType))\n        return pos;\n    if ($pos.parentOffset == 0)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.index(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.before(d + 1);\n            if (index > 0)\n                return null;\n        }\n    if ($pos.parentOffset == $pos.parent.content.size)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.indexAfter(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.after(d + 1);\n            if (index < $pos.node(d).childCount)\n                return null;\n        }\n    return null;\n}\n/**\nFinds a position at or around the given position where the given\nslice can be inserted. Will look at parent nodes' nearest boundary\nand try there, even if the original position wasn't directly at the\nstart or end of that node. Returns null when no position was found.\n*/\nfunction dropPoint(doc, pos, slice) {\n    let $pos = doc.resolve(pos);\n    if (!slice.content.size)\n        return pos;\n    let content = slice.content;\n    for (let i = 0; i < slice.openStart; i++)\n        content = content.firstChild.content;\n    for (let pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n        for (let d = $pos.depth; d >= 0; d--) {\n            let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n            let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n            let parent = $pos.node(d), fits = false;\n            if (pass == 1) {\n                fits = parent.canReplace(insertPos, insertPos, content);\n            }\n            else {\n                let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type);\n                fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]);\n            }\n            if (fits)\n                return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1);\n        }\n    }\n    return null;\n}\n\n/**\n‘Fit’ a slice into a given position in the document, producing a\n[step](https://prosemirror.net/docs/ref/#transform.Step) that inserts it. Will return null if\nthere's no meaningful way to insert the slice here, or inserting it\nwould be a no-op (an empty slice over an empty range).\n*/\nfunction replaceStep(doc, from, to = from, slice = Slice.empty) {\n    if (from == to && !slice.size)\n        return null;\n    let $from = doc.resolve(from), $to = doc.resolve(to);\n    // Optimization -- avoid work if it's obvious that it's not needed.\n    if (fitsTrivially($from, $to, slice))\n        return new ReplaceStep(from, to, slice);\n    return new Fitter($from, $to, slice).fit();\n}\nfunction fitsTrivially($from, $to, slice) {\n    return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n        $from.parent.canReplace($from.index(), $to.index(), slice.content);\n}\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in <p(\"foo\"), p(\"bar\")>, when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n//  - `frontier` holds a stack of `{type, match}` objects that\n//    represent the open side of the replacement. It starts at\n//    `$from`, then moves forward as content is placed, and is finally\n//    reconciled with `$to`.\n//\n//  - `unplaced` is a slice that represents the content that hasn't\n//    been placed yet.\n//\n//  - `placed` is a fragment of placed content. Its open-start value\n//    is implicit in `$from`, and its open-end value in `frontier`.\nclass Fitter {\n    constructor($from, $to, unplaced) {\n        this.$from = $from;\n        this.$to = $to;\n        this.unplaced = unplaced;\n        this.frontier = [];\n        this.placed = Fragment.empty;\n        for (let i = 0; i <= $from.depth; i++) {\n            let node = $from.node(i);\n            this.frontier.push({\n                type: node.type,\n                match: node.contentMatchAt($from.indexAfter(i))\n            });\n        }\n        for (let i = $from.depth; i > 0; i--)\n            this.placed = Fragment.from($from.node(i).copy(this.placed));\n    }\n    get depth() { return this.frontier.length - 1; }\n    fit() {\n        // As long as there's unplaced content, try to place some of it.\n        // If that fails, either increase the open score of the unplaced\n        // slice, or drop nodes from it, and then try again.\n        while (this.unplaced.size) {\n            let fit = this.findFittable();\n            if (fit)\n                this.placeNodes(fit);\n            else\n                this.openMore() || this.dropNode();\n        }\n        // When there's inline content directly after the frontier _and_\n        // directly after `this.$to`, we must generate a `ReplaceAround`\n        // step that pulls that content into the node after the frontier.\n        // That means the fitting must be done to the end of the textblock\n        // node after `this.$to`, not `this.$to` itself.\n        let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n        let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n        if (!$to)\n            return null;\n        // If closing to `$to` succeeded, create a step\n        let content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n        while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n            content = content.firstChild.content;\n            openStart--;\n            openEnd--;\n        }\n        let slice = new Slice(content, openStart, openEnd);\n        if (moveInline > -1)\n            return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize);\n        if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n            return new ReplaceStep($from.pos, $to.pos, slice);\n        return null;\n    }\n    // Find a position on the start spine of `this.unplaced` that has\n    // content that can be moved somewhere on the frontier. Returns two\n    // depths, one for the slice and one for the frontier.\n    findFittable() {\n        let startDepth = this.unplaced.openStart;\n        for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) {\n            let node = cur.firstChild;\n            if (cur.childCount > 1)\n                openEnd = 0;\n            if (node.type.spec.isolating && openEnd <= d) {\n                startDepth = d;\n                break;\n            }\n            cur = node.content;\n        }\n        // Only try wrapping nodes (pass 2) after finding a place without\n        // wrapping failed.\n        for (let pass = 1; pass <= 2; pass++) {\n            for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n                let fragment, parent = null;\n                if (sliceDepth) {\n                    parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n                    fragment = parent.content;\n                }\n                else {\n                    fragment = this.unplaced.content;\n                }\n                let first = fragment.firstChild;\n                for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n                    let { type, match } = this.frontier[frontierDepth], wrap, inject = null;\n                    // In pass 1, if the next node matches, or there is no next\n                    // node but the parents look compatible, we've found a\n                    // place.\n                    if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n                        : parent && type.compatibleContent(parent.type)))\n                        return { sliceDepth, frontierDepth, parent, inject };\n                    // In pass 2, look for a set of wrapping nodes that make\n                    // `first` fit here.\n                    else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n                        return { sliceDepth, frontierDepth, parent, wrap };\n                    // Don't continue looking further up if the parent node\n                    // would fit here.\n                    if (parent && match.matchType(parent.type))\n                        break;\n                }\n            }\n        }\n    }\n    openMore() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (!inner.childCount || inner.firstChild.isLeaf)\n            return false;\n        this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n        return true;\n    }\n    dropNode() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (inner.childCount <= 1 && openStart > 0) {\n            let openAtEnd = content.size - openStart <= openStart + inner.size;\n            this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd);\n        }\n        else {\n            this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n        }\n    }\n    // Move content from the unplaced slice at `sliceDepth` to the\n    // frontier node at `frontierDepth`. Close that frontier node when\n    // applicable.\n    placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap }) {\n        while (this.depth > frontierDepth)\n            this.closeFrontierNode();\n        if (wrap)\n            for (let i = 0; i < wrap.length; i++)\n                this.openFrontierNode(wrap[i]);\n        let slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n        let openStart = slice.openStart - sliceDepth;\n        let taken = 0, add = [];\n        let { match, type } = this.frontier[frontierDepth];\n        if (inject) {\n            for (let i = 0; i < inject.childCount; i++)\n                add.push(inject.child(i));\n            match = match.matchFragment(inject);\n        }\n        // Computes the amount of (end) open nodes at the end of the\n        // fragment. When 0, the parent is open, but no more. When\n        // negative, nothing is open.\n        let openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n        // Scan over the fragment, fitting as many child nodes as\n        // possible.\n        while (taken < fragment.childCount) {\n            let next = fragment.child(taken), matches = match.matchType(next.type);\n            if (!matches)\n                break;\n            taken++;\n            if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n                match = matches;\n                add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1));\n            }\n        }\n        let toEnd = taken == fragment.childCount;\n        if (!toEnd)\n            openEndCount = -1;\n        this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n        this.frontier[frontierDepth].match = match;\n        // If the parent types match, and the entire node was moved, and\n        // it's not open, close this frontier node right away.\n        if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n            this.closeFrontierNode();\n        // Add new frontier nodes for any open nodes at the end.\n        for (let i = 0, cur = fragment; i < openEndCount; i++) {\n            let node = cur.lastChild;\n            this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) });\n            cur = node.content;\n        }\n        // Update `this.unplaced`. Drop the entire node from which we\n        // placed it we got to its end, otherwise just drop the placed\n        // nodes.\n        this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n            : sliceDepth == 0 ? Slice.empty\n                : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n    }\n    mustMoveInline() {\n        if (!this.$to.parent.isTextblock)\n            return -1;\n        let top = this.frontier[this.depth], level;\n        if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n            (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth))\n            return -1;\n        let { depth } = this.$to, after = this.$to.after(depth);\n        while (depth > 1 && after == this.$to.end(--depth))\n            ++after;\n        return after;\n    }\n    findCloseLevel($to) {\n        scan: for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n            let { match, type } = this.frontier[i];\n            let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n            let fit = contentAfterFits($to, i, type, match, dropInner);\n            if (!fit)\n                continue;\n            for (let d = i - 1; d >= 0; d--) {\n                let { match, type } = this.frontier[d];\n                let matches = contentAfterFits($to, d, type, match, true);\n                if (!matches || matches.childCount)\n                    continue scan;\n            }\n            return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to };\n        }\n    }\n    close($to) {\n        let close = this.findCloseLevel($to);\n        if (!close)\n            return null;\n        while (this.depth > close.depth)\n            this.closeFrontierNode();\n        if (close.fit.childCount)\n            this.placed = addToFragment(this.placed, close.depth, close.fit);\n        $to = close.move;\n        for (let d = close.depth + 1; d <= $to.depth; d++) {\n            let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n            this.openFrontierNode(node.type, node.attrs, add);\n        }\n        return $to;\n    }\n    openFrontierNode(type, attrs = null, content) {\n        let top = this.frontier[this.depth];\n        top.match = top.match.matchType(type);\n        this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n        this.frontier.push({ type, match: type.contentMatch });\n    }\n    closeFrontierNode() {\n        let open = this.frontier.pop();\n        let add = open.match.fillBefore(Fragment.empty, true);\n        if (add.childCount)\n            this.placed = addToFragment(this.placed, this.frontier.length, add);\n    }\n}\nfunction dropFromFragment(fragment, depth, count) {\n    if (depth == 0)\n        return fragment.cutByIndex(count, fragment.childCount);\n    return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)));\n}\nfunction addToFragment(fragment, depth, content) {\n    if (depth == 0)\n        return fragment.append(content);\n    return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)));\n}\nfunction contentAt(fragment, depth) {\n    for (let i = 0; i < depth; i++)\n        fragment = fragment.firstChild.content;\n    return fragment;\n}\nfunction closeNodeStart(node, openStart, openEnd) {\n    if (openStart <= 0)\n        return node;\n    let frag = node.content;\n    if (openStart > 1)\n        frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0));\n    if (openStart > 0) {\n        frag = node.type.contentMatch.fillBefore(frag).append(frag);\n        if (openEnd <= 0)\n            frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true));\n    }\n    return node.copy(frag);\n}\nfunction contentAfterFits($to, depth, type, match, open) {\n    let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n    if (index == node.childCount && !type.compatibleContent(node.type))\n        return null;\n    let fit = match.fillBefore(node.content, true, index);\n    return fit && !invalidMarks(type, node.content, index) ? fit : null;\n}\nfunction invalidMarks(type, fragment, start) {\n    for (let i = start; i < fragment.childCount; i++)\n        if (!type.allowsMarks(fragment.child(i).marks))\n            return true;\n    return false;\n}\nfunction definesContent(type) {\n    return type.spec.defining || type.spec.definingForContent;\n}\nfunction replaceRange(tr, from, to, slice) {\n    if (!slice.size)\n        return tr.deleteRange(from, to);\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    if (fitsTrivially($from, $to, slice))\n        return tr.step(new ReplaceStep(from, to, slice));\n    let targetDepths = coveredDepths($from, $to);\n    // Can't replace the whole document, so remove 0 if it's present\n    if (targetDepths[targetDepths.length - 1] == 0)\n        targetDepths.pop();\n    // Negative numbers represent not expansion over the whole node at\n    // that depth, but replacing from $from.before(-D) to $to.pos.\n    let preferredTarget = -($from.depth + 1);\n    targetDepths.unshift(preferredTarget);\n    // This loop picks a preferred target depth, if one of the covering\n    // depths is not outside of a defining node, and adds negative\n    // depths for any depth that has $from at its start and does not\n    // cross a defining node.\n    for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n        let spec = $from.node(d).type.spec;\n        if (spec.defining || spec.definingAsContext || spec.isolating)\n            break;\n        if (targetDepths.indexOf(d) > -1)\n            preferredTarget = d;\n        else if ($from.before(d) == pos)\n            targetDepths.splice(1, 0, -d);\n    }\n    // Try to fit each possible depth of the slice into each possible\n    // target depth, starting with the preferred depths.\n    let preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n    let leftNodes = [], preferredDepth = slice.openStart;\n    for (let content = slice.content, i = 0;; i++) {\n        let node = content.firstChild;\n        leftNodes.push(node);\n        if (i == slice.openStart)\n            break;\n        content = node.content;\n    }\n    // Back up preferredDepth to cover defining textblocks directly\n    // above it, possibly skipping a non-defining textblock.\n    for (let d = preferredDepth - 1; d >= 0; d--) {\n        let leftNode = leftNodes[d], def = definesContent(leftNode.type);\n        if (def && !leftNode.sameMarkup($from.node(Math.abs(preferredTarget) - 1)))\n            preferredDepth = d;\n        else if (def || !leftNode.type.isTextblock)\n            break;\n    }\n    for (let j = slice.openStart; j >= 0; j--) {\n        let openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n        let insert = leftNodes[openDepth];\n        if (!insert)\n            continue;\n        for (let i = 0; i < targetDepths.length; i++) {\n            // Loop over possible expansion levels, starting with the\n            // preferred one\n            let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true;\n            if (targetDepth < 0) {\n                expand = false;\n                targetDepth = -targetDepth;\n            }\n            let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n            if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n                return tr.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth), openDepth, slice.openEnd));\n        }\n    }\n    let startSteps = tr.steps.length;\n    for (let i = targetDepths.length - 1; i >= 0; i--) {\n        tr.replace(from, to, slice);\n        if (tr.steps.length > startSteps)\n            break;\n        let depth = targetDepths[i];\n        if (depth < 0)\n            continue;\n        from = $from.before(depth);\n        to = $to.after(depth);\n    }\n}\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n    if (depth < oldOpen) {\n        let first = fragment.firstChild;\n        fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n    }\n    if (depth > newOpen) {\n        let match = parent.contentMatchAt(0);\n        let start = match.fillBefore(fragment).append(fragment);\n        fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n    }\n    return fragment;\n}\nfunction replaceRangeWith(tr, from, to, node) {\n    if (!node.isInline && from == to && tr.doc.resolve(from).parent.content.size) {\n        let point = insertPoint(tr.doc, from, node.type);\n        if (point != null)\n            from = to = point;\n    }\n    tr.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0));\n}\nfunction deleteRange(tr, from, to) {\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    // When the deleted range spans from the start of one textblock to\n    // the start of another one, move out of the start of both blocks.\n    if ($from.parent.isTextblock && $to.parent.isTextblock && $from.start() != $to.start() &&\n        $from.parentOffset == 0 && $to.parentOffset == 0) {\n        let shared = $from.sharedDepth(to), isolated = false;\n        for (let d = $from.depth; d > shared; d--)\n            if ($from.node(d).type.spec.isolating)\n                isolated = true;\n        for (let d = $to.depth; d > shared; d--)\n            if ($to.node(d).type.spec.isolating)\n                isolated = true;\n        if (!isolated) {\n            for (let d = $from.depth; d > 0 && from == $from.start(d); d--)\n                from = $from.before(d);\n            for (let d = $to.depth; d > 0 && to == $to.start(d); d--)\n                to = $to.before(d);\n            $from = tr.doc.resolve(from);\n            $to = tr.doc.resolve(to);\n        }\n    }\n    let covered = coveredDepths($from, $to);\n    for (let i = 0; i < covered.length; i++) {\n        let depth = covered[i], last = i == covered.length - 1;\n        if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n            return tr.delete($from.start(depth), $to.end(depth));\n        if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n            return tr.delete($from.before(depth), $to.after(depth));\n    }\n    for (let d = 1; d <= $from.depth && d <= $to.depth; d++) {\n        if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d &&\n            $from.start(d - 1) == $to.start(d - 1) && $from.node(d - 1).canReplace($from.index(d - 1), $to.index(d - 1)))\n            return tr.delete($from.before(d), to);\n    }\n    tr.delete(from, to);\n}\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n    let result = [], minDepth = Math.min($from.depth, $to.depth);\n    for (let d = minDepth; d >= 0; d--) {\n        let start = $from.start(d);\n        if (start < $from.pos - ($from.depth - d) ||\n            $to.end(d) > $to.pos + ($to.depth - d) ||\n            $from.node(d).type.spec.isolating ||\n            $to.node(d).type.spec.isolating)\n            break;\n        if (start == $to.start(d) ||\n            (d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent &&\n                d && $to.start(d - 1) == start - 1))\n            result.push(d);\n    }\n    return result;\n}\n\n/**\nUpdate an attribute in a specific node.\n*/\nclass AttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.pos = pos;\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at attribute step's position\");\n        let attrs = Object.create(null);\n        for (let name in node.attrs)\n            attrs[name] = node.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = node.type.create(attrs, null, node.marks);\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new AttrStep(this.pos, this.attr, doc.nodeAt(this.pos).attrs[this.attr]);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);\n    }\n    toJSON() {\n        return { stepType: \"attr\", pos: this.pos, attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\" || typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for AttrStep.fromJSON\");\n        return new AttrStep(json.pos, json.attr, json.value);\n    }\n}\nStep.jsonID(\"attr\", AttrStep);\n/**\nUpdate an attribute in the doc node.\n*/\nclass DocAttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let attrs = Object.create(null);\n        for (let name in doc.attrs)\n            attrs[name] = doc.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = doc.type.create(attrs, doc.content, doc.marks);\n        return StepResult.ok(updated);\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new DocAttrStep(this.attr, doc.attrs[this.attr]);\n    }\n    map(mapping) {\n        return this;\n    }\n    toJSON() {\n        return { stepType: \"docAttr\", attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for DocAttrStep.fromJSON\");\n        return new DocAttrStep(json.attr, json.value);\n    }\n}\nStep.jsonID(\"docAttr\", DocAttrStep);\n\n/**\n@internal\n*/\nlet TransformError = class extends Error {\n};\nTransformError = function TransformError(message) {\n    let err = Error.call(this, message);\n    err.__proto__ = TransformError.prototype;\n    return err;\n};\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n/**\nAbstraction to build up and track an array of\n[steps](https://prosemirror.net/docs/ref/#transform.Step) representing a document transformation.\n\nMost transforming methods return the `Transform` object itself, so\nthat they can be chained.\n*/\nclass Transform {\n    /**\n    Create a transform that starts with the given document.\n    */\n    constructor(\n    /**\n    The current document (the result of applying the steps in the\n    transform).\n    */\n    doc) {\n        this.doc = doc;\n        /**\n        The steps in this transform.\n        */\n        this.steps = [];\n        /**\n        The documents before each of the steps.\n        */\n        this.docs = [];\n        /**\n        A mapping with the maps for each of the steps in this transform.\n        */\n        this.mapping = new Mapping;\n    }\n    /**\n    The starting document.\n    */\n    get before() { return this.docs.length ? this.docs[0] : this.doc; }\n    /**\n    Apply a new step in this transform, saving the result. Throws an\n    error when the step fails.\n    */\n    step(step) {\n        let result = this.maybeStep(step);\n        if (result.failed)\n            throw new TransformError(result.failed);\n        return this;\n    }\n    /**\n    Try to apply a step in this transformation, ignoring it if it\n    fails. Returns the step result.\n    */\n    maybeStep(step) {\n        let result = step.apply(this.doc);\n        if (!result.failed)\n            this.addStep(step, result.doc);\n        return result;\n    }\n    /**\n    True when the document has been changed (when there are any\n    steps).\n    */\n    get docChanged() {\n        return this.steps.length > 0;\n    }\n    /**\n    Return a single range, in post-transform document positions,\n    that covers all content changed by this transform. Returns null\n    if no replacements are made. Note that this will ignore changes\n    that add/remove marks without replacing the underlying content.\n    */\n    changedRange() {\n        let from = 1e9, to = -1e9;\n        for (let i = 0; i < this.mapping.maps.length; i++) {\n            let map = this.mapping.maps[i];\n            if (i) {\n                from = map.map(from, 1);\n                to = map.map(to, -1);\n            }\n            map.forEach((_f, _t, fromB, toB) => {\n                from = Math.min(from, fromB);\n                to = Math.max(to, toB);\n            });\n        }\n        return from == 1e9 ? null : { from, to };\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        this.docs.push(this.doc);\n        this.steps.push(step);\n        this.mapping.appendMap(step.getMap());\n        this.doc = doc;\n    }\n    /**\n    Replace the part of the document between `from` and `to` with the\n    given `slice`.\n    */\n    replace(from, to = from, slice = Slice.empty) {\n        let step = replaceStep(this.doc, from, to, slice);\n        if (step)\n            this.step(step);\n        return this;\n    }\n    /**\n    Replace the given range with the given content, which may be a\n    fragment, node, or array of nodes.\n    */\n    replaceWith(from, to, content) {\n        return this.replace(from, to, new Slice(Fragment.from(content), 0, 0));\n    }\n    /**\n    Delete the content between the given positions.\n    */\n    delete(from, to) {\n        return this.replace(from, to, Slice.empty);\n    }\n    /**\n    Insert the given content at the given position.\n    */\n    insert(pos, content) {\n        return this.replaceWith(pos, pos, content);\n    }\n    /**\n    Replace a range of the document with a given slice, using\n    `from`, `to`, and the slice's\n    [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather\n    than fixed start and end points. This method may grow the\n    replaced area or close open nodes in the slice in order to get a\n    fit that is more in line with WYSIWYG expectations, by dropping\n    fully covered parent nodes of the replaced region when they are\n    marked [non-defining as\n    context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an\n    open parent node from the slice that _is_ marked as [defining\n    its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n    \n    This is the method, for example, to handle paste. The similar\n    [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more\n    primitive tool which will _not_ move the start and end of its given\n    range, and is useful in situations where you need more precise\n    control over what happens.\n    */\n    replaceRange(from, to, slice) {\n        replaceRange(this, from, to, slice);\n        return this;\n    }\n    /**\n    Replace the given range with a node, but use `from` and `to` as\n    hints, rather than precise positions. When from and to are the same\n    and are at the start or end of a parent node in which the given\n    node doesn't fit, this method may _move_ them out towards a parent\n    that does allow the given node to be placed. When the given range\n    completely covers a parent node, this method may completely replace\n    that parent node.\n    */\n    replaceRangeWith(from, to, node) {\n        replaceRangeWith(this, from, to, node);\n        return this;\n    }\n    /**\n    Delete the given range, expanding it to cover fully covered\n    parent nodes until a valid replace is found.\n    */\n    deleteRange(from, to) {\n        deleteRange(this, from, to);\n        return this;\n    }\n    /**\n    Split the content in the given range off from its parent, if there\n    is sibling content before or after it, and move it up the tree to\n    the depth specified by `target`. You'll probably want to use\n    [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make\n    sure the lift is valid.\n    */\n    lift(range, target) {\n        lift(this, range, target);\n        return this;\n    }\n    /**\n    Join the blocks around the given position. If depth is 2, their\n    last and first siblings are also joined, and so on.\n    */\n    join(pos, depth = 1) {\n        join(this, pos, depth);\n        return this;\n    }\n    /**\n    Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers.\n    The wrappers are assumed to be valid in this position, and should\n    probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping).\n    */\n    wrap(range, wrappers) {\n        wrap(this, range, wrappers);\n        return this;\n    }\n    /**\n    Set the type of all textblocks (partly) between `from` and `to` to\n    the given node type with the given attributes.\n    */\n    setBlockType(from, to = from, type, attrs = null) {\n        setBlockType(this, from, to, type, attrs);\n        return this;\n    }\n    /**\n    Change the type, attributes, and/or marks of the node at `pos`.\n    When `type` isn't given, the existing node type is preserved,\n    */\n    setNodeMarkup(pos, type, attrs = null, marks) {\n        setNodeMarkup(this, pos, type, attrs, marks);\n        return this;\n    }\n    /**\n    Set a single attribute on a given node to a new value.\n    The `pos` addresses the document content. Use `setDocAttribute`\n    to set attributes on the document itself.\n    */\n    setNodeAttribute(pos, attr, value) {\n        this.step(new AttrStep(pos, attr, value));\n        return this;\n    }\n    /**\n    Set a single attribute on the document to a new value.\n    */\n    setDocAttribute(attr, value) {\n        this.step(new DocAttrStep(attr, value));\n        return this;\n    }\n    /**\n    Add a mark to the node at position `pos`.\n    */\n    addNodeMark(pos, mark) {\n        this.step(new AddNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Remove a mark (or all marks of the given type) from the node at\n    position `pos`.\n    */\n    removeNodeMark(pos, mark) {\n        let node = this.doc.nodeAt(pos);\n        if (!node)\n            throw new RangeError(\"No node at position \" + pos);\n        if (mark instanceof Mark) {\n            if (mark.isInSet(node.marks))\n                this.step(new RemoveNodeMarkStep(pos, mark));\n        }\n        else {\n            let set = node.marks, found, steps = [];\n            while (found = mark.isInSet(set)) {\n                steps.push(new RemoveNodeMarkStep(pos, found));\n                set = found.removeFromSet(set);\n            }\n            for (let i = steps.length - 1; i >= 0; i--)\n                this.step(steps[i]);\n        }\n        return this;\n    }\n    /**\n    Split the node at the given position, and optionally, if `depth` is\n    greater than one, any number of nodes above that. By default, the\n    parts split off will inherit the node type of the original node.\n    This can be changed by passing an array of types and attributes to\n    use after the split (with the outermost nodes coming first).\n    */\n    split(pos, depth = 1, typesAfter) {\n        split(this, pos, depth, typesAfter);\n        return this;\n    }\n    /**\n    Add the given mark to the inline content between `from` and `to`.\n    */\n    addMark(from, to, mark) {\n        addMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Remove marks from inline nodes between `from` and `to`. When\n    `mark` is a single mark, remove precisely that mark. When it is\n    a mark type, remove all marks of that type. When it is null,\n    remove all marks of any type.\n    */\n    removeMark(from, to, mark) {\n        removeMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Removes all marks and nodes from the content of the node at\n    `pos` that don't match the given new parent node type. Accepts\n    an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as\n    third argument.\n    */\n    clearIncompatible(pos, parentType, match) {\n        clearIncompatible(this, pos, parentType, match);\n        return this;\n    }\n}\n\nexport { AddMarkStep, AddNodeMarkStep, AttrStep, DocAttrStep, MapResult, Mapping, RemoveMarkStep, RemoveNodeMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nconst classesById = Object.create(null);\n/**\nSuperclass for editor selections. Every selection type should\nextend this. Should not be instantiated directly.\n*/\nclass Selection {\n    /**\n    Initialize a selection with the head and anchor and ranges. If no\n    ranges are given, constructs a single range across `$anchor` and\n    `$head`.\n    */\n    constructor(\n    /**\n    The resolved anchor of the selection (the side that stays in\n    place when the selection is modified).\n    */\n    $anchor, \n    /**\n    The resolved head of the selection (the side that moves when\n    the selection is modified).\n    */\n    $head, ranges) {\n        this.$anchor = $anchor;\n        this.$head = $head;\n        this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n    }\n    /**\n    The selection's anchor, as an unresolved position.\n    */\n    get anchor() { return this.$anchor.pos; }\n    /**\n    The selection's head.\n    */\n    get head() { return this.$head.pos; }\n    /**\n    The lower bound of the selection's main range.\n    */\n    get from() { return this.$from.pos; }\n    /**\n    The upper bound of the selection's main range.\n    */\n    get to() { return this.$to.pos; }\n    /**\n    The resolved lower  bound of the selection's main range.\n    */\n    get $from() {\n        return this.ranges[0].$from;\n    }\n    /**\n    The resolved upper bound of the selection's main range.\n    */\n    get $to() {\n        return this.ranges[0].$to;\n    }\n    /**\n    Indicates whether the selection contains any content.\n    */\n    get empty() {\n        let ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++)\n            if (ranges[i].$from.pos != ranges[i].$to.pos)\n                return false;\n        return true;\n    }\n    /**\n    Get the content of this selection as a slice.\n    */\n    content() {\n        return this.$from.doc.slice(this.from, this.to, true);\n    }\n    /**\n    Replace the selection with a slice or, if no slice is given,\n    delete the selection. Will append to the given transaction.\n    */\n    replace(tr, content = Slice.empty) {\n        // Put the new selection at the position after the inserted\n        // content. When that ended in an inline node, search backwards,\n        // to get the position after that node. If not, search forward.\n        let lastNode = content.content.lastChild, lastParent = null;\n        for (let i = 0; i < content.openEnd; i++) {\n            lastParent = lastNode;\n            lastNode = lastNode.lastChild;\n        }\n        let mapFrom = tr.steps.length, ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++) {\n            let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n            tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i ? Slice.empty : content);\n            if (i == 0)\n                selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1);\n        }\n    }\n    /**\n    Replace the selection with the given node, appending the changes\n    to the given transaction.\n    */\n    replaceWith(tr, node) {\n        let mapFrom = tr.steps.length, ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++) {\n            let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n            let from = mapping.map($from.pos), to = mapping.map($to.pos);\n            if (i) {\n                tr.deleteRange(from, to);\n            }\n            else {\n                tr.replaceRangeWith(from, to, node);\n                selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n            }\n        }\n    }\n    /**\n    Find a valid cursor or leaf node selection starting at the given\n    position and searching back if `dir` is negative, and forward if\n    positive. When `textOnly` is true, only consider cursor\n    selections. Will return null when no valid selection position is\n    found.\n    */\n    static findFrom($pos, dir, textOnly = false) {\n        let inner = $pos.parent.inlineContent ? new TextSelection($pos)\n            : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n        if (inner)\n            return inner;\n        for (let depth = $pos.depth - 1; depth >= 0; depth--) {\n            let found = dir < 0\n                ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n                : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n            if (found)\n                return found;\n        }\n        return null;\n    }\n    /**\n    Find a valid cursor or leaf node selection near the given\n    position. Searches forward first by default, but if `bias` is\n    negative, it will search backwards first.\n    */\n    static near($pos, bias = 1) {\n        return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0));\n    }\n    /**\n    Find the cursor or leaf node selection closest to the start of\n    the given document. Will return an\n    [`AllSelection`](https://prosemirror.net/docs/ref/#state.AllSelection) if no valid position\n    exists.\n    */\n    static atStart(doc) {\n        return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc);\n    }\n    /**\n    Find the cursor or leaf node selection closest to the end of the\n    given document.\n    */\n    static atEnd(doc) {\n        return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc);\n    }\n    /**\n    Deserialize the JSON representation of a selection. Must be\n    implemented for custom classes (as a static class method).\n    */\n    static fromJSON(doc, json) {\n        if (!json || !json.type)\n            throw new RangeError(\"Invalid input for Selection.fromJSON\");\n        let cls = classesById[json.type];\n        if (!cls)\n            throw new RangeError(`No selection type ${json.type} defined`);\n        return cls.fromJSON(doc, json);\n    }\n    /**\n    To be able to deserialize selections from JSON, custom selection\n    classes must register themselves with an ID string, so that they\n    can be disambiguated. Try to pick something that's unlikely to\n    clash with classes from other modules.\n    */\n    static jsonID(id, selectionClass) {\n        if (id in classesById)\n            throw new RangeError(\"Duplicate use of selection JSON ID \" + id);\n        classesById[id] = selectionClass;\n        selectionClass.prototype.jsonID = id;\n        return selectionClass;\n    }\n    /**\n    Get a [bookmark](https://prosemirror.net/docs/ref/#state.SelectionBookmark) for this selection,\n    which is a value that can be mapped without having access to a\n    current document, and later resolved to a real selection for a\n    given document again. (This is used mostly by the history to\n    track and restore old selections.) The default implementation of\n    this method just converts the selection to a text selection and\n    returns the bookmark for that.\n    */\n    getBookmark() {\n        return TextSelection.between(this.$anchor, this.$head).getBookmark();\n    }\n}\nSelection.prototype.visible = true;\n/**\nRepresents a selected range in a document.\n*/\nclass SelectionRange {\n    /**\n    Create a range.\n    */\n    constructor(\n    /**\n    The lower bound of the range.\n    */\n    $from, \n    /**\n    The upper bound of the range.\n    */\n    $to) {\n        this.$from = $from;\n        this.$to = $to;\n    }\n}\nlet warnedAboutTextSelection = false;\nfunction checkTextSelection($pos) {\n    if (!warnedAboutTextSelection && !$pos.parent.inlineContent) {\n        warnedAboutTextSelection = true;\n        console[\"warn\"](\"TextSelection endpoint not pointing into a node with inline content (\" + $pos.parent.type.name + \")\");\n    }\n}\n/**\nA text selection represents a classical editor selection, with a\nhead (the moving side) and anchor (immobile side), both of which\npoint into textblock nodes. It can be empty (a regular cursor\nposition).\n*/\nclass TextSelection extends Selection {\n    /**\n    Construct a text selection between the given points.\n    */\n    constructor($anchor, $head = $anchor) {\n        checkTextSelection($anchor);\n        checkTextSelection($head);\n        super($anchor, $head);\n    }\n    /**\n    Returns a resolved position if this is a cursor selection (an\n    empty text selection), and null otherwise.\n    */\n    get $cursor() { return this.$anchor.pos == this.$head.pos ? this.$head : null; }\n    map(doc, mapping) {\n        let $head = doc.resolve(mapping.map(this.head));\n        if (!$head.parent.inlineContent)\n            return Selection.near($head);\n        let $anchor = doc.resolve(mapping.map(this.anchor));\n        return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head);\n    }\n    replace(tr, content = Slice.empty) {\n        super.replace(tr, content);\n        if (content == Slice.empty) {\n            let marks = this.$from.marksAcross(this.$to);\n            if (marks)\n                tr.ensureMarks(marks);\n        }\n    }\n    eq(other) {\n        return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head;\n    }\n    getBookmark() {\n        return new TextBookmark(this.anchor, this.head);\n    }\n    toJSON() {\n        return { type: \"text\", anchor: this.anchor, head: this.head };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n            throw new RangeError(\"Invalid input for TextSelection.fromJSON\");\n        return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n    }\n    /**\n    Create a text selection from non-resolved positions.\n    */\n    static create(doc, anchor, head = anchor) {\n        let $anchor = doc.resolve(anchor);\n        return new this($anchor, head == anchor ? $anchor : doc.resolve(head));\n    }\n    /**\n    Return a text selection that spans the given positions or, if\n    they aren't text positions, find a text selection near them.\n    `bias` determines whether the method searches forward (default)\n    or backwards (negative number) first. Will fall back to calling\n    [`Selection.near`](https://prosemirror.net/docs/ref/#state.Selection^near) when the document\n    doesn't contain a valid text position.\n    */\n    static between($anchor, $head, bias) {\n        let dPos = $anchor.pos - $head.pos;\n        if (!bias || dPos)\n            bias = dPos >= 0 ? 1 : -1;\n        if (!$head.parent.inlineContent) {\n            let found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n            if (found)\n                $head = found.$head;\n            else\n                return Selection.near($head, bias);\n        }\n        if (!$anchor.parent.inlineContent) {\n            if (dPos == 0) {\n                $anchor = $head;\n            }\n            else {\n                $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n                if (($anchor.pos < $head.pos) != (dPos < 0))\n                    $anchor = $head;\n            }\n        }\n        return new TextSelection($anchor, $head);\n    }\n}\nSelection.jsonID(\"text\", TextSelection);\nclass TextBookmark {\n    constructor(anchor, head) {\n        this.anchor = anchor;\n        this.head = head;\n    }\n    map(mapping) {\n        return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head));\n    }\n    resolve(doc) {\n        return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head));\n    }\n}\n/**\nA node selection is a selection that points at a single node. All\nnodes marked [selectable](https://prosemirror.net/docs/ref/#model.NodeSpec.selectable) can be the\ntarget of a node selection. In such a selection, `from` and `to`\npoint directly before and after the selected node, `anchor` equals\n`from`, and `head` equals `to`..\n*/\nclass NodeSelection extends Selection {\n    /**\n    Create a node selection. Does not verify the validity of its\n    argument.\n    */\n    constructor($pos) {\n        let node = $pos.nodeAfter;\n        let $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n        super($pos, $end);\n        this.node = node;\n    }\n    map(doc, mapping) {\n        let { deleted, pos } = mapping.mapResult(this.anchor);\n        let $pos = doc.resolve(pos);\n        if (deleted)\n            return Selection.near($pos);\n        return new NodeSelection($pos);\n    }\n    content() {\n        return new Slice(Fragment.from(this.node), 0, 0);\n    }\n    eq(other) {\n        return other instanceof NodeSelection && other.anchor == this.anchor;\n    }\n    toJSON() {\n        return { type: \"node\", anchor: this.anchor };\n    }\n    getBookmark() { return new NodeBookmark(this.anchor); }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.anchor != \"number\")\n            throw new RangeError(\"Invalid input for NodeSelection.fromJSON\");\n        return new NodeSelection(doc.resolve(json.anchor));\n    }\n    /**\n    Create a node selection from non-resolved positions.\n    */\n    static create(doc, from) {\n        return new NodeSelection(doc.resolve(from));\n    }\n    /**\n    Determines whether the given node may be selected as a node\n    selection.\n    */\n    static isSelectable(node) {\n        return !node.isText && node.type.spec.selectable !== false;\n    }\n}\nNodeSelection.prototype.visible = false;\nSelection.jsonID(\"node\", NodeSelection);\nclass NodeBookmark {\n    constructor(anchor) {\n        this.anchor = anchor;\n    }\n    map(mapping) {\n        let { deleted, pos } = mapping.mapResult(this.anchor);\n        return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos);\n    }\n    resolve(doc) {\n        let $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n        if (node && NodeSelection.isSelectable(node))\n            return new NodeSelection($pos);\n        return Selection.near($pos);\n    }\n}\n/**\nA selection type that represents selecting the whole document\n(which can not necessarily be expressed with a text selection, when\nthere are for example leaf block nodes at the start or end of the\ndocument).\n*/\nclass AllSelection extends Selection {\n    /**\n    Create an all-selection over the given document.\n    */\n    constructor(doc) {\n        super(doc.resolve(0), doc.resolve(doc.content.size));\n    }\n    replace(tr, content = Slice.empty) {\n        if (content == Slice.empty) {\n            tr.delete(0, tr.doc.content.size);\n            let sel = Selection.atStart(tr.doc);\n            if (!sel.eq(tr.selection))\n                tr.setSelection(sel);\n        }\n        else {\n            super.replace(tr, content);\n        }\n    }\n    toJSON() { return { type: \"all\" }; }\n    /**\n    @internal\n    */\n    static fromJSON(doc) { return new AllSelection(doc); }\n    map(doc) { return new AllSelection(doc); }\n    eq(other) { return other instanceof AllSelection; }\n    getBookmark() { return AllBookmark; }\n}\nSelection.jsonID(\"all\", AllSelection);\nconst AllBookmark = {\n    map() { return this; },\n    resolve(doc) { return new AllSelection(doc); }\n};\n// FIXME we'll need some awareness of text direction when scanning for selections\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text = false) {\n    if (node.inlineContent)\n        return TextSelection.create(doc, pos);\n    for (let i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n        let child = node.child(i);\n        if (!child.isAtom) {\n            let inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n            if (inner)\n                return inner;\n        }\n        else if (!text && NodeSelection.isSelectable(child)) {\n            return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0));\n        }\n        pos += child.nodeSize * dir;\n    }\n    return null;\n}\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n    let last = tr.steps.length - 1;\n    if (last < startLen)\n        return;\n    let step = tr.steps[last];\n    if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep))\n        return;\n    let map = tr.mapping.maps[last], end;\n    map.forEach((_from, _to, _newFrom, newTo) => { if (end == null)\n        end = newTo; });\n    tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nconst UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n/**\nAn editor state transaction, which can be applied to a state to\ncreate an updated state. Use\n[`EditorState.tr`](https://prosemirror.net/docs/ref/#state.EditorState.tr) to create an instance.\n\nTransactions track changes to the document (they are a subclass of\n[`Transform`](https://prosemirror.net/docs/ref/#transform.Transform)), but also other state changes,\nlike selection updates and adjustments of the set of [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks). In addition, you can store\nmetadata properties in a transaction, which are extra pieces of\ninformation that client code or plugins can use to describe what a\ntransaction represents, so that they can update their [own\nstate](https://prosemirror.net/docs/ref/#state.StateField) accordingly.\n\nThe [editor view](https://prosemirror.net/docs/ref/#view.EditorView) uses a few metadata\nproperties: it will attach a property `\"pointer\"` with the value\n`true` to selection transactions directly caused by mouse or touch\ninput, a `\"composition\"` property holding an ID identifying the\ncomposition that caused it to transactions caused by composed DOM\ninput, and a `\"uiEvent\"` property of that may be `\"paste\"`,\n`\"cut\"`, or `\"drop\"`.\n*/\nclass Transaction extends Transform {\n    /**\n    @internal\n    */\n    constructor(state) {\n        super(state.doc);\n        // The step count for which the current selection is valid.\n        this.curSelectionFor = 0;\n        // Bitfield to track which aspects of the state were updated by\n        // this transaction.\n        this.updated = 0;\n        // Object used to store metadata properties for the transaction.\n        this.meta = Object.create(null);\n        this.time = Date.now();\n        this.curSelection = state.selection;\n        this.storedMarks = state.storedMarks;\n    }\n    /**\n    The transaction's current selection. This defaults to the editor\n    selection [mapped](https://prosemirror.net/docs/ref/#state.Selection.map) through the steps in the\n    transaction, but can be overwritten with\n    [`setSelection`](https://prosemirror.net/docs/ref/#state.Transaction.setSelection).\n    */\n    get selection() {\n        if (this.curSelectionFor < this.steps.length) {\n            this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n            this.curSelectionFor = this.steps.length;\n        }\n        return this.curSelection;\n    }\n    /**\n    Update the transaction's current selection. Will determine the\n    selection that the editor gets when the transaction is applied.\n    */\n    setSelection(selection) {\n        if (selection.$from.doc != this.doc)\n            throw new RangeError(\"Selection passed to setSelection must point at the current document\");\n        this.curSelection = selection;\n        this.curSelectionFor = this.steps.length;\n        this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n        this.storedMarks = null;\n        return this;\n    }\n    /**\n    Whether the selection was explicitly updated by this transaction.\n    */\n    get selectionSet() {\n        return (this.updated & UPDATED_SEL) > 0;\n    }\n    /**\n    Set the current stored marks.\n    */\n    setStoredMarks(marks) {\n        this.storedMarks = marks;\n        this.updated |= UPDATED_MARKS;\n        return this;\n    }\n    /**\n    Make sure the current stored marks or, if that is null, the marks\n    at the selection, match the given set of marks. Does nothing if\n    this is already the case.\n    */\n    ensureMarks(marks) {\n        if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n            this.setStoredMarks(marks);\n        return this;\n    }\n    /**\n    Add a mark to the set of stored marks.\n    */\n    addStoredMark(mark) {\n        return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()));\n    }\n    /**\n    Remove a mark or mark type from the set of stored marks.\n    */\n    removeStoredMark(mark) {\n        return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()));\n    }\n    /**\n    Whether the stored marks were explicitly set for this transaction.\n    */\n    get storedMarksSet() {\n        return (this.updated & UPDATED_MARKS) > 0;\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        super.addStep(step, doc);\n        this.updated = this.updated & ~UPDATED_MARKS;\n        this.storedMarks = null;\n    }\n    /**\n    Update the timestamp for the transaction.\n    */\n    setTime(time) {\n        this.time = time;\n        return this;\n    }\n    /**\n    Replace the current selection with the given slice.\n    */\n    replaceSelection(slice) {\n        this.selection.replace(this, slice);\n        return this;\n    }\n    /**\n    Replace the selection with the given node. When `inheritMarks` is\n    true and the content is inline, it inherits the marks from the\n    place where it is inserted.\n    */\n    replaceSelectionWith(node, inheritMarks = true) {\n        let selection = this.selection;\n        if (inheritMarks)\n            node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none)));\n        selection.replaceWith(this, node);\n        return this;\n    }\n    /**\n    Delete the selection.\n    */\n    deleteSelection() {\n        this.selection.replace(this);\n        return this;\n    }\n    /**\n    Replace the given range, or the selection if no range is given,\n    with a text node containing the given string.\n    */\n    insertText(text, from, to) {\n        let schema = this.doc.type.schema;\n        if (from == null) {\n            if (!text)\n                return this.deleteSelection();\n            return this.replaceSelectionWith(schema.text(text), true);\n        }\n        else {\n            if (to == null)\n                to = from;\n            if (!text)\n                return this.deleteRange(from, to);\n            let marks = this.storedMarks;\n            if (!marks) {\n                let $from = this.doc.resolve(from);\n                marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n            }\n            this.replaceRangeWith(from, to, schema.text(text, marks));\n            if (!this.selection.empty && this.selection.to == from + text.length)\n                this.setSelection(Selection.near(this.selection.$to));\n            return this;\n        }\n    }\n    /**\n    Store a metadata property in this transaction, keyed either by\n    name or by plugin.\n    */\n    setMeta(key, value) {\n        this.meta[typeof key == \"string\" ? key : key.key] = value;\n        return this;\n    }\n    /**\n    Retrieve a metadata property for a given name or plugin.\n    */\n    getMeta(key) {\n        return this.meta[typeof key == \"string\" ? key : key.key];\n    }\n    /**\n    Returns true if this transaction doesn't contain any metadata,\n    and can thus safely be extended.\n    */\n    get isGeneric() {\n        for (let _ in this.meta)\n            return false;\n        return true;\n    }\n    /**\n    Indicate that the editor should scroll the selection into view\n    when updated to the state produced by this transaction.\n    */\n    scrollIntoView() {\n        this.updated |= UPDATED_SCROLL;\n        return this;\n    }\n    /**\n    True when this transaction has had `scrollIntoView` called on it.\n    */\n    get scrolledIntoView() {\n        return (this.updated & UPDATED_SCROLL) > 0;\n    }\n}\n\nfunction bind(f, self) {\n    return !self || !f ? f : f.bind(self);\n}\nclass FieldDesc {\n    constructor(name, desc, self) {\n        this.name = name;\n        this.init = bind(desc.init, self);\n        this.apply = bind(desc.apply, self);\n    }\n}\nconst baseFields = [\n    new FieldDesc(\"doc\", {\n        init(config) { return config.doc || config.schema.topNodeType.createAndFill(); },\n        apply(tr) { return tr.doc; }\n    }),\n    new FieldDesc(\"selection\", {\n        init(config, instance) { return config.selection || Selection.atStart(instance.doc); },\n        apply(tr) { return tr.selection; }\n    }),\n    new FieldDesc(\"storedMarks\", {\n        init(config) { return config.storedMarks || null; },\n        apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null; }\n    }),\n    new FieldDesc(\"scrollToSelection\", {\n        init() { return 0; },\n        apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev; }\n    })\n];\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nclass Configuration {\n    constructor(schema, plugins) {\n        this.schema = schema;\n        this.plugins = [];\n        this.pluginsByKey = Object.create(null);\n        this.fields = baseFields.slice();\n        if (plugins)\n            plugins.forEach(plugin => {\n                if (this.pluginsByKey[plugin.key])\n                    throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\");\n                this.plugins.push(plugin);\n                this.pluginsByKey[plugin.key] = plugin;\n                if (plugin.spec.state)\n                    this.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin));\n            });\n    }\n}\n/**\nThe state of a ProseMirror editor is represented by an object of\nthis type. A state is a persistent data structure—it isn't\nupdated, but rather a new state value is computed from an old one\nusing the [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) method.\n\nA state holds a number of built-in fields, and plugins can\n[define](https://prosemirror.net/docs/ref/#state.PluginSpec.state) additional fields.\n*/\nclass EditorState {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    @internal\n    */\n    config) {\n        this.config = config;\n    }\n    /**\n    The schema of the state's document.\n    */\n    get schema() {\n        return this.config.schema;\n    }\n    /**\n    The plugins that are active in this state.\n    */\n    get plugins() {\n        return this.config.plugins;\n    }\n    /**\n    Apply the given transaction to produce a new state.\n    */\n    apply(tr) {\n        return this.applyTransaction(tr).state;\n    }\n    /**\n    @internal\n    */\n    filterTransaction(tr, ignore = -1) {\n        for (let i = 0; i < this.config.plugins.length; i++)\n            if (i != ignore) {\n                let plugin = this.config.plugins[i];\n                if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n                    return false;\n            }\n        return true;\n    }\n    /**\n    Verbose variant of [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) that\n    returns the precise transactions that were applied (which might\n    be influenced by the [transaction\n    hooks](https://prosemirror.net/docs/ref/#state.PluginSpec.filterTransaction) of\n    plugins) along with the new state.\n    */\n    applyTransaction(rootTr) {\n        if (!this.filterTransaction(rootTr))\n            return { state: this, transactions: [] };\n        let trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n        // This loop repeatedly gives plugins a chance to respond to\n        // transactions as new transactions are added, making sure to only\n        // pass the transactions the plugin did not see before.\n        for (;;) {\n            let haveNew = false;\n            for (let i = 0; i < this.config.plugins.length; i++) {\n                let plugin = this.config.plugins[i];\n                if (plugin.spec.appendTransaction) {\n                    let n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n                    let tr = n < trs.length &&\n                        plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n                    if (tr && newState.filterTransaction(tr, i)) {\n                        tr.setMeta(\"appendedTransaction\", rootTr);\n                        if (!seen) {\n                            seen = [];\n                            for (let j = 0; j < this.config.plugins.length; j++)\n                                seen.push(j < i ? { state: newState, n: trs.length } : { state: this, n: 0 });\n                        }\n                        trs.push(tr);\n                        newState = newState.applyInner(tr);\n                        haveNew = true;\n                    }\n                    if (seen)\n                        seen[i] = { state: newState, n: trs.length };\n                }\n            }\n            if (!haveNew)\n                return { state: newState, transactions: trs };\n        }\n    }\n    /**\n    @internal\n    */\n    applyInner(tr) {\n        if (!tr.before.eq(this.doc))\n            throw new RangeError(\"Applying a mismatched transaction\");\n        let newInstance = new EditorState(this.config), fields = this.config.fields;\n        for (let i = 0; i < fields.length; i++) {\n            let field = fields[i];\n            newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n        }\n        return newInstance;\n    }\n    /**\n    Accessor that constructs and returns a new [transaction](https://prosemirror.net/docs/ref/#state.Transaction) from this state.\n    */\n    get tr() { return new Transaction(this); }\n    /**\n    Create a new state.\n    */\n    static create(config) {\n        let $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n        let instance = new EditorState($config);\n        for (let i = 0; i < $config.fields.length; i++)\n            instance[$config.fields[i].name] = $config.fields[i].init(config, instance);\n        return instance;\n    }\n    /**\n    Create a new state based on this one, but with an adjusted set\n    of active plugins. State fields that exist in both sets of\n    plugins are kept unchanged. Those that no longer exist are\n    dropped, and those that are new are initialized using their\n    [`init`](https://prosemirror.net/docs/ref/#state.StateField.init) method, passing in the new\n    configuration object..\n    */\n    reconfigure(config) {\n        let $config = new Configuration(this.schema, config.plugins);\n        let fields = $config.fields, instance = new EditorState($config);\n        for (let i = 0; i < fields.length; i++) {\n            let name = fields[i].name;\n            instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n        }\n        return instance;\n    }\n    /**\n    Serialize this state to JSON. If you want to serialize the state\n    of plugins, pass an object mapping property names to use in the\n    resulting JSON object to plugin objects. The argument may also be\n    a string or number, in which case it is ignored, to support the\n    way `JSON.stringify` calls `toString` methods.\n    */\n    toJSON(pluginFields) {\n        let result = { doc: this.doc.toJSON(), selection: this.selection.toJSON() };\n        if (this.storedMarks)\n            result.storedMarks = this.storedMarks.map(m => m.toJSON());\n        if (pluginFields && typeof pluginFields == 'object')\n            for (let prop in pluginFields) {\n                if (prop == \"doc\" || prop == \"selection\")\n                    throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\");\n                let plugin = pluginFields[prop], state = plugin.spec.state;\n                if (state && state.toJSON)\n                    result[prop] = state.toJSON.call(plugin, this[plugin.key]);\n            }\n        return result;\n    }\n    /**\n    Deserialize a JSON representation of a state. `config` should\n    have at least a `schema` field, and should contain array of\n    plugins to initialize the state with. `pluginFields` can be used\n    to deserialize the state of plugins, by associating plugin\n    instances with the property names they use in the JSON object.\n    */\n    static fromJSON(config, json, pluginFields) {\n        if (!json)\n            throw new RangeError(\"Invalid input for EditorState.fromJSON\");\n        if (!config.schema)\n            throw new RangeError(\"Required config field 'schema' missing\");\n        let $config = new Configuration(config.schema, config.plugins);\n        let instance = new EditorState($config);\n        $config.fields.forEach(field => {\n            if (field.name == \"doc\") {\n                instance.doc = Node.fromJSON(config.schema, json.doc);\n            }\n            else if (field.name == \"selection\") {\n                instance.selection = Selection.fromJSON(instance.doc, json.selection);\n            }\n            else if (field.name == \"storedMarks\") {\n                if (json.storedMarks)\n                    instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON);\n            }\n            else {\n                if (pluginFields)\n                    for (let prop in pluginFields) {\n                        let plugin = pluginFields[prop], state = plugin.spec.state;\n                        if (plugin.key == field.name && state && state.fromJSON &&\n                            Object.prototype.hasOwnProperty.call(json, prop)) {\n                            instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n                            return;\n                        }\n                    }\n                instance[field.name] = field.init(config, instance);\n            }\n        });\n        return instance;\n    }\n}\n\nfunction bindProps(obj, self, target) {\n    for (let prop in obj) {\n        let val = obj[prop];\n        if (val instanceof Function)\n            val = val.bind(self);\n        else if (prop == \"handleDOMEvents\")\n            val = bindProps(val, self, {});\n        target[prop] = val;\n    }\n    return target;\n}\n/**\nPlugins bundle functionality that can be added to an editor.\nThey are part of the [editor state](https://prosemirror.net/docs/ref/#state.EditorState) and\nmay influence that state and the view that contains it.\n*/\nclass Plugin {\n    /**\n    Create a plugin.\n    */\n    constructor(\n    /**\n    The plugin's [spec object](https://prosemirror.net/docs/ref/#state.PluginSpec).\n    */\n    spec) {\n        this.spec = spec;\n        /**\n        The [props](https://prosemirror.net/docs/ref/#view.EditorProps) exported by this plugin.\n        */\n        this.props = {};\n        if (spec.props)\n            bindProps(spec.props, this, this.props);\n        this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n    }\n    /**\n    Extract the plugin's state field from an editor state.\n    */\n    getState(state) { return state[this.key]; }\n}\nconst keys = Object.create(null);\nfunction createKey(name) {\n    if (name in keys)\n        return name + \"$\" + ++keys[name];\n    keys[name] = 0;\n    return name + \"$\";\n}\n/**\nA key is used to [tag](https://prosemirror.net/docs/ref/#state.PluginSpec.key) plugins in a way\nthat makes it possible to find them, given an editor state.\nAssigning a key does mean only one plugin of that type can be\nactive in a state.\n*/\nclass PluginKey {\n    /**\n    Create a plugin key.\n    */\n    constructor(name = \"key\") { this.key = createKey(name); }\n    /**\n    Get the active plugin with this key, if any, from an editor\n    state.\n    */\n    get(state) { return state.config.pluginsByKey[this.key]; }\n    /**\n    Get the plugin's state from an editor state.\n    */\n    getState(state) { return state[this.key]; }\n}\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n","import { liftTarget, replaceStep, ReplaceStep, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection, SelectionRange } from 'prosemirror-state';\n\n/**\nDelete the selection, if there is one.\n*/\nconst deleteSelection = (state, dispatch) => {\n    if (state.selection.empty)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.deleteSelection().scrollIntoView());\n    return true;\n};\nfunction atBlockStart(state, view) {\n    let { $cursor } = state.selection;\n    if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n        : $cursor.parentOffset > 0))\n        return null;\n    return $cursor;\n}\n/**\nIf the selection is empty and at the start of a textblock, try to\nreduce the distance between that block and the one before it—if\nthere's a block directly before it that can be joined, join them.\nIf not, try to move the selected block closer to the next one in\nthe document structure by lifting it out of its parent or moving it\ninto a parent of the previous block. Will use the view for accurate\n(bidi-aware) start-of-textblock detection if given.\n*/\nconst joinBackward = (state, dispatch, view) => {\n    let $cursor = atBlockStart(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutBefore($cursor);\n    // If there is no node before this, try to lift\n    if (!$cut) {\n        let range = $cursor.blockRange(), target = range && liftTarget(range);\n        if (target == null)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.lift(range, target).scrollIntoView());\n        return true;\n    }\n    let before = $cut.nodeBefore;\n    // Apply the joining algorithm\n    if (deleteBarrier(state, $cut, dispatch, -1))\n        return true;\n    // If the node below has no content and the node above is\n    // selectable, delete the node below and select the one above.\n    if ($cursor.parent.content.size == 0 &&\n        (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n        for (let depth = $cursor.depth;; depth--) {\n            let delStep = replaceStep(state.doc, $cursor.before(depth), $cursor.after(depth), Slice.empty);\n            if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n                if (dispatch) {\n                    let tr = state.tr.step(delStep);\n                    tr.setSelection(textblockAt(before, \"end\")\n                        ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n                        : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n                    dispatch(tr.scrollIntoView());\n                }\n                return true;\n            }\n            if (depth == 1 || $cursor.node(depth - 1).childCount > 1)\n                break;\n        }\n    }\n    // If the node before is an atom, delete it\n    if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n        if (dispatch)\n            dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView());\n        return true;\n    }\n    return false;\n};\n/**\nA more limited form of [`joinBackward`](https://prosemirror.net/docs/ref/#commands.joinBackward)\nthat only tries to join the current textblock to the one before\nit, if the cursor is at the start of a textblock.\n*/\nconst joinTextblockBackward = (state, dispatch, view) => {\n    let $cursor = atBlockStart(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutBefore($cursor);\n    return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\n/**\nA more limited form of [`joinForward`](https://prosemirror.net/docs/ref/#commands.joinForward)\nthat only tries to join the current textblock to the one after\nit, if the cursor is at the end of a textblock.\n*/\nconst joinTextblockForward = (state, dispatch, view) => {\n    let $cursor = atBlockEnd(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutAfter($cursor);\n    return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\nfunction joinTextblocksAround(state, $cut, dispatch) {\n    let before = $cut.nodeBefore, beforeText = before, beforePos = $cut.pos - 1;\n    for (; !beforeText.isTextblock; beforePos--) {\n        if (beforeText.type.spec.isolating)\n            return false;\n        let child = beforeText.lastChild;\n        if (!child)\n            return false;\n        beforeText = child;\n    }\n    let after = $cut.nodeAfter, afterText = after, afterPos = $cut.pos + 1;\n    for (; !afterText.isTextblock; afterPos++) {\n        if (afterText.type.spec.isolating)\n            return false;\n        let child = afterText.firstChild;\n        if (!child)\n            return false;\n        afterText = child;\n    }\n    let step = replaceStep(state.doc, beforePos, afterPos, Slice.empty);\n    if (!step || step.from != beforePos ||\n        step instanceof ReplaceStep && step.slice.size >= afterPos - beforePos)\n        return false;\n    if (dispatch) {\n        let tr = state.tr.step(step);\n        tr.setSelection(TextSelection.create(tr.doc, beforePos));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n}\nfunction textblockAt(node, side, only = false) {\n    for (let scan = node; scan; scan = (side == \"start\" ? scan.firstChild : scan.lastChild)) {\n        if (scan.isTextblock)\n            return true;\n        if (only && scan.childCount != 1)\n            return false;\n    }\n    return false;\n}\n/**\nWhen the selection is empty and at the start of a textblock, select\nthe node before that textblock, if possible. This is intended to be\nbound to keys like backspace, after\n[`joinBackward`](https://prosemirror.net/docs/ref/#commands.joinBackward) or other deleting\ncommands, as a fall-back behavior when the schema doesn't allow\ndeletion at the selected point.\n*/\nconst selectNodeBackward = (state, dispatch, view) => {\n    let { $head, empty } = state.selection, $cut = $head;\n    if (!empty)\n        return false;\n    if ($head.parent.isTextblock) {\n        if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0)\n            return false;\n        $cut = findCutBefore($head);\n    }\n    let node = $cut && $cut.nodeBefore;\n    if (!node || !NodeSelection.isSelectable(node))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView());\n    return true;\n};\nfunction findCutBefore($pos) {\n    if (!$pos.parent.type.spec.isolating)\n        for (let i = $pos.depth - 1; i >= 0; i--) {\n            if ($pos.index(i) > 0)\n                return $pos.doc.resolve($pos.before(i + 1));\n            if ($pos.node(i).type.spec.isolating)\n                break;\n        }\n    return null;\n}\nfunction atBlockEnd(state, view) {\n    let { $cursor } = state.selection;\n    if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n        : $cursor.parentOffset < $cursor.parent.content.size))\n        return null;\n    return $cursor;\n}\n/**\nIf the selection is empty and the cursor is at the end of a\ntextblock, try to reduce or remove the boundary between that block\nand the one after it, either by joining them or by moving the other\nblock closer to this one in the tree structure. Will use the view\nfor accurate start-of-textblock detection if given.\n*/\nconst joinForward = (state, dispatch, view) => {\n    let $cursor = atBlockEnd(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutAfter($cursor);\n    // If there is no node after this, there's nothing to do\n    if (!$cut)\n        return false;\n    let after = $cut.nodeAfter;\n    // Try the joining algorithm\n    if (deleteBarrier(state, $cut, dispatch, 1))\n        return true;\n    // If the node above has no content and the node below is\n    // selectable, delete the node above and select the one below.\n    if ($cursor.parent.content.size == 0 &&\n        (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n        let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n        if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n            if (dispatch) {\n                let tr = state.tr.step(delStep);\n                tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n                    : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n    }\n    // If the next node is an atom, delete it\n    if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n        if (dispatch)\n            dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView());\n        return true;\n    }\n    return false;\n};\n/**\nWhen the selection is empty and at the end of a textblock, select\nthe node coming after that textblock, if possible. This is intended\nto be bound to keys like delete, after\n[`joinForward`](https://prosemirror.net/docs/ref/#commands.joinForward) and similar deleting\ncommands, to provide a fall-back behavior when the schema doesn't\nallow deletion at the selected point.\n*/\nconst selectNodeForward = (state, dispatch, view) => {\n    let { $head, empty } = state.selection, $cut = $head;\n    if (!empty)\n        return false;\n    if ($head.parent.isTextblock) {\n        if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n            return false;\n        $cut = findCutAfter($head);\n    }\n    let node = $cut && $cut.nodeAfter;\n    if (!node || !NodeSelection.isSelectable(node))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView());\n    return true;\n};\nfunction findCutAfter($pos) {\n    if (!$pos.parent.type.spec.isolating)\n        for (let i = $pos.depth - 1; i >= 0; i--) {\n            let parent = $pos.node(i);\n            if ($pos.index(i) + 1 < parent.childCount)\n                return $pos.doc.resolve($pos.after(i + 1));\n            if (parent.type.spec.isolating)\n                break;\n        }\n    return null;\n}\n/**\nJoin the selected block or, if there is a text selection, the\nclosest ancestor block of the selection that can be joined, with\nthe sibling above it.\n*/\nconst joinUp = (state, dispatch) => {\n    let sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n    if (nodeSel) {\n        if (sel.node.isTextblock || !canJoin(state.doc, sel.from))\n            return false;\n        point = sel.from;\n    }\n    else {\n        point = joinPoint(state.doc, sel.from, -1);\n        if (point == null)\n            return false;\n    }\n    if (dispatch) {\n        let tr = state.tr.join(point);\n        if (nodeSel)\n            tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nJoin the selected block, or the closest ancestor of the selection\nthat can be joined, with the sibling after it.\n*/\nconst joinDown = (state, dispatch) => {\n    let sel = state.selection, point;\n    if (sel instanceof NodeSelection) {\n        if (sel.node.isTextblock || !canJoin(state.doc, sel.to))\n            return false;\n        point = sel.to;\n    }\n    else {\n        point = joinPoint(state.doc, sel.to, 1);\n        if (point == null)\n            return false;\n    }\n    if (dispatch)\n        dispatch(state.tr.join(point).scrollIntoView());\n    return true;\n};\n/**\nLift the selected block, or the closest ancestor block of the\nselection that can be lifted, out of its parent node.\n*/\nconst lift = (state, dispatch) => {\n    let { $from, $to } = state.selection;\n    let range = $from.blockRange($to), target = range && liftTarget(range);\n    if (target == null)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.lift(range, target).scrollIntoView());\n    return true;\n};\n/**\nIf the selection is in a node whose type has a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, replace the\nselection with a newline character.\n*/\nconst newlineInCode = (state, dispatch) => {\n    let { $head, $anchor } = state.selection;\n    if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.insertText(\"\\n\").scrollIntoView());\n    return true;\n};\nfunction defaultBlockAt(match) {\n    for (let i = 0; i < match.edgeCount; i++) {\n        let { type } = match.edge(i);\n        if (type.isTextblock && !type.hasRequiredAttrs())\n            return type;\n    }\n    return null;\n}\n/**\nWhen the selection is in a node with a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, create a\ndefault block after the code block, and move the cursor there.\n*/\nconst exitCode = (state, dispatch) => {\n    let { $head, $anchor } = state.selection;\n    if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n        return false;\n    let above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n    if (!type || !above.canReplaceWith(after, after, type))\n        return false;\n    if (dispatch) {\n        let pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n        tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nIf a block node is selected, create an empty paragraph before (if\nit is its parent's first child) or after it.\n*/\nconst createParagraphNear = (state, dispatch) => {\n    let sel = state.selection, { $from, $to } = sel;\n    if (sel instanceof AllSelection || $from.parent.inlineContent || $to.parent.inlineContent)\n        return false;\n    let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter()));\n    if (!type || !type.isTextblock)\n        return false;\n    if (dispatch) {\n        let side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n        let tr = state.tr.insert(side, type.createAndFill());\n        tr.setSelection(TextSelection.create(tr.doc, side + 1));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nIf the cursor is in an empty textblock that can be lifted, lift the\nblock.\n*/\nconst liftEmptyBlock = (state, dispatch) => {\n    let { $cursor } = state.selection;\n    if (!$cursor || $cursor.parent.content.size)\n        return false;\n    if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n        let before = $cursor.before();\n        if (canSplit(state.doc, before)) {\n            if (dispatch)\n                dispatch(state.tr.split(before).scrollIntoView());\n            return true;\n        }\n    }\n    let range = $cursor.blockRange(), target = range && liftTarget(range);\n    if (target == null)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.lift(range, target).scrollIntoView());\n    return true;\n};\n/**\nCreate a variant of [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock) that uses\na custom function to determine the type of the newly split off block.\n*/\nfunction splitBlockAs(splitNode) {\n    return (state, dispatch) => {\n        if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n            let { $from } = state.selection;\n            if (!$from.parentOffset || !canSplit(state.doc, $from.pos))\n                return false;\n            if (dispatch)\n                dispatch(state.tr.split($from.pos).scrollIntoView());\n            return true;\n        }\n        if (!state.selection.$from.depth)\n            return false;\n        let tr = state.tr;\n        if (!state.selection.empty && (state.selection instanceof TextSelection || state.selection instanceof AllSelection))\n            tr.deleteSelection();\n        let { $from } = tr.selection, mapFrom = tr.steps.length;\n        let types = [];\n        let splitDepth, deflt, atEnd = false, atStart = false;\n        for (let d = $from.depth;; d--) {\n            let node = $from.node(d);\n            if (node.isBlock) {\n                atEnd = $from.end(d) == $from.pos + ($from.depth - d);\n                atStart = $from.start(d) == $from.pos - ($from.depth - d);\n                deflt = defaultBlockAt($from.node(d - 1).contentMatchAt($from.indexAfter(d - 1)));\n                let splitType = splitNode && splitNode($from.parent, atEnd, $from);\n                types.unshift(splitType || (atEnd && deflt ? { type: deflt } : null));\n                splitDepth = d;\n                break;\n            }\n            else {\n                if (d == 1)\n                    return false;\n                types.unshift(null);\n            }\n        }\n        let splitPos = $from.pos;\n        let can = canSplit(tr.doc, splitPos, types.length, types);\n        if (!can) {\n            types[0] = deflt ? { type: deflt } : null;\n            can = canSplit(tr.doc, splitPos, types.length, types);\n        }\n        if (!can)\n            return false;\n        tr.split(splitPos, types.length, types);\n        if (!atEnd && atStart && $from.node(splitDepth).type != deflt) {\n            let mapping = tr.mapping.slice(mapFrom);\n            let first = mapping.map($from.before(splitDepth)), $first = tr.doc.resolve(first);\n            if (deflt && $from.node(splitDepth - 1).canReplaceWith($first.index(), $first.index() + 1, deflt))\n                tr.setNodeMarkup(mapping.map($from.before(splitDepth)), deflt);\n        }\n        if (dispatch)\n            dispatch(tr.scrollIntoView());\n        return true;\n    };\n}\n/**\nSplit the parent block of the selection. If the selection is a text\nselection, also delete its content.\n*/\nconst splitBlock = splitBlockAs();\n/**\nActs like [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock), but without\nresetting the set of active marks at the cursor.\n*/\nconst splitBlockKeepMarks = (state, dispatch) => {\n    return splitBlock(state, dispatch && (tr => {\n        let marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n        if (marks)\n            tr.ensureMarks(marks);\n        dispatch(tr);\n    }));\n};\n/**\nMove the selection to the node wrapping the current selection, if\nany. (Will not select the document node.)\n*/\nconst selectParentNode = (state, dispatch) => {\n    let { $from, to } = state.selection, pos;\n    let same = $from.sharedDepth(to);\n    if (same == 0)\n        return false;\n    pos = $from.before(same);\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos)));\n    return true;\n};\n/**\nSelect the whole document.\n*/\nconst selectAll = (state, dispatch) => {\n    if (dispatch)\n        dispatch(state.tr.setSelection(new AllSelection(state.doc)));\n    return true;\n};\nfunction joinMaybeClear(state, $pos, dispatch) {\n    let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n    if (!before || !after || !before.type.compatibleContent(after.type))\n        return false;\n    if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n        if (dispatch)\n            dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView());\n        return true;\n    }\n    if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.join($pos.pos).scrollIntoView());\n    return true;\n}\nfunction deleteBarrier(state, $cut, dispatch, dir) {\n    let before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n    let isolated = before.type.spec.isolating || after.type.spec.isolating;\n    if (!isolated && joinMaybeClear(state, $cut, dispatch))\n        return true;\n    let canDelAfter = !isolated && $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n    if (canDelAfter &&\n        (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n        match.matchType(conn[0] || after.type).validEnd) {\n        if (dispatch) {\n            let end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n            for (let i = conn.length - 1; i >= 0; i--)\n                wrap = Fragment.from(conn[i].create(null, wrap));\n            wrap = Fragment.from(before.copy(wrap));\n            let tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n            let $joinAt = tr.doc.resolve(end + 2 * conn.length);\n            if ($joinAt.nodeAfter && $joinAt.nodeAfter.type == before.type &&\n                canJoin(tr.doc, $joinAt.pos))\n                tr.join($joinAt.pos);\n            dispatch(tr.scrollIntoView());\n        }\n        return true;\n    }\n    let selAfter = after.type.spec.isolating || (dir > 0 && isolated) ? null : Selection.findFrom($cut, 1);\n    let range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n    if (target != null && target >= $cut.depth) {\n        if (dispatch)\n            dispatch(state.tr.lift(range, target).scrollIntoView());\n        return true;\n    }\n    if (canDelAfter && textblockAt(after, \"start\", true) && textblockAt(before, \"end\")) {\n        let at = before, wrap = [];\n        for (;;) {\n            wrap.push(at);\n            if (at.isTextblock)\n                break;\n            at = at.lastChild;\n        }\n        let afterText = after, afterDepth = 1;\n        for (; !afterText.isTextblock; afterText = afterText.firstChild)\n            afterDepth++;\n        if (at.canReplace(at.childCount, at.childCount, afterText.content)) {\n            if (dispatch) {\n                let end = Fragment.empty;\n                for (let i = wrap.length - 1; i >= 0; i--)\n                    end = Fragment.from(wrap[i].copy(end));\n                let tr = state.tr.step(new ReplaceAroundStep($cut.pos - wrap.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new Slice(end, wrap.length, 0), 0, true));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n    }\n    return false;\n}\nfunction selectTextblockSide(side) {\n    return function (state, dispatch) {\n        let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to;\n        let depth = $pos.depth;\n        while ($pos.node(depth).isInline) {\n            if (!depth)\n                return false;\n            depth--;\n        }\n        if (!$pos.node(depth).isTextblock)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.setSelection(TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth))));\n        return true;\n    };\n}\n/**\nMoves the cursor to the start of current text block.\n*/\nconst selectTextblockStart = selectTextblockSide(-1);\n/**\nMoves the cursor to the end of current text block.\n*/\nconst selectTextblockEnd = selectTextblockSide(1);\n// Parameterized commands\n/**\nWrap the selection in a node of the given type with the given\nattributes.\n*/\nfunction wrapIn(nodeType, attrs = null) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n        if (!wrapping)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.wrap(range, wrapping).scrollIntoView());\n        return true;\n    };\n}\n/**\nReturns a command that tries to set the selected textblocks to the\ngiven node type with the given attributes.\n*/\nfunction setBlockType(nodeType, attrs = null) {\n    return function (state, dispatch) {\n        let applicable = false;\n        for (let i = 0; i < state.selection.ranges.length && !applicable; i++) {\n            let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n            state.doc.nodesBetween(from, to, (node, pos) => {\n                if (applicable)\n                    return false;\n                if (!node.isTextblock || node.hasMarkup(nodeType, attrs))\n                    return;\n                if (node.type == nodeType) {\n                    applicable = true;\n                }\n                else {\n                    let $pos = state.doc.resolve(pos), index = $pos.index();\n                    applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n                }\n            });\n        }\n        if (!applicable)\n            return false;\n        if (dispatch) {\n            let tr = state.tr;\n            for (let i = 0; i < state.selection.ranges.length; i++) {\n                let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n                tr.setBlockType(from, to, nodeType, attrs);\n            }\n            dispatch(tr.scrollIntoView());\n        }\n        return true;\n    };\n}\nfunction markApplies(doc, ranges, type, enterAtoms) {\n    for (let i = 0; i < ranges.length; i++) {\n        let { $from, $to } = ranges[i];\n        let can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) : false;\n        doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n            if (can || !enterAtoms && node.isAtom && node.isInline && pos >= $from.pos && pos + node.nodeSize <= $to.pos)\n                return false;\n            can = node.inlineContent && node.type.allowsMarkType(type);\n        });\n        if (can)\n            return true;\n    }\n    return false;\n}\nfunction removeInlineAtoms(ranges) {\n    let result = [];\n    for (let i = 0; i < ranges.length; i++) {\n        let { $from, $to } = ranges[i];\n        $from.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n            if (node.isAtom && node.content.size && node.isInline && pos >= $from.pos && pos + node.nodeSize <= $to.pos) {\n                if (pos + 1 > $from.pos)\n                    result.push(new SelectionRange($from, $from.doc.resolve(pos + 1)));\n                $from = $from.doc.resolve(pos + 1 + node.content.size);\n                return false;\n            }\n        });\n        if ($from.pos < $to.pos)\n            result.push(new SelectionRange($from, $to));\n    }\n    return result;\n}\n/**\nCreate a command function that toggles the given mark with the\ngiven attributes. Will return `false` when the current selection\ndoesn't support that mark. This will remove the mark if any marks\nof that type exist in the selection, or add it otherwise. If the\nselection is empty, this applies to the [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks) instead of a range of the\ndocument.\n*/\nfunction toggleMark(markType, attrs = null, options) {\n    let removeWhenPresent = (options && options.removeWhenPresent) !== false;\n    let enterAtoms = (options && options.enterInlineAtoms) !== false;\n    let dropSpace = !(options && options.includeWhitespace);\n    return function (state, dispatch) {\n        let { empty, $cursor, ranges } = state.selection;\n        if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType, enterAtoms))\n            return false;\n        if (dispatch) {\n            if ($cursor) {\n                if (markType.isInSet(state.storedMarks || $cursor.marks()))\n                    dispatch(state.tr.removeStoredMark(markType));\n                else\n                    dispatch(state.tr.addStoredMark(markType.create(attrs)));\n            }\n            else {\n                let add, tr = state.tr;\n                if (!enterAtoms)\n                    ranges = removeInlineAtoms(ranges);\n                if (removeWhenPresent) {\n                    add = !ranges.some(r => state.doc.rangeHasMark(r.$from.pos, r.$to.pos, markType));\n                }\n                else {\n                    add = !ranges.every(r => {\n                        let missing = false;\n                        tr.doc.nodesBetween(r.$from.pos, r.$to.pos, (node, pos, parent) => {\n                            if (missing)\n                                return false;\n                            missing = !markType.isInSet(node.marks) && !!parent && parent.type.allowsMarkType(markType) &&\n                                !(node.isText && /^\\s*$/.test(node.textBetween(Math.max(0, r.$from.pos - pos), Math.min(node.nodeSize, r.$to.pos - pos))));\n                        });\n                        return !missing;\n                    });\n                }\n                for (let i = 0; i < ranges.length; i++) {\n                    let { $from, $to } = ranges[i];\n                    if (!add) {\n                        tr.removeMark($from.pos, $to.pos, markType);\n                    }\n                    else {\n                        let from = $from.pos, to = $to.pos, start = $from.nodeAfter, end = $to.nodeBefore;\n                        let spaceStart = dropSpace && start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n                        let spaceEnd = dropSpace && end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n                        if (from + spaceStart < to) {\n                            from += spaceStart;\n                            to -= spaceEnd;\n                        }\n                        tr.addMark(from, to, markType.create(attrs));\n                    }\n                }\n                dispatch(tr.scrollIntoView());\n            }\n        }\n        return true;\n    };\n}\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n    return (tr) => {\n        if (!tr.isGeneric)\n            return dispatch(tr);\n        let ranges = [];\n        for (let i = 0; i < tr.mapping.maps.length; i++) {\n            let map = tr.mapping.maps[i];\n            for (let j = 0; j < ranges.length; j++)\n                ranges[j] = map.map(ranges[j]);\n            map.forEach((_s, _e, from, to) => ranges.push(from, to));\n        }\n        // Figure out which joinable points exist inside those ranges,\n        // by checking all node boundaries in their parent nodes.\n        let joinable = [];\n        for (let i = 0; i < ranges.length; i += 2) {\n            let from = ranges[i], to = ranges[i + 1];\n            let $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n            for (let index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n                let after = parent.maybeChild(index);\n                if (!after)\n                    break;\n                if (index && joinable.indexOf(pos) == -1) {\n                    let before = parent.child(index - 1);\n                    if (before.type == after.type && isJoinable(before, after))\n                        joinable.push(pos);\n                }\n                pos += after.nodeSize;\n            }\n        }\n        // Join the joinable points\n        joinable.sort((a, b) => a - b);\n        for (let i = joinable.length - 1; i >= 0; i--) {\n            if (canJoin(tr.doc, joinable[i]))\n                tr.join(joinable[i]);\n        }\n        dispatch(tr);\n    };\n}\n/**\nWrap a command so that, when it produces a transform that causes\ntwo joinable nodes to end up next to each other, those are joined.\nNodes are considered joinable when they are of the same type and\nwhen the `isJoinable` predicate returns true for them or, if an\narray of strings was passed, if their node type name is in that\narray.\n*/\nfunction autoJoin(command, isJoinable) {\n    let canJoin = Array.isArray(isJoinable) ? (node) => isJoinable.indexOf(node.type.name) > -1\n        : isJoinable;\n    return (state, dispatch, view) => command(state, dispatch && wrapDispatchForJoin(dispatch, canJoin), view);\n}\n/**\nCombine a number of command functions into a single function (which\ncalls them one by one until one returns true).\n*/\nfunction chainCommands(...commands) {\n    return function (state, dispatch, view) {\n        for (let i = 0; i < commands.length; i++)\n            if (commands[i](state, dispatch, view))\n                return true;\n        return false;\n    };\n}\nlet backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nlet del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n/**\nA basic keymap containing bindings not specific to any schema.\nBinds the following keys (when multiple commands are listed, they\nare chained with [`chainCommands`](https://prosemirror.net/docs/ref/#commands.chainCommands)):\n\n* **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n* **Mod-Enter** to `exitCode`\n* **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n* **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-a** to `selectAll`\n*/\nconst pcBaseKeymap = {\n    \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n    \"Mod-Enter\": exitCode,\n    \"Backspace\": backspace,\n    \"Mod-Backspace\": backspace,\n    \"Shift-Backspace\": backspace,\n    \"Delete\": del,\n    \"Mod-Delete\": del,\n    \"Mod-a\": selectAll\n};\n/**\nA copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n**Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n**Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\nCtrl-Delete.\n*/\nconst macBaseKeymap = {\n    \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n    \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n    \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n    \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Ctrl-a\": selectTextblockStart,\n    \"Ctrl-e\": selectTextblockEnd\n};\nfor (let key in pcBaseKeymap)\n    macBaseKeymap[key] = pcBaseKeymap[key];\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform)\n    // @ts-ignore\n    : typeof os != \"undefined\" && os.platform ? os.platform() == \"darwin\" : false;\n/**\nDepending on the detected platform, this will hold\n[`pcBasekeymap`](https://prosemirror.net/docs/ref/#commands.pcBaseKeymap) or\n[`macBaseKeymap`](https://prosemirror.net/docs/ref/#commands.macBaseKeymap).\n*/\nconst baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinTextblockBackward, joinTextblockForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, selectTextblockEnd, selectTextblockStart, setBlockType, splitBlock, splitBlockAs, splitBlockKeepMarks, toggleMark, wrapIn };\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class<T> A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n  if (!other.length) { return this }\n  other = RopeSequence.from(other);\n\n  return (!this.length && other) ||\n    (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n    (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n    this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n  if (!other.length) { return this }\n  return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n  return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence<T>\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  if (from >= to) { return RopeSequence.empty }\n  return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n  if (i < 0 || i >= this.length) { return undefined }\n  return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  if (from <= to)\n    { this.forEachInner(f, from, to, 0); }\n  else\n    { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  var result = [];\n  this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n  return result\n};\n\n// :: (?union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n  if (values instanceof RopeSequence) { return values }\n  return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n  function Leaf(values) {\n    RopeSequence.call(this);\n    this.values = values;\n  }\n\n  if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n  Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n  Leaf.prototype.constructor = Leaf;\n\n  var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n  Leaf.prototype.flatten = function flatten () {\n    return this.values\n  };\n\n  Leaf.prototype.sliceInner = function sliceInner (from, to) {\n    if (from == 0 && to == this.length) { return this }\n    return new Leaf(this.values.slice(from, to))\n  };\n\n  Leaf.prototype.getInner = function getInner (i) {\n    return this.values[i]\n  };\n\n  Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n    for (var i = from; i < to; i++)\n      { if (f(this.values[i], start + i) === false) { return false } }\n  };\n\n  Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n    for (var i = from - 1; i >= to; i--)\n      { if (f(this.values[i], start + i) === false) { return false } }\n  };\n\n  Leaf.prototype.leafAppend = function leafAppend (other) {\n    if (this.length + other.length <= GOOD_LEAF_SIZE)\n      { return new Leaf(this.values.concat(other.flatten())) }\n  };\n\n  Leaf.prototype.leafPrepend = function leafPrepend (other) {\n    if (this.length + other.length <= GOOD_LEAF_SIZE)\n      { return new Leaf(other.flatten().concat(this.values)) }\n  };\n\n  prototypeAccessors.length.get = function () { return this.values.length };\n\n  prototypeAccessors.depth.get = function () { return 0 };\n\n  Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n  return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n  function Append(left, right) {\n    RopeSequence.call(this);\n    this.left = left;\n    this.right = right;\n    this.length = left.length + right.length;\n    this.depth = Math.max(left.depth, right.depth) + 1;\n  }\n\n  if ( RopeSequence ) Append.__proto__ = RopeSequence;\n  Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n  Append.prototype.constructor = Append;\n\n  Append.prototype.flatten = function flatten () {\n    return this.left.flatten().concat(this.right.flatten())\n  };\n\n  Append.prototype.getInner = function getInner (i) {\n    return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n  };\n\n  Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n    var leftLen = this.left.length;\n    if (from < leftLen &&\n        this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n      { return false }\n    if (to > leftLen &&\n        this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n      { return false }\n  };\n\n  Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n    var leftLen = this.left.length;\n    if (from > leftLen &&\n        this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n      { return false }\n    if (to < leftLen &&\n        this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n      { return false }\n  };\n\n  Append.prototype.sliceInner = function sliceInner (from, to) {\n    if (from == 0 && to == this.length) { return this }\n    var leftLen = this.left.length;\n    if (to <= leftLen) { return this.left.slice(from, to) }\n    if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n    return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n  };\n\n  Append.prototype.leafAppend = function leafAppend (other) {\n    var inner = this.right.leafAppend(other);\n    if (inner) { return new Append(this.left, inner) }\n  };\n\n  Append.prototype.leafPrepend = function leafPrepend (other) {\n    var inner = this.left.leafPrepend(other);\n    if (inner) { return new Append(inner, this.right) }\n  };\n\n  Append.prototype.appendInner = function appendInner (other) {\n    if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n      { return new Append(this.left, new Append(this.right, other)) }\n    return new Append(this, other)\n  };\n\n  return Append;\n}(RopeSequence));\n\nexport default RopeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n// Used to schedule history compression\nconst max_empty_items = 500;\nclass Branch {\n    constructor(items, eventCount) {\n        this.items = items;\n        this.eventCount = eventCount;\n    }\n    // Pop the latest event off the branch's history and apply it\n    // to a document transform.\n    popEvent(state, preserveItems) {\n        if (this.eventCount == 0)\n            return null;\n        let end = this.items.length;\n        for (;; end--) {\n            let next = this.items.get(end - 1);\n            if (next.selection) {\n                --end;\n                break;\n            }\n        }\n        let remap, mapFrom;\n        if (preserveItems) {\n            remap = this.remapping(end, this.items.length);\n            mapFrom = remap.maps.length;\n        }\n        let transform = state.tr;\n        let selection, remaining;\n        let addAfter = [], addBefore = [];\n        this.items.forEach((item, i) => {\n            if (!item.step) {\n                if (!remap) {\n                    remap = this.remapping(end, i + 1);\n                    mapFrom = remap.maps.length;\n                }\n                mapFrom--;\n                addBefore.push(item);\n                return;\n            }\n            if (remap) {\n                addBefore.push(new Item(item.map));\n                let step = item.step.map(remap.slice(mapFrom)), map;\n                if (step && transform.maybeStep(step).doc) {\n                    map = transform.mapping.maps[transform.mapping.maps.length - 1];\n                    addAfter.push(new Item(map, undefined, undefined, addAfter.length + addBefore.length));\n                }\n                mapFrom--;\n                if (map)\n                    remap.appendMap(map, mapFrom);\n            }\n            else {\n                transform.maybeStep(item.step);\n            }\n            if (item.selection) {\n                selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n                remaining = new Branch(this.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1);\n                return false;\n            }\n        }, this.items.length, 0);\n        return { remaining: remaining, transform, selection: selection };\n    }\n    // Create a new branch with the given transform added.\n    addTransform(transform, selection, histOptions, preserveItems) {\n        let newItems = [], eventCount = this.eventCount;\n        let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n        for (let i = 0; i < transform.steps.length; i++) {\n            let step = transform.steps[i].invert(transform.docs[i]);\n            let item = new Item(transform.mapping.maps[i], step, selection), merged;\n            if (merged = lastItem && lastItem.merge(item)) {\n                item = merged;\n                if (i)\n                    newItems.pop();\n                else\n                    oldItems = oldItems.slice(0, oldItems.length - 1);\n            }\n            newItems.push(item);\n            if (selection) {\n                eventCount++;\n                selection = undefined;\n            }\n            if (!preserveItems)\n                lastItem = item;\n        }\n        let overflow = eventCount - histOptions.depth;\n        if (overflow > DEPTH_OVERFLOW) {\n            oldItems = cutOffEvents(oldItems, overflow);\n            eventCount -= overflow;\n        }\n        return new Branch(oldItems.append(newItems), eventCount);\n    }\n    remapping(from, to) {\n        let maps = new Mapping;\n        this.items.forEach((item, i) => {\n            let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n                ? maps.maps.length - item.mirrorOffset : undefined;\n            maps.appendMap(item.map, mirrorPos);\n        }, from, to);\n        return maps;\n    }\n    addMaps(array) {\n        if (this.eventCount == 0)\n            return this;\n        return new Branch(this.items.append(array.map(map => new Item(map))), this.eventCount);\n    }\n    // When the collab module receives remote changes, the history has\n    // to know about those, so that it can adjust the steps that were\n    // rebased on top of the remote changes, and include the position\n    // maps for the remote changes in its array of items.\n    rebased(rebasedTransform, rebasedCount) {\n        if (!this.eventCount)\n            return this;\n        let rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n        let mapping = rebasedTransform.mapping;\n        let newUntil = rebasedTransform.steps.length;\n        let eventCount = this.eventCount;\n        this.items.forEach(item => { if (item.selection)\n            eventCount--; }, start);\n        let iRebased = rebasedCount;\n        this.items.forEach(item => {\n            let pos = mapping.getMirror(--iRebased);\n            if (pos == null)\n                return;\n            newUntil = Math.min(newUntil, pos);\n            let map = mapping.maps[pos];\n            if (item.step) {\n                let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n                let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n                if (selection)\n                    eventCount++;\n                rebasedItems.push(new Item(map, step, selection));\n            }\n            else {\n                rebasedItems.push(new Item(map));\n            }\n        }, start);\n        let newMaps = [];\n        for (let i = rebasedCount; i < newUntil; i++)\n            newMaps.push(new Item(mapping.maps[i]));\n        let items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n        let branch = new Branch(items, eventCount);\n        if (branch.emptyItemCount() > max_empty_items)\n            branch = branch.compress(this.items.length - rebasedItems.length);\n        return branch;\n    }\n    emptyItemCount() {\n        let count = 0;\n        this.items.forEach(item => { if (!item.step)\n            count++; });\n        return count;\n    }\n    // Compressing a branch means rewriting it to push the air (map-only\n    // items) out. During collaboration, these naturally accumulate\n    // because each remote change adds one. The `upto` argument is used\n    // to ensure that only the items below a given level are compressed,\n    // because `rebased` relies on a clean, untouched set of items in\n    // order to associate old items with rebased steps.\n    compress(upto = this.items.length) {\n        let remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n        let items = [], events = 0;\n        this.items.forEach((item, i) => {\n            if (i >= upto) {\n                items.push(item);\n                if (item.selection)\n                    events++;\n            }\n            else if (item.step) {\n                let step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n                mapFrom--;\n                if (map)\n                    remap.appendMap(map, mapFrom);\n                if (step) {\n                    let selection = item.selection && item.selection.map(remap.slice(mapFrom));\n                    if (selection)\n                        events++;\n                    let newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n                    if (merged = items.length && items[last].merge(newItem))\n                        items[last] = merged;\n                    else\n                        items.push(newItem);\n                }\n            }\n            else if (item.map) {\n                mapFrom--;\n            }\n        }, this.items.length, 0);\n        return new Branch(RopeSequence.from(items.reverse()), events);\n    }\n}\nBranch.empty = new Branch(RopeSequence.empty, 0);\nfunction cutOffEvents(items, n) {\n    let cutPoint;\n    items.forEach((item, i) => {\n        if (item.selection && (n-- == 0)) {\n            cutPoint = i;\n            return false;\n        }\n    });\n    return items.slice(cutPoint);\n}\nclass Item {\n    constructor(\n    // The (forward) step map for this item.\n    map, \n    // The inverted step\n    step, \n    // If this is non-null, this item is the start of a group, and\n    // this selection is the starting selection for the group (the one\n    // that was active before the first step was applied)\n    selection, \n    // If this item is the inverse of a previous mapping on the stack,\n    // this points at the inverse's offset\n    mirrorOffset) {\n        this.map = map;\n        this.step = step;\n        this.selection = selection;\n        this.mirrorOffset = mirrorOffset;\n    }\n    merge(other) {\n        if (this.step && other.step && !other.selection) {\n            let step = other.step.merge(this.step);\n            if (step)\n                return new Item(step.getMap().invert(), step, this.selection);\n        }\n    }\n}\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nclass HistoryState {\n    constructor(done, undone, prevRanges, prevTime, prevComposition) {\n        this.done = done;\n        this.undone = undone;\n        this.prevRanges = prevRanges;\n        this.prevTime = prevTime;\n        this.prevComposition = prevComposition;\n    }\n}\nconst DEPTH_OVERFLOW = 20;\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n    let historyTr = tr.getMeta(historyKey), rebased;\n    if (historyTr)\n        return historyTr.historyState;\n    if (tr.getMeta(closeHistoryKey))\n        history = new HistoryState(history.done, history.undone, null, 0, -1);\n    let appended = tr.getMeta(\"appendedTransaction\");\n    if (tr.steps.length == 0) {\n        return history;\n    }\n    else if (appended && appended.getMeta(historyKey)) {\n        if (appended.getMeta(historyKey).redo)\n            return new HistoryState(history.done.addTransform(tr, undefined, options, mustPreserveItems(state)), history.undone, rangesFor(tr.mapping.maps), history.prevTime, history.prevComposition);\n        else\n            return new HistoryState(history.done, history.undone.addTransform(tr, undefined, options, mustPreserveItems(state)), null, history.prevTime, history.prevComposition);\n    }\n    else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n        // Group transforms that occur in quick succession into one event.\n        let composition = tr.getMeta(\"composition\");\n        let newGroup = history.prevTime == 0 ||\n            (!appended && history.prevComposition != composition &&\n                (history.prevTime < (tr.time || 0) - options.newGroupDelay || !isAdjacentTo(tr, history.prevRanges)));\n        let prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps);\n        return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : undefined, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr.time, composition == null ? history.prevComposition : composition);\n    }\n    else if (rebased = tr.getMeta(\"rebased\")) {\n        // Used by the collab module to tell the history that some of its\n        // content has been rebased.\n        return new HistoryState(history.done.rebased(tr, rebased), history.undone.rebased(tr, rebased), mapRanges(history.prevRanges, tr.mapping), history.prevTime, history.prevComposition);\n    }\n    else {\n        return new HistoryState(history.done.addMaps(tr.mapping.maps), history.undone.addMaps(tr.mapping.maps), mapRanges(history.prevRanges, tr.mapping), history.prevTime, history.prevComposition);\n    }\n}\nfunction isAdjacentTo(transform, prevRanges) {\n    if (!prevRanges)\n        return false;\n    if (!transform.docChanged)\n        return true;\n    let adjacent = false;\n    transform.mapping.maps[0].forEach((start, end) => {\n        for (let i = 0; i < prevRanges.length; i += 2)\n            if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n                adjacent = true;\n    });\n    return adjacent;\n}\nfunction rangesFor(maps) {\n    let result = [];\n    for (let i = maps.length - 1; i >= 0 && result.length == 0; i--)\n        maps[i].forEach((_from, _to, from, to) => result.push(from, to));\n    return result;\n}\nfunction mapRanges(ranges, mapping) {\n    if (!ranges)\n        return null;\n    let result = [];\n    for (let i = 0; i < ranges.length; i += 2) {\n        let from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n        if (from <= to)\n            result.push(from, to);\n    }\n    return result;\n}\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, redo) {\n    let preserveItems = mustPreserveItems(state);\n    let histOptions = historyKey.get(state).spec.config;\n    let pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n    if (!pop)\n        return null;\n    let selection = pop.selection.resolve(pop.transform.doc);\n    let added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems);\n    let newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0, -1);\n    return pop.transform.setSelection(selection).setMeta(historyKey, { redo, historyState: newHist });\n}\nlet cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n    let plugins = state.plugins;\n    if (cachedPreserveItemsPlugins != plugins) {\n        cachedPreserveItems = false;\n        cachedPreserveItemsPlugins = plugins;\n        for (let i = 0; i < plugins.length; i++)\n            if (plugins[i].spec.historyPreserveItems) {\n                cachedPreserveItems = true;\n                break;\n            }\n    }\n    return cachedPreserveItems;\n}\n/**\nSet a flag on the given transaction that will prevent further steps\nfrom being appended to an existing history event (so that they\nrequire a separate undo command to undo).\n*/\nfunction closeHistory(tr) {\n    return tr.setMeta(closeHistoryKey, true);\n}\nconst historyKey = new PluginKey(\"history\");\nconst closeHistoryKey = new PluginKey(\"closeHistory\");\n/**\nReturns a plugin that enables the undo history for an editor. The\nplugin will track undo and redo stacks, which can be used with the\n[`undo`](https://prosemirror.net/docs/ref/#history.undo) and [`redo`](https://prosemirror.net/docs/ref/#history.redo) commands.\n\nYou can set an `\"addToHistory\"` [metadata\nproperty](https://prosemirror.net/docs/ref/#state.Transaction.setMeta) of `false` on a transaction\nto prevent it from being rolled back by undo.\n*/\nfunction history(config = {}) {\n    config = { depth: config.depth || 100,\n        newGroupDelay: config.newGroupDelay || 500 };\n    return new Plugin({\n        key: historyKey,\n        state: {\n            init() {\n                return new HistoryState(Branch.empty, Branch.empty, null, 0, -1);\n            },\n            apply(tr, hist, state) {\n                return applyTransaction(hist, state, tr, config);\n            }\n        },\n        config,\n        props: {\n            handleDOMEvents: {\n                beforeinput(view, e) {\n                    let inputType = e.inputType;\n                    let command = inputType == \"historyUndo\" ? undo : inputType == \"historyRedo\" ? redo : null;\n                    if (!command || !view.editable)\n                        return false;\n                    e.preventDefault();\n                    return command(view.state, view.dispatch);\n                }\n            }\n        }\n    });\n}\nfunction buildCommand(redo, scroll) {\n    return (state, dispatch) => {\n        let hist = historyKey.getState(state);\n        if (!hist || (redo ? hist.undone : hist.done).eventCount == 0)\n            return false;\n        if (dispatch) {\n            let tr = histTransaction(hist, state, redo);\n            if (tr)\n                dispatch(scroll ? tr.scrollIntoView() : tr);\n        }\n        return true;\n    };\n}\n/**\nA command function that undoes the last change, if any.\n*/\nconst undo = buildCommand(false, true);\n/**\nA command function that redoes the last undone change, if any.\n*/\nconst redo = buildCommand(true, true);\n/**\nA command function that undoes the last change. Don't scroll the\nselection into view.\n*/\nconst undoNoScroll = buildCommand(false, false);\n/**\nA command function that redoes the last undone change. Don't\nscroll the selection into view.\n*/\nconst redoNoScroll = buildCommand(true, false);\n/**\nThe amount of undoable events available in a given state.\n*/\nfunction undoDepth(state) {\n    let hist = historyKey.getState(state);\n    return hist ? hist.done.eventCount : 0;\n}\n/**\nThe amount of redoable events available in a given editor state.\n*/\nfunction redoDepth(state) {\n    let hist = historyKey.getState(state);\n    return hist ? hist.undone.eventCount : 0;\n}\n/**\nReturns true if the given transaction was generated by the history\nplugin.\n*/\nfunction isHistoryTransaction(tr) {\n    return tr.getMeta(historyKey) != null;\n}\n\nexport { closeHistory, history, isHistoryTransaction, redo, redoDepth, redoNoScroll, undo, undoDepth, undoNoScroll };\n","export var base = {\n  8: \"Backspace\",\n  9: \"Tab\",\n  10: \"Enter\",\n  12: \"NumLock\",\n  13: \"Enter\",\n  16: \"Shift\",\n  17: \"Control\",\n  18: \"Alt\",\n  20: \"CapsLock\",\n  27: \"Escape\",\n  32: \" \",\n  33: \"PageUp\",\n  34: \"PageDown\",\n  35: \"End\",\n  36: \"Home\",\n  37: \"ArrowLeft\",\n  38: \"ArrowUp\",\n  39: \"ArrowRight\",\n  40: \"ArrowDown\",\n  44: \"PrintScreen\",\n  45: \"Insert\",\n  46: \"Delete\",\n  59: \";\",\n  61: \"=\",\n  91: \"Meta\",\n  92: \"Meta\",\n  106: \"*\",\n  107: \"+\",\n  108: \",\",\n  109: \"-\",\n  110: \".\",\n  111: \"/\",\n  144: \"NumLock\",\n  145: \"ScrollLock\",\n  160: \"Shift\",\n  161: \"Shift\",\n  162: \"Control\",\n  163: \"Control\",\n  164: \"Alt\",\n  165: \"Alt\",\n  173: \"-\",\n  186: \";\",\n  187: \"=\",\n  188: \",\",\n  189: \"-\",\n  190: \".\",\n  191: \"/\",\n  192: \"`\",\n  219: \"[\",\n  220: \"\\\\\",\n  221: \"]\",\n  222: \"'\"\n}\n\nexport var shift = {\n  48: \")\",\n  49: \"!\",\n  50: \"@\",\n  51: \"#\",\n  52: \"$\",\n  53: \"%\",\n  54: \"^\",\n  55: \"&\",\n  56: \"*\",\n  57: \"(\",\n  59: \":\",\n  61: \"+\",\n  173: \"_\",\n  186: \":\",\n  187: \"+\",\n  188: \"<\",\n  189: \"_\",\n  190: \">\",\n  191: \"?\",\n  192: \"~\",\n  219: \"{\",\n  220: \"|\",\n  221: \"}\",\n  222: \"\\\"\"\n}\n\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n  base[i] = String.fromCharCode(i + 32)\n  shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n  // On macOS, keys held with Shift and Cmd don't reflect the effect of Shift in `.key`.\n  // On IE, shift effect is never included in `.key`.\n  var ignoreKey = mac && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey ||\n      ie && event.shiftKey && event.key && event.key.length == 1 ||\n      event.key == \"Unidentified\"\n  var name = (!ignoreKey && event.key) ||\n    (event.shiftKey ? shift : base)[event.keyCode] ||\n    event.key || \"Unidentified\"\n  // Edge sometimes produces wrong names (Issue #3)\n  if (name == \"Esc\") name = \"Escape\"\n  if (name == \"Del\") name = \"Delete\"\n  // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n  if (name == \"Left\") name = \"ArrowLeft\"\n  if (name == \"Up\") name = \"ArrowUp\"\n  if (name == \"Right\") name = \"ArrowRight\"\n  if (name == \"Down\") name = \"ArrowDown\"\n  return name\n}\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\nconst mac = typeof navigator != \"undefined\" && /Mac|iP(hone|[oa]d)/.test(navigator.platform);\nconst windows = typeof navigator != \"undefined\" && /Win/.test(navigator.platform);\nfunction normalizeKeyName(name) {\n    let parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n    if (result == \"Space\")\n        result = \" \";\n    let alt, ctrl, shift, meta;\n    for (let i = 0; i < parts.length - 1; i++) {\n        let mod = parts[i];\n        if (/^(cmd|meta|m)$/i.test(mod))\n            meta = true;\n        else if (/^a(lt)?$/i.test(mod))\n            alt = true;\n        else if (/^(c|ctrl|control)$/i.test(mod))\n            ctrl = true;\n        else if (/^s(hift)?$/i.test(mod))\n            shift = true;\n        else if (/^mod$/i.test(mod)) {\n            if (mac)\n                meta = true;\n            else\n                ctrl = true;\n        }\n        else\n            throw new Error(\"Unrecognized modifier name: \" + mod);\n    }\n    if (alt)\n        result = \"Alt-\" + result;\n    if (ctrl)\n        result = \"Ctrl-\" + result;\n    if (meta)\n        result = \"Meta-\" + result;\n    if (shift)\n        result = \"Shift-\" + result;\n    return result;\n}\nfunction normalize(map) {\n    let copy = Object.create(null);\n    for (let prop in map)\n        copy[normalizeKeyName(prop)] = map[prop];\n    return copy;\n}\nfunction modifiers(name, event, shift = true) {\n    if (event.altKey)\n        name = \"Alt-\" + name;\n    if (event.ctrlKey)\n        name = \"Ctrl-\" + name;\n    if (event.metaKey)\n        name = \"Meta-\" + name;\n    if (shift && event.shiftKey)\n        name = \"Shift-\" + name;\n    return name;\n}\n/**\nCreate a keymap plugin for the given set of bindings.\n\nBindings should map key names to [command](https://prosemirror.net/docs/ref/#commands)-style\nfunctions, which will be called with `(EditorState, dispatch,\nEditorView)` arguments, and should return true when they've handled\nthe key. Note that the view argument isn't part of the command\nprotocol, but can be used as an escape hatch if a binding needs to\ndirectly interact with the UI.\n\nKey names may be strings like `\"Shift-Ctrl-Enter\"`—a key\nidentifier prefixed with zero or more modifiers. Key identifiers\nare based on the strings that can appear in\n[`KeyEvent.key`](https:developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\nUse lowercase letters to refer to letter keys (or uppercase letters\nif you want shift to be held). You may use `\"Space\"` as an alias\nfor the `\" \"` name.\n\nModifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n`a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n`Meta-`) are recognized. For characters that are created by holding\nshift, the `Shift-` prefix is implied, and should not be added\nexplicitly.\n\nYou can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\nother platforms.\n\nYou can add multiple keymap plugins to an editor. The order in\nwhich they appear determines their precedence (the ones early in\nthe array get to dispatch first).\n*/\nfunction keymap(bindings) {\n    return new Plugin({ props: { handleKeyDown: keydownHandler(bindings) } });\n}\n/**\nGiven a set of bindings (using the same format as\n[`keymap`](https://prosemirror.net/docs/ref/#keymap.keymap)), return a [keydown\nhandler](https://prosemirror.net/docs/ref/#view.EditorProps.handleKeyDown) that handles them.\n*/\nfunction keydownHandler(bindings) {\n    let map = normalize(bindings);\n    return function (view, event) {\n        let name = keyName(event), baseName, direct = map[modifiers(name, event)];\n        if (direct && direct(view.state, view.dispatch, view))\n            return true;\n        // A character key\n        if (name.length == 1 && name != \" \") {\n            if (event.shiftKey) {\n                // In case the name was already modified by shift, try looking\n                // it up without its shift modifier\n                let noShift = map[modifiers(name, event, false)];\n                if (noShift && noShift(view.state, view.dispatch, view))\n                    return true;\n            }\n            if ((event.altKey || event.metaKey || event.ctrlKey) &&\n                // Ctrl-Alt may be used for AltGr on Windows\n                !(windows && event.ctrlKey && event.altKey) &&\n                (baseName = base[event.keyCode]) && baseName != name) {\n                // Try falling back to the keyCode when there's a modifier\n                // active or the character produced isn't ASCII, and our table\n                // produces a different name from the the keyCode. See #668,\n                // #1060, #1529.\n                let fromCode = map[modifiers(baseName, event)];\n                if (fromCode && fromCode(view.state, view.dispatch, view))\n                    return true;\n            }\n        }\n        return false;\n    };\n}\n\nexport { keydownHandler, keymap };\n","import { TextSelection, NodeSelection, AllSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nconst domIndex = function (node) {\n    for (var index = 0;; index++) {\n        node = node.previousSibling;\n        if (!node)\n            return index;\n    }\n};\nconst parentNode = function (node) {\n    let parent = node.assignedSlot || node.parentNode;\n    return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nconst textRange = function (node, from, to) {\n    let range = reusedRange || (reusedRange = document.createRange());\n    range.setEnd(node, to == null ? node.nodeValue.length : to);\n    range.setStart(node, from || 0);\n    return range;\n};\nconst clearReusedRange = function () {\n    reusedRange = null;\n};\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nconst isEquivalentPosition = function (node, off, targetNode, targetOff) {\n    return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n        scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n    var _a;\n    for (;;) {\n        if (node == targetNode && off == targetOff)\n            return true;\n        if (off == (dir < 0 ? 0 : nodeSize(node))) {\n            let parent = node.parentNode;\n            if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||\n                node.contentEditable == \"false\")\n                return false;\n            off = domIndex(node) + (dir < 0 ? 0 : 1);\n            node = parent;\n        }\n        else if (node.nodeType == 1) {\n            let child = node.childNodes[off + (dir < 0 ? -1 : 0)];\n            if (child.nodeType == 1 && child.contentEditable == \"false\") {\n                if ((_a = child.pmViewDesc) === null || _a === void 0 ? void 0 : _a.ignoreForSelection)\n                    off += dir;\n                else\n                    return false;\n            }\n            else {\n                node = child;\n                off = dir < 0 ? nodeSize(node) : 0;\n            }\n        }\n        else {\n            return false;\n        }\n    }\n}\nfunction nodeSize(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction textNodeBefore$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset)\n            return node;\n        if (node.nodeType == 1 && offset > 0) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset - 1];\n            offset = nodeSize(node);\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node);\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction textNodeAfter$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset < node.nodeValue.length)\n            return node;\n        if (node.nodeType == 1 && offset < node.childNodes.length) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset];\n            offset = 0;\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node) + 1;\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction isOnEdge(node, offset, parent) {\n    for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n        if (node == parent)\n            return true;\n        let index = domIndex(node);\n        node = node.parentNode;\n        if (!node)\n            return false;\n        atStart = atStart && index == 0;\n        atEnd = atEnd && index == nodeSize(node);\n    }\n}\nfunction hasBlockDesc(dom) {\n    let desc;\n    for (let cur = dom; cur; cur = cur.parentNode)\n        if (desc = cur.pmViewDesc)\n            break;\n    return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nconst selectionCollapsed = function (domSel) {\n    return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset);\n};\nfunction keyEvent(keyCode, key) {\n    let event = document.createEvent(\"Event\");\n    event.initEvent(\"keydown\", true, true);\n    event.keyCode = keyCode;\n    event.key = event.code = key;\n    return event;\n}\nfunction deepActiveElement(doc) {\n    let elt = doc.activeElement;\n    while (elt && elt.shadowRoot)\n        elt = elt.shadowRoot.activeElement;\n    return elt;\n}\nfunction caretFromPoint(doc, x, y) {\n    if (doc.caretPositionFromPoint) {\n        try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n            let pos = doc.caretPositionFromPoint(x, y);\n            // Clip the offset, because Chrome will return a text offset\n            // into <input> nodes, which can't be treated as a regular DOM\n            // offset\n            if (pos)\n                return { node: pos.offsetNode, offset: Math.min(nodeSize(pos.offsetNode), pos.offset) };\n        }\n        catch (_) { }\n    }\n    if (doc.caretRangeFromPoint) {\n        let range = doc.caretRangeFromPoint(x, y);\n        if (range)\n            return { node: range.startContainer, offset: Math.min(nodeSize(range.startContainer), range.startOffset) };\n    }\n}\n\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = (nav && nav.userAgent) || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\n// Is true for both iOS and iPadOS for convenience\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst windows = nav ? /Win/.test(nav.platform) : false;\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\n\nfunction windowRect(doc) {\n    let vp = doc.defaultView && doc.defaultView.visualViewport;\n    if (vp)\n        return {\n            left: 0, right: vp.width,\n            top: 0, bottom: vp.height\n        };\n    return { left: 0, right: doc.documentElement.clientWidth,\n        top: 0, bottom: doc.documentElement.clientHeight };\n}\nfunction getSide(value, side) {\n    return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n    let rect = node.getBoundingClientRect();\n    // Adjust for elements with style \"transform: scale()\"\n    let scaleX = (rect.width / node.offsetWidth) || 1;\n    let scaleY = (rect.height / node.offsetHeight) || 1;\n    // Make sure scrollbar width isn't included in the rectangle\n    return { left: rect.left, right: rect.left + node.clientWidth * scaleX,\n        top: rect.top, bottom: rect.top + node.clientHeight * scaleY };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n    // Skip empty rects with all sides at 0, for example, when the element has no CSS box (display: none)\n    if (!nonZero(rect) && rect.left == 0)\n        return;\n    let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n    let doc = view.dom.ownerDocument;\n    for (let parent = startDOM || view.dom;;) {\n        if (!parent)\n            break;\n        if (parent.nodeType != 1) {\n            parent = parentNode(parent);\n            continue;\n        }\n        let elt = parent;\n        let atTop = elt == doc.body;\n        let bounding = atTop ? windowRect(doc) : clientRect(elt);\n        let moveX = 0, moveY = 0;\n        if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n            moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n        else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n            moveY = rect.bottom - rect.top > bounding.bottom - bounding.top\n                ? rect.top + getSide(scrollMargin, \"top\") - bounding.top\n                : rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n        if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n            moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n        else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n            moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n        if (moveX || moveY) {\n            if (atTop) {\n                doc.defaultView.scrollBy(moveX, moveY);\n            }\n            else {\n                let startX = elt.scrollLeft, startY = elt.scrollTop;\n                if (moveY)\n                    elt.scrollTop += moveY;\n                if (moveX)\n                    elt.scrollLeft += moveX;\n                let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n                rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n            }\n        }\n        let pos = atTop ? \"fixed\" : getComputedStyle(parent).position;\n        if (/^(fixed|sticky)$/.test(pos))\n            break;\n        parent = pos == \"absolute\" ? parent.offsetParent : parentNode(parent);\n    }\n}\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n    let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n    let refDOM, refTop;\n    for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n        let dom = view.root.elementFromPoint(x, y);\n        if (!dom || dom == view.dom || !view.dom.contains(dom))\n            continue;\n        let localRect = dom.getBoundingClientRect();\n        if (localRect.top >= startY - 20) {\n            refDOM = dom;\n            refTop = localRect.top;\n            break;\n        }\n    }\n    return { refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n    let stack = [], doc = dom.ownerDocument;\n    for (let cur = dom; cur; cur = parentNode(cur)) {\n        stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n        if (dom == doc)\n            break;\n    }\n    return stack;\n}\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n    let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n    restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n    for (let i = 0; i < stack.length; i++) {\n        let { dom, top, left } = stack[i];\n        if (dom.scrollTop != top + dTop)\n            dom.scrollTop = top + dTop;\n        if (dom.scrollLeft != left)\n            dom.scrollLeft = left;\n    }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n    if (dom.setActive)\n        return dom.setActive(); // in IE\n    if (preventScrollSupported)\n        return dom.focus(preventScrollSupported);\n    let stored = scrollStack(dom);\n    dom.focus(preventScrollSupported == null ? {\n        get preventScroll() {\n            preventScrollSupported = { preventScroll: true };\n            return true;\n        }\n    } : undefined);\n    if (!preventScrollSupported) {\n        preventScrollSupported = false;\n        restoreScrollStack(stored, 0);\n    }\n}\nfunction findOffsetInNode(node, coords) {\n    let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n    let rowBot = coords.top, rowTop = coords.top;\n    let firstBelow, coordsBelow;\n    for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n        let rects;\n        if (child.nodeType == 1)\n            rects = child.getClientRects();\n        else if (child.nodeType == 3)\n            rects = textRange(child).getClientRects();\n        else\n            continue;\n        for (let i = 0; i < rects.length; i++) {\n            let rect = rects[i];\n            if (rect.top <= rowBot && rect.bottom >= rowTop) {\n                rowBot = Math.max(rect.bottom, rowBot);\n                rowTop = Math.min(rect.top, rowTop);\n                let dx = rect.left > coords.left ? rect.left - coords.left\n                    : rect.right < coords.left ? coords.left - rect.right : 0;\n                if (dx < dxClosest) {\n                    closest = child;\n                    dxClosest = dx;\n                    coordsClosest = dx && closest.nodeType == 3 ? {\n                        left: rect.right < coords.left ? rect.right : rect.left,\n                        top: coords.top\n                    } : coords;\n                    if (child.nodeType == 1 && dx)\n                        offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n                    continue;\n                }\n            }\n            else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) {\n                firstBelow = child;\n                coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top };\n            }\n            if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n                coords.left >= rect.left && coords.top >= rect.bottom))\n                offset = childIndex + 1;\n        }\n    }\n    if (!closest && firstBelow) {\n        closest = firstBelow;\n        coordsClosest = coordsBelow;\n        dxClosest = 0;\n    }\n    if (closest && closest.nodeType == 3)\n        return findOffsetInText(closest, coordsClosest);\n    if (!closest || (dxClosest && closest.nodeType == 1))\n        return { node, offset };\n    return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n    let len = node.nodeValue.length;\n    let range = document.createRange(), result;\n    for (let i = 0; i < len; i++) {\n        range.setEnd(node, i + 1);\n        range.setStart(node, i);\n        let rect = singleRect(range, 1);\n        if (rect.top == rect.bottom)\n            continue;\n        if (inRect(coords, rect)) {\n            result = { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n            break;\n        }\n    }\n    range.detach();\n    return result || { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n    return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 &&\n        coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n    let parent = dom.parentNode;\n    if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n        return parent;\n    return dom;\n}\nfunction posFromElement(view, elt, coords) {\n    let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n    if (node.nodeType == 1 && !node.firstChild) {\n        let rect = node.getBoundingClientRect();\n        bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n    }\n    return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n    // Browser (in caretPosition/RangeFromPoint) will agressively\n    // normalize towards nearby inline nodes. Since we are interested in\n    // positions between block nodes too, we first walk up the hierarchy\n    // of nodes to see if there are block nodes that the coordinates\n    // fall outside of. If so, we take the position before/after that\n    // block. If not, we call `posFromDOM` on the raw node/offset.\n    let outsideBlock = -1;\n    for (let cur = node, sawBlock = false;;) {\n        if (cur == view.dom)\n            break;\n        let desc = view.docView.nearestDesc(cur, true), rect;\n        if (!desc)\n            return null;\n        if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent || !desc.contentDOM) &&\n            // Ignore elements with zero-size bounding rectangles\n            ((rect = desc.dom.getBoundingClientRect()).width || rect.height)) {\n            if (desc.node.isBlock && desc.parent && !/^T(R|BODY|HEAD|FOOT)$/.test(desc.dom.nodeName)) {\n                // Only apply the horizontal test to the innermost block. Vertical for any parent.\n                if (!sawBlock && rect.left > coords.left || rect.top > coords.top)\n                    outsideBlock = desc.posBefore;\n                else if (!sawBlock && rect.right < coords.left || rect.bottom < coords.top)\n                    outsideBlock = desc.posAfter;\n                sawBlock = true;\n            }\n            if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) {\n                // If we are inside a leaf, return the side of the leaf closer to the coords\n                let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2\n                    : coords.left < (rect.left + rect.right) / 2;\n                return before ? desc.posBefore : desc.posAfter;\n            }\n        }\n        cur = desc.dom.parentNode;\n    }\n    return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset, -1);\n}\nfunction elementFromPoint(element, coords, box) {\n    let len = element.childNodes.length;\n    if (len && box.top < box.bottom) {\n        for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n            let child = element.childNodes[i];\n            if (child.nodeType == 1) {\n                let rects = child.getClientRects();\n                for (let j = 0; j < rects.length; j++) {\n                    let rect = rects[j];\n                    if (inRect(coords, rect))\n                        return elementFromPoint(child, coords, rect);\n                }\n            }\n            if ((i = (i + 1) % len) == startI)\n                break;\n        }\n    }\n    return element;\n}\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n    let doc = view.dom.ownerDocument, node, offset = 0;\n    let caret = caretFromPoint(doc, coords.left, coords.top);\n    if (caret)\n        ({ node, offset } = caret);\n    let elt = (view.root.elementFromPoint ? view.root : doc)\n        .elementFromPoint(coords.left, coords.top);\n    let pos;\n    if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n        let box = view.dom.getBoundingClientRect();\n        if (!inRect(coords, box))\n            return null;\n        elt = elementFromPoint(view.dom, coords, box);\n        if (!elt)\n            return null;\n    }\n    // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n    if (safari) {\n        for (let p = elt; node && p; p = parentNode(p))\n            if (p.draggable)\n                node = undefined;\n    }\n    elt = targetKludge(elt, coords);\n    if (node) {\n        if (gecko && node.nodeType == 1) {\n            // Firefox will sometimes return offsets into <input> nodes, which\n            // have no actual children, from caretPositionFromPoint (#953)\n            offset = Math.min(offset, node.childNodes.length);\n            // It'll also move the returned position before image nodes,\n            // even if those are behind it.\n            if (offset < node.childNodes.length) {\n                let next = node.childNodes[offset], box;\n                if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left &&\n                    box.bottom > coords.top)\n                    offset++;\n            }\n        }\n        let prev;\n        // When clicking above the right side of an uneditable node, Chrome will report a cursor position after that node.\n        if (webkit && offset && node.nodeType == 1 && (prev = node.childNodes[offset - 1]).nodeType == 1 &&\n            prev.contentEditable == \"false\" && prev.getBoundingClientRect().top >= coords.top)\n            offset--;\n        // Suspiciously specific kludge to work around caret*FromPoint\n        // never returning a position at the end of the document\n        if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n            coords.top > node.lastChild.getBoundingClientRect().bottom)\n            pos = view.state.doc.content.size;\n        // Ignore positions directly after a BR, since caret*FromPoint\n        // 'round up' positions that would be more accurately placed\n        // before the BR node.\n        else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n            pos = posFromCaret(view, node, offset, coords);\n    }\n    if (pos == null)\n        pos = posFromElement(view, elt, coords);\n    let desc = view.docView.nearestDesc(elt, true);\n    return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction nonZero(rect) {\n    return rect.top < rect.bottom || rect.left < rect.right;\n}\nfunction singleRect(target, bias) {\n    let rects = target.getClientRects();\n    if (rects.length) {\n        let first = rects[bias < 0 ? 0 : rects.length - 1];\n        if (nonZero(first))\n            return first;\n    }\n    return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect();\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n    let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n    let supportEmptyRange = webkit || gecko;\n    if (node.nodeType == 3) {\n        // These browsers support querying empty text ranges. Prefer that in\n        // bidi context or when at the end of a node.\n        if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n            let rect = singleRect(textRange(node, offset, offset), side);\n            // Firefox returns bad results (the position before the space)\n            // when querying a position directly after line-broken\n            // whitespace. Detect this situation and and kludge around it\n            if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n                let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n                if (rectBefore.top == rect.top) {\n                    let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n                    if (rectAfter.top != rect.top)\n                        return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n                }\n            }\n            return rect;\n        }\n        else {\n            let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n            if (side < 0 && !offset) {\n                to++;\n                takeSide = -1;\n            }\n            else if (side >= 0 && offset == node.nodeValue.length) {\n                from--;\n                takeSide = 1;\n            }\n            else if (side < 0) {\n                from--;\n            }\n            else {\n                to++;\n            }\n            return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);\n        }\n    }\n    let $dom = view.state.doc.resolve(pos - (atom || 0));\n    // Return a horizontal line in block context\n    if (!$dom.parent.inlineContent) {\n        if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n            let before = node.childNodes[offset - 1];\n            if (before.nodeType == 1)\n                return flattenH(before.getBoundingClientRect(), false);\n        }\n        if (atom == null && offset < nodeSize(node)) {\n            let after = node.childNodes[offset];\n            if (after.nodeType == 1)\n                return flattenH(after.getBoundingClientRect(), true);\n        }\n        return flattenH(node.getBoundingClientRect(), side >= 0);\n    }\n    // Inline, not in text node (this is not Bidi-safe)\n    if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n        let before = node.childNodes[offset - 1];\n        let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))\n            // BR nodes tend to only return the rectangle before them.\n            // Only use them if they are the last element in their parent\n            : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n        if (target)\n            return flattenV(singleRect(target, 1), false);\n    }\n    if (atom == null && offset < nodeSize(node)) {\n        let after = node.childNodes[offset];\n        while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n            after = after.nextSibling;\n        let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))\n            : after.nodeType == 1 ? after : null;\n        if (target)\n            return flattenV(singleRect(target, -1), true);\n    }\n    // All else failed, just try to get a rectangle for the target node\n    return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n    if (rect.width == 0)\n        return rect;\n    let x = left ? rect.left : rect.right;\n    return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n    if (rect.height == 0)\n        return rect;\n    let y = top ? rect.top : rect.bottom;\n    return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n    let viewState = view.state, active = view.root.activeElement;\n    if (viewState != state)\n        view.updateState(state);\n    if (active != view.dom)\n        view.focus();\n    try {\n        return f();\n    }\n    finally {\n        if (viewState != state)\n            view.updateState(viewState);\n        if (active != view.dom && active)\n            active.focus();\n    }\n}\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n    let sel = state.selection;\n    let $pos = dir == \"up\" ? sel.$from : sel.$to;\n    return withFlushedState(view, state, () => {\n        let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n        for (;;) {\n            let nearest = view.docView.nearestDesc(dom, true);\n            if (!nearest)\n                break;\n            if (nearest.node.isBlock) {\n                dom = nearest.contentDOM || nearest.dom;\n                break;\n            }\n            dom = nearest.dom.parentNode;\n        }\n        let coords = coordsAtPos(view, $pos.pos, 1);\n        for (let child = dom.firstChild; child; child = child.nextSibling) {\n            let boxes;\n            if (child.nodeType == 1)\n                boxes = child.getClientRects();\n            else if (child.nodeType == 3)\n                boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n            else\n                continue;\n            for (let i = 0; i < boxes.length; i++) {\n                let box = boxes[i];\n                if (box.bottom > box.top + 1 &&\n                    (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2\n                        : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n                    return false;\n            }\n        }\n        return true;\n    });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n    let { $head } = state.selection;\n    if (!$head.parent.isTextblock)\n        return false;\n    let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n    let sel = view.domSelection();\n    if (!sel)\n        return $head.pos == $head.start() || $head.pos == $head.end();\n    // If the textblock is all LTR, or the browser doesn't support\n    // Selection.modify (Edge), fall back to a primitive approach\n    if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n        return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n    return withFlushedState(view, state, () => {\n        // This is a huge hack, but appears to be the best we can\n        // currently do: use `Selection.modify` to move the selection by\n        // one character, and see if that moves the cursor out of the\n        // textblock (or doesn't move it at all, when at the start/end of\n        // the document).\n        let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange();\n        let oldBidiLevel = sel.caretBidiLevel // Only for Firefox\n        ;\n        sel.modify(\"move\", dir, \"character\");\n        let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n        let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();\n        let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) ||\n            (oldNode == newNode && oldOff == newOff);\n        // Restore the previous selection\n        try {\n            sel.collapse(anchorNode, anchorOffset);\n            if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend)\n                sel.extend(oldNode, oldOff);\n        }\n        catch (_) { }\n        if (oldBidiLevel != null)\n            sel.caretBidiLevel = oldBidiLevel;\n        return result;\n    });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n    if (cachedState == state && cachedDir == dir)\n        return cachedResult;\n    cachedState = state;\n    cachedDir = dir;\n    return cachedResult = dir == \"up\" || dir == \"down\"\n        ? endOfTextblockVertical(view, state, dir)\n        : endOfTextblockHorizontal(view, state, dir);\n}\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n//   corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n//   given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nclass ViewDesc {\n    constructor(parent, children, dom, \n    // This is the node that holds the child views. It may be null for\n    // descs that don't have children.\n    contentDOM) {\n        this.parent = parent;\n        this.children = children;\n        this.dom = dom;\n        this.contentDOM = contentDOM;\n        this.dirty = NOT_DIRTY;\n        // An expando property on the DOM node provides a link back to its\n        // description.\n        dom.pmViewDesc = this;\n    }\n    // Used to check whether a given description corresponds to a\n    // widget/mark/node.\n    matchesWidget(widget) { return false; }\n    matchesMark(mark) { return false; }\n    matchesNode(node, outerDeco, innerDeco) { return false; }\n    matchesHack(nodeName) { return false; }\n    // When parsing in-editor content (in domchange.js), we allow\n    // descriptions to determine the parse rules that should be used to\n    // parse them.\n    parseRule(addedNodes) { return null; }\n    // Used by the editor's event handler to ignore events that come\n    // from certain descs.\n    stopEvent(event) { return false; }\n    // The size of the content represented by this desc.\n    get size() {\n        let size = 0;\n        for (let i = 0; i < this.children.length; i++)\n            size += this.children[i].size;\n        return size;\n    }\n    // For block nodes, this represents the space taken up by their\n    // start/end tokens.\n    get border() { return 0; }\n    destroy() {\n        this.parent = undefined;\n        if (this.dom.pmViewDesc == this)\n            this.dom.pmViewDesc = undefined;\n        for (let i = 0; i < this.children.length; i++)\n            this.children[i].destroy();\n    }\n    posBeforeChild(child) {\n        for (let i = 0, pos = this.posAtStart;; i++) {\n            let cur = this.children[i];\n            if (cur == child)\n                return pos;\n            pos += cur.size;\n        }\n    }\n    get posBefore() {\n        return this.parent.posBeforeChild(this);\n    }\n    get posAtStart() {\n        return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n    }\n    get posAfter() {\n        return this.posBefore + this.size;\n    }\n    get posAtEnd() {\n        return this.posAtStart + this.size - 2 * this.border;\n    }\n    localPosFromDOM(dom, offset, bias) {\n        // If the DOM position is in the content, use the child desc after\n        // it to figure out a position.\n        if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n            if (bias < 0) {\n                let domBefore, desc;\n                if (dom == this.contentDOM) {\n                    domBefore = dom.childNodes[offset - 1];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domBefore = dom.previousSibling;\n                }\n                while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n                    domBefore = domBefore.previousSibling;\n                return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n            }\n            else {\n                let domAfter, desc;\n                if (dom == this.contentDOM) {\n                    domAfter = dom.childNodes[offset];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domAfter = dom.nextSibling;\n                }\n                while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n                    domAfter = domAfter.nextSibling;\n                return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n            }\n        }\n        // Otherwise, use various heuristics, falling back on the bias\n        // parameter, to determine whether to return the position at the\n        // start or at the end of this view desc.\n        let atEnd;\n        if (dom == this.dom && this.contentDOM) {\n            atEnd = offset > domIndex(this.contentDOM);\n        }\n        else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n            atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n        }\n        else if (this.dom.firstChild) {\n            if (offset == 0)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = false;\n                        break;\n                    }\n                    if (search.previousSibling)\n                        break;\n                }\n            if (atEnd == null && offset == dom.childNodes.length)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = true;\n                        break;\n                    }\n                    if (search.nextSibling)\n                        break;\n                }\n        }\n        return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n    }\n    nearestDesc(dom, onlyNodes = false) {\n        for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n            let desc = this.getDesc(cur), nodeDOM;\n            if (desc && (!onlyNodes || desc.node)) {\n                // If dom is outside of this desc's nodeDOM, don't count it.\n                if (first && (nodeDOM = desc.nodeDOM) &&\n                    !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n                    first = false;\n                else\n                    return desc;\n            }\n        }\n    }\n    getDesc(dom) {\n        let desc = dom.pmViewDesc;\n        for (let cur = desc; cur; cur = cur.parent)\n            if (cur == this)\n                return desc;\n    }\n    posFromDOM(dom, offset, bias) {\n        for (let scan = dom; scan; scan = scan.parentNode) {\n            let desc = this.getDesc(scan);\n            if (desc)\n                return desc.localPosFromDOM(dom, offset, bias);\n        }\n        return -1;\n    }\n    // Find the desc for the node after the given pos, if any. (When a\n    // parent node overrode rendering, there might not be one.)\n    descAt(pos) {\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == pos && end != offset) {\n                while (!child.border && child.children.length) {\n                    for (let i = 0; i < child.children.length; i++) {\n                        let inner = child.children[i];\n                        if (inner.size) {\n                            child = inner;\n                            break;\n                        }\n                    }\n                }\n                return child;\n            }\n            if (pos < end)\n                return child.descAt(pos - offset - child.border);\n            offset = end;\n        }\n    }\n    domFromPos(pos, side) {\n        if (!this.contentDOM)\n            return { node: this.dom, offset: 0, atom: pos + 1 };\n        // First find the position in the child array\n        let i = 0, offset = 0;\n        for (let curPos = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = curPos + child.size;\n            if (end > pos || child instanceof TrailingHackViewDesc) {\n                offset = pos - curPos;\n                break;\n            }\n            curPos = end;\n        }\n        // If this points into the middle of a child, call through\n        if (offset)\n            return this.children[i].domFromPos(offset - this.children[i].border, side);\n        // Go back if there were any zero-length widgets with side >= 0 before this point\n        for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }\n        // Scan towards the first useable node\n        if (side <= 0) {\n            let prev, enter = true;\n            for (;; i--, enter = false) {\n                prev = i ? this.children[i - 1] : null;\n                if (!prev || prev.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (prev && side && enter && !prev.border && !prev.domAtom)\n                return prev.domFromPos(prev.size, side);\n            return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n        }\n        else {\n            let next, enter = true;\n            for (;; i++, enter = false) {\n                next = i < this.children.length ? this.children[i] : null;\n                if (!next || next.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (next && enter && !next.border && !next.domAtom)\n                return next.domFromPos(0, side);\n            return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n        }\n    }\n    // Used to find a DOM range in a single parent for a given changed\n    // range.\n    parseRange(from, to, base = 0) {\n        if (this.children.length == 0)\n            return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n        let fromOffset = -1, toOffset = -1;\n        for (let offset = base, i = 0;; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (fromOffset == -1 && from <= end) {\n                let childBase = offset + child.border;\n                // FIXME maybe descend mark views to parse a narrower range?\n                if (from >= childBase && to <= end - child.border && child.node &&\n                    child.contentDOM && this.contentDOM.contains(child.contentDOM))\n                    return child.parseRange(from, to, childBase);\n                from = offset;\n                for (let j = i; j > 0; j--) {\n                    let prev = this.children[j - 1];\n                    if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n                        fromOffset = domIndex(prev.dom) + 1;\n                        break;\n                    }\n                    from -= prev.size;\n                }\n                if (fromOffset == -1)\n                    fromOffset = 0;\n            }\n            if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n                to = end;\n                for (let j = i + 1; j < this.children.length; j++) {\n                    let next = this.children[j];\n                    if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n                        toOffset = domIndex(next.dom);\n                        break;\n                    }\n                    to += next.size;\n                }\n                if (toOffset == -1)\n                    toOffset = this.contentDOM.childNodes.length;\n                break;\n            }\n            offset = end;\n        }\n        return { node: this.contentDOM, from, to, fromOffset, toOffset };\n    }\n    emptyChildAt(side) {\n        if (this.border || !this.contentDOM || !this.children.length)\n            return false;\n        let child = this.children[side < 0 ? 0 : this.children.length - 1];\n        return child.size == 0 || child.emptyChildAt(side);\n    }\n    domAfterPos(pos) {\n        let { node, offset } = this.domFromPos(pos, 0);\n        if (node.nodeType != 1 || offset == node.childNodes.length)\n            throw new RangeError(\"No node after pos \" + pos);\n        return node.childNodes[offset];\n    }\n    // View descs are responsible for setting any selection that falls\n    // entirely inside of them, so that custom implementations can do\n    // custom things with the selection. Note that this falls apart when\n    // a selection starts in such a node and ends in another, in which\n    // case we just use whatever domFromPos produces as a best effort.\n    setSelection(anchor, head, view, force = false) {\n        // If the selection falls entirely in a child, give it to that child\n        let from = Math.min(anchor, head), to = Math.max(anchor, head);\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (from > offset && to < end)\n                return child.setSelection(anchor - offset - child.border, head - offset - child.border, view, force);\n            offset = end;\n        }\n        let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n        let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n        let domSel = view.root.getSelection();\n        let selRange = view.domSelectionRange();\n        let brKludge = false;\n        // On Firefox, using Selection.collapse to put the cursor after a\n        // BR node for some reason doesn't always work (#1073). On Safari,\n        // the cursor sometimes inexplicable visually lags behind its\n        // reported position in such situations (#1092).\n        if ((gecko || safari) && anchor == head) {\n            let { node, offset } = anchorDOM;\n            if (node.nodeType == 3) {\n                brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n                // Issue #1128\n                if (brKludge && offset == node.nodeValue.length) {\n                    for (let scan = node, after; scan; scan = scan.parentNode) {\n                        if (after = scan.nextSibling) {\n                            if (after.nodeName == \"BR\")\n                                anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n                            break;\n                        }\n                        let desc = scan.pmViewDesc;\n                        if (desc && desc.node && desc.node.isBlock)\n                            break;\n                    }\n                }\n            }\n            else {\n                let prev = node.childNodes[offset - 1];\n                brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n            }\n        }\n        // Firefox can act strangely when the selection is in front of an\n        // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536\n        if (gecko && selRange.focusNode && selRange.focusNode != headDOM.node && selRange.focusNode.nodeType == 1) {\n            let after = selRange.focusNode.childNodes[selRange.focusOffset];\n            if (after && after.contentEditable == \"false\")\n                force = true;\n        }\n        if (!(force || brKludge && safari) &&\n            isEquivalentPosition(anchorDOM.node, anchorDOM.offset, selRange.anchorNode, selRange.anchorOffset) &&\n            isEquivalentPosition(headDOM.node, headDOM.offset, selRange.focusNode, selRange.focusOffset))\n            return;\n        // Selection.extend can be used to create an 'inverted' selection\n        // (one where the focus is before the anchor), but not all\n        // browsers support it yet.\n        let domSelExtended = false;\n        if ((domSel.extend || anchor == head) && !(brKludge && gecko)) {\n            domSel.collapse(anchorDOM.node, anchorDOM.offset);\n            try {\n                if (anchor != head)\n                    domSel.extend(headDOM.node, headDOM.offset);\n                domSelExtended = true;\n            }\n            catch (_) {\n                // In some cases with Chrome the selection is empty after calling\n                // collapse, even when it should be valid. This appears to be a bug, but\n                // it is difficult to isolate. If this happens fallback to the old path\n                // without using extend.\n                // Similarly, this could crash on Safari if the editor is hidden, and\n                // there was no selection.\n            }\n        }\n        if (!domSelExtended) {\n            if (anchor > head) {\n                let tmp = anchorDOM;\n                anchorDOM = headDOM;\n                headDOM = tmp;\n            }\n            let range = document.createRange();\n            range.setEnd(headDOM.node, headDOM.offset);\n            range.setStart(anchorDOM.node, anchorDOM.offset);\n            domSel.removeAllRanges();\n            domSel.addRange(range);\n        }\n    }\n    ignoreMutation(mutation) {\n        return !this.contentDOM && mutation.type != \"selection\";\n    }\n    get contentLost() {\n        return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n    }\n    // Remove a subtree of the element tree that has been touched\n    // by a DOM change, so that the next update will redraw it.\n    markDirty(from, to) {\n        for (let offset = 0, i = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n                let startInside = offset + child.border, endInside = end - child.border;\n                if (from >= startInside && to <= endInside) {\n                    this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n                    if (from == startInside && to == endInside &&\n                        (child.contentLost || child.dom.parentNode != this.contentDOM))\n                        child.dirty = NODE_DIRTY;\n                    else\n                        child.markDirty(from - startInside, to - startInside);\n                    return;\n                }\n                else {\n                    child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length\n                        ? CONTENT_DIRTY : NODE_DIRTY;\n                }\n            }\n            offset = end;\n        }\n        this.dirty = CONTENT_DIRTY;\n    }\n    markParentsDirty() {\n        let level = 1;\n        for (let node = this.parent; node; node = node.parent, level++) {\n            let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n            if (node.dirty < dirty)\n                node.dirty = dirty;\n        }\n    }\n    get domAtom() { return false; }\n    get ignoreForCoords() { return false; }\n    get ignoreForSelection() { return false; }\n    isText(text) { return false; }\n}\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nclass WidgetViewDesc extends ViewDesc {\n    constructor(parent, widget, view, pos) {\n        let self, dom = widget.type.toDOM;\n        if (typeof dom == \"function\")\n            dom = dom(view, () => {\n                if (!self)\n                    return pos;\n                if (self.parent)\n                    return self.parent.posBeforeChild(self);\n            });\n        if (!widget.type.spec.raw) {\n            if (dom.nodeType != 1) {\n                let wrap = document.createElement(\"span\");\n                wrap.appendChild(dom);\n                dom = wrap;\n            }\n            dom.contentEditable = \"false\";\n            dom.classList.add(\"ProseMirror-widget\");\n        }\n        super(parent, [], dom, null);\n        this.widget = widget;\n        this.widget = widget;\n        self = this;\n    }\n    matchesWidget(widget) {\n        return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n    }\n    parseRule() { return { ignore: true }; }\n    stopEvent(event) {\n        let stop = this.widget.spec.stopEvent;\n        return stop ? stop(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n    }\n    destroy() {\n        this.widget.type.destroy(this.dom);\n        super.destroy();\n    }\n    get domAtom() { return true; }\n    get ignoreForSelection() { return !!this.widget.type.spec.relaxedSide; }\n    get side() { return this.widget.type.side; }\n}\nclass CompositionViewDesc extends ViewDesc {\n    constructor(parent, dom, textDOM, text) {\n        super(parent, [], dom, null);\n        this.textDOM = textDOM;\n        this.text = text;\n    }\n    get size() { return this.text.length; }\n    localPosFromDOM(dom, offset) {\n        if (dom != this.textDOM)\n            return this.posAtStart + (offset ? this.size : 0);\n        return this.posAtStart + offset;\n    }\n    domFromPos(pos) {\n        return { node: this.textDOM, offset: pos };\n    }\n    ignoreMutation(mut) {\n        return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue;\n    }\n}\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nclass MarkViewDesc extends ViewDesc {\n    constructor(parent, mark, dom, contentDOM, spec) {\n        super(parent, [], dom, contentDOM);\n        this.mark = mark;\n        this.spec = spec;\n    }\n    static create(parent, mark, inline, view) {\n        let custom = view.nodeViews[mark.type.name];\n        let spec = custom && custom(mark, view, inline);\n        if (!spec || !spec.dom)\n            spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline), null, mark.attrs);\n        return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom, spec);\n    }\n    parseRule() {\n        if ((this.dirty & NODE_DIRTY) || this.mark.type.spec.reparseInView)\n            return null;\n        return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM };\n    }\n    matchesMark(mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark); }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        // Move dirty info to nearest node view\n        if (this.dirty != NOT_DIRTY) {\n            let parent = this.parent;\n            while (!parent.node)\n                parent = parent.parent;\n            if (parent.dirty < this.dirty)\n                parent.dirty = this.dirty;\n            this.dirty = NOT_DIRTY;\n        }\n    }\n    slice(from, to, view) {\n        let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n        let nodes = this.children, size = this.size;\n        if (to < size)\n            nodes = replaceNodes(nodes, to, size, view);\n        if (from > 0)\n            nodes = replaceNodes(nodes, 0, from, view);\n        for (let i = 0; i < nodes.length; i++)\n            nodes[i].parent = copy;\n        copy.children = nodes;\n        return copy;\n    }\n    ignoreMutation(mutation) {\n        return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n    }\n    destroy() {\n        if (this.spec.destroy)\n            this.spec.destroy();\n        super.destroy();\n    }\n}\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nclass NodeViewDesc extends ViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM) {\n        super(parent, [], dom, contentDOM);\n        this.node = node;\n        this.outerDeco = outerDeco;\n        this.innerDeco = innerDeco;\n        this.nodeDOM = nodeDOM;\n    }\n    // By default, a node is rendered using the `toDOM` method from the\n    // node type spec. But client code can use the `nodeViews` spec to\n    // supply a custom node view, which can influence various aspects of\n    // the way the node works.\n    //\n    // (Using subclassing for this was intentionally decided against,\n    // since it'd require exposing a whole slew of finicky\n    // implementation details to the user code that they probably will\n    // never need.)\n    static create(parent, node, outerDeco, innerDeco, view, pos) {\n        let custom = view.nodeViews[node.type.name], descObj;\n        let spec = custom && custom(node, view, () => {\n            // (This is a function that allows the custom view to find its\n            // own position)\n            if (!descObj)\n                return pos;\n            if (descObj.parent)\n                return descObj.parent.posBeforeChild(descObj);\n        }, outerDeco, innerDeco);\n        let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n        if (node.isText) {\n            if (!dom)\n                dom = document.createTextNode(node.text);\n            else if (dom.nodeType != 3)\n                throw new RangeError(\"Text must be rendered as a DOM text node\");\n        }\n        else if (!dom) {\n            let spec = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node), null, node.attrs);\n            ({ dom, contentDOM } = spec);\n        }\n        if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by <br contenteditable=false>\n            if (!dom.hasAttribute(\"contenteditable\"))\n                dom.contentEditable = \"false\";\n            if (node.type.spec.draggable)\n                dom.draggable = true;\n        }\n        let nodeDOM = dom;\n        dom = applyOuterDeco(dom, outerDeco, node);\n        if (spec)\n            return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec);\n        else if (node.isText)\n            return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM);\n        else\n            return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM);\n    }\n    parseRule(addedNodes) {\n        // Experimental kludge to allow opt-in re-parsing of nodes\n        if (this.node.type.spec.reparseInView)\n            return null;\n        // FIXME the assumption that this can always return the current\n        // attrs means that if the user somehow manages to change the\n        // attrs in the dom, that won't be picked up. Not entirely sure\n        // whether this is a problem\n        let rule = { node: this.node.type.name, attrs: this.node.attrs };\n        if (this.node.type.whitespace == \"pre\")\n            rule.preserveWhitespace = \"full\";\n        if (!this.contentDOM) {\n            rule.getContent = () => this.node.content;\n        }\n        else if (!this.contentLost) {\n            rule.contentElement = this.contentDOM;\n        }\n        else {\n            // Chrome likes to randomly recreate parent nodes when\n            // backspacing things. When that happens, this tries to find the\n            // new parent.\n            for (let i = this.children.length - 1; i >= 0; i--) {\n                let child = this.children[i];\n                if (this.dom.contains(child.dom.parentNode)) {\n                    rule.contentElement = child.dom.parentNode;\n                    break;\n                }\n            }\n            if (!rule.contentElement) {\n                let found = addedNodes &&\n                    addedNodes.find(n => n.nodeType == 1 && addedNodes.indexOf(n.parentNode) < 0 && this.dom.contains(n));\n                if (found)\n                    rule.contentElement = found;\n                else\n                    rule.getContent = () => Fragment.empty;\n            }\n        }\n        return rule;\n    }\n    matchesNode(node, outerDeco, innerDeco) {\n        return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n            sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n    }\n    get size() { return this.node.nodeSize; }\n    get border() { return this.node.isLeaf ? 0 : 1; }\n    // Syncs `this.children` to match `this.node.content` and the local\n    // decorations, possibly introducing nesting for marks. Then, in a\n    // separate step, syncs the DOM inside `this.contentDOM` to\n    // `this.children`.\n    updateChildren(view, pos) {\n        let inline = this.node.inlineContent, off = pos;\n        let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n        let localComposition = composition && composition.pos > -1 ? composition : null;\n        let compositionInChild = composition && composition.pos < 0;\n        let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);\n        iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n            if (widget.spec.marks)\n                updater.syncToMarks(widget.spec.marks, inline, view, i);\n            else if (widget.type.side >= 0 && !insideNode)\n                updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view, i);\n            // If the next node is a desc matching this widget, reuse it,\n            // otherwise insert the widget as a new view desc.\n            updater.placeWidget(widget, view, off);\n        }, (child, outerDeco, innerDeco, i) => {\n            // Make sure the wrapping mark descs match the node's marks.\n            updater.syncToMarks(child.marks, inline, view, i);\n            // Try several strategies for drawing this node\n            let compIndex;\n            if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;\n            else if (compositionInChild && view.state.selection.from > off &&\n                view.state.selection.to < off + child.nodeSize &&\n                (compIndex = updater.findIndexWithChild(composition.node)) > -1 &&\n                updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) ;\n            else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off)) ;\n            else {\n                // Add it as a new view\n                updater.addNode(child, outerDeco, innerDeco, view, off);\n            }\n            off += child.nodeSize;\n        });\n        // Drop all remaining descs after the current position.\n        updater.syncToMarks([], inline, view, 0);\n        if (this.node.isTextblock)\n            updater.addTextblockHacks();\n        updater.destroyRest();\n        // Sync the DOM if anything changed\n        if (updater.changed || this.dirty == CONTENT_DIRTY) {\n            // May have to protect focused DOM from being changed if a composition is active\n            if (localComposition)\n                this.protectLocalComposition(view, localComposition);\n            renderDescs(this.contentDOM, this.children, view);\n            if (ios)\n                iosHacks(this.dom);\n        }\n    }\n    localCompositionInfo(view, pos) {\n        // Only do something if both the selection and a focused text node\n        // are inside of this node\n        let { from, to } = view.state.selection;\n        if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n            return null;\n        let textNode = view.input.compositionNode;\n        if (!textNode || !this.dom.contains(textNode.parentNode))\n            return null;\n        if (this.node.inlineContent) {\n            // Find the text in the focused node in the node, stop if it's not\n            // there (may have been modified through other means, in which\n            // case it should overwritten)\n            let text = textNode.nodeValue;\n            let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n            return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n        }\n        else {\n            return { node: textNode, pos: -1, text: \"\" };\n        }\n    }\n    protectLocalComposition(view, { node, pos, text }) {\n        // The node is already part of a local view desc, leave it there\n        if (this.getDesc(node))\n            return;\n        // Create a composition view for the orphaned nodes\n        let topNode = node;\n        for (;; topNode = topNode.parentNode) {\n            if (topNode.parentNode == this.contentDOM)\n                break;\n            while (topNode.previousSibling)\n                topNode.parentNode.removeChild(topNode.previousSibling);\n            while (topNode.nextSibling)\n                topNode.parentNode.removeChild(topNode.nextSibling);\n            if (topNode.pmViewDesc)\n                topNode.pmViewDesc = undefined;\n        }\n        let desc = new CompositionViewDesc(this, topNode, node, text);\n        view.input.compositionNodes.push(desc);\n        // Patch up this.children to contain the composition view\n        this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n    }\n    // If this desc must be updated to match the given node decoration,\n    // do so and return true.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateInner(node, outerDeco, innerDeco, view);\n        return true;\n    }\n    updateInner(node, outerDeco, innerDeco, view) {\n        this.updateOuterDeco(outerDeco);\n        this.node = node;\n        this.innerDeco = innerDeco;\n        if (this.contentDOM)\n            this.updateChildren(view, this.posAtStart);\n        this.dirty = NOT_DIRTY;\n    }\n    updateOuterDeco(outerDeco) {\n        if (sameOuterDeco(outerDeco, this.outerDeco))\n            return;\n        let needsWrap = this.nodeDOM.nodeType != 1;\n        let oldDOM = this.dom;\n        this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n        if (this.dom != oldDOM) {\n            oldDOM.pmViewDesc = undefined;\n            this.dom.pmViewDesc = this;\n        }\n        this.outerDeco = outerDeco;\n    }\n    // Mark this node as being the selected node.\n    selectNode() {\n        if (this.nodeDOM.nodeType == 1) {\n            this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n            if (this.contentDOM || !this.node.type.spec.draggable)\n                this.nodeDOM.draggable = true;\n        }\n    }\n    // Remove selected node marking from this node.\n    deselectNode() {\n        if (this.nodeDOM.nodeType == 1) {\n            this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n            if (this.contentDOM || !this.node.type.spec.draggable)\n                this.nodeDOM.removeAttribute(\"draggable\");\n        }\n    }\n    get domAtom() { return this.node.isAtom; }\n}\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n    applyOuterDeco(dom, outerDeco, doc);\n    let docView = new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom);\n    if (docView.contentDOM)\n        docView.updateChildren(view, 0);\n    return docView;\n}\nclass TextViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM) {\n        super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM);\n    }\n    parseRule() {\n        let skip = this.nodeDOM.parentNode;\n        while (skip && skip != this.dom && !skip.pmIsDeco)\n            skip = skip.parentNode;\n        return { skip: (skip || true) };\n    }\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateOuterDeco(outerDeco);\n        if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n            this.nodeDOM.nodeValue = node.text;\n            if (view.trackWrites == this.nodeDOM)\n                view.trackWrites = null;\n        }\n        this.node = node;\n        this.dirty = NOT_DIRTY;\n        return true;\n    }\n    inParent() {\n        let parentDOM = this.parent.contentDOM;\n        for (let n = this.nodeDOM; n; n = n.parentNode)\n            if (n == parentDOM)\n                return true;\n        return false;\n    }\n    domFromPos(pos) {\n        return { node: this.nodeDOM, offset: pos };\n    }\n    localPosFromDOM(dom, offset, bias) {\n        if (dom == this.nodeDOM)\n            return this.posAtStart + Math.min(offset, this.node.text.length);\n        return super.localPosFromDOM(dom, offset, bias);\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"characterData\" && mutation.type != \"selection\";\n    }\n    slice(from, to, _view) {\n        let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n        return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom);\n    }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n            this.dirty = NODE_DIRTY;\n    }\n    get domAtom() { return false; }\n    isText(text) { return this.node.text == text; }\n}\n// A dummy desc used to tag trailing BR or IMG nodes created to work\n// around contentEditable terribleness.\nclass TrailingHackViewDesc extends ViewDesc {\n    parseRule() { return { ignore: true }; }\n    matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }\n    get domAtom() { return true; }\n    get ignoreForCoords() { return this.dom.nodeName == \"IMG\"; }\n}\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nclass CustomNodeViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec) {\n        super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM);\n        this.spec = spec;\n    }\n    // A custom `update` method gets to decide whether the update goes\n    // through. If it does, and there's a `contentDOM` node, our logic\n    // updates the children.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY)\n            return false;\n        if (this.spec.update && (this.node.type == node.type || this.spec.multiType)) {\n            let result = this.spec.update(node, outerDeco, innerDeco);\n            if (result)\n                this.updateInner(node, outerDeco, innerDeco, view);\n            return result;\n        }\n        else if (!this.contentDOM && !node.isLeaf) {\n            return false;\n        }\n        else {\n            return super.update(node, outerDeco, innerDeco, view);\n        }\n    }\n    selectNode() {\n        this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n    }\n    deselectNode() {\n        this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n    }\n    setSelection(anchor, head, view, force) {\n        this.spec.setSelection ? this.spec.setSelection(anchor, head, view.root)\n            : super.setSelection(anchor, head, view, force);\n    }\n    destroy() {\n        if (this.spec.destroy)\n            this.spec.destroy();\n        super.destroy();\n    }\n    stopEvent(event) {\n        return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n    }\n}\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n    let dom = parentDOM.firstChild, written = false;\n    for (let i = 0; i < descs.length; i++) {\n        let desc = descs[i], childDOM = desc.dom;\n        if (childDOM.parentNode == parentDOM) {\n            while (childDOM != dom) {\n                dom = rm(dom);\n                written = true;\n            }\n            dom = dom.nextSibling;\n        }\n        else {\n            written = true;\n            parentDOM.insertBefore(childDOM, dom);\n        }\n        if (desc instanceof MarkViewDesc) {\n            let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n            renderDescs(desc.contentDOM, desc.children, view);\n            dom = pos ? pos.nextSibling : parentDOM.firstChild;\n        }\n    }\n    while (dom) {\n        dom = rm(dom);\n        written = true;\n    }\n    if (written && view.trackWrites == parentDOM)\n        view.trackWrites = null;\n}\nconst OuterDecoLevel = function (nodeName) {\n    if (nodeName)\n        this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = Object.create(null);\nconst noDeco = [new OuterDecoLevel];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n    if (outerDeco.length == 0)\n        return noDeco;\n    let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n    for (let i = 0; i < outerDeco.length; i++) {\n        let attrs = outerDeco[i].type.attrs;\n        if (!attrs)\n            continue;\n        if (attrs.nodeName)\n            result.push(top = new OuterDecoLevel(attrs.nodeName));\n        for (let name in attrs) {\n            let val = attrs[name];\n            if (val == null)\n                continue;\n            if (needsWrap && result.length == 1)\n                result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n            if (name == \"class\")\n                top.class = (top.class ? top.class + \" \" : \"\") + val;\n            else if (name == \"style\")\n                top.style = (top.style ? top.style + \";\" : \"\") + val;\n            else if (name != \"nodeName\")\n                top[name] = val;\n        }\n    }\n    return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n    // Shortcut for trivial case\n    if (prevComputed == noDeco && curComputed == noDeco)\n        return nodeDOM;\n    let curDOM = nodeDOM;\n    for (let i = 0; i < curComputed.length; i++) {\n        let deco = curComputed[i], prev = prevComputed[i];\n        if (i) {\n            let parent;\n            if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n                (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n                curDOM = parent;\n            }\n            else {\n                parent = document.createElement(deco.nodeName);\n                parent.pmIsDeco = true;\n                parent.appendChild(curDOM);\n                prev = noDeco[0];\n                curDOM = parent;\n            }\n        }\n        patchAttributes(curDOM, prev || noDeco[0], deco);\n    }\n    return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n    for (let name in prev)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n            dom.removeAttribute(name);\n    for (let name in cur)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n            dom.setAttribute(name, cur[name]);\n    if (prev.class != cur.class) {\n        let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n        let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n        for (let i = 0; i < prevList.length; i++)\n            if (curList.indexOf(prevList[i]) == -1)\n                dom.classList.remove(prevList[i]);\n        for (let i = 0; i < curList.length; i++)\n            if (prevList.indexOf(curList[i]) == -1)\n                dom.classList.add(curList[i]);\n        if (dom.classList.length == 0)\n            dom.removeAttribute(\"class\");\n    }\n    if (prev.style != cur.style) {\n        if (prev.style) {\n            let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n            while (m = prop.exec(prev.style))\n                dom.style.removeProperty(m[1]);\n        }\n        if (cur.style)\n            dom.style.cssText += cur.style;\n    }\n}\nfunction applyOuterDeco(dom, deco, node) {\n    return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n    if (a.length != b.length)\n        return false;\n    for (let i = 0; i < a.length; i++)\n        if (!a[i].type.eq(b[i].type))\n            return false;\n    return true;\n}\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n    let next = dom.nextSibling;\n    dom.parentNode.removeChild(dom);\n    return next;\n}\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nclass ViewTreeUpdater {\n    constructor(top, lock, view) {\n        this.lock = lock;\n        this.view = view;\n        // Index into `this.top`'s child array, represents the current\n        // update position.\n        this.index = 0;\n        // When entering a mark, the current top and index are pushed\n        // onto this.\n        this.stack = [];\n        // Tracks whether anything was changed\n        this.changed = false;\n        this.top = top;\n        this.preMatch = preMatch(top.node.content, top);\n    }\n    // Destroy and remove the children between the given indices in\n    // `this.top`.\n    destroyBetween(start, end) {\n        if (start == end)\n            return;\n        for (let i = start; i < end; i++)\n            this.top.children[i].destroy();\n        this.top.children.splice(start, end - start);\n        this.changed = true;\n    }\n    // Destroy all remaining children in `this.top`.\n    destroyRest() {\n        this.destroyBetween(this.index, this.top.children.length);\n    }\n    // Sync the current stack of mark descs with the given array of\n    // marks, reusing existing mark descs when possible.\n    syncToMarks(marks, inline, view, parentIndex) {\n        let keep = 0, depth = this.stack.length >> 1;\n        let maxKeep = Math.min(depth, marks.length);\n        while (keep < maxKeep &&\n            (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1])\n                .matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n            keep++;\n        while (keep < depth) {\n            this.destroyRest();\n            this.top.dirty = NOT_DIRTY;\n            this.index = this.stack.pop();\n            this.top = this.stack.pop();\n            depth--;\n        }\n        while (depth < marks.length) {\n            this.stack.push(this.top, this.index + 1);\n            let found = -1, scanTo = this.top.children.length;\n            if (parentIndex < this.preMatch.index)\n                scanTo = Math.min(this.index + 3, scanTo);\n            for (let i = this.index; i < scanTo; i++) {\n                let next = this.top.children[i];\n                if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) {\n                    found = i;\n                    break;\n                }\n            }\n            // When nothing matches, try to update the mark view at this position\n            // in place, so a custom mark view can adapt to a changed mark without\n            // re-creating its DOM.\n            if (found < 0 && this.index < this.top.children.length) {\n                let cur = this.top.children[this.index];\n                if (cur instanceof MarkViewDesc && cur.dirty != NODE_DIRTY &&\n                    cur.mark.type == marks[depth].type && cur.spec.update &&\n                    !this.isLocked(cur.dom) && cur.spec.update(marks[depth])) {\n                    cur.mark = marks[depth];\n                    found = this.index;\n                    this.changed = true;\n                }\n            }\n            if (found > -1) {\n                if (found > this.index) {\n                    this.changed = true;\n                    this.destroyBetween(this.index, found);\n                }\n                this.top = this.top.children[this.index];\n            }\n            else {\n                let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n                this.top.children.splice(this.index, 0, markDesc);\n                this.top = markDesc;\n                this.changed = true;\n            }\n            this.index = 0;\n            depth++;\n        }\n    }\n    // Try to find a node desc matching the given data. Skip over it and\n    // return true when successful.\n    findNodeMatch(node, outerDeco, innerDeco, index) {\n        let found = -1, targetDesc;\n        if (index >= this.preMatch.index &&\n            (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top &&\n            targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n            found = this.top.children.indexOf(targetDesc, this.index);\n        }\n        else {\n            for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n                let child = this.top.children[i];\n                if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n                    found = i;\n                    break;\n                }\n            }\n        }\n        if (found < 0)\n            return false;\n        this.destroyBetween(this.index, found);\n        this.index++;\n        return true;\n    }\n    updateNodeAt(node, outerDeco, innerDeco, index, view) {\n        let child = this.top.children[index];\n        if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n            child.dirty = CONTENT_DIRTY;\n        if (!child.update(node, outerDeco, innerDeco, view))\n            return false;\n        this.destroyBetween(this.index, index);\n        this.index++;\n        return true;\n    }\n    findIndexWithChild(domNode) {\n        for (;;) {\n            let parent = domNode.parentNode;\n            if (!parent)\n                return -1;\n            if (parent == this.top.contentDOM) {\n                let desc = domNode.pmViewDesc;\n                if (desc)\n                    for (let i = this.index; i < this.top.children.length; i++) {\n                        if (this.top.children[i] == desc)\n                            return i;\n                    }\n                return -1;\n            }\n            domNode = parent;\n        }\n    }\n    // Try to update the next node, if any, to the given data. Checks\n    // pre-matches to avoid overwriting nodes that could still be used.\n    updateNextNode(node, outerDeco, innerDeco, view, index, pos) {\n        for (let i = this.index; i < this.top.children.length; i++) {\n            let next = this.top.children[i];\n            if (next instanceof NodeViewDesc) {\n                let preMatch = this.preMatch.matched.get(next);\n                if (preMatch != null && preMatch != index)\n                    return false;\n                let nextDOM = next.dom, updated;\n                // Can't update if nextDOM is or contains this.lock, except if\n                // it's a text node whose content already matches the new text\n                // and whose decorations match the new ones.\n                let locked = this.isLocked(nextDOM) &&\n                    !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n                        next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n                if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n                    this.destroyBetween(this.index, i);\n                    if (next.dom != nextDOM)\n                        this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) {\n                    this.destroyBetween(this.index, i);\n                    this.top.children[this.index] = updated;\n                    if (updated.contentDOM) {\n                        updated.dirty = CONTENT_DIRTY;\n                        updated.updateChildren(view, pos + 1);\n                        updated.dirty = NOT_DIRTY;\n                    }\n                    this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                break;\n            }\n        }\n        return false;\n    }\n    // When a node with content is replaced by a different node with\n    // identical content, move over its children.\n    recreateWrapper(next, node, outerDeco, innerDeco, view, pos) {\n        if (next.dirty || node.isAtom || !next.children.length ||\n            !next.node.content.eq(node.content) ||\n            !sameOuterDeco(outerDeco, next.outerDeco) || !innerDeco.eq(next.innerDeco))\n            return null;\n        let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (wrapper.contentDOM) {\n            wrapper.children = next.children;\n            next.children = [];\n            for (let ch of wrapper.children)\n                ch.parent = wrapper;\n        }\n        next.destroy();\n        return wrapper;\n    }\n    // Insert the node as a newly created node desc.\n    addNode(node, outerDeco, innerDeco, view, pos) {\n        let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (desc.contentDOM)\n            desc.updateChildren(view, pos + 1);\n        this.top.children.splice(this.index++, 0, desc);\n        this.changed = true;\n    }\n    placeWidget(widget, view, pos) {\n        let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n        if (next && next.matchesWidget(widget) &&\n            (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n            this.index++;\n        }\n        else {\n            let desc = new WidgetViewDesc(this.top, widget, view, pos);\n            this.top.children.splice(this.index++, 0, desc);\n            this.changed = true;\n        }\n    }\n    // Make sure a textblock looks and behaves correctly in\n    // contentEditable.\n    addTextblockHacks() {\n        let lastChild = this.top.children[this.index - 1], parent = this.top;\n        while (lastChild instanceof MarkViewDesc) {\n            parent = lastChild;\n            lastChild = parent.children[parent.children.length - 1];\n        }\n        if (!lastChild || // Empty textblock\n            !(lastChild instanceof TextViewDesc) ||\n            /\\n$/.test(lastChild.node.text) ||\n            (this.view.requiresGeckoHackNode && /\\s$/.test(lastChild.node.text))) {\n            // Avoid bugs in Safari's cursor drawing (#1165) and Chrome's mouse selection (#1152)\n            if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n                this.addHackNode(\"IMG\", parent);\n            this.addHackNode(\"BR\", this.top);\n        }\n    }\n    addHackNode(nodeName, parent) {\n        if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n            this.index++;\n        }\n        else {\n            let dom = document.createElement(nodeName);\n            if (nodeName == \"IMG\") {\n                dom.className = \"ProseMirror-separator\";\n                dom.alt = \"\";\n            }\n            if (nodeName == \"BR\")\n                dom.className = \"ProseMirror-trailingBreak\";\n            let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n            if (parent != this.top)\n                parent.children.push(hack);\n            else\n                parent.children.splice(this.index++, 0, hack);\n            this.changed = true;\n        }\n    }\n    isLocked(node) {\n        return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));\n    }\n}\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing those\n// for other nodes.\nfunction preMatch(frag, parentDesc) {\n    let curDesc = parentDesc, descI = curDesc.children.length;\n    let fI = frag.childCount, matched = new Map, matches = [];\n    outer: while (fI > 0) {\n        let desc;\n        for (;;) {\n            if (descI) {\n                let next = curDesc.children[descI - 1];\n                if (next instanceof MarkViewDesc) {\n                    curDesc = next;\n                    descI = next.children.length;\n                }\n                else {\n                    desc = next;\n                    descI--;\n                    break;\n                }\n            }\n            else if (curDesc == parentDesc) {\n                break outer;\n            }\n            else {\n                descI = curDesc.parent.children.indexOf(curDesc);\n                curDesc = curDesc.parent;\n            }\n        }\n        let node = desc.node;\n        if (!node)\n            continue;\n        if (node != frag.child(fI - 1))\n            break;\n        --fI;\n        matched.set(desc, fI);\n        matches.push(desc);\n    }\n    return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n    return a.type.side - b.type.side;\n}\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n    let locals = deco.locals(parent), offset = 0;\n    // Simple, cheap variant for when there are no local decorations\n    if (locals.length == 0) {\n        for (let i = 0; i < parent.childCount; i++) {\n            let child = parent.child(i);\n            onNode(child, locals, deco.forChild(offset, child), i);\n            offset += child.nodeSize;\n        }\n        return;\n    }\n    let decoIndex = 0, active = [], restNode = null;\n    for (let parentIndex = 0;;) {\n        let widget, widgets;\n        while (decoIndex < locals.length && locals[decoIndex].to == offset) {\n            let next = locals[decoIndex++];\n            if (next.widget) {\n                if (!widget)\n                    widget = next;\n                else\n                    (widgets || (widgets = [widget])).push(next);\n            }\n        }\n        if (widget) {\n            if (widgets) {\n                widgets.sort(compareSide);\n                for (let i = 0; i < widgets.length; i++)\n                    onWidget(widgets[i], parentIndex, !!restNode);\n            }\n            else {\n                onWidget(widget, parentIndex, !!restNode);\n            }\n        }\n        let child, index;\n        if (restNode) {\n            index = -1;\n            child = restNode;\n            restNode = null;\n        }\n        else if (parentIndex < parent.childCount) {\n            index = parentIndex;\n            child = parent.child(parentIndex++);\n        }\n        else {\n            break;\n        }\n        for (let i = 0; i < active.length; i++)\n            if (active[i].to <= offset)\n                active.splice(i--, 1);\n        while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n            active.push(locals[decoIndex++]);\n        let end = offset + child.nodeSize;\n        if (child.isText) {\n            let cutAt = end;\n            if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n                cutAt = locals[decoIndex].from;\n            for (let i = 0; i < active.length; i++)\n                if (active[i].to < cutAt)\n                    cutAt = active[i].to;\n            if (cutAt < end) {\n                restNode = child.cut(cutAt - offset);\n                child = child.cut(0, cutAt - offset);\n                end = cutAt;\n                index = -1;\n            }\n        }\n        else {\n            while (decoIndex < locals.length && locals[decoIndex].to < end)\n                decoIndex++;\n        }\n        let outerDeco = child.isInline && !child.isLeaf ? active.filter(d => !d.inline) : active.slice();\n        onNode(child, outerDeco, deco.forChild(offset, child), index);\n        offset = end;\n    }\n}\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n    if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n        let oldCSS = dom.style.cssText;\n        dom.style.cssText = oldCSS + \"; list-style: square !important\";\n        window.getComputedStyle(dom).listStyle;\n        dom.style.cssText = oldCSS;\n    }\n}\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n    for (let i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n        let child = frag.child(i++), childStart = pos;\n        pos += child.nodeSize;\n        if (!child.isText)\n            continue;\n        let str = child.text;\n        while (i < frag.childCount) {\n            let next = frag.child(i++);\n            pos += next.nodeSize;\n            if (!next.isText)\n                break;\n            str += next.text;\n        }\n        if (pos >= from) {\n            if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text)\n                return to - text.length;\n            let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n            if (found >= 0 && found + text.length + childStart >= from)\n                return childStart + found;\n            if (from == to && str.length >= (to + text.length) - childStart &&\n                str.slice(to - childStart, to - childStart + text.length) == text)\n                return to;\n        }\n    }\n    return -1;\n}\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n    let result = [];\n    for (let i = 0, off = 0; i < nodes.length; i++) {\n        let child = nodes[i], start = off, end = off += child.size;\n        if (start >= to || end <= from) {\n            result.push(child);\n        }\n        else {\n            if (start < from)\n                result.push(child.slice(0, from - start, view));\n            if (replacement) {\n                result.push(replacement);\n                replacement = undefined;\n            }\n            if (end > to)\n                result.push(child.slice(to - start, child.size, view));\n        }\n    }\n    return result;\n}\n\nfunction selectionFromDOM(view, origin = null) {\n    let domSel = view.domSelectionRange(), doc = view.state.doc;\n    if (!domSel.focusNode)\n        return null;\n    let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n    let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n    if (head < 0)\n        return null;\n    let $head = doc.resolve(head), anchor, selection;\n    if (selectionCollapsed(domSel)) {\n        anchor = head;\n        while (nearestDesc && !nearestDesc.node)\n            nearestDesc = nearestDesc.parent;\n        let nearestDescNode = nearestDesc.node;\n        if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent\n            && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n            let pos = nearestDesc.posBefore;\n            selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n        }\n    }\n    else {\n        if (domSel instanceof view.dom.ownerDocument.defaultView.Selection && domSel.rangeCount > 1) {\n            let min = head, max = head;\n            for (let i = 0; i < domSel.rangeCount; i++) {\n                let range = domSel.getRangeAt(i);\n                min = Math.min(min, view.docView.posFromDOM(range.startContainer, range.startOffset, 1));\n                max = Math.max(max, view.docView.posFromDOM(range.endContainer, range.endOffset, -1));\n            }\n            if (min < 0)\n                return null;\n            [anchor, head] = max == view.state.selection.anchor ? [max, min] : [min, max];\n            $head = doc.resolve(head);\n        }\n        else {\n            anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n        }\n        if (anchor < 0)\n            return null;\n    }\n    let $anchor = doc.resolve(anchor);\n    if (!selection) {\n        let bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n        selection = selectionBetween(view, $anchor, $head, bias);\n    }\n    return selection;\n}\nfunction editorOwnsSelection(view) {\n    return view.editable ? view.hasFocus() :\n        hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n    let sel = view.state.selection;\n    syncNodeSelection(view, sel);\n    if (!editorOwnsSelection(view))\n        return;\n    // Need to delay selection normalization during a native selection\n    // drag on Chrome, or it will cause further dragging to glitch.\n    let mouseDown = view.input.mouseDown;\n    if (!force && chrome && mouseDown) {\n        let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;\n        if (domSel.anchorNode && curSel.anchorNode &&\n            isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset) &&\n            mouseDown.delaySelUpdate()) {\n            view.domObserver.setCurSelection();\n            return;\n        }\n    }\n    view.domObserver.disconnectSelection();\n    if (view.cursorWrapper) {\n        selectCursorWrapper(view);\n    }\n    else {\n        let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n        if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n            if (!sel.$from.parent.inlineContent)\n                resetEditableFrom = temporarilyEditableNear(view, sel.from);\n            if (!sel.empty && !sel.$from.parent.inlineContent)\n                resetEditableTo = temporarilyEditableNear(view, sel.to);\n        }\n        view.docView.setSelection(anchor, head, view, force);\n        if (brokenSelectBetweenUneditable) {\n            if (resetEditableFrom)\n                resetEditable(resetEditableFrom);\n            if (resetEditableTo)\n                resetEditable(resetEditableTo);\n        }\n        if (sel.visible) {\n            view.dom.classList.remove(\"ProseMirror-hideselection\");\n        }\n        else {\n            view.dom.classList.add(\"ProseMirror-hideselection\");\n            if (\"onselectionchange\" in document)\n                removeClassOnSelectionChange(view);\n        }\n    }\n    view.domObserver.setCurSelection();\n    view.domObserver.connectSelection();\n}\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n    let { node, offset } = view.docView.domFromPos(pos, 0);\n    let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n    let before = offset ? node.childNodes[offset - 1] : null;\n    if (safari && after && after.contentEditable == \"false\")\n        return setEditable(after);\n    if ((!after || after.contentEditable == \"false\") &&\n        (!before || before.contentEditable == \"false\")) {\n        if (after)\n            return setEditable(after);\n        else if (before)\n            return setEditable(before);\n    }\n}\nfunction setEditable(element) {\n    element.contentEditable = \"true\";\n    if (safari && element.draggable) {\n        element.draggable = false;\n        element.wasDraggable = true;\n    }\n    return element;\n}\nfunction resetEditable(element) {\n    element.contentEditable = \"false\";\n    if (element.wasDraggable) {\n        element.draggable = true;\n        element.wasDraggable = null;\n    }\n}\nfunction removeClassOnSelectionChange(view) {\n    let doc = view.dom.ownerDocument;\n    doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n    let domSel = view.domSelectionRange();\n    let node = domSel.anchorNode, offset = domSel.anchorOffset;\n    doc.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n        if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n            doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n            setTimeout(() => {\n                if (!editorOwnsSelection(view) || view.state.selection.visible)\n                    view.dom.classList.remove(\"ProseMirror-hideselection\");\n            }, 20);\n        }\n    });\n}\nfunction selectCursorWrapper(view) {\n    let domSel = view.domSelection();\n    if (!domSel)\n        return;\n    let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n    if (img)\n        domSel.collapse(node.parentNode, domIndex(node) + 1);\n    else\n        domSel.collapse(node, 0);\n    // Kludge to kill 'control selection' in IE11 when selecting an\n    // invisible cursor wrapper, since that would result in those weird\n    // resize handles and a selection that considers the absolutely\n    // positioned wrapper, rather than the root editable node, the\n    // focused element.\n    if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n        node.disabled = true;\n        node.disabled = false;\n    }\n}\nfunction syncNodeSelection(view, sel) {\n    if (sel instanceof NodeSelection) {\n        let desc = view.docView.descAt(sel.from);\n        if (desc != view.lastSelectedViewDesc) {\n            clearNodeSelection(view);\n            if (desc)\n                desc.selectNode();\n            view.lastSelectedViewDesc = desc;\n        }\n    }\n    else {\n        clearNodeSelection(view);\n    }\n}\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n    if (view.lastSelectedViewDesc) {\n        if (view.lastSelectedViewDesc.parent)\n            view.lastSelectedViewDesc.deselectNode();\n        view.lastSelectedViewDesc = undefined;\n    }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n    return view.someProp(\"createSelectionBetween\", f => f(view, $anchor, $head))\n        || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n    if (view.editable && !view.hasFocus())\n        return false;\n    return hasSelection(view);\n}\nfunction hasSelection(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.anchorNode)\n        return false;\n    try {\n        // Firefox will raise 'permission denied' errors when accessing\n        // properties of `sel.anchorNode` when it's in a generated CSS\n        // element.\n        return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n            (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n    }\n    catch (_) {\n        return false;\n    }\n}\nfunction anchorInRightPlace(view) {\n    let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n    let domSel = view.domSelectionRange();\n    return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\n\nfunction moveSelectionBlock(state, dir) {\n    let { $anchor, $head } = state.selection;\n    let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n    let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n    return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n    view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n    return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection) {\n        if (mods.indexOf(\"s\") > -1) {\n            let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter;\n            if (!node || node.isText || !node.isLeaf)\n                return false;\n            let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1));\n            return apply(view, new TextSelection(sel.$anchor, $newHead));\n        }\n        else if (!sel.empty) {\n            return false;\n        }\n        else if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) {\n            let next = moveSelectionBlock(view.state, dir);\n            if (next && (next instanceof NodeSelection))\n                return apply(view, next);\n            return false;\n        }\n        else if (!(mac && mods.indexOf(\"m\") > -1)) {\n            let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n            if (!node || node.isText)\n                return false;\n            let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n            if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n                return false;\n            if (NodeSelection.isSelectable(node)) {\n                return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n            }\n            else if (webkit) {\n                // Chrome and Safari will introduce extra pointless cursor\n                // positions around inline uneditable nodes, so we have to\n                // take over and move the cursor past them (#937)\n                return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    else if (sel instanceof NodeSelection && sel.node.isInline) {\n        return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n    }\n    else {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next)\n            return apply(view, next);\n        return false;\n    }\n}\nfunction nodeLen(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom, dir) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != \"BR\");\n}\nfunction skipIgnoredNodes(view, dir) {\n    return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view);\n}\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesBefore(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let moveNode, moveOffset, force = false;\n    // Gecko will do odd things when the selection is directly in front\n    // of a non-editable node, so in that case, move it into the next\n    // node if possible. Issue prosemirror/prosemirror#832.\n    if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset], -1))\n        force = true;\n    for (;;) {\n        if (offset > 0) {\n            if (node.nodeType != 1) {\n                break;\n            }\n            else {\n                let before = node.childNodes[offset - 1];\n                if (isIgnorable(before, -1)) {\n                    moveNode = node;\n                    moveOffset = --offset;\n                }\n                else if (before.nodeType == 3) {\n                    node = before;\n                    offset = node.nodeValue.length;\n                }\n                else\n                    break;\n            }\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let prev = node.previousSibling;\n            while (prev && isIgnorable(prev, -1)) {\n                moveNode = node.parentNode;\n                moveOffset = domIndex(prev);\n                prev = prev.previousSibling;\n            }\n            if (!prev) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = 0;\n            }\n            else {\n                node = prev;\n                offset = nodeLen(node);\n            }\n        }\n    }\n    if (force)\n        setSelFocus(view, node, offset);\n    else if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesAfter(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let len = nodeLen(node);\n    let moveNode, moveOffset;\n    for (;;) {\n        if (offset < len) {\n            if (node.nodeType != 1)\n                break;\n            let after = node.childNodes[offset];\n            if (isIgnorable(after, 1)) {\n                moveNode = node;\n                moveOffset = ++offset;\n            }\n            else\n                break;\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let next = node.nextSibling;\n            while (next && isIgnorable(next, 1)) {\n                moveNode = next.parentNode;\n                moveOffset = domIndex(next) + 1;\n                next = next.nextSibling;\n            }\n            if (!next) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = len = 0;\n            }\n            else {\n                node = next;\n                offset = 0;\n                len = nodeLen(node);\n            }\n        }\n    }\n    if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.node && desc.node.isBlock;\n}\nfunction textNodeAfter(node, offset) {\n    while (node && offset == node.childNodes.length && !hasBlockDesc(node)) {\n        offset = domIndex(node) + 1;\n        node = node.parentNode;\n    }\n    while (node && offset < node.childNodes.length) {\n        let next = node.childNodes[offset];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = 0;\n    }\n}\nfunction textNodeBefore(node, offset) {\n    while (node && !offset && !hasBlockDesc(node)) {\n        offset = domIndex(node);\n        node = node.parentNode;\n    }\n    while (node && offset) {\n        let next = node.childNodes[offset - 1];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = node.childNodes.length;\n    }\n}\nfunction setSelFocus(view, node, offset) {\n    if (node.nodeType != 3) {\n        let before, after;\n        if (after = textNodeAfter(node, offset)) {\n            node = after;\n            offset = 0;\n        }\n        else if (before = textNodeBefore(node, offset)) {\n            node = before;\n            offset = before.nodeValue.length;\n        }\n    }\n    let sel = view.domSelection();\n    if (!sel)\n        return;\n    if (selectionCollapsed(sel)) {\n        let range = document.createRange();\n        range.setEnd(node, offset);\n        range.setStart(node, offset);\n        sel.removeAllRanges();\n        sel.addRange(range);\n    }\n    else if (sel.extend) {\n        sel.extend(node, offset);\n    }\n    view.domObserver.setCurSelection();\n    let { state } = view;\n    // If no state update ends up happening, reset the selection.\n    setTimeout(() => {\n        if (view.state == state)\n            selectionToDOM(view);\n    }, 50);\n}\nfunction findDirection(view, pos) {\n    let $pos = view.state.doc.resolve(pos);\n    if (!(chrome || windows) && $pos.parent.inlineContent) {\n        let coords = view.coordsAtPos(pos);\n        if (pos > $pos.start()) {\n            let before = view.coordsAtPos(pos - 1);\n            let mid = (before.top + before.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1)\n                return before.left < coords.left ? \"ltr\" : \"rtl\";\n        }\n        if (pos < $pos.end()) {\n            let after = view.coordsAtPos(pos + 1);\n            let mid = (after.top + after.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1)\n                return after.left > coords.left ? \"ltr\" : \"rtl\";\n        }\n    }\n    let computed = getComputedStyle(view.dom).direction;\n    return computed == \"rtl\" ? \"rtl\" : \"ltr\";\n}\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n        return false;\n    if (mac && mods.indexOf(\"m\") > -1)\n        return false;\n    let { $from, $to } = sel;\n    if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next && (next instanceof NodeSelection))\n            return apply(view, next);\n    }\n    if (!$from.parent.inlineContent) {\n        let side = dir < 0 ? $from : $to;\n        let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n        return beyond ? apply(view, beyond) : false;\n    }\n    return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n    if (!(view.state.selection instanceof TextSelection))\n        return true;\n    let { $head, $anchor, empty } = view.state.selection;\n    if (!$head.sameParent($anchor))\n        return true;\n    if (!empty)\n        return false;\n    if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n        return true;\n    let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n    if (nextNode && !nextNode.isText) {\n        let tr = view.state.tr;\n        if (dir < 0)\n            tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n        else\n            tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n        view.dispatch(tr);\n        return true;\n    }\n    return false;\n}\nfunction switchEditable(view, node, state) {\n    view.domObserver.stop();\n    node.contentEditable = state;\n    view.domObserver.start();\n}\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n    if (!safari || view.state.selection.$head.parentOffset > 0)\n        return false;\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n        focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n        let child = focusNode.firstChild;\n        switchEditable(view, child, \"true\");\n        setTimeout(() => switchEditable(view, child, \"false\"), 20);\n    }\n    return false;\n}\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\nfunction getMods(event) {\n    let result = \"\";\n    if (event.ctrlKey)\n        result += \"c\";\n    if (event.metaKey)\n        result += \"m\";\n    if (event.altKey)\n        result += \"a\";\n    if (event.shiftKey)\n        result += \"s\";\n    return result;\n}\nfunction captureKeyDown(view, event) {\n    let code = event.keyCode, mods = getMods(event);\n    if (code == 8 || (mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n        return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);\n    }\n    else if ((code == 46 && !event.shiftKey) || (mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n        return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);\n    }\n    else if (code == 13 || code == 27) { // Enter, Esc\n        return true;\n    }\n    else if (code == 37 || (mac && code == 66 && mods == \"c\")) { // Left arrow, Ctrl-b on Mac\n        let dir = code == 37 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? -1 : 1) : -1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 39 || (mac && code == 70 && mods == \"c\")) { // Right arrow, Ctrl-f on Mac\n        let dir = code == 39 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? 1 : -1) : 1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 38 || (mac && code == 80 && mods == \"c\")) { // Up arrow, Ctrl-p on Mac\n        return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1);\n    }\n    else if (code == 40 || (mac && code == 78 && mods == \"c\")) { // Down arrow, Ctrl-n on Mac\n        return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1);\n    }\n    else if (mods == (mac ? \"m\" : \"c\") &&\n        (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n        return true;\n    }\n    return false;\n}\n\nfunction serializeForClipboard(view, slice) {\n    view.someProp(\"transformCopied\", f => { slice = f(slice, view); });\n    let context = [], { content, openStart, openEnd } = slice;\n    while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n        openStart--;\n        openEnd--;\n        let node = content.firstChild;\n        context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n        content = node.content;\n    }\n    let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n    let doc = detachedDoc(), wrap = doc.createElement(\"div\");\n    wrap.appendChild(serializer.serializeFragment(content, { document: doc }));\n    let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n    while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n        for (let i = needsWrap.length - 1; i >= 0; i--) {\n            let wrapper = doc.createElement(needsWrap[i]);\n            while (wrap.firstChild)\n                wrapper.appendChild(wrap.firstChild);\n            wrap.appendChild(wrapper);\n            wrappers++;\n        }\n        firstChild = wrap.firstChild;\n    }\n    if (firstChild && firstChild.nodeType == 1)\n        firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n    let text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n        slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n    return { dom: wrap, text, slice };\n}\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n    let inCode = $context.parent.type.spec.code;\n    let dom, slice;\n    if (!html && !text)\n        return null;\n    let asText = !!text && (plainText || inCode || !html);\n    if (asText) {\n        view.someProp(\"transformPastedText\", f => { text = f(text, inCode || plainText, view); });\n        if (inCode) {\n            slice = new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0);\n            view.someProp(\"transformPasted\", f => { slice = f(slice, view, true); });\n            return slice;\n        }\n        let parsed = view.someProp(\"clipboardTextParser\", f => f(text, $context, plainText, view));\n        if (parsed) {\n            slice = parsed;\n        }\n        else {\n            let marks = $context.marks();\n            let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n            dom = document.createElement(\"div\");\n            text.split(/(?:\\r\\n?|\\n)+/).forEach(block => {\n                let p = dom.appendChild(document.createElement(\"p\"));\n                if (block)\n                    p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n            });\n        }\n    }\n    else {\n        view.someProp(\"transformPastedHTML\", f => { html = f(html, view); });\n        dom = readHTML(html);\n        if (webkit)\n            restoreReplacedSpaces(dom);\n    }\n    let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n    let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n    if (sliceData && sliceData[3])\n        for (let i = +sliceData[3]; i > 0; i--) {\n            let child = dom.firstChild;\n            while (child && child.nodeType != 1)\n                child = child.nextSibling;\n            if (!child)\n                break;\n            dom = child;\n        }\n    if (!slice) {\n        let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n        slice = parser.parseSlice(dom, {\n            preserveWhitespace: !!(asText || sliceData),\n            context: $context,\n            ruleFromNode(dom) {\n                if (dom.nodeName == \"BR\" && !dom.nextSibling &&\n                    dom.parentNode && !inlineParents.test(dom.parentNode.nodeName))\n                    return { ignore: true };\n                return null;\n            }\n        });\n    }\n    if (sliceData) {\n        slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n    }\n    else { // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n        slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n        if (slice.openStart || slice.openEnd) {\n            let openStart = 0, openEnd = 0;\n            for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { }\n            for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { }\n            slice = closeSlice(slice, openStart, openEnd);\n        }\n    }\n    view.someProp(\"transformPasted\", f => { slice = f(slice, view, asText); });\n    return slice;\n}\nconst inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n    if (fragment.childCount < 2)\n        return fragment;\n    for (let d = $context.depth; d >= 0; d--) {\n        let parent = $context.node(d);\n        let match = parent.contentMatchAt($context.index(d));\n        let lastWrap, result = [];\n        fragment.forEach(node => {\n            if (!result)\n                return;\n            let wrap = match.findWrapping(node.type), inLast;\n            if (!wrap)\n                return result = null;\n            if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n                result[result.length - 1] = inLast;\n            }\n            else {\n                if (result.length)\n                    result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n                let wrapped = withWrappers(node, wrap);\n                result.push(wrapped);\n                match = match.matchType(wrapped.type);\n                lastWrap = wrap;\n            }\n        });\n        if (result)\n            return Fragment.from(result);\n    }\n    return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n    for (let i = wrap.length - 1; i >= from; i--)\n        node = wrap[i].create(null, Fragment.from(node));\n    return node;\n}\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n    if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n        let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n        if (inner)\n            return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n        let match = sibling.contentMatchAt(sibling.childCount);\n        if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n            return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n    }\n}\nfunction closeRight(node, depth) {\n    if (depth == 0)\n        return node;\n    let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n    let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n    return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n    let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n    if (fragment.childCount > 1)\n        openEnd = 0;\n    if (depth < to - 1)\n        inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n    if (depth >= from)\n        inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner)\n            : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n    return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n    if (openStart < slice.openStart)\n        slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n    if (openEnd < slice.openEnd)\n        slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n    return slice;\n}\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap = {\n    thead: [\"table\"],\n    tbody: [\"table\"],\n    tfoot: [\"table\"],\n    caption: [\"table\"],\n    colgroup: [\"table\"],\n    col: [\"table\", \"colgroup\"],\n    tr: [\"table\", \"tbody\"],\n    td: [\"table\", \"tbody\", \"tr\"],\n    th: [\"table\", \"tbody\", \"tr\"]\n};\nfunction detachedDoc() {\n    return document.implementation.createHTMLDocument(\"title\");\n}\nlet _policy = null;\nfunction maybeWrapTrusted(html) {\n    let trustedTypes = window.trustedTypes;\n    if (!trustedTypes)\n        return html;\n    // With the require-trusted-types-for CSP, Chrome will block\n    // innerHTML, even on a detached document. This wraps the string in\n    // a way that makes the browser allow us to use its parser again.\n    if (!_policy)\n        _policy = trustedTypes.defaultPolicy || trustedTypes.createPolicy(\"ProseMirrorClipboard\", { createHTML: (s) => s });\n    return _policy.createHTML(html);\n}\nfunction readHTML(html) {\n    let metas = /^(\\s*<meta [^>]*>)*/.exec(html);\n    if (metas)\n        html = html.slice(metas[0].length);\n    let doc = detachedDoc(), elt = doc.body;\n    let firstTag = /<([a-z][^>\\s]+)/i.exec(html), wrap;\n    if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])\n        html = wrap.map(n => \"<\" + n + \">\").join(\"\") + html + wrap.map(n => \"</\" + n + \">\").reverse().join(\"\");\n    elt.innerHTML = maybeWrapTrusted(html);\n    if (wrap)\n        for (let i = 0; i < wrap.length; i++)\n            elt = elt.querySelector(wrap[i]) || elt;\n    // Inline styles defined in the pasted content, so that parse rules pick them up\n    for (let i = 0; i < doc.styleSheets.length; i++) {\n        let style = doc.styleSheets[i];\n        for (let j = 0; j < style.rules.length; j++) {\n            let rule = style.rules[j];\n            if (rule instanceof CSSStyleRule) {\n                let matches = elt.querySelectorAll(rule.selectorText);\n                for (let k = 0; k < matches.length; k++)\n                    matches[k].style.cssText += rule.style.cssText;\n            }\n        }\n    }\n    return elt;\n}\n// Webkit browsers do some hard-to-predict replacement of regular\n// spaces with non-breaking spaces when putting content on the\n// clipboard. This tries to convert such non-breaking spaces (which\n// will be wrapped in a plain span on Chrome, a span with class\n// Apple-converted-space on Safari) back to regular spaces.\nfunction restoreReplacedSpaces(dom) {\n    let nodes = dom.querySelectorAll(chrome ? \"span:not([class]):not([style])\" : \"span.Apple-converted-space\");\n    for (let i = 0; i < nodes.length; i++) {\n        let node = nodes[i];\n        if (node.childNodes.length == 1 && node.textContent == \"\\u00a0\" && node.parentNode)\n            node.parentNode.replaceChild(dom.ownerDocument.createTextNode(\" \"), node);\n    }\n}\nfunction addContext(slice, context) {\n    if (!slice.size)\n        return slice;\n    let schema = slice.content.firstChild.type.schema, array;\n    try {\n        array = JSON.parse(context);\n    }\n    catch (e) {\n        return slice;\n    }\n    let { content, openStart, openEnd } = slice;\n    for (let i = array.length - 2; i >= 0; i -= 2) {\n        let type = schema.nodes[array[i]];\n        if (!type || type.hasRequiredAttrs())\n            break;\n        content = Fragment.from(type.create(array[i + 1], content));\n        openStart++;\n        openEnd++;\n    }\n    return new Slice(content, openStart, openEnd);\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nconst handlers = {};\nconst editHandlers = {};\nconst passiveHandlers = { touchstart: true, touchmove: true };\nclass InputState {\n    constructor() {\n        this.shiftKey = false;\n        this.mouseDown = null;\n        this.lastKeyCode = null;\n        this.lastKeyCodeTime = 0;\n        this.lastClick = { time: 0, x: 0, y: 0, type: \"\", button: 0 };\n        this.lastSelectionOrigin = null;\n        this.lastSelectionTime = 0;\n        this.lastIOSEnter = 0;\n        this.lastIOSEnterFallbackTimeout = -1;\n        this.lastFocus = 0;\n        this.lastTouch = 0;\n        this.lastChromeDelete = 0;\n        this.composing = false;\n        this.compositionNode = null;\n        this.composingTimeout = -1;\n        this.compositionNodes = [];\n        this.compositionEndedAt = -2e8;\n        this.compositionID = 1;\n        this.badSafariComposition = false;\n        // Set to a composition ID when there are pending changes at compositionend\n        this.compositionPendingChanges = 0;\n        this.domChangeCount = 0;\n        this.eventHandlers = Object.create(null);\n        this.hideSelectionGuard = null;\n    }\n}\nfunction initInput(view) {\n    for (let event in handlers) {\n        let handler = handlers[event];\n        view.dom.addEventListener(event, view.input.eventHandlers[event] = (event) => {\n            if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n                (view.editable || !(event.type in editHandlers)))\n                handler(view, event);\n        }, passiveHandlers[event] ? { passive: true } : undefined);\n    }\n    // On Safari, for reasons beyond my understanding, adding an input\n    // event handler makes an issue where the composition vanishes when\n    // you press enter go away.\n    if (safari)\n        view.dom.addEventListener(\"input\", () => null);\n    ensureListeners(view);\n}\nfunction setSelectionOrigin(view, origin) {\n    view.input.lastSelectionOrigin = origin;\n    view.input.lastSelectionTime = Date.now();\n}\nfunction destroyInput(view) {\n    if (view.input.mouseDown)\n        view.input.mouseDown.done();\n    view.domObserver.stop();\n    for (let type in view.input.eventHandlers)\n        view.dom.removeEventListener(type, view.input.eventHandlers[type]);\n    clearTimeout(view.input.composingTimeout);\n    clearTimeout(view.input.lastIOSEnterFallbackTimeout);\n}\nfunction ensureListeners(view) {\n    view.someProp(\"handleDOMEvents\", currentHandlers => {\n        for (let type in currentHandlers)\n            if (!view.input.eventHandlers[type])\n                view.dom.addEventListener(type, view.input.eventHandlers[type] = event => runCustomHandler(view, event));\n    });\n}\nfunction runCustomHandler(view, event) {\n    return view.someProp(\"handleDOMEvents\", handlers => {\n        let handler = handlers[event.type];\n        return handler ? handler(view, event) || event.defaultPrevented : false;\n    });\n}\nfunction eventBelongsToView(view, event) {\n    if (!event.bubbles)\n        return true;\n    if (event.defaultPrevented)\n        return false;\n    for (let node = event.target; node != view.dom; node = node.parentNode)\n        if (!node || node.nodeType == 11 ||\n            (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n            return false;\n    return true;\n}\nfunction dispatchEvent(view, event) {\n    if (!runCustomHandler(view, event) && handlers[event.type] &&\n        (view.editable || !(event.type in editHandlers)))\n        handlers[event.type](view, event);\n}\neditHandlers.keydown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.keyCode == 16 || event.shiftKey;\n    if (inOrNearComposition(view))\n        return;\n    view.input.lastKeyCode = event.keyCode;\n    view.input.lastKeyCodeTime = Date.now();\n    // Suppress enter key events on Chrome Android, because those tend\n    // to be part of a confused sequence of composition events fired,\n    // and handling them eagerly tends to corrupt the input.\n    if (android && chrome && event.keyCode == 13)\n        return;\n    if (event.keyCode != 229)\n        view.domObserver.forceFlush();\n    // On iOS, if we preventDefault enter key presses, the virtual\n    // keyboard gets confused. So the hack here is to set a flag that\n    // makes the DOM change code recognize that what just happens should\n    // be replaced by whatever the Enter key handlers do.\n    if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n        let now = Date.now();\n        view.input.lastIOSEnter = now;\n        view.input.lastIOSEnterFallbackTimeout = setTimeout(() => {\n            if (view.input.lastIOSEnter == now) {\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")));\n                view.input.lastIOSEnter = 0;\n            }\n        }, 200);\n    }\n    else if (view.someProp(\"handleKeyDown\", f => f(view, event)) || captureKeyDown(view, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"key\");\n    }\n};\neditHandlers.keyup = (view, event) => {\n    if (event.keyCode == 16)\n        view.input.shiftKey = false;\n};\neditHandlers.keypress = (view, _event) => {\n    let event = _event;\n    if (inOrNearComposition(view) || !event.charCode ||\n        event.ctrlKey && !event.altKey || mac && event.metaKey)\n        return;\n    if (view.someProp(\"handleKeyPress\", f => f(view, event))) {\n        event.preventDefault();\n        return;\n    }\n    let sel = view.state.selection;\n    if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n        let text = String.fromCharCode(event.charCode);\n        let deflt = () => view.state.tr.insertText(text).scrollIntoView();\n        if (!/[\\r\\n]/.test(text) && !view.someProp(\"handleTextInput\", f => f(view, sel.$from.pos, sel.$to.pos, text, deflt)))\n            view.dispatch(deflt());\n        event.preventDefault();\n    }\n};\nfunction eventCoords(event) { return { left: event.clientX, top: event.clientY }; }\nfunction isNear(event, click) {\n    let dx = click.x - event.clientX, dy = click.y - event.clientY;\n    return dx * dx + dy * dy < 100;\n}\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        if (view.someProp(propName, f => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n            : f(view, pos, $pos.node(i), $pos.before(i), event, false)))\n            return true;\n    }\n    return false;\n}\nfunction updateSelection(view, selection, origin) {\n    if (!view.focused)\n        view.focus();\n    if (view.state.selection.eq(selection))\n        return;\n    let tr = view.state.tr.setSelection(selection);\n    if (origin == \"pointer\")\n        tr.setMeta(\"pointer\", true);\n    view.dispatch(tr);\n}\nfunction selectClickedLeaf(view, inside) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n    if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n        updateSelection(view, new NodeSelection($pos), \"pointer\");\n        return true;\n    }\n    return false;\n}\nfunction selectClickedNode(view, inside) {\n    if (inside == -1)\n        return false;\n    let sel = view.state.selection, selectedNode, selectAt;\n    if (sel instanceof NodeSelection)\n        selectedNode = sel.node;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        if (NodeSelection.isSelectable(node)) {\n            if (selectedNode && sel.$from.depth > 0 &&\n                i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n                selectAt = $pos.before(sel.$from.depth);\n            else\n                selectAt = $pos.before(i);\n            break;\n        }\n    }\n    if (selectAt != null) {\n        updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n        return true;\n    }\n    else {\n        return false;\n    }\n}\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n    return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleClick\", f => f(view, pos, event)) ||\n        (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside));\n}\nfunction handleDoubleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleDoubleClick\", f => f(view, pos, event));\n}\nfunction handleTripleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleTripleClick\", f => f(view, pos, event)) ||\n        defaultTripleClick(view, inside, event);\n}\nfunction defaultTripleClick(view, inside, event) {\n    if (event.button != 0)\n        return false;\n    let selection = selectionForTripleClick(view, inside, true), doc = view.state.doc;\n    if (!selection)\n        return false;\n    updateSelection(view, selection, \"pointer\");\n    if (selection instanceof TextSelection && doc.eq(view.state.doc))\n        view.input.mouseDown = new TripleClickDrag(view, selection);\n    return true;\n}\nfunction selectionForTripleClick(view, inside, selectNodes) {\n    let doc = view.state.doc;\n    if (inside == -1)\n        return doc.inlineContent ? TextSelection.create(doc, 0, doc.content.size) : null;\n    let $pos = doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        let nodePos = $pos.before(i);\n        if (node.inlineContent)\n            return TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size);\n        else if (selectNodes && NodeSelection.isSelectable(node))\n            return NodeSelection.create(doc, nodePos);\n    }\n    return null;\n}\nfunction forceDOMFlush(view) {\n    return endComposition(view);\n}\nconst selectNodeModifier = mac ? \"metaKey\" : \"ctrlKey\";\nhandlers.mousedown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.shiftKey;\n    let flushed = forceDOMFlush(view);\n    let now = Date.now(), type = \"singleClick\";\n    if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier] &&\n        view.input.lastClick.button == event.button) {\n        if (view.input.lastClick.type == \"singleClick\")\n            type = \"doubleClick\";\n        else if (view.input.lastClick.type == \"doubleClick\")\n            type = \"tripleClick\";\n    }\n    view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type, button: event.button };\n    if (view.input.mouseDown)\n        view.input.mouseDown.done();\n    let pos = view.posAtCoords(eventCoords(event));\n    if (!pos)\n        return;\n    if (type == \"singleClick\") {\n        view.input.mouseDown = new LeftMouseDown(view, pos, event, !!flushed);\n    }\n    else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"pointer\");\n    }\n};\nclass MouseDown {\n    constructor(view) {\n        this.view = view;\n        this.mightDrag = null;\n        view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n        view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n    }\n    up(event) {\n        this.done();\n    }\n    move(event) {\n        if (event.buttons == 0)\n            this.done();\n    }\n    done() {\n        this.view.root.removeEventListener(\"mouseup\", this.up);\n        this.view.root.removeEventListener(\"mousemove\", this.move);\n        if (this.view.input.mouseDown == this)\n            this.view.input.mouseDown = null;\n    }\n    delaySelUpdate() { return false; }\n}\nclass LeftMouseDown extends MouseDown {\n    constructor(view, pos, event, flushed) {\n        super(view);\n        this.pos = pos;\n        this.event = event;\n        this.flushed = flushed;\n        this.delayedSelectionSync = false;\n        this.startDoc = view.state.doc;\n        this.selectNode = !!event[selectNodeModifier];\n        this.allowDefault = event.shiftKey;\n        let targetNode, targetPos;\n        if (pos.inside > -1) {\n            targetNode = view.state.doc.nodeAt(pos.inside);\n            targetPos = pos.inside;\n        }\n        else {\n            let $pos = view.state.doc.resolve(pos.pos);\n            targetNode = $pos.parent;\n            targetPos = $pos.depth ? $pos.before() : 0;\n        }\n        const target = flushed ? null : event.target;\n        const targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n        this.target = targetDesc && targetDesc.nodeDOM.nodeType == 1 ? targetDesc.nodeDOM : null;\n        let { selection } = view.state;\n        if (event.button == 0 &&\n            (targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n                selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos))\n            this.mightDrag = {\n                node: targetNode,\n                pos: targetPos,\n                addAttr: !!(this.target && !this.target.draggable),\n                setUneditable: !!(this.target && gecko && !this.target.hasAttribute(\"contentEditable\"))\n            };\n        if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.draggable = true;\n            if (this.mightDrag.setUneditable)\n                setTimeout(() => {\n                    if (this.view.input.mouseDown == this)\n                        this.target.setAttribute(\"contentEditable\", \"false\");\n                }, 20);\n            this.view.domObserver.start();\n        }\n        setSelectionOrigin(view, \"pointer\");\n    }\n    done() {\n        super.done();\n        if (this.mightDrag && this.target) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.removeAttribute(\"draggable\");\n            if (this.mightDrag.setUneditable)\n                this.target.removeAttribute(\"contentEditable\");\n            this.view.domObserver.start();\n        }\n        if (this.delayedSelectionSync)\n            setTimeout(() => {\n                if (!this.view.isDestroyed)\n                    selectionToDOM(this.view);\n            });\n    }\n    up(event) {\n        this.done();\n        if (!this.view.dom.contains(event.target))\n            return;\n        let pos = this.pos;\n        if (this.view.state.doc != this.startDoc)\n            pos = this.view.posAtCoords(eventCoords(event));\n        this.updateAllowDefault(event);\n        if (this.allowDefault || !pos) {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n        else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n            event.preventDefault();\n        }\n        else if (event.button == 0 &&\n            (this.flushed ||\n                // Safari ignores clicks on draggable elements\n                (safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n                // Chrome will sometimes treat a node selection as a\n                // cursor, but still report that the node is selected\n                // when asked through getSelection. You'll then get a\n                // situation where clicking at the point where that\n                // (hidden) cursor is doesn't change the selection, and\n                // thus doesn't get a reaction from ProseMirror. This\n                // works around that.\n                (chrome && !this.view.state.selection.visible &&\n                    Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2))) {\n            updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n            event.preventDefault();\n        }\n        else {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n    }\n    move(event) {\n        this.updateAllowDefault(event);\n        setSelectionOrigin(this.view, \"pointer\");\n        super.move(event);\n    }\n    updateAllowDefault(event) {\n        if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n            Math.abs(this.event.y - event.clientY) > 4))\n            this.allowDefault = true;\n    }\n    delaySelUpdate() {\n        if (!this.allowDefault)\n            return false;\n        this.delayedSelectionSync = true;\n        return true;\n    }\n}\nclass TripleClickDrag extends MouseDown {\n    constructor(view, startSelection) {\n        super(view);\n        this.startSelection = startSelection;\n        this.startDoc = view.state.doc;\n    }\n    move(event) {\n        if (event.buttons == 0 || this.view.isDestroyed || !this.view.state.doc.eq(this.startDoc)) {\n            this.done();\n            return;\n        }\n        event.preventDefault();\n        setSelectionOrigin(this.view, \"pointer\");\n        let pos = this.view.posAtCoords(eventCoords(event));\n        let target = pos && selectionForTripleClick(this.view, pos.inside, false);\n        if (!target)\n            return;\n        let { doc } = this.view.state, start = this.startSelection;\n        let [anchor, head] = target.from < start.from ? [start.to, target.from] : [start.from, target.to];\n        updateSelection(this.view, TextSelection.create(doc, anchor, head), \"pointer\");\n    }\n}\nhandlers.touchstart = view => {\n    view.input.lastTouch = Date.now();\n    forceDOMFlush(view);\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.touchmove = view => {\n    view.input.lastTouch = Date.now();\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.contextmenu = view => forceDOMFlush(view);\nfunction inOrNearComposition(view, event) {\n    if (view.composing)\n        return true;\n    // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n    // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n    // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n    // emitted. The keydown event triggers newline insertion, which we don't want.\n    // This method returns true if the keydown event should be ignored.\n    // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n    // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n    // This guards against the case where compositionend is triggered without the keyboard\n    // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n    // afterwards- we wouldn't want to ignore the keydown event in this case.\n    if (safari && Math.abs(Date.now() - view.input.compositionEndedAt) < 500) {\n        view.input.compositionEndedAt = -2e8;\n        return true;\n    }\n    return false;\n}\n// Drop active composition after 5 seconds of inactivity on Android\nconst timeoutComposition = android ? 5000 : -1;\neditHandlers.compositionstart = editHandlers.compositionupdate = view => {\n    if (!view.composing) {\n        view.domObserver.flush();\n        let { state } = view, $pos = state.selection.$to;\n        if (state.selection instanceof TextSelection &&\n            (state.storedMarks ||\n                (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)) ||\n                chrome && windows && selectionBeforeUneditable(view))) { // Issue #1500\n            // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n            view.markCursor = view.state.storedMarks || $pos.marks();\n            endComposition(view, true);\n            view.markCursor = null;\n        }\n        else {\n            endComposition(view, !state.selection.empty);\n            // In firefox, if the cursor is after but outside a marked node,\n            // the inserted text won't inherit the marks. So this moves it\n            // inside if necessary.\n            if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n                let sel = view.domSelectionRange();\n                for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n                    let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n                    if (!before)\n                        break;\n                    if (before.nodeType == 3) {\n                        let sel = view.domSelection();\n                        if (sel)\n                            sel.collapse(before, before.nodeValue.length);\n                        break;\n                    }\n                    else {\n                        node = before;\n                        offset = -1;\n                    }\n                }\n            }\n        }\n        view.input.composing = true;\n    }\n    scheduleComposeEnd(view, timeoutComposition);\n};\nfunction selectionBeforeUneditable(view) {\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    if (!focusNode || focusNode.nodeType != 1 || focusOffset >= focusNode.childNodes.length)\n        return false;\n    let next = focusNode.childNodes[focusOffset];\n    return next.nodeType == 1 && next.contentEditable == \"false\";\n}\neditHandlers.compositionend = (view, event) => {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = Date.now();\n        view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0;\n        view.input.compositionNode = null;\n        if (view.input.badSafariComposition)\n            view.domObserver.forceFlush();\n        else if (view.input.compositionPendingChanges)\n            Promise.resolve().then(() => view.domObserver.flush());\n        view.input.compositionID++;\n        scheduleComposeEnd(view, 20);\n    }\n};\nfunction scheduleComposeEnd(view, delay) {\n    clearTimeout(view.input.composingTimeout);\n    if (delay > -1)\n        view.input.composingTimeout = setTimeout(() => endComposition(view), delay);\n}\nfunction clearComposition(view) {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = Date.now();\n    }\n    while (view.input.compositionNodes.length > 0)\n        view.input.compositionNodes.pop().markParentsDirty();\n}\nfunction findCompositionNode(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.focusNode)\n        return null;\n    let textBefore = textNodeBefore$1(sel.focusNode, sel.focusOffset);\n    let textAfter = textNodeAfter$1(sel.focusNode, sel.focusOffset);\n    if (textBefore && textAfter && textBefore != textAfter) {\n        let descAfter = textAfter.pmViewDesc, lastChanged = view.domObserver.lastChangedTextNode;\n        if (textBefore == lastChanged || textAfter == lastChanged)\n            return lastChanged;\n        if (!descAfter || !descAfter.isText(textAfter.nodeValue)) {\n            return textAfter;\n        }\n        else if (view.input.compositionNode == textAfter) {\n            let descBefore = textBefore.pmViewDesc;\n            if (!(!descBefore || !descBefore.isText(textBefore.nodeValue)))\n                return textAfter;\n        }\n    }\n    return textBefore || textAfter;\n}\n/**\n@internal\n*/\nfunction endComposition(view, restarting = false) {\n    if (android && view.domObserver.flushingSoon >= 0)\n        return;\n    view.domObserver.forceFlush();\n    clearComposition(view);\n    if (restarting || view.docView && view.docView.dirty) {\n        let sel = selectionFromDOM(view), cur = view.state.selection;\n        if (sel && !sel.eq(cur))\n            view.dispatch(view.state.tr.setSelection(sel));\n        else if ((view.markCursor || restarting) && !cur.$from.node(cur.$from.sharedDepth(cur.to)).inlineContent)\n            view.dispatch(view.state.tr.deleteSelection());\n        else\n            view.updateState(view.state);\n        return true;\n    }\n    return false;\n}\nfunction captureCopy(view, dom) {\n    // The extra wrapper is somehow necessary on IE/Edge to prevent the\n    // content from being mangled when it is put onto the clipboard\n    if (!view.dom.parentNode)\n        return;\n    let wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n    wrap.appendChild(dom);\n    wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    let sel = getSelection(), range = document.createRange();\n    range.selectNodeContents(dom);\n    // Done because IE will fire a selectionchange moving the selection\n    // to its start when removeAllRanges is called and the editor still\n    // has focus (which will mess up the editor's selection state).\n    view.dom.blur();\n    sel.removeAllRanges();\n    sel.addRange(range);\n    setTimeout(() => {\n        if (wrap.parentNode)\n            wrap.parentNode.removeChild(wrap);\n        view.focus();\n    }, 50);\n}\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nconst brokenClipboardAPI = (ie && ie_version < 15) ||\n    (ios && webkit_version < 604);\nhandlers.copy = editHandlers.cut = (view, _event) => {\n    let event = _event;\n    let sel = view.state.selection, cut = event.type == \"cut\";\n    if (sel.empty)\n        return;\n    // IE and Edge's clipboard interface is completely broken\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let slice = sel.content(), { dom, text } = serializeForClipboard(view, slice);\n    if (data) {\n        event.preventDefault();\n        data.clearData();\n        data.setData(\"text/html\", dom.innerHTML);\n        data.setData(\"text/plain\", text);\n    }\n    else {\n        captureCopy(view, dom);\n    }\n    if (cut)\n        view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n};\nfunction sliceSingleNode(slice) {\n    return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null;\n}\nfunction capturePaste(view, event) {\n    if (!view.dom.parentNode)\n        return;\n    let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code;\n    let target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n    if (!plainText)\n        target.contentEditable = \"true\";\n    target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    target.focus();\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    setTimeout(() => {\n        view.focus();\n        if (target.parentNode)\n            target.parentNode.removeChild(target);\n        if (plainText)\n            doPaste(view, target.value, null, plain, event);\n        else\n            doPaste(view, target.textContent, target.innerHTML, plain, event);\n    }, 50);\n}\nfunction doPaste(view, text, html, preferPlain, event) {\n    let slice = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from);\n    if (view.someProp(\"handlePaste\", f => f(view, event, slice || Slice.empty)))\n        return true;\n    if (!slice)\n        return false;\n    let singleNode = sliceSingleNode(slice);\n    let tr = singleNode\n        ? view.state.tr.replaceSelectionWith(singleNode, preferPlain)\n        : view.state.tr.replaceSelection(slice);\n    view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n    return true;\n}\nfunction getText(clipboardData) {\n    let text = clipboardData.getData(\"text/plain\") || clipboardData.getData(\"Text\");\n    if (text)\n        return text;\n    let uris = clipboardData.getData(\"text/uri-list\");\n    return uris ? uris.replace(/\\r?\\n/g, \" \") : \"\";\n}\neditHandlers.paste = (view, _event) => {\n    let event = _event;\n    // Handling paste from JavaScript during composition is very poorly\n    // handled by browsers, so as a dodgy but preferable kludge, we just\n    // let the browser do its native thing there, except on Android,\n    // where the editor is almost always composing.\n    if (view.composing && !android)\n        return;\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    if (data && doPaste(view, getText(data), data.getData(\"text/html\"), plain, event))\n        event.preventDefault();\n    else\n        capturePaste(view, event);\n};\nclass Dragging {\n    constructor(slice, move, node) {\n        this.slice = slice;\n        this.move = move;\n        this.node = node;\n    }\n}\nconst dragCopyModifier = mac ? \"altKey\" : \"ctrlKey\";\nfunction dragMoves(view, event) {\n    let copy;\n    view.someProp(\"dragCopies\", test => { copy = copy || test(event); });\n    return copy != null ? !copy : !event[dragCopyModifier];\n}\nhandlers.dragstart = (view, _event) => {\n    let event = _event;\n    let mouseDown = view.input.mouseDown;\n    if (mouseDown)\n        mouseDown.done();\n    if (!event.dataTransfer)\n        return;\n    let sel = view.state.selection;\n    let pos = sel.empty ? null : view.posAtCoords(eventCoords(event));\n    let node;\n    if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) ;\n    else if (mouseDown && mouseDown.mightDrag) {\n        node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos);\n    }\n    else if (event.target && event.target.nodeType == 1) {\n        let desc = view.docView.nearestDesc(event.target, true);\n        if (desc && desc.node.type.spec.draggable && desc != view.docView)\n            node = NodeSelection.create(view.state.doc, desc.posBefore);\n    }\n    let draggedSlice = (node || view.state.selection).content();\n    let { dom, text, slice } = serializeForClipboard(view, draggedSlice);\n    // Pre-120 Chrome versions clear files when calling `clearData` (#1472)\n    if (!event.dataTransfer.files.length || !chrome || chrome_version > 120)\n        event.dataTransfer.clearData();\n    event.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n    // See https://code.haverbeke.berlin/prosemirror/prosemirror/issues/1156\n    event.dataTransfer.effectAllowed = \"copyMove\";\n    if (!brokenClipboardAPI)\n        event.dataTransfer.setData(\"text/plain\", text);\n    view.dragging = new Dragging(slice, dragMoves(view, event), node);\n};\nhandlers.dragend = view => {\n    let dragging = view.dragging;\n    window.setTimeout(() => {\n        if (view.dragging == dragging)\n            view.dragging = null;\n    }, 50);\n};\neditHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault();\neditHandlers.drop = (view, event) => {\n    try {\n        handleDrop(view, event, view.dragging);\n    }\n    finally {\n        view.dragging = null;\n    }\n};\nfunction handleDrop(view, event, dragging) {\n    if (!event.dataTransfer)\n        return;\n    let eventPos = view.posAtCoords(eventCoords(event));\n    if (!eventPos)\n        return;\n    let $mouse = view.state.doc.resolve(eventPos.pos);\n    let slice = dragging && dragging.slice;\n    if (slice) {\n        view.someProp(\"transformPasted\", f => { slice = f(slice, view, false); });\n    }\n    else {\n        slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData(\"text/html\"), false, $mouse);\n    }\n    let move = !!(dragging && dragMoves(view, event));\n    if (view.someProp(\"handleDrop\", f => f(view, event, slice || Slice.empty, move))) {\n        event.preventDefault();\n        return;\n    }\n    if (!slice)\n        return;\n    event.preventDefault();\n    let insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n    if (insertPos == null)\n        insertPos = $mouse.pos;\n    let tr = view.state.tr;\n    if (move) {\n        let { node } = dragging;\n        if (node)\n            node.replace(tr);\n        else\n            tr.deleteSelection();\n    }\n    let pos = tr.mapping.map(insertPos);\n    let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n    let beforeInsert = tr.doc;\n    if (isNode)\n        tr.replaceRangeWith(pos, pos, slice.content.firstChild);\n    else\n        tr.replaceRange(pos, pos, slice);\n    if (tr.doc.eq(beforeInsert))\n        return;\n    let $pos = tr.doc.resolve(pos);\n    if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n        $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n        tr.setSelection(new NodeSelection($pos));\n    }\n    else {\n        let end = tr.mapping.map(insertPos);\n        tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo);\n        tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n    }\n    view.focus();\n    view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n}\nhandlers.focus = view => {\n    view.input.lastFocus = Date.now();\n    if (!view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.add(\"ProseMirror-focused\");\n        view.domObserver.start();\n        view.focused = true;\n        setTimeout(() => {\n            if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange()))\n                selectionToDOM(view);\n        }, 20);\n    }\n};\nhandlers.blur = (view, _event) => {\n    let event = _event;\n    if (view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.remove(\"ProseMirror-focused\");\n        view.domObserver.start();\n        if (event.relatedTarget && view.dom.contains(event.relatedTarget))\n            view.domObserver.currentSelection.clear();\n        view.focused = false;\n    }\n};\nhandlers.beforeinput = (view, _event) => {\n    let event = _event;\n    // We should probably do more with beforeinput events, but support\n    // is so spotty that I'm still waiting to see where they are going.\n    // Very specific hack to deal with backspace sometimes failing on\n    // Chrome and Firefox Android when after an uneditable node.\n    if (android && event.inputType == \"deleteContentBackward\") {\n        view.domObserver.flushSoon();\n        let { domChangeCount } = view.input;\n        setTimeout(() => {\n            if (view.input.domChangeCount != domChangeCount)\n                return; // Event already had some effect\n            // This bug tends to close the virtual keyboard, so we refocus\n            view.dom.blur();\n            view.focus();\n            if (view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\"))))\n                return;\n            let { $cursor } = view.state.selection;\n            // Crude approximation of backspace behavior when no command handled it\n            if ($cursor && $cursor.pos > 0)\n                view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView());\n        }, 50);\n    }\n};\n// Make sure all handlers get registered\nfor (let prop in editHandlers)\n    handlers[prop] = editHandlers[prop];\n\nfunction compareObjs(a, b) {\n    if (a == b)\n        return true;\n    for (let p in a)\n        if (a[p] !== b[p])\n            return false;\n    for (let p in b)\n        if (!(p in a))\n            return false;\n    return true;\n}\nclass WidgetType {\n    constructor(toDOM, spec) {\n        this.toDOM = toDOM;\n        this.spec = spec || noSpec;\n        this.side = this.spec.side || 0;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n        return deleted ? null : new Decoration(pos - offset, pos - offset, this);\n    }\n    valid() { return true; }\n    eq(other) {\n        return this == other ||\n            (other instanceof WidgetType &&\n                (this.spec.key && this.spec.key == other.spec.key ||\n                    this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)));\n    }\n    destroy(node) {\n        if (this.spec.destroy)\n            this.spec.destroy(node);\n    }\n}\nclass InlineType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n        let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n        return from >= to ? null : new Decoration(from, to, this);\n    }\n    valid(_, span) { return span.from < span.to; }\n    eq(other) {\n        return this == other ||\n            (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    static is(span) { return span.type instanceof InlineType; }\n    destroy() { }\n}\nclass NodeType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.mapResult(span.from + oldOffset, 1);\n        if (from.deleted)\n            return null;\n        let to = mapping.mapResult(span.to + oldOffset, -1);\n        if (to.deleted || to.pos <= from.pos)\n            return null;\n        return new Decoration(from.pos - offset, to.pos - offset, this);\n    }\n    valid(node, span) {\n        let { index, offset } = node.content.findIndex(span.from), child;\n        return offset == span.from && !(child = node.child(index)).isText && offset + child.nodeSize == span.to;\n    }\n    eq(other) {\n        return this == other ||\n            (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    destroy() { }\n}\n/**\nDecoration objects can be provided to the view through the\n[`decorations` prop](https://prosemirror.net/docs/ref/#view.EditorProps.decorations). They come in\nseveral variants—see the static members of this class for details.\n*/\nclass Decoration {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The start position of the decoration.\n    */\n    from, \n    /**\n    The end position. Will be the same as `from` for [widget\n    decorations](https://prosemirror.net/docs/ref/#view.Decoration^widget).\n    */\n    to, \n    /**\n    @internal\n    */\n    type) {\n        this.from = from;\n        this.to = to;\n        this.type = type;\n    }\n    /**\n    @internal\n    */\n    copy(from, to) {\n        return new Decoration(from, to, this.type);\n    }\n    /**\n    @internal\n    */\n    eq(other, offset = 0) {\n        return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to;\n    }\n    /**\n    @internal\n    */\n    map(mapping, offset, oldOffset) {\n        return this.type.map(mapping, this, offset, oldOffset);\n    }\n    /**\n    Creates a widget decoration, which is a DOM node that's shown in\n    the document at the given position. It is recommended that you\n    delay rendering the widget by passing a function that will be\n    called when the widget is actually drawn in a view, but you can\n    also directly pass a DOM node. `getPos` can be used to find the\n    widget's current document position.\n    */\n    static widget(pos, toDOM, spec) {\n        return new Decoration(pos, pos, new WidgetType(toDOM, spec));\n    }\n    /**\n    Creates an inline decoration, which adds the given attributes to\n    each inline node between `from` and `to`.\n    */\n    static inline(from, to, attrs, spec) {\n        return new Decoration(from, to, new InlineType(attrs, spec));\n    }\n    /**\n    Creates a node decoration. `from` and `to` should point precisely\n    before and after a node in the document. That node, and only that\n    node, will receive the given attributes.\n    */\n    static node(from, to, attrs, spec) {\n        return new Decoration(from, to, new NodeType(attrs, spec));\n    }\n    /**\n    The spec provided when creating this decoration. Can be useful\n    if you've stored extra information in that object.\n    */\n    get spec() { return this.type.spec; }\n    /**\n    @internal\n    */\n    get inline() { return this.type instanceof InlineType; }\n    /**\n    @internal\n    */\n    get widget() { return this.type instanceof WidgetType; }\n}\nconst none = [], noSpec = {};\n/**\nA collection of [decorations](https://prosemirror.net/docs/ref/#view.Decoration), organized in such\na way that the drawing algorithm can efficiently use and compare\nthem. This is a persistent data structure—it is not modified,\nupdates create a new value.\n*/\nclass DecorationSet {\n    /**\n    @internal\n    */\n    constructor(local, children) {\n        this.local = local.length ? local : none;\n        this.children = children.length ? children : none;\n    }\n    /**\n    Create a set of decorations, using the structure of the given\n    document. This will consume (modify) the `decorations` array, so\n    you must make a copy if you want need to preserve that.\n    */\n    static create(doc, decorations) {\n        return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty;\n    }\n    /**\n    Find all decorations in this set which touch the given range\n    (including decorations that start or end directly at the\n    boundaries) and match the given predicate on their spec. When\n    `start` and `end` are omitted, all decorations in the set are\n    considered. When `predicate` isn't given, all decorations are\n    assumed to match.\n    */\n    find(start, end, predicate) {\n        let result = [];\n        this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n        return result;\n    }\n    findInner(start, end, result, offset, predicate) {\n        for (let i = 0; i < this.local.length; i++) {\n            let span = this.local[i];\n            if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n                result.push(span.copy(span.from + offset, span.to + offset));\n        }\n        for (let i = 0; i < this.children.length; i += 3) {\n            if (this.children[i] < end && this.children[i + 1] > start) {\n                let childOff = this.children[i] + 1;\n                this.children[i + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n            }\n        }\n    }\n    /**\n    Map the set of decorations in response to a change in the\n    document.\n    */\n    map(mapping, doc, options) {\n        if (this == empty || mapping.maps.length == 0)\n            return this;\n        return this.mapInner(mapping, doc, 0, 0, options || noSpec);\n    }\n    /**\n    @internal\n    */\n    mapInner(mapping, node, offset, oldOffset, options) {\n        let newLocal;\n        for (let i = 0; i < this.local.length; i++) {\n            let mapped = this.local[i].map(mapping, offset, oldOffset);\n            if (mapped && mapped.type.valid(node, mapped))\n                (newLocal || (newLocal = [])).push(mapped);\n            else if (options.onRemove)\n                options.onRemove(this.local[i].spec);\n        }\n        if (this.children.length)\n            return mapChildren(this.children, newLocal || [], mapping, node, offset, oldOffset, options);\n        else\n            return newLocal ? new DecorationSet(newLocal.sort(byPos), none) : empty;\n    }\n    /**\n    Add the given array of decorations to the ones in the set,\n    producing a new set. Consumes the `decorations` array. Needs\n    access to the current document to create the appropriate tree\n    structure.\n    */\n    add(doc, decorations) {\n        if (!decorations.length)\n            return this;\n        if (this == empty)\n            return DecorationSet.create(doc, decorations);\n        return this.addInner(doc, decorations, 0);\n    }\n    addInner(doc, decorations, offset) {\n        let children, childIndex = 0;\n        doc.forEach((childNode, childOffset) => {\n            let baseOffset = childOffset + offset, found;\n            if (!(found = takeSpansForNode(decorations, childNode, baseOffset)))\n                return;\n            if (!children)\n                children = this.children.slice();\n            while (childIndex < children.length && children[childIndex] < childOffset)\n                childIndex += 3;\n            if (children[childIndex] == childOffset)\n                children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1);\n            else\n                children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec));\n            childIndex += 3;\n        });\n        let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n        for (let i = 0; i < local.length; i++)\n            if (!local[i].type.valid(doc, local[i]))\n                local.splice(i--, 1);\n        return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children);\n    }\n    /**\n    Create a new set that contains the decorations in this set, minus\n    the ones in the given array.\n    */\n    remove(decorations) {\n        if (decorations.length == 0 || this == empty)\n            return this;\n        return this.removeInner(decorations, 0);\n    }\n    removeInner(decorations, offset) {\n        let children = this.children, local = this.local;\n        for (let i = 0; i < children.length; i += 3) {\n            let found;\n            let from = children[i] + offset, to = children[i + 1] + offset;\n            for (let j = 0, span; j < decorations.length; j++)\n                if (span = decorations[j]) {\n                    if (span.from > from && span.to < to) {\n                        decorations[j] = null;\n                        (found || (found = [])).push(span);\n                    }\n                }\n            if (!found)\n                continue;\n            if (children == this.children)\n                children = this.children.slice();\n            let removed = children[i + 2].removeInner(found, from + 1);\n            if (removed != empty) {\n                children[i + 2] = removed;\n            }\n            else {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        }\n        if (local.length)\n            for (let i = 0, span; i < decorations.length; i++)\n                if (span = decorations[i]) {\n                    for (let j = 0; j < local.length; j++)\n                        if (local[j].eq(span, offset)) {\n                            if (local == this.local)\n                                local = this.local.slice();\n                            local.splice(j--, 1);\n                        }\n                }\n        if (children == this.children && local == this.local)\n            return this;\n        return local.length || children.length ? new DecorationSet(local, children) : empty;\n    }\n    forChild(offset, node) {\n        if (this == empty)\n            return this;\n        if (node.isLeaf)\n            return DecorationSet.empty;\n        let child, local;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] >= offset) {\n                if (this.children[i] == offset)\n                    child = this.children[i + 2];\n                break;\n            }\n        let start = offset + 1, end = start + node.content.size;\n        for (let i = 0; i < this.local.length; i++) {\n            let dec = this.local[i];\n            if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n                let from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n                if (from < to)\n                    (local || (local = [])).push(dec.copy(from, to));\n            }\n        }\n        if (local) {\n            let localSet = new DecorationSet(local.sort(byPos), none);\n            return child ? new DecorationGroup([localSet, child]) : localSet;\n        }\n        return child || empty;\n    }\n    /**\n    @internal\n    */\n    eq(other) {\n        if (this == other)\n            return true;\n        if (!(other instanceof DecorationSet) ||\n            this.local.length != other.local.length ||\n            this.children.length != other.children.length)\n            return false;\n        for (let i = 0; i < this.local.length; i++)\n            if (!this.local[i].eq(other.local[i]))\n                return false;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] != other.children[i] ||\n                this.children[i + 1] != other.children[i + 1] ||\n                !this.children[i + 2].eq(other.children[i + 2]))\n                return false;\n        return true;\n    }\n    /**\n    @internal\n    */\n    locals(node) {\n        return removeOverlap(this.localsInner(node));\n    }\n    /**\n    @internal\n    */\n    localsInner(node) {\n        if (this == empty)\n            return none;\n        if (node.inlineContent || !this.local.some(InlineType.is))\n            return this.local;\n        let result = [];\n        for (let i = 0; i < this.local.length; i++) {\n            if (!(this.local[i].type instanceof InlineType))\n                result.push(this.local[i]);\n        }\n        return result;\n    }\n    forEachSet(f) { f(this); }\n}\n/**\nThe empty set of decorations.\n*/\nDecorationSet.empty = new DecorationSet([], []);\n/**\n@internal\n*/\nDecorationSet.removeOverlap = removeOverlap;\nconst empty = DecorationSet.empty;\n// An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nclass DecorationGroup {\n    constructor(members) {\n        this.members = members;\n    }\n    map(mapping, doc) {\n        const mappedDecos = this.members.map(member => member.map(mapping, doc, noSpec));\n        return DecorationGroup.from(mappedDecos);\n    }\n    forChild(offset, child) {\n        if (child.isLeaf)\n            return DecorationSet.empty;\n        let found = [];\n        for (let i = 0; i < this.members.length; i++) {\n            let result = this.members[i].forChild(offset, child);\n            if (result == empty)\n                continue;\n            if (result instanceof DecorationGroup)\n                found = found.concat(result.members);\n            else\n                found.push(result);\n        }\n        return DecorationGroup.from(found);\n    }\n    eq(other) {\n        if (!(other instanceof DecorationGroup) ||\n            other.members.length != this.members.length)\n            return false;\n        for (let i = 0; i < this.members.length; i++)\n            if (!this.members[i].eq(other.members[i]))\n                return false;\n        return true;\n    }\n    locals(node) {\n        let result, sorted = true;\n        for (let i = 0; i < this.members.length; i++) {\n            let locals = this.members[i].localsInner(node);\n            if (!locals.length)\n                continue;\n            if (!result) {\n                result = locals;\n            }\n            else {\n                if (sorted) {\n                    result = result.slice();\n                    sorted = false;\n                }\n                for (let j = 0; j < locals.length; j++)\n                    result.push(locals[j]);\n            }\n        }\n        return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none;\n    }\n    // Create a group for the given array of decoration sets, or return\n    // a single set when possible.\n    static from(members) {\n        switch (members.length) {\n            case 0: return empty;\n            case 1: return members[0];\n            default: return new DecorationGroup(members.every(m => m instanceof DecorationSet) ? members :\n                members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));\n        }\n    }\n    forEachSet(f) {\n        for (let i = 0; i < this.members.length; i++)\n            this.members[i].forEachSet(f);\n    }\n}\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n    let children = oldChildren.slice();\n    // Mark the children that are directly touched by changes, and\n    // move those that are after the changes.\n    for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {\n        let moved = 0;\n        mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {\n            let dSize = (newEnd - newStart) - (oldEnd - oldStart);\n            for (let i = 0; i < children.length; i += 3) {\n                let end = children[i + 1];\n                if (end < 0 || oldStart > end + baseOffset - moved)\n                    continue;\n                let start = children[i] + baseOffset - moved;\n                if (oldEnd >= start) {\n                    children[i + 1] = oldStart <= start ? -2 : -1;\n                }\n                else if (oldStart >= baseOffset && dSize) {\n                    children[i] += dSize;\n                    children[i + 1] += dSize;\n                }\n            }\n            moved += dSize;\n        });\n        baseOffset = mapping.maps[i].map(baseOffset, -1);\n    }\n    // Find the child nodes that still correspond to a single node,\n    // recursively call mapInner on them and update their positions.\n    let mustRebuild = false;\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] < 0) { // Touched nodes\n            if (children[i + 1] == -2) {\n                mustRebuild = true;\n                children[i + 1] = -1;\n                continue;\n            }\n            let from = mapping.map(oldChildren[i] + oldOffset), fromLocal = from - offset;\n            if (fromLocal < 0 || fromLocal >= node.content.size) {\n                mustRebuild = true;\n                continue;\n            }\n            // Must read oldChildren because children was tagged with -1\n            let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset;\n            let { index, offset: childOffset } = node.content.findIndex(fromLocal);\n            let childNode = node.maybeChild(index);\n            if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n                let mapped = children[i + 2]\n                    .mapInner(mapping, childNode, from + 1, oldChildren[i] + oldOffset + 1, options);\n                if (mapped != empty) {\n                    children[i] = fromLocal;\n                    children[i + 1] = toLocal;\n                    children[i + 2] = mapped;\n                }\n                else {\n                    children[i + 1] = -2;\n                    mustRebuild = true;\n                }\n            }\n            else {\n                mustRebuild = true;\n            }\n        }\n    // Remaining children must be collected and rebuilt into the appropriate structure\n    if (mustRebuild) {\n        let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset, oldOffset, options);\n        let built = buildTree(decorations, node, 0, options);\n        newLocal = built.local;\n        for (let i = 0; i < children.length; i += 3)\n            if (children[i + 1] < 0) {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        for (let i = 0, j = 0; i < built.children.length; i += 3) {\n            let from = built.children[i];\n            while (j < children.length && children[j] < from)\n                j += 3;\n            children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]);\n        }\n    }\n    return new DecorationSet(newLocal.sort(byPos), children);\n}\nfunction moveSpans(spans, offset) {\n    if (!offset || !spans.length)\n        return spans;\n    let result = [];\n    for (let i = 0; i < spans.length; i++) {\n        let span = spans[i];\n        result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n    }\n    return result;\n}\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n    // Gather all decorations from the remaining marked children\n    function gather(set, oldOffset) {\n        for (let i = 0; i < set.local.length; i++) {\n            let mapped = set.local[i].map(mapping, offset, oldOffset);\n            if (mapped)\n                decorations.push(mapped);\n            else if (options.onRemove)\n                options.onRemove(set.local[i].spec);\n        }\n        for (let i = 0; i < set.children.length; i += 3)\n            gather(set.children[i + 2], set.children[i] + oldOffset + 1);\n    }\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] == -1)\n            gather(children[i + 2], oldChildren[i] + oldOffset + 1);\n    return decorations;\n}\nfunction takeSpansForNode(spans, node, offset) {\n    if (node.isLeaf)\n        return null;\n    let end = offset + node.nodeSize, found = null;\n    for (let i = 0, span; i < spans.length; i++) {\n        if ((span = spans[i]) && span.from > offset && span.to < end) {\n            (found || (found = [])).push(span);\n            spans[i] = null;\n        }\n    }\n    return found;\n}\nfunction withoutNulls(array) {\n    let result = [];\n    for (let i = 0; i < array.length; i++)\n        if (array[i] != null)\n            result.push(array[i]);\n    return result;\n}\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtracted from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n    let children = [], hasNulls = false;\n    node.forEach((childNode, localStart) => {\n        let found = takeSpansForNode(spans, childNode, localStart + offset);\n        if (found) {\n            hasNulls = true;\n            let subtree = buildTree(found, childNode, offset + localStart + 1, options);\n            if (subtree != empty)\n                children.push(localStart, localStart + childNode.nodeSize, subtree);\n        }\n    });\n    let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n    for (let i = 0; i < locals.length; i++)\n        if (!locals[i].type.valid(node, locals[i])) {\n            if (options.onRemove)\n                options.onRemove(locals[i].spec);\n            locals.splice(i--, 1);\n        }\n    return locals.length || children.length ? new DecorationSet(locals, children) : empty;\n}\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n    return a.from - b.from || a.to - b.to;\n}\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n    let working = spans;\n    for (let i = 0; i < working.length - 1; i++) {\n        let span = working[i];\n        if (span.from != span.to)\n            for (let j = i + 1; j < working.length; j++) {\n                let next = working[j];\n                if (next.from == span.from) {\n                    if (next.to != span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // Followed by a partially overlapping larger span. Split that\n                        // span.\n                        working[j] = next.copy(next.from, span.to);\n                        insertAhead(working, j + 1, next.copy(span.to, next.to));\n                    }\n                    continue;\n                }\n                else {\n                    if (next.from < span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // The end of this one overlaps with a subsequent span. Split\n                        // this one.\n                        working[i] = span.copy(span.from, next.from);\n                        insertAhead(working, j, span.copy(next.from, span.to));\n                    }\n                    break;\n                }\n            }\n    }\n    return working;\n}\nfunction insertAhead(array, i, deco) {\n    while (i < array.length && byPos(deco, array[i]) > 0)\n        i++;\n    array.splice(i, 0, deco);\n}\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n    let found = [];\n    view.someProp(\"decorations\", f => {\n        let result = f(view.state);\n        if (result && result != empty)\n            found.push(result);\n    });\n    if (view.cursorWrapper)\n        found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco]));\n    return DecorationGroup.from(found);\n}\n\nconst observeOptions = {\n    childList: true,\n    characterData: true,\n    characterDataOldValue: true,\n    attributes: true,\n    attributeOldValue: true,\n    subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nconst useCharData = ie && ie_version <= 11;\nclass SelectionState {\n    constructor() {\n        this.anchorNode = null;\n        this.anchorOffset = 0;\n        this.focusNode = null;\n        this.focusOffset = 0;\n    }\n    set(sel) {\n        this.anchorNode = sel.anchorNode;\n        this.anchorOffset = sel.anchorOffset;\n        this.focusNode = sel.focusNode;\n        this.focusOffset = sel.focusOffset;\n    }\n    clear() {\n        this.anchorNode = this.focusNode = null;\n    }\n    eq(sel) {\n        return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n            sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;\n    }\n}\nclass DOMObserver {\n    constructor(view, handleDOMChange) {\n        this.view = view;\n        this.handleDOMChange = handleDOMChange;\n        this.queue = [];\n        this.flushingSoon = -1;\n        this.observer = null;\n        this.currentSelection = new SelectionState;\n        this.onCharData = null;\n        this.suppressingSelectionUpdates = false;\n        this.lastChangedTextNode = null;\n        this.observer = window.MutationObserver &&\n            new window.MutationObserver(mutations => {\n                for (let i = 0; i < mutations.length; i++)\n                    this.queue.push(mutations[i]);\n                if (ie && ie_version <= 11 && mutations.some(m => m.type == \"childList\" && m.removedNodes.length ||\n                    m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length)) {\n                    // IE11 will sometimes (on backspacing out a single character\n                    // text node after a BR node) call the observer callback\n                    // before actually updating the DOM, which will cause\n                    // ProseMirror to miss the change (see #930)\n                    this.flushSoon();\n                }\n                else if (safari && view.composing && mutations.some(m => m.type == \"childList\" && m.target.nodeName == \"TR\")) {\n                    // Safari does weird stuff when finishing a composition in a\n                    // table cell, which tends to involve inserting inappropriate\n                    // nodes in the table row.\n                    view.input.badSafariComposition = true;\n                    this.flushSoon();\n                }\n                else {\n                    this.flush();\n                }\n            });\n        if (useCharData) {\n            this.onCharData = e => {\n                this.queue.push({ target: e.target, type: \"characterData\", oldValue: e.prevValue });\n                this.flushSoon();\n            };\n        }\n        this.onSelectionChange = this.onSelectionChange.bind(this);\n    }\n    flushSoon() {\n        if (this.flushingSoon < 0)\n            this.flushingSoon = window.setTimeout(() => { this.flushingSoon = -1; this.flush(); }, 20);\n    }\n    forceFlush() {\n        if (this.flushingSoon > -1) {\n            window.clearTimeout(this.flushingSoon);\n            this.flushingSoon = -1;\n            this.flush();\n        }\n    }\n    start() {\n        if (this.observer) {\n            this.observer.takeRecords();\n            this.observer.observe(this.view.dom, observeOptions);\n        }\n        if (this.onCharData)\n            this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.connectSelection();\n    }\n    stop() {\n        if (this.observer) {\n            let take = this.observer.takeRecords();\n            if (take.length) {\n                for (let i = 0; i < take.length; i++)\n                    this.queue.push(take[i]);\n                window.setTimeout(() => this.flush(), 20);\n            }\n            this.observer.disconnect();\n        }\n        if (this.onCharData)\n            this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.disconnectSelection();\n    }\n    connectSelection() {\n        this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    disconnectSelection() {\n        this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    suppressSelectionUpdates() {\n        this.suppressingSelectionUpdates = true;\n        setTimeout(() => this.suppressingSelectionUpdates = false, 50);\n    }\n    onSelectionChange() {\n        if (!hasFocusAndSelection(this.view))\n            return;\n        if (this.suppressingSelectionUpdates)\n            return selectionToDOM(this.view);\n        // Deletions on IE11 fire their events in the wrong order, giving\n        // us a selection change event before the DOM changes are\n        // reported.\n        if (ie && ie_version <= 11 && !this.view.state.selection.empty) {\n            let sel = this.view.domSelectionRange();\n            // Selection.isCollapsed isn't reliable on IE\n            if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n                return this.flushSoon();\n        }\n        this.flush();\n    }\n    setCurSelection() {\n        this.currentSelection.set(this.view.domSelectionRange());\n    }\n    ignoreSelectionChange(sel) {\n        if (!sel.focusNode)\n            return true;\n        let ancestors = new Set, container;\n        for (let scan = sel.focusNode; scan; scan = parentNode(scan))\n            ancestors.add(scan);\n        for (let scan = sel.anchorNode; scan; scan = parentNode(scan))\n            if (ancestors.has(scan)) {\n                container = scan;\n                break;\n            }\n        let desc = container && this.view.docView.nearestDesc(container);\n        if (desc && desc.ignoreMutation({\n            type: \"selection\",\n            target: container.nodeType == 3 ? container.parentNode : container\n        })) {\n            this.setCurSelection();\n            return true;\n        }\n    }\n    pendingRecords() {\n        if (this.observer)\n            for (let mut of this.observer.takeRecords())\n                this.queue.push(mut);\n        return this.queue;\n    }\n    flush() {\n        let { view } = this;\n        if (!view.docView || this.flushingSoon > -1)\n            return;\n        let mutations = this.pendingRecords();\n        if (mutations.length)\n            this.queue = [];\n        let sel = view.domSelectionRange();\n        let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);\n        let from = -1, to = -1, typeOver = false, added = [];\n        if (view.editable) {\n            for (let i = 0; i < mutations.length; i++) {\n                let result = this.registerMutation(mutations[i], added);\n                if (result) {\n                    from = from < 0 ? result.from : Math.min(result.from, from);\n                    to = to < 0 ? result.to : Math.max(result.to, to);\n                    if (result.typeOver)\n                        typeOver = true;\n                }\n            }\n        }\n        if (added.some(n => n.nodeName == \"BR\") &&\n            (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46 ||\n                chrome && (view.composing || view.input.compositionEndedAt > Date.now() - 50) &&\n                    mutations.some(m => m.type == \"childList\" && m.removedNodes.length))) {\n            // Browsers sometimes insert a bogus break node if you\n            // backspace out the last bit of text before an inline-flex node (#1552)\n            for (let node of added)\n                if (node.nodeName == \"BR\" && node.parentNode) {\n                    let after = node.nextSibling;\n                    while (after && after.nodeType == 1) {\n                        if (after.contentEditable == \"false\") {\n                            node.parentNode.removeChild(node);\n                            break;\n                        }\n                        after = after.firstChild;\n                    }\n                }\n        }\n        else if (gecko && added.length) {\n            let brs = added.filter(n => n.nodeName == \"BR\");\n            if (brs.length == 2) {\n                let [a, b] = brs;\n                if (a.parentNode && a.parentNode.parentNode == b.parentNode)\n                    b.remove();\n                else\n                    a.remove();\n            }\n            else {\n                let { focusNode } = this.currentSelection;\n                for (let br of brs) {\n                    let parent = br.parentNode;\n                    if (parent && parent.nodeName == \"LI\" && (!focusNode || blockParent(view, focusNode) != parent))\n                        br.remove();\n                }\n            }\n        }\n        let readSel = null;\n        // If it looks like the browser has reset the selection to the\n        // start of the document after focus, restore the selection from\n        // the state\n        if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 &&\n            Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 &&\n            selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) &&\n            readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {\n            view.input.lastFocus = 0;\n            selectionToDOM(view);\n            this.currentSelection.set(sel);\n            view.scrollToSelection();\n        }\n        else if (from > -1 || newSel) {\n            if (from > -1) {\n                view.docView.markDirty(from, to);\n                checkCSS(view);\n            }\n            if (view.input.badSafariComposition) {\n                view.input.badSafariComposition = false;\n                fixUpBadSafariComposition(view, added);\n            }\n            this.handleDOMChange(from, to, typeOver, added);\n            if (view.docView && view.docView.dirty)\n                view.updateState(view.state);\n            else if (!this.currentSelection.eq(sel))\n                selectionToDOM(view);\n            this.currentSelection.set(sel);\n        }\n    }\n    registerMutation(mut, added) {\n        // Ignore mutations inside nodes that were already noted as inserted\n        if (added.indexOf(mut.target) > -1)\n            return null;\n        let desc = this.view.docView.nearestDesc(mut.target);\n        if (mut.type == \"attributes\" &&\n            (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n                // Firefox sometimes fires spurious events for null/empty styles\n                (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n            return null;\n        if (!desc || desc.ignoreMutation(mut))\n            return null;\n        if (mut.type == \"childList\") {\n            for (let i = 0; i < mut.addedNodes.length; i++) {\n                let node = mut.addedNodes[i];\n                added.push(node);\n                if (node.nodeType == 3)\n                    this.lastChangedTextNode = node;\n            }\n            if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))\n                return { from: desc.posBefore, to: desc.posAfter };\n            let prev = mut.previousSibling, next = mut.nextSibling;\n            if (ie && ie_version <= 11 && mut.addedNodes.length) {\n                // IE11 gives us incorrect next/prev siblings for some\n                // insertions, so if there are added nodes, recompute those\n                for (let i = 0; i < mut.addedNodes.length; i++) {\n                    let { previousSibling, nextSibling } = mut.addedNodes[i];\n                    if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0)\n                        prev = previousSibling;\n                    if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0)\n                        next = nextSibling;\n                }\n            }\n            let fromOffset = prev && prev.parentNode == mut.target\n                ? domIndex(prev) + 1 : 0;\n            let from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n            let toOffset = next && next.parentNode == mut.target\n                ? domIndex(next) : mut.target.childNodes.length;\n            let to = desc.localPosFromDOM(mut.target, toOffset, 1);\n            return { from, to };\n        }\n        else if (mut.type == \"attributes\") {\n            return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border };\n        }\n        else { // \"characterData\"\n            this.lastChangedTextNode = mut.target;\n            return {\n                from: desc.posAtStart,\n                to: desc.posAtEnd,\n                // An event was generated for a text change that didn't change\n                // any text. Mark the dom change to fall back to assuming the\n                // selection was typed over with an identical value if it can't\n                // find another change.\n                typeOver: mut.target.nodeValue == mut.oldValue\n            };\n        }\n    }\n}\nlet cssChecked = new WeakMap();\nlet cssCheckWarned = false;\nfunction checkCSS(view) {\n    if (cssChecked.has(view))\n        return;\n    cssChecked.set(view, null);\n    if (['normal', 'nowrap', 'pre-line'].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {\n        view.requiresGeckoHackNode = gecko;\n        if (cssCheckWarned)\n            return;\n        console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\");\n        cssCheckWarned = true;\n    }\n}\nfunction rangeToSelectionRange(view, range) {\n    let anchorNode = range.startContainer, anchorOffset = range.startOffset;\n    let focusNode = range.endContainer, focusOffset = range.endOffset;\n    let currentAnchor = view.domAtPos(view.state.selection.anchor);\n    // Since such a range doesn't distinguish between anchor and head,\n    // use a heuristic that flips it around if its end matches the\n    // current anchor.\n    if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset))\n        [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n    return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\n// Used to work around a Safari Selection/shadow DOM bug\n// Based on https://github.com/codemirror/dev/issues/414 fix\nfunction safariShadowSelectionRange(view, selection) {\n    if (selection.getComposedRanges) {\n        let range = selection.getComposedRanges(view.root)[0];\n        if (range)\n            return rangeToSelectionRange(view, range);\n    }\n    let found;\n    function read(event) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        found = event.getTargetRanges()[0];\n    }\n    // Because Safari (at least in 2018-2022) doesn't provide regular\n    // access to the selection inside a shadowRoot, we have to perform a\n    // ridiculous hack to get at it—using `execCommand` to trigger a\n    // `beforeInput` event so that we can read the target range from the\n    // event.\n    view.dom.addEventListener(\"beforeinput\", read, true);\n    document.execCommand(\"indent\");\n    view.dom.removeEventListener(\"beforeinput\", read, true);\n    return found ? rangeToSelectionRange(view, found) : null;\n}\nfunction blockParent(view, node) {\n    for (let p = node.parentNode; p && p != view.dom; p = p.parentNode) {\n        let desc = view.docView.nearestDesc(p, true);\n        if (desc && desc.node.isBlock)\n            return p;\n    }\n    return null;\n}\n// Kludge for a Safari bug where, on ending a composition in an\n// otherwise empty table cell, it randomly moves the composed text\n// into the table row around that cell, greatly confusing everything\n// (#188).\nfunction fixUpBadSafariComposition(view, addedNodes) {\n    var _a;\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    for (let node of addedNodes) {\n        if (((_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.nodeName) == \"TR\") {\n            let nextCell = node.nextSibling;\n            while (nextCell && (nextCell.nodeName != \"TD\" && nextCell.nodeName != \"TH\"))\n                nextCell = nextCell.nextSibling;\n            if (nextCell) {\n                let parent = nextCell;\n                for (;;) {\n                    let first = parent.firstChild;\n                    if (!first || first.nodeType != 1 || first.contentEditable == \"false\" ||\n                        /^(BR|IMG)$/.test(first.nodeName))\n                        break;\n                    parent = first;\n                }\n                parent.insertBefore(node, parent.firstChild);\n                if (focusNode == node)\n                    view.domSelection().collapse(node, focusOffset);\n            }\n            else {\n                node.parentNode.removeChild(node);\n            }\n        }\n    }\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\nfunction parseBetween(view, from_, to_, addedNodes) {\n    let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);\n    let domSel = view.domSelectionRange();\n    let find;\n    let anchor = domSel.anchorNode;\n    if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n        find = [{ node: anchor, offset: domSel.anchorOffset }];\n        if (!selectionCollapsed(domSel))\n            find.push({ node: domSel.focusNode, offset: domSel.focusOffset });\n    }\n    // Work around issue in Chrome where backspacing sometimes replaces\n    // the deleted content with a random BR node (issues #799, #831)\n    if (chrome && view.input.lastKeyCode === 8) {\n        for (let off = toOffset; off > fromOffset; off--) {\n            let node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n            if (node.nodeName == \"BR\" && !desc) {\n                toOffset = off;\n                break;\n            }\n            if (!desc || desc.size)\n                break;\n        }\n    }\n    let startDoc = view.state.doc;\n    let parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n    let $from = startDoc.resolve(from);\n    let sel = null, doc = parser.parse(parent, {\n        topNode: $from.parent,\n        topMatch: $from.parent.contentMatchAt($from.index()),\n        topOpen: true,\n        from: fromOffset,\n        to: toOffset,\n        preserveWhitespace: $from.parent.type.whitespace == \"pre\" ? \"full\" : true,\n        findPositions: find,\n        ruleFromNode: ruleFromNode(addedNodes),\n        context: $from\n    });\n    if (find && find[0].pos != null) {\n        let anchor = find[0].pos, head = find[1] && find[1].pos;\n        if (head == null)\n            head = anchor;\n        sel = { anchor: anchor + from, head: head + from };\n    }\n    return { doc, sel, from, to };\n}\nconst ruleFromNode = (added) => (dom) => {\n    let desc = dom.pmViewDesc;\n    if (desc) {\n        return desc.parseRule(added);\n    }\n    else if (dom.nodeName == \"BR\" && dom.parentNode) {\n        // Safari replaces the list item or table cell with a BR\n        // directly in the list node (?!) if you delete the last\n        // character in a list item or table cell (#708, #862)\n        if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n            let skip = document.createElement(\"div\");\n            skip.appendChild(document.createElement(\"li\"));\n            return { skip };\n        }\n        else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n            return { ignore: true };\n        }\n    }\n    else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n        return { ignore: true };\n    }\n    return null;\n};\nconst isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n    let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);\n    view.input.compositionPendingChanges = 0;\n    if (from < 0) {\n        let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;\n        let newSel = selectionFromDOM(view, origin);\n        if (newSel && !view.state.selection.eq(newSel)) {\n            if (chrome && android &&\n                view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime &&\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\"))))\n                return;\n            let tr = view.state.tr.setSelection(newSel);\n            if (origin == \"pointer\")\n                tr.setMeta(\"pointer\", true);\n            else if (origin == \"key\")\n                tr.scrollIntoView();\n            if (compositionID)\n                tr.setMeta(\"composition\", compositionID);\n            view.dispatch(tr);\n        }\n        return;\n    }\n    let $before = view.state.doc.resolve(from);\n    let shared = $before.sharedDepth(to);\n    from = $before.before(shared + 1);\n    to = view.state.doc.resolve(to).after(shared + 1);\n    let sel = view.state.selection;\n    let parse = parseBetween(view, from, to, addedNodes);\n    let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n    let preferredPos, preferredSide;\n    // Prefer anchoring to end when Backspace is pressed\n    if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) {\n        preferredPos = view.state.selection.to;\n        preferredSide = \"end\";\n    }\n    else {\n        preferredPos = view.state.selection.from;\n        preferredSide = \"start\";\n    }\n    view.input.lastKeyCode = null;\n    let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n    if (change)\n        view.input.domChangeCount++;\n    if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&\n        addedNodes.some(n => n.nodeType == 1 && !isInline.test(n.nodeName)) &&\n        (!change || change.endA >= change.endB) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    if (!change) {\n        if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n            !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n            change = { start: sel.from, endA: sel.to, endB: sel.to };\n        }\n        else {\n            if (parse.sel) {\n                let sel = resolveSelection(view, view.state.doc, parse.sel);\n                if (sel && !sel.eq(view.state.selection)) {\n                    let tr = view.state.tr.setSelection(sel);\n                    if (compositionID)\n                        tr.setMeta(\"composition\", compositionID);\n                    view.dispatch(tr);\n                }\n            }\n            return;\n        }\n    }\n    // Handle the case where overwriting a selection by typing matches\n    // the start or end of the selected content, creating a change\n    // that's smaller than what was actually overwritten.\n    if (view.state.selection.from < view.state.selection.to &&\n        change.start == change.endB &&\n        view.state.selection instanceof TextSelection) {\n        if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 &&\n            view.state.selection.from >= parse.from) {\n            change.start = view.state.selection.from;\n        }\n        else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 &&\n            view.state.selection.to <= parse.to) {\n            change.endB += (view.state.selection.to - change.endA);\n            change.endA = view.state.selection.to;\n        }\n    }\n    // IE11 will insert a non-breaking space _ahead_ of the space after\n    // the cursor space when adding a space before another space. When\n    // that happened, adjust the change to cover the space instead.\n    if (ie && ie_version <= 11 && change.endB == change.start + 1 &&\n        change.endA == change.start && change.start > parse.from &&\n        parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n        change.start--;\n        change.endA--;\n        change.endB--;\n    }\n    let $from = parse.doc.resolveNoCache(change.start - parse.from);\n    let $to = parse.doc.resolveNoCache(change.endB - parse.from);\n    let $fromA = doc.resolve(change.start);\n    let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA;\n    // If this looks like the effect of pressing Enter (or was recorded\n    // as being an iOS enter press), just dispatch an Enter key instead.\n    if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&\n        (!inlineChange || addedNodes.some(n => n.nodeName == \"DIV\" || n.nodeName == \"P\"))) ||\n        (!inlineChange && $from.pos < parse.doc.content.size &&\n            (!$from.sameParent($to) || !$from.parent.inlineContent) &&\n            $from.pos < $to.pos && !/\\S/.test(parse.doc.textBetween($from.pos, $to.pos, \"\", \"\")))) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    // Same for backspace\n    if (view.state.selection.anchor > change.start &&\n        looksLikeBackspace(doc, change.start, change.endA, $from, $to) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\")))) {\n        if (android && chrome)\n            view.domObserver.suppressSelectionUpdates(); // #820\n        return;\n    }\n    // Chrome will occasionally, during composition, delete the\n    // entire composition and then immediately insert it again. This is\n    // used to detect that situation.\n    if (chrome && change.endB == change.start)\n        view.input.lastChromeDelete = Date.now();\n    // This tries to detect Android virtual keyboard\n    // enter-and-pick-suggestion action. That sometimes (see issue\n    // #1059) first fires a DOM mutation, before moving the selection to\n    // the newly created block. And then, because ProseMirror cleans up\n    // the DOM selection, it gives up moving the selection entirely,\n    // leaving the cursor in the wrong place. When that happens, we drop\n    // the new paragraph from the initial change, and fire a simulated\n    // enter key afterwards.\n    if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n        parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n        change.endB -= 2;\n        $to = parse.doc.resolveNoCache(change.endB - parse.from);\n        setTimeout(() => {\n            view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n        }, 20);\n    }\n    let chFrom = change.start, chTo = change.endA;\n    let mkTr = (base) => {\n        let tr = base || view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from));\n        if (parse.sel) {\n            let sel = resolveSelection(view, tr.doc, parse.sel);\n            // Chrome will sometimes, during composition, report the\n            // selection in the wrong place. If it looks like that is\n            // happening, don't update the selection.\n            // Edge just doesn't move the cursor forward when you start typing\n            // in an empty block or between br nodes.\n            if (sel && !(chrome && view.composing && sel.empty &&\n                (change.start != change.endB || view.input.lastChromeDelete < Date.now() - 100) &&\n                (sel.head == chFrom || sel.head == tr.mapping.map(chTo) - 1) ||\n                ie && sel.empty && sel.head == chFrom))\n                tr.setSelection(sel);\n        }\n        if (compositionID)\n            tr.setMeta(\"composition\", compositionID);\n        return tr.scrollIntoView();\n    };\n    let markChange;\n    if (inlineChange) {\n        if ($from.pos == $to.pos) { // Deletion\n            // IE11 sometimes weirdly moves the DOM selection around after\n            // backspacing out the first element in a textblock\n            if (ie && ie_version <= 11 && $from.parentOffset == 0) {\n                view.domObserver.suppressSelectionUpdates();\n                setTimeout(() => selectionToDOM(view), 20);\n            }\n            let tr = mkTr(view.state.tr.delete(chFrom, chTo));\n            let marks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n            if (marks)\n                tr.ensureMarks(marks);\n            view.dispatch(tr);\n        }\n        else if ( // Adding or removing a mark\n        change.endA == change.endB &&\n            (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start())))) {\n            let tr = mkTr(view.state.tr);\n            if (markChange.type == \"add\")\n                tr.addMark(chFrom, chTo, markChange.mark);\n            else\n                tr.removeMark(chFrom, chTo, markChange.mark);\n            view.dispatch(tr);\n        }\n        else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n            // Both positions in the same text node -- simply insert text\n            let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n            let deflt = () => mkTr(view.state.tr.insertText(text, chFrom, chTo));\n            if (!view.someProp(\"handleTextInput\", f => f(view, chFrom, chTo, text, deflt)))\n                view.dispatch(deflt());\n        }\n        else {\n            view.dispatch(mkTr());\n        }\n    }\n    else {\n        view.dispatch(mkTr());\n    }\n}\nfunction resolveSelection(view, doc, parsedSel) {\n    if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size)\n        return null;\n    return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head));\n}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n    let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n    let added = curMarks, removed = prevMarks, type, mark, update;\n    for (let i = 0; i < prevMarks.length; i++)\n        added = prevMarks[i].removeFromSet(added);\n    for (let i = 0; i < curMarks.length; i++)\n        removed = curMarks[i].removeFromSet(removed);\n    if (added.length == 1 && removed.length == 0) {\n        mark = added[0];\n        type = \"add\";\n        update = (node) => node.mark(mark.addToSet(node.marks));\n    }\n    else if (added.length == 0 && removed.length == 1) {\n        mark = removed[0];\n        type = \"remove\";\n        update = (node) => node.mark(mark.removeFromSet(node.marks));\n    }\n    else {\n        return null;\n    }\n    let updated = [];\n    for (let i = 0; i < prev.childCount; i++)\n        updated.push(update(prev.child(i)));\n    if (Fragment.from(updated).eq(cur))\n        return { mark, type };\n}\nfunction looksLikeBackspace(old, start, end, $newStart, $newEnd) {\n    if ( // The content must have shrunk\n    end - start <= $newEnd.pos - $newStart.pos ||\n        // newEnd must point directly at or after the end of the block that newStart points into\n        skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n        return false;\n    let $start = old.resolve(start);\n    // Handle the case where, rather than joining blocks, the change just removed an entire block\n    if (!$newStart.parent.isTextblock) {\n        let after = $start.nodeAfter;\n        return after != null && end == start + after.nodeSize;\n    }\n    // Start must be at the end of a block\n    if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n        return false;\n    let $next = old.resolve(skipClosingAndOpening($start, true, true));\n    // The next textblock must start before end and end near it\n    if (!$next.parent.isTextblock || $next.pos > end ||\n        skipClosingAndOpening($next, true, false) < end)\n        return false;\n    // The fragments after the join point must match\n    return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);\n}\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n    let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n    while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n        depth--;\n        end++;\n        fromEnd = false;\n    }\n    if (mayOpen) {\n        let next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n        while (next && !next.isLeaf) {\n            next = next.firstChild;\n            end++;\n        }\n    }\n    return end;\n}\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n    let start = a.findDiffStart(b, pos), lenA = pos + a.size, lenB = pos + b.size;\n    if (start == null)\n        return null;\n    let { a: endA, b: endB } = a.findDiffEnd(b, lenA, lenB);\n    if (preferredSide == \"end\") {\n        let adjust = Math.max(0, start - Math.min(endA, endB));\n        preferredPos -= endA + adjust - start;\n    }\n    if (endA < start && lenA < lenB) {\n        let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n        start -= move;\n        endB = start + (endB - endA);\n        endA = start;\n    }\n    else if (endB < start) {\n        let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n        start -= move;\n        endA = start + (endA - endB);\n        endB = start;\n    }\n    return { start, endA, endB };\n}\n\n/**\n@internal\n*/\nconst __parseFromClipboard = parseFromClipboard;\n/**\n@internal\n*/\nconst __endComposition = endComposition;\n/**\nAn editor view manages the DOM structure that represents an\neditable document. Its state and behavior are determined by its\n[props](https://prosemirror.net/docs/ref/#view.DirectEditorProps).\n*/\nclass EditorView {\n    /**\n    Create a view. `place` may be a DOM node that the editor should\n    be appended to, a function that will place it into the document,\n    or an object whose `mount` property holds the node to use as the\n    document container. If it is `null`, the editor will not be\n    added to the document.\n    */\n    constructor(place, props) {\n        this._root = null;\n        /**\n        @internal\n        */\n        this.focused = false;\n        /**\n        Kludge used to work around a Chrome bug @internal\n        */\n        this.trackWrites = null;\n        this.mounted = false;\n        /**\n        @internal\n        */\n        this.markCursor = null;\n        /**\n        @internal\n        */\n        this.cursorWrapper = null;\n        /**\n        @internal\n        */\n        this.lastSelectedViewDesc = undefined;\n        /**\n        @internal\n        */\n        this.input = new InputState;\n        this.prevDirectPlugins = [];\n        this.pluginViews = [];\n        /**\n        Holds `true` when a hack node is needed in Firefox to prevent the\n        [space is eaten issue](https://code.haverbeke.berlin/prosemirror/prosemirror/issues/651)\n        @internal\n        */\n        this.requiresGeckoHackNode = false;\n        /**\n        When editor content is being dragged, this object contains\n        information about the dragged slice and whether it is being\n        copied or moved. At any other time, it is null.\n        */\n        this.dragging = null;\n        this._props = props;\n        this.state = props.state;\n        this.directPlugins = props.plugins || [];\n        this.directPlugins.forEach(checkStateComponent);\n        this.dispatch = this.dispatch.bind(this);\n        this.dom = (place && place.mount) || document.createElement(\"div\");\n        if (place) {\n            if (place.appendChild)\n                place.appendChild(this.dom);\n            else if (typeof place == \"function\")\n                place(this.dom);\n            else if (place.mount)\n                this.mounted = true;\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        this.nodeViews = buildNodeViews(this);\n        this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n        this.domObserver = new DOMObserver(this, (from, to, typeOver, added) => readDOMChange(this, from, to, typeOver, added));\n        this.domObserver.start();\n        initInput(this);\n        this.updatePluginViews();\n    }\n    /**\n    Holds `true` when a\n    [composition](https://w3c.github.io/uievents/#events-compositionevents)\n    is active.\n    */\n    get composing() { return this.input.composing; }\n    /**\n    The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps).\n    */\n    get props() {\n        if (this._props.state != this.state) {\n            let prev = this._props;\n            this._props = {};\n            for (let name in prev)\n                this._props[name] = prev[name];\n            this._props.state = this.state;\n        }\n        return this._props;\n    }\n    /**\n    Update the view's props. Will immediately cause an update to\n    the DOM.\n    */\n    update(props) {\n        if (props.handleDOMEvents != this._props.handleDOMEvents)\n            ensureListeners(this);\n        let prevProps = this._props;\n        this._props = props;\n        if (props.plugins) {\n            props.plugins.forEach(checkStateComponent);\n            this.directPlugins = props.plugins;\n        }\n        this.updateStateInner(props.state, prevProps);\n    }\n    /**\n    Update the view by updating existing props object with the object\n    given as argument. Equivalent to `view.update(Object.assign({},\n    view.props, props))`.\n    */\n    setProps(props) {\n        let updated = {};\n        for (let name in this._props)\n            updated[name] = this._props[name];\n        updated.state = this.state;\n        for (let name in props)\n            updated[name] = props[name];\n        this.update(updated);\n    }\n    /**\n    Update the editor's `state` prop, without touching any of the\n    other props.\n    */\n    updateState(state) {\n        this.updateStateInner(state, this._props);\n    }\n    updateStateInner(state, prevProps) {\n        var _a;\n        let prev = this.state, redraw = false, updateSel = false;\n        // When stored marks are added, stop composition, so that they can\n        // be displayed.\n        if (state.storedMarks && this.composing) {\n            clearComposition(this);\n            updateSel = true;\n        }\n        this.state = state;\n        let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins;\n        if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) {\n            let nodeViews = buildNodeViews(this);\n            if (changedNodeViews(nodeViews, this.nodeViews)) {\n                this.nodeViews = nodeViews;\n                redraw = true;\n            }\n        }\n        if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) {\n            ensureListeners(this);\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n        let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? \"reset\"\n            : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n        let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n        if (updateDoc || !state.selection.eq(prev.selection))\n            updateSel = true;\n        let oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n        if (updateSel) {\n            this.domObserver.stop();\n            // Work around an issue in Chrome, IE, and Edge where changing\n            // the DOM around an active selection puts it into a broken\n            // state where the thing the user sees differs from the\n            // selection reported by the Selection object (#710, #973,\n            // #1011, #1013, #1035).\n            let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing &&\n                !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n            if (updateDoc) {\n                // If the node that the selection points into is written to,\n                // Chrome sometimes starts misreporting the selection, so this\n                // tracks that and forces a selection reset when our update\n                // did write to the node.\n                let chromeKludge = chrome ? (this.trackWrites = this.domSelectionRange().focusNode) : null;\n                if (this.composing)\n                    this.input.compositionNode = findCompositionNode(this);\n                if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n                    this.docView.updateOuterDeco(outerDeco);\n                    this.docView.destroy();\n                    this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n                }\n                if (chromeKludge && (!this.trackWrites || !this.dom.contains(this.trackWrites)))\n                    forceSelUpdate = true;\n            }\n            // Work around for an issue where an update arriving right between\n            // a DOM selection change and the \"selectionchange\" event for it\n            // can cause a spurious DOM selection update, disrupting mouse\n            // drag selection.\n            let mouseDown = this.input.mouseDown;\n            if (forceSelUpdate ||\n                !(mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&\n                    anchorInRightPlace(this) && mouseDown.delaySelUpdate())) {\n                selectionToDOM(this, forceSelUpdate);\n            }\n            else {\n                syncNodeSelection(this, state.selection);\n                this.domObserver.setCurSelection();\n            }\n            this.domObserver.start();\n        }\n        this.updatePluginViews(prev);\n        if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc))\n            this.updateDraggedNode(this.dragging, prev);\n        if (scroll == \"reset\") {\n            this.dom.scrollTop = 0;\n        }\n        else if (scroll == \"to selection\") {\n            this.scrollToSelection();\n        }\n        else if (oldScrollPos) {\n            resetScrollPos(oldScrollPos);\n        }\n    }\n    /**\n    @internal\n    */\n    scrollToSelection() {\n        let startDOM = this.domSelectionRange().focusNode;\n        if (!startDOM || !this.dom.contains(startDOM.nodeType == 1 ? startDOM : startDOM.parentNode)) ;\n        else if (this.someProp(\"handleScrollToSelection\", f => f(this))) ;\n        else if (this.state.selection instanceof NodeSelection) {\n            let target = this.docView.domAfterPos(this.state.selection.from);\n            if (target.nodeType == 1)\n                scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);\n        }\n        else {\n            scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM);\n        }\n    }\n    destroyPluginViews() {\n        let view;\n        while (view = this.pluginViews.pop())\n            if (view.destroy)\n                view.destroy();\n    }\n    updatePluginViews(prevState) {\n        if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) {\n            this.prevDirectPlugins = this.directPlugins;\n            this.destroyPluginViews();\n            for (let i = 0; i < this.directPlugins.length; i++) {\n                let plugin = this.directPlugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n            for (let i = 0; i < this.state.plugins.length; i++) {\n                let plugin = this.state.plugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n        }\n        else {\n            for (let i = 0; i < this.pluginViews.length; i++) {\n                let pluginView = this.pluginViews[i];\n                if (pluginView.update)\n                    pluginView.update(this, prevState);\n            }\n        }\n    }\n    updateDraggedNode(dragging, prev) {\n        let sel = dragging.node, found = -1;\n        if (sel.from < this.state.doc.content.size && this.state.doc.nodeAt(sel.from) == sel.node) {\n            found = sel.from;\n        }\n        else {\n            let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);\n            let moved = movedPos > 0 && movedPos < this.state.doc.content.size && this.state.doc.nodeAt(movedPos);\n            if (moved == sel.node)\n                found = movedPos;\n        }\n        this.dragging = new Dragging(dragging.slice, dragging.move, found < 0 ? undefined : NodeSelection.create(this.state.doc, found));\n    }\n    someProp(propName, f) {\n        let prop = this._props && this._props[propName], value;\n        if (prop != null && (value = f ? f(prop) : prop))\n            return value;\n        for (let i = 0; i < this.directPlugins.length; i++) {\n            let prop = this.directPlugins[i].props[propName];\n            if (prop != null && (value = f ? f(prop) : prop))\n                return value;\n        }\n        let plugins = this.state.plugins;\n        if (plugins)\n            for (let i = 0; i < plugins.length; i++) {\n                let prop = plugins[i].props[propName];\n                if (prop != null && (value = f ? f(prop) : prop))\n                    return value;\n            }\n    }\n    /**\n    Query whether the view has focus.\n    */\n    hasFocus() {\n        // Work around IE not handling focus correctly if resize handles are shown.\n        // If the cursor is inside an element with resize handles, activeElement\n        // will be that element instead of this.dom.\n        if (ie) {\n            // If activeElement is within this.dom, and there are no other elements\n            // setting `contenteditable` to false in between, treat it as focused.\n            let node = this.root.activeElement;\n            if (node == this.dom)\n                return true;\n            if (!node || !this.dom.contains(node))\n                return false;\n            while (node && this.dom != node && this.dom.contains(node)) {\n                if (node.contentEditable == 'false')\n                    return false;\n                node = node.parentElement;\n            }\n            return true;\n        }\n        return this.root.activeElement == this.dom;\n    }\n    /**\n    Focus the editor.\n    */\n    focus() {\n        this.domObserver.stop();\n        if (this.editable)\n            focusPreventScroll(this.dom);\n        selectionToDOM(this);\n        this.domObserver.start();\n    }\n    /**\n    Get the document root in which the editor exists. This will\n    usually be the top-level `document`, but might be a [shadow\n    DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n    root if the editor is inside one.\n    */\n    get root() {\n        let cached = this._root;\n        if (cached == null)\n            for (let search = this.dom.parentNode; search; search = search.parentNode) {\n                if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n                    if (!search.getSelection)\n                        Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection();\n                    return this._root = search;\n                }\n            }\n        return cached || document;\n    }\n    /**\n    When an existing editor view is moved to a new document or\n    shadow tree, call this to make it recompute its root.\n    */\n    updateRoot() {\n        this._root = null;\n    }\n    /**\n    Given a pair of viewport coordinates, return the document\n    position that corresponds to them. May return null if the given\n    coordinates aren't inside of the editor. When an object is\n    returned, its `pos` property is the position nearest to the\n    coordinates, and its `inside` property holds the position of the\n    inner node that the position falls inside of, or -1 if it is at\n    the top level, not in any node.\n    */\n    posAtCoords(coords) {\n        return posAtCoords(this, coords);\n    }\n    /**\n    Returns the viewport rectangle at a given document position.\n    `left` and `right` will be the same number, as this returns a\n    flat cursor-ish rectangle. If the position is between two things\n    that aren't directly adjacent, `side` determines which element\n    is used. When < 0, the element before the position is used,\n    otherwise the element after.\n    */\n    coordsAtPos(pos, side = 1) {\n        return coordsAtPos(this, pos, side);\n    }\n    /**\n    Find the DOM position that corresponds to the given document\n    position. When `side` is negative, find the position as close as\n    possible to the content before the position. When positive,\n    prefer positions close to the content after the position. When\n    zero, prefer as shallow a position as possible.\n    \n    Note that you should **not** mutate the editor's internal DOM,\n    only inspect it (and even that is usually not necessary).\n    */\n    domAtPos(pos, side = 0) {\n        return this.docView.domFromPos(pos, side);\n    }\n    /**\n    Find the DOM node that represents the document node after the\n    given position. May return `null` when the position doesn't point\n    in front of a node or if the node is inside an opaque node view.\n    \n    This is intended to be able to call things like\n    `getBoundingClientRect` on that DOM node. Do **not** mutate the\n    editor DOM directly, or add styling this way, since that will be\n    immediately overriden by the editor as it redraws the node.\n    */\n    nodeDOM(pos) {\n        let desc = this.docView.descAt(pos);\n        return desc ? desc.nodeDOM : null;\n    }\n    /**\n    Find the document position that corresponds to a given DOM\n    position. (Whenever possible, it is preferable to inspect the\n    document structure directly, rather than poking around in the\n    DOM, but sometimes—for example when interpreting an event\n    target—you don't have a choice.)\n    \n    The `bias` parameter can be used to influence which side of a DOM\n    node to use when the position is inside a leaf node.\n    */\n    posAtDOM(node, offset, bias = -1) {\n        let pos = this.docView.posFromDOM(node, offset, bias);\n        if (pos == null)\n            throw new RangeError(\"DOM position not inside the editor\");\n        return pos;\n    }\n    /**\n    Find out whether the selection is at the end of a textblock when\n    moving in a given direction. When, for example, given `\"left\"`,\n    it will return true if moving left from the current cursor\n    position would leave that position's parent textblock. Will apply\n    to the view's current state by default, but it is possible to\n    pass a different state.\n    */\n    endOfTextblock(dir, state) {\n        return endOfTextblock(this, state || this.state, dir);\n    }\n    /**\n    Run the editor's paste logic with the given HTML string. The\n    `event`, if given, will be passed to the\n    [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook.\n    */\n    pasteHTML(html, event) {\n        return doPaste(this, \"\", html, false, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Run the editor's paste logic with the given plain-text input.\n    */\n    pasteText(text, event) {\n        return doPaste(this, text, null, true, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Serialize the given slice as it would be if it was copied from\n    this editor. Returns a DOM element that contains a\n    representation of the slice as its children, a textual\n    representation, and the transformed slice (which can be\n    different from the given input due to hooks like\n    [`transformCopied`](https://prosemirror.net/docs/ref/#view.EditorProps.transformCopied)).\n    */\n    serializeForClipboard(slice) {\n        return serializeForClipboard(this, slice);\n    }\n    /**\n    Removes the editor from the DOM and destroys all [node\n    views](https://prosemirror.net/docs/ref/#view.NodeView).\n    */\n    destroy() {\n        if (!this.docView)\n            return;\n        destroyInput(this);\n        this.destroyPluginViews();\n        if (this.mounted) {\n            this.docView.update(this.state.doc, [], viewDecorations(this), this);\n            this.dom.textContent = \"\";\n        }\n        else if (this.dom.parentNode) {\n            this.dom.parentNode.removeChild(this.dom);\n        }\n        this.docView.destroy();\n        this.docView = null;\n        clearReusedRange();\n    }\n    /**\n    This is true when the view has been\n    [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be\n    used anymore).\n    */\n    get isDestroyed() {\n        return this.docView == null;\n    }\n    /**\n    Used for testing.\n    */\n    dispatchEvent(event) {\n        return dispatchEvent(this, event);\n    }\n    /**\n    @internal\n    */\n    domSelectionRange() {\n        let sel = this.domSelection();\n        if (!sel)\n            return { focusNode: null, focusOffset: 0, anchorNode: null, anchorOffset: 0 };\n        return safari && this.root.nodeType === 11 &&\n            deepActiveElement(this.dom.ownerDocument) == this.dom && safariShadowSelectionRange(this, sel) || sel;\n    }\n    /**\n    @internal\n    */\n    domSelection() {\n        return this.root.getSelection();\n    }\n}\nEditorView.prototype.dispatch = function (tr) {\n    let dispatchTransaction = this._props.dispatchTransaction;\n    if (dispatchTransaction)\n        dispatchTransaction.call(this, tr);\n    else\n        this.updateState(this.state.apply(tr));\n};\nfunction computeDocDeco(view) {\n    let attrs = Object.create(null);\n    attrs.class = \"ProseMirror\";\n    attrs.contenteditable = String(view.editable);\n    view.someProp(\"attributes\", value => {\n        if (typeof value == \"function\")\n            value = value(view.state);\n        if (value)\n            for (let attr in value) {\n                if (attr == \"class\")\n                    attrs.class += \" \" + value[attr];\n                else if (attr == \"style\")\n                    attrs.style = (attrs.style ? attrs.style + \";\" : \"\") + value[attr];\n                else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n                    attrs[attr] = String(value[attr]);\n            }\n    });\n    if (!attrs.translate)\n        attrs.translate = \"no\";\n    return [Decoration.node(0, view.state.doc.content.size, attrs)];\n}\nfunction updateCursorWrapper(view) {\n    if (view.markCursor) {\n        let dom = document.createElement(\"img\");\n        dom.className = \"ProseMirror-separator\";\n        dom.setAttribute(\"mark-placeholder\", \"true\");\n        dom.setAttribute(\"alt\", \"\");\n        view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.from, dom, { raw: true, marks: view.markCursor }) };\n    }\n    else {\n        view.cursorWrapper = null;\n    }\n}\nfunction getEditable(view) {\n    return !view.someProp(\"editable\", value => value(view.state) === false);\n}\nfunction selectionContextChanged(sel1, sel2) {\n    let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n    return sel1.$anchor.start(depth) != sel2.$anchor.start(depth);\n}\nfunction buildNodeViews(view) {\n    let result = Object.create(null);\n    function add(obj) {\n        for (let prop in obj)\n            if (!Object.prototype.hasOwnProperty.call(result, prop))\n                result[prop] = obj[prop];\n    }\n    view.someProp(\"nodeViews\", add);\n    view.someProp(\"markViews\", add);\n    return result;\n}\nfunction changedNodeViews(a, b) {\n    let nA = 0, nB = 0;\n    for (let prop in a) {\n        if (a[prop] != b[prop])\n            return true;\n        nA++;\n    }\n    for (let _ in b)\n        nB++;\n    return nA != nB;\n}\nfunction checkStateComponent(plugin) {\n    if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction)\n        throw new RangeError(\"Plugins passed directly to the view must not have a state component\");\n}\n\nexport { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard };\n","import { BlockType } from './types';\n\n/** Editor-engine-neutral document stored by Sable drafts and serializers. */\nexport type EditorText = { text: string };\nexport type LinkToken = { type: BlockType.Link; href: string; children: EditorText[] };\nexport type MentionToken = {\n  type: BlockType.Mention;\n  id: string;\n  eventId?: string;\n  viaServers?: string[];\n  highlight: boolean;\n  name: string;\n  children: EditorText[];\n};\nexport type EmoticonToken = {\n  type: BlockType.Emoticon;\n  key: string;\n  shortcode: string;\n  children: EditorText[];\n};\nexport type CommandToken = { type: BlockType.Command; command: string; children: EditorText[] };\nexport type InlineToken = EditorText | LinkToken | MentionToken | EmoticonToken | CommandToken;\nexport type EditorParagraph = { type: BlockType.Paragraph; children: InlineToken[] };\nexport type EditorDocument = EditorParagraph[];\n\nexport const isEditorText = (token: InlineToken | EditorParagraph): token is EditorText =>\n  !('type' in token);\nexport const emptyEditorDocument = (): EditorDocument => [\n  { type: BlockType.Paragraph, children: [{ text: '' }] },\n];\n\nexport const getDocumentBeginCommand = (document: EditorDocument): string | undefined => {\n  const paragraph = document[0];\n  if (!paragraph) return undefined;\n  for (const token of paragraph.children) {\n    if (isEditorText(token) && token.text.trim() === '') continue;\n    return !isEditorText(token) && token.type === BlockType.Command ? token.command : undefined;\n  }\n  return undefined;\n};\n\nexport const editorDocumentText = (document: EditorDocument): string =>\n  document\n    .map((paragraph) =>\n      paragraph.children\n        .map((token) => {\n          if (isEditorText(token)) return token.text;\n          switch (token.type) {\n            case BlockType.Link:\n              return `[${token.children.map((child) => child.text).join('')}](${token.href})`;\n            case BlockType.Mention:\n              return token.name === '@room' ? token.name : token.id;\n            case BlockType.Emoticon:\n              return token.key.startsWith('mxc://') ? `:${token.shortcode}:` : token.key;\n            case BlockType.Command:\n              return `/${token.command}`;\n            default:\n              return '';\n          }\n        })\n        .join('')\n    )\n    .join('\\n');\n","import type { Node as ProseMirrorNode } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport type { Decoration, NodeView, NodeViewConstructor } from 'prosemirror-view';\nimport { Decoration as NodeDecoration, DecorationSet } from 'prosemirror-view';\nimport * as css from '$styles/CustomHtml.css';\nimport { BlockType } from './types';\nimport type { MentionToken } from './model';\nimport { formatMentionElementDisplayName } from './utils';\n\n/**\n * App data the atom node views render from. Plain functions, so the views stay\n * out of React and nothing inside the editable re-renders during composition.\n */\nexport type EditorRenderContext = {\n  emoticonSrc: (key: string) => string | undefined;\n  mentionDisplayName: (token: MentionToken) => string;\n};\n\nexport const defaultEditorRenderContext: EditorRenderContext = {\n  emoticonSrc: () => undefined,\n  mentionDisplayName: (token) => formatMentionElementDisplayName(token),\n};\n\nconst mentionTokenOf = (node: ProseMirrorNode): MentionToken => ({\n  type: BlockType.Mention,\n  id: node.attrs.id as string,\n  eventId: (node.attrs.eventId as string | null) ?? undefined,\n  viaServers: (node.attrs.viaServers as string[] | null) ?? undefined,\n  highlight: Boolean(node.attrs.highlight),\n  name: node.attrs.name as string,\n  children: [{ text: '' }],\n});\n\nabstract class AtomNodeView implements NodeView {\n  dom: HTMLElement;\n\n  protected selected = false;\n\n  constructor() {\n    this.dom = document.createElement('span');\n    // Otherwise the caret enters the pill and an IME can anchor inside it.\n    this.dom.setAttribute('contenteditable', 'false');\n  }\n\n  selectNode(): void {\n    this.selected = true;\n    this.render();\n  }\n\n  deselectNode(): void {\n    this.selected = false;\n    this.render();\n  }\n\n  stopEvent(): boolean {\n    return false;\n  }\n\n  protected abstract render(): void;\n}\n\nclass MentionNodeView extends AtomNodeView {\n  constructor(\n    private node: ProseMirrorNode,\n    private context: () => EditorRenderContext\n  ) {\n    super();\n    this.render();\n  }\n\n  protected render(): void {\n    const token = mentionTokenOf(this.node);\n    this.dom.className = css.Mention({ highlight: token.highlight, focus: this.selected });\n    this.dom.textContent = this.context().mentionDisplayName(token);\n  }\n}\n\nclass CommandNodeView extends AtomNodeView {\n  private active: boolean;\n\n  constructor(\n    private node: ProseMirrorNode,\n    decorations: readonly Decoration[]\n  ) {\n    super();\n    this.active = hasBeginCommandDecoration(decorations);\n    this.render();\n  }\n\n  // Active depends on surrounding text, not the node, so it arrives as a\n  // decoration — which is what makes this run on edits elsewhere.\n  update(node: ProseMirrorNode, decorations: readonly Decoration[]): boolean {\n    if (node.type !== this.node.type) return false;\n    this.node = node;\n    this.active = hasBeginCommandDecoration(decorations);\n    this.render();\n    return true;\n  }\n\n  protected render(): void {\n    this.dom.className = css.Command({ focus: this.selected, active: this.active });\n    this.dom.textContent = `/${this.node.attrs.command as string}`;\n  }\n}\n\nconst BEGIN_COMMAND_DECORATION = 'sableBeginCommand';\n\nconst hasBeginCommandDecoration = (decorations: readonly Decoration[]): boolean =>\n  decorations.some((decoration) => decoration.spec[BEGIN_COMMAND_DECORATION] === true);\n\n/** Mirrors getDocumentBeginCommand: first paragraph, only whitespace before. */\nexport const beginCommandPlugin = new Plugin({\n  props: {\n    decorations: (state) => {\n      const firstParagraph = state.doc.firstChild;\n      if (!firstParagraph) return null;\n      let offset = 1;\n      let prefix = '';\n      for (let index = 0; index < firstParagraph.childCount; index += 1) {\n        const child = firstParagraph.child(index);\n        if (child.type.name === 'command') {\n          return prefix.trim() === ''\n            ? DecorationSet.create(state.doc, [\n                NodeDecoration.node(\n                  offset,\n                  offset + child.nodeSize,\n                  {},\n                  { [BEGIN_COMMAND_DECORATION]: true }\n                ),\n              ])\n            : null;\n        }\n        if (!child.isText) return null;\n        prefix += child.text ?? '';\n        offset += child.nodeSize;\n      }\n      return null;\n    },\n  },\n});\n\nclass EmoticonNodeView extends AtomNodeView {\n  constructor(\n    private node: ProseMirrorNode,\n    private context: () => EditorRenderContext\n  ) {\n    super();\n    this.dom.className = css.EmoticonBase;\n    this.render();\n  }\n\n  protected render(): void {\n    const key = this.node.attrs.key as string;\n    const shortcode = this.node.attrs.shortcode as string;\n    const inner = document.createElement('span');\n    inner.className = css.Emoticon({ focus: this.selected });\n    inner.setAttribute('contenteditable', 'false');\n\n    const src = key.startsWith('mxc://') ? this.context().emoticonSrc(key) : undefined;\n    if (src) {\n      const img = document.createElement('img');\n      img.className = css.EmoticonImg;\n      img.style.width = 'auto';\n      img.style.height = '1em';\n      img.src = src;\n      img.alt = shortcode;\n      inner.append(img);\n    } else {\n      inner.textContent = key.startsWith('mxc://') ? `:${shortcode}:` : key;\n    }\n\n    this.dom.replaceChildren(inner);\n  }\n}\n\nexport const buildEditorNodeViews = (\n  context: () => EditorRenderContext\n): Record<string, NodeViewConstructor> => ({\n  mention: (node) => new MentionNodeView(node, context),\n  emoticon: (node) => new EmoticonNodeView(node, context),\n  command: (node, _view, _getPos, decorations) => new CommandNodeView(node, decorations),\n});\n","import { Schema, type Node as ProseMirrorNode } from 'prosemirror-model';\nimport type { EditorDocument, InlineToken } from './model';\nimport { emptyEditorDocument, isEditorText } from './model';\nimport { BlockType } from './types';\n\nexport const editorSchema = new Schema({\n  nodes: {\n    doc: { content: 'paragraph+' },\n    // Reset UA margins so a one-line composer stays one line high.\n    paragraph: {\n      content: 'inline*',\n      group: 'block',\n      parseDOM: [{ tag: 'p' }],\n      toDOM: () => ['p', { style: 'margin: 0' }, 0],\n    },\n    text: { group: 'inline' },\n    link: {\n      inline: true,\n      content: 'text*',\n      group: 'inline',\n      attrs: { href: {} },\n      parseDOM: [{ tag: 'a[href]', getAttrs: (dom) => ({ href: dom.getAttribute('href') }) }],\n      toDOM: (node) => ['a', { href: node.attrs.href }, 0],\n    },\n    // Node views render these in-editor; toDOM is the clipboard shape, so it\n    // must carry every attribute parseDOM needs to rebuild the node.\n    mention: {\n      inline: true,\n      atom: true,\n      group: 'inline',\n      selectable: true,\n      attrs: {\n        id: {},\n        eventId: { default: null },\n        viaServers: { default: null },\n        highlight: { default: false },\n        name: {},\n      },\n      parseDOM: [\n        {\n          tag: 'span[data-sable-mention]',\n          getAttrs: (dom) => ({\n            id: dom.getAttribute('data-sable-mention'),\n            name: dom.getAttribute('data-mention-name') ?? dom.textContent ?? '',\n            eventId: dom.getAttribute('data-mention-event-id'),\n            viaServers: dom.getAttribute('data-mention-via')?.split(',') ?? null,\n            highlight: dom.getAttribute('data-mention-highlight') === 'true',\n          }),\n        },\n      ],\n      toDOM: (node) => [\n        'span',\n        {\n          'data-sable-mention': node.attrs.id,\n          'data-mention-name': node.attrs.name,\n          ...(node.attrs.eventId ? { 'data-mention-event-id': node.attrs.eventId } : {}),\n          ...((node.attrs.viaServers as string[] | null)?.length\n            ? { 'data-mention-via': (node.attrs.viaServers as string[]).join(',') }\n            : {}),\n          ...(node.attrs.highlight ? { 'data-mention-highlight': 'true' } : {}),\n        },\n        node.attrs.name,\n      ],\n    },\n    emoticon: {\n      inline: true,\n      atom: true,\n      group: 'inline',\n      selectable: true,\n      attrs: { key: {}, shortcode: {} },\n      parseDOM: [\n        {\n          tag: 'span[data-sable-emoticon]',\n          getAttrs: (dom) => ({\n            key: dom.getAttribute('data-sable-emoticon'),\n            shortcode: dom.getAttribute('data-emoticon-shortcode') ?? '',\n          }),\n        },\n      ],\n      toDOM: (node) => [\n        'span',\n        {\n          'data-sable-emoticon': node.attrs.key,\n          'data-emoticon-shortcode': node.attrs.shortcode,\n        },\n        `:${node.attrs.shortcode}:`,\n      ],\n    },\n    command: {\n      inline: true,\n      atom: true,\n      group: 'inline',\n      selectable: true,\n      attrs: { command: {} },\n      parseDOM: [\n        {\n          tag: 'span[data-sable-command]',\n          getAttrs: (dom) => ({ command: dom.getAttribute('data-sable-command') }),\n        },\n      ],\n      toDOM: (node) => [\n        'span',\n        { 'data-sable-command': node.attrs.command },\n        `/${node.attrs.command}`,\n      ],\n    },\n  },\n});\n\nexport const toProseMirrorInline = (token: InlineToken): ProseMirrorNode | null => {\n  if (isEditorText(token)) return token.text ? editorSchema.text(token.text) : null;\n  switch (token.type) {\n    case BlockType.Link:\n      return editorSchema.nodes.link.create(\n        { href: token.href },\n        token.children\n          .map(toProseMirrorInline)\n          .filter((child): child is ProseMirrorNode => child !== null)\n      );\n    case BlockType.Mention:\n      return editorSchema.nodes.mention.create({\n        id: token.id,\n        eventId: token.eventId ?? null,\n        viaServers: token.viaServers ?? null,\n        highlight: token.highlight,\n        name: token.name,\n      });\n    case BlockType.Emoticon:\n      return editorSchema.nodes.emoticon.create({ key: token.key, shortcode: token.shortcode });\n    case BlockType.Command:\n      return editorSchema.nodes.command.create({ command: token.command });\n    default:\n      return null;\n  }\n};\n\nexport const toProseMirrorDocument = (document: EditorDocument) =>\n  editorSchema.node(\n    'doc',\n    undefined,\n    (document.length ? document : emptyEditorDocument()).map((paragraph) =>\n      editorSchema.nodes.paragraph.create(\n        undefined,\n        paragraph.children\n          .map(toProseMirrorInline)\n          .filter((child): child is ProseMirrorNode => child !== null)\n      )\n    )\n  );\n\nconst fromProseMirrorInline = (node: ProseMirrorNode): InlineToken => {\n  if (node.isText) return { text: node.text ?? '' };\n  switch (node.type.name) {\n    case 'link':\n      return {\n        type: BlockType.Link,\n        href: node.attrs.href as string,\n        children: node.content.content.map(fromProseMirrorInline) as { text: string }[],\n      };\n    case 'mention':\n      return {\n        type: BlockType.Mention,\n        id: node.attrs.id as string,\n        eventId: node.attrs.eventId ?? undefined,\n        viaServers: node.attrs.viaServers ?? undefined,\n        highlight: Boolean(node.attrs.highlight),\n        name: node.attrs.name as string,\n        children: [{ text: '' }],\n      };\n    case 'emoticon':\n      return {\n        type: BlockType.Emoticon,\n        key: node.attrs.key as string,\n        shortcode: node.attrs.shortcode as string,\n        children: [{ text: '' }],\n      };\n    case 'command':\n      return {\n        type: BlockType.Command,\n        command: node.attrs.command as string,\n        children: [{ text: '' }],\n      };\n    default:\n      return { text: node.textContent };\n  }\n};\n\nexport const fromProseMirrorDocument = (doc: ProseMirrorNode): EditorDocument => {\n  const document: EditorDocument = [];\n  doc.forEach((paragraph) => {\n    const children = paragraph.content.content.map(fromProseMirrorInline);\n    // ProseMirror has no empty text nodes; isEmpty and the serializers require\n    // at least one text token per paragraph.\n    document.push({\n      type: BlockType.Paragraph,\n      children: children.length ? children : [{ text: '' }],\n    });\n  });\n  return document.length ? document : emptyEditorDocument();\n};\n","import { baseKeymap, splitBlock } from 'prosemirror-commands';\nimport { history, redo, undo } from 'prosemirror-history';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Selection, TextSelection, type Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Fragment, Slice, type Node as ProseMirrorNode } from 'prosemirror-model';\nimport type { EditorDocument, InlineToken } from './model';\nimport { emptyEditorDocument, isEditorText } from './model';\nimport type { EditorRenderContext } from './prosemirrorNodeViews';\nimport {\n  beginCommandPlugin,\n  buildEditorNodeViews,\n  defaultEditorRenderContext,\n} from './prosemirrorNodeViews';\nimport {\n  editorSchema,\n  fromProseMirrorDocument,\n  toProseMirrorDocument,\n  toProseMirrorInline,\n} from './prosemirrorSchema';\n\nconst isProseMirrorDocumentEmpty = (doc: ProseMirrorNode): boolean =>\n  doc.childCount === 1 && doc.firstChild?.content.size === 0;\n\n// Mirrors prosemirror-view's own Android gate for its backspace fallback.\nconst isAndroid = (): boolean => /Android \\d/.test(navigator.userAgent);\n\nconst androidBackspaceKeyEvent = (): KeyboardEvent =>\n  new KeyboardEvent('keydown', {\n    key: 'Backspace',\n    code: 'Backspace',\n    bubbles: true,\n    cancelable: true,\n  });\n\n/**\n * prosemirror-view resyncs an Android backspace that left the DOM untouched by\n * blurring and refocusing the editable, which flashes the soft keyboard shut.\n * Delete through the state instead.\n */\nconst handleAndroidDeleteBackward = (view: EditorView): void => {\n  const cursor =\n    view.state.selection instanceof TextSelection ? view.state.selection.$cursor : null;\n  if (!cursor || cursor.pos <= 0) return;\n  const pos = cursor.pos;\n  const contentSize = view.state.doc.content.size;\n  window.setTimeout(() => {\n    // The IME deleted in the DOM; leave it to the DOM observer.\n    const cursorAfter =\n      view.state.selection instanceof TextSelection ? view.state.selection.$cursor : null;\n    if (!cursorAfter || cursorAfter.pos !== pos) return;\n    if (view.state.doc.content.size !== contentSize) return;\n    // Prefer the keymap so atom nodes follow desktop Backspace behavior.\n    if (view.someProp('handleKeyDown', (handler) => handler(view, androidBackspaceKeyEvent())))\n      return;\n    view.dispatch(view.state.tr.delete(pos - 1, pos));\n  }, 50);\n};\n\nexport type EditorAutocompleteQuery<TPrefix extends string> = {\n  from: number;\n  prefix: TPrefix;\n  text: string;\n  to: number;\n};\n\nexport type EditorDomEventHandlers = {\n  blur?: (event: FocusEvent) => void;\n  focus?: (event: FocusEvent) => void;\n};\n\n/**\n * The sole editor-engine seam. Consumers exchange Sable documents and never\n * retain an EditorState or EditorView.\n */\nexport class ProseMirrorEditorController {\n  private attributes: Record<string, string> = {};\n  private document: EditorDocument;\n  private domEventHandlers: EditorDomEventHandlers = {};\n  private listeners = new Set<(document: EditorDocument) => void>();\n  private renderContext: EditorRenderContext = defaultEditorRenderContext;\n  private view: EditorView | undefined;\n\n  constructor(initialDocument: EditorDocument = emptyEditorDocument()) {\n    this.document = structuredClone(initialDocument);\n  }\n\n  setAttributes(attributes: Record<string, string>): void {\n    const unchanged =\n      Object.keys(attributes).length === Object.keys(this.attributes).length &&\n      Object.entries(attributes).every(([key, value]) => this.attributes[key] === value);\n    if (unchanged) return;\n    this.attributes = attributes;\n    this.view?.setProps({ attributes: this.viewAttributes });\n  }\n\n  private viewAttributes = (state: EditorState): Record<string, string> => ({\n    ...this.attributes,\n    'data-placeholder-visible': String(isProseMirrorDocumentEmpty(state.doc)),\n  });\n\n  /** Rebuilding node views is a full redraw, so only react to a real change. */\n  setRenderContext(context: EditorRenderContext): void {\n    if (context === this.renderContext) return;\n    this.renderContext = context;\n    this.view?.setProps({ nodeViews: buildEditorNodeViews(() => this.renderContext) });\n  }\n\n  setDomEventHandlers(handlers: EditorDomEventHandlers): void {\n    this.domEventHandlers = handlers;\n  }\n\n  get children(): EditorDocument {\n    return this.getDocument();\n  }\n\n  getDocument(): EditorDocument {\n    return structuredClone(this.document);\n  }\n\n  isEmpty(): boolean {\n    const firstParagraph = this.document[0];\n    const firstToken = firstParagraph?.children[0];\n    return (\n      this.document.length === 1 &&\n      firstParagraph?.children.length === 1 &&\n      !!firstToken &&\n      isEditorText(firstToken) &&\n      firstToken.text === ''\n    );\n  }\n\n  isSelectionAtStart(): boolean {\n    const view = this.view;\n    return !!view && view.state.selection.empty && view.state.selection.from === 1;\n  }\n\n  getText(): string {\n    const view = this.view;\n    if (view) return view.state.doc.textBetween(0, view.state.doc.content.size, '\\n', '\\0');\n    return this.document\n      .map((paragraph) =>\n        paragraph.children.map((child) => (isEditorText(child) ? child.text : '')).join('')\n      )\n      .join('\\n');\n  }\n\n  setDocument(document: EditorDocument): void {\n    this.document = structuredClone(document.length ? document : emptyEditorDocument());\n    if (this.view) {\n      const nextDocument = toProseMirrorDocument(this.document);\n      if (this.view.state.doc.eq(nextDocument)) return;\n      const transaction = this.view.state.tr.replaceWith(\n        0,\n        this.view.state.doc.content.size,\n        nextDocument.content\n      );\n      // Put the caret after the new content rather than wherever the old ended.\n      transaction.setSelection(Selection.atEnd(transaction.doc));\n      this.view.dispatch(transaction);\n      return;\n    }\n    this.notify();\n  }\n\n  appendDocument(document: EditorDocument): void {\n    if (!document.length) return;\n    this.setDocument(this.isEmpty() ? document : [...this.document, ...document]);\n  }\n\n  private createState(): EditorState {\n    return EditorState.create({\n      doc: toProseMirrorDocument(this.document),\n      plugins: [\n        beginCommandPlugin,\n        history(),\n        keymap({ 'Mod-z': undo, 'Mod-Shift-z': redo, 'Mod-y': redo }),\n        // Enter is withheld on purpose: the host decides send vs newline.\n        // Binding it here also splits the paragraph, on top of whatever it did.\n        keymap(Object.fromEntries(Object.entries(baseKeymap).filter(([key]) => key !== 'Enter'))),\n      ],\n      schema: editorSchema,\n    });\n  }\n\n  mount(element: HTMLElement, attributes?: Record<string, string>): () => void {\n    this.view?.destroy();\n    this.attributes = attributes ?? {};\n    const state = this.createState();\n    this.view = new EditorView(\n      { mount: element },\n      {\n        attributes: this.viewAttributes,\n        handleDOMEvents: {\n          focus: (_view, event) => {\n            this.domEventHandlers.focus?.(event as FocusEvent);\n            return false;\n          },\n          blur: (_view, event) => {\n            this.domEventHandlers.blur?.(event as FocusEvent);\n            return false;\n          },\n          beforeinput: (view, event) => {\n            if (!isAndroid() || (event as InputEvent).inputType !== 'deleteContentBackward')\n              return false;\n            handleAndroidDeleteBackward(view);\n            return true;\n          },\n        },\n        handlePaste: (view, event) => {\n          const text = event.clipboardData?.getData('text/plain');\n          if (text === undefined || text === '') return false;\n\n          const paragraphs = text\n            .split(/\\r\\n?|\\n/)\n            .map((line) =>\n              editorSchema.nodes.paragraph.create(\n                undefined,\n                line ? editorSchema.text(line) : undefined\n              )\n            );\n          view.dispatch(\n            view.state.tr.replaceSelection(Slice.maxOpen(Fragment.from(paragraphs), true))\n          );\n          return true;\n        },\n        nodeViews: buildEditorNodeViews(() => this.renderContext),\n        state,\n        dispatchTransaction: (transaction: Transaction) => {\n          const view = this.view;\n          if (!view) return;\n          view.updateState(view.state.apply(transaction));\n          if (transaction.docChanged) {\n            this.document = fromProseMirrorDocument(view.state.doc);\n            this.notify();\n          }\n        },\n      }\n    );\n    return () => {\n      this.view?.destroy();\n      this.view = undefined;\n    };\n  }\n\n  focus(): void {\n    this.view?.focus();\n  }\n\n  /** Drops the undo stack too: cleared content was sent, consumed, or abandoned. */\n  clear(): void {\n    this.setDocument(emptyEditorDocument());\n    if (this.view) this.view.updateState(this.createState());\n  }\n\n  blur(): void {\n    (this.view?.dom as HTMLElement | undefined)?.blur();\n  }\n\n  undo(): void {\n    if (this.view) undo(this.view.state, this.view.dispatch);\n  }\n\n  redo(): void {\n    if (this.view) redo(this.view.state, this.view.dispatch);\n  }\n\n  insertText(text: string): void {\n    const view = this.view;\n    if (view) view.dispatch(view.state.tr.insertText(text));\n  }\n\n  insertNewline(): void {\n    const view = this.view;\n    if (view) splitBlock(view.state, view.dispatch);\n  }\n\n  insertInline(token: InlineToken, from?: number, to?: number): void {\n    const view = this.view;\n    const node = toProseMirrorInline(token);\n    if (!view || !node) return;\n    const start = from ?? view.state.selection.from;\n    const end = to ?? view.state.selection.to;\n    const transaction = view.state.tr.replaceWith(start, end, node);\n    transaction.setSelection(TextSelection.create(transaction.doc, start + node.nodeSize));\n    view.dispatch(transaction);\n  }\n\n  getAutocompleteQuery<TPrefix extends string>(\n    prefixes: readonly TPrefix[],\n    atDocumentStart = false\n  ): EditorAutocompleteQuery<TPrefix> | undefined {\n    const view = this.view;\n    if (!view || !view.state.selection.empty) return undefined;\n    const { $from, from } = view.state.selection;\n    const precedingText = view.state.doc.textBetween($from.start(), from, '\\n', '\\0');\n    const word = precedingText.match(/(?:^|\\s)(\\S*)$/)?.[1];\n    if (!word) return undefined;\n    const prefix = prefixes.find((candidate) => word.startsWith(candidate));\n    if (!prefix) return undefined;\n    const queryFrom = from - word.length;\n    if (\n      atDocumentStart &&\n      ($from.parent !== view.state.doc.firstChild ||\n        view.state.doc.textBetween(1, queryFrom, '\\n', '\\0').trim() !== '')\n    ) {\n      return undefined;\n    }\n    return { from: queryFrom, to: from, prefix, text: word.slice(prefix.length) };\n  }\n\n  applyMarkdownInline(marker: string): void {\n    const view = this.view;\n    if (!view) return;\n    const { from, to, empty } = view.state.selection;\n    const selectedText = empty ? '' : view.state.doc.textBetween(from, to, '\\n', '\\0');\n    const transaction = view.state.tr.insertText(`${marker}${selectedText}${marker}`, from, to);\n    transaction.setSelection(\n      TextSelection.create(transaction.doc, from + marker.length + selectedText.length)\n    );\n    view.dispatch(transaction);\n  }\n\n  applyMarkdownBlockPrefix(prefix: string): void {\n    const view = this.view;\n    if (view) view.dispatch(view.state.tr.insertText(prefix, view.state.selection.$from.start()));\n  }\n\n  subscribe(listener: (document: EditorDocument) => void): () => void {\n    this.listeners.add(listener);\n    return () => this.listeners.delete(listener);\n  }\n\n  private notify(): void {\n    this.listeners.forEach((listener) => listener(this.getDocument()));\n  }\n}\n","import type { KeyboardEvent } from 'react';\nimport type { ProseMirrorEditorController } from './prosemirrorController';\nimport type { ShortcutId, ShortcutOverrides } from '../../keyboard/shortcuts';\nimport { matchesShortcut } from '../../keyboard/shortcuts';\n\nexport const INLINE_MARKERS = {\n  'composer.bold': '**',\n  'composer.italic': '*',\n  'composer.underline': '__',\n  'composer.strikethrough': '~~',\n  'composer.inlineCode': '`',\n  'composer.spoiler': '||',\n} satisfies Partial<Record<ShortcutId, string>>;\n\nexport const BLOCK_PREFIXES = {\n  'composer.heading1': '# ',\n  'composer.heading2': '## ',\n  'composer.heading3': '### ',\n  'composer.blockquote': '> ',\n  'composer.codeBlock': '```\\n',\n  'composer.orderedList': '1. ',\n  'composer.unorderedList': '- ',\n} satisfies Partial<Record<ShortcutId, string>>;\n\nconst INLINE_ACTIONS = Object.entries(INLINE_MARKERS) as [ShortcutId, string][];\nconst BLOCK_ACTIONS = Object.entries(BLOCK_PREFIXES) as [ShortcutId, string][];\n\n/** Same user-configurable Markdown shortcut policy for the ProseMirror adapter. */\nexport const toggleProseMirrorKeyboardShortcut = (\n  controller: ProseMirrorEditorController,\n  event: KeyboardEvent,\n  overrides: ShortcutOverrides\n): boolean => {\n  if (matchesShortcut('composer.undo', event, overrides)) {\n    controller.undo();\n    return true;\n  }\n  if (matchesShortcut('composer.redo', event, overrides)) {\n    controller.redo();\n    return true;\n  }\n  const block = BLOCK_ACTIONS.find(([id]) => matchesShortcut(id, event, overrides));\n  if (block) {\n    controller.applyMarkdownBlockPrefix(block[1]);\n    return true;\n  }\n  const inline = INLINE_ACTIONS.find(([id]) => matchesShortcut(id, event, overrides));\n  if (inline) {\n    controller.applyMarkdownInline(inline[1]);\n    return true;\n  }\n  return false;\n};\n","import { useMemo } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { nicknamesAtom } from '$state/nicknames';\nimport type { EditorRenderContext } from './prosemirrorNodeViews';\nimport { formatMentionElementDisplayName } from './utils';\n\nexport const useEditorRenderContext = (): EditorRenderContext => {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const nicknames = useAtomValue(nicknamesAtom);\n\n  return useMemo(\n    () => ({\n      emoticonSrc: (key) => mxcUrlToHttp(mx, key, useAuthentication) ?? undefined,\n      mentionDisplayName: (token) => {\n        const nickname = nicknames[token.id];\n        return nickname ? `@${nickname}` : formatMentionElementDisplayName(token);\n      },\n    }),\n    [mx, nicknames, useAuthentication]\n  );\n};\n","import type {\n  ClipboardEventHandler,\n  KeyboardEventHandler,\n  MutableRefObject,\n  ReactNode,\n} from 'react';\nimport { forwardRef, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { Box, Scroll } from 'folds';\nimport { iosApp, isMobileOrTablet } from '$utils/platform';\nimport { readClipboardText } from '$utils/dom';\nimport { createLogger } from '$utils/debug';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport type { EditorDocument } from './model';\nimport { ProseMirrorEditable } from './ProseMirrorEditable';\nimport { ProseMirrorEditorController } from './prosemirrorController';\nimport { toggleProseMirrorKeyboardShortcut } from './keyboard';\nimport { useEditorRenderContext } from './useEditorRenderContext';\nimport * as css from './Editor.css';\n\nexport const useEditor = (): ProseMirrorEditorController => {\n  const [editor] = useState(() => new ProseMirrorEditorController());\n  const renderContext = useEditorRenderContext();\n  useEffect(() => {\n    editor.setRenderContext(renderContext);\n  }, [editor, renderContext]);\n  return editor;\n};\n\nconst log = createLogger('Editor');\nconst MULTILINE_HEIGHT_EPSILON = 1;\nconst TRAILING_SPACE_SENTINEL = '\\u200B';\n\nconst normalizeMeasurementText = (text: string): string =>\n  /[ \\t]+$/.test(text) ? `${text}${TRAILING_SPACE_SENTINEL}` : text;\n\ntype CustomEditorProps = {\n  after?: ReactNode;\n  before?: ReactNode;\n  bottom?: ReactNode;\n  className?: string;\n  editableName?: string;\n  editor: ProseMirrorEditorController;\n  enterKeyHint?: 'enter' | 'send';\n  forceMultilineLayout?: boolean;\n  maxHeight?: string;\n  onChange?: (value: EditorDocument) => void;\n  onKeyDown?: KeyboardEventHandler;\n  onKeyUp?: KeyboardEventHandler;\n  onPaste?: ClipboardEventHandler;\n  placeholder?: string;\n  responsiveAfter?: ReactNode;\n  suppressBlurRefocusRef?: MutableRefObject<boolean>;\n  top?: ReactNode;\n  variant?: 'Surface' | 'SurfaceVariant' | 'Background';\n};\n\n/**\n * Visual shell for the Sable editor. Its interface is engine-neutral: callers\n * interact with a controller and Sable documents, never an editor engine state.\n */\nexport const CustomEditor = forwardRef<HTMLDivElement, CustomEditorProps>(\n  (\n    {\n      after,\n      before,\n      bottom,\n      className,\n      editableName,\n      editor,\n      enterKeyHint,\n      forceMultilineLayout = false,\n      maxHeight = '50dvh',\n      onChange,\n      onKeyDown,\n      onKeyUp,\n      onPaste,\n      placeholder,\n      responsiveAfter,\n      suppressBlurRefocusRef,\n      variant = 'SurfaceVariant',\n      top,\n    },\n    ref\n  ) => {\n    const [shortcutOverrides] = useSetting(settingsAtom, 'shortcutOverrides');\n    const [alwaysInlineEditor] = useSetting(settingsAtom, 'alwaysInlineEditor');\n    const rootRef = useRef<HTMLDivElement | null>(null);\n    const rowRef = useRef<HTMLDivElement | null>(null);\n    const beforeRef = useRef<HTMLDivElement | null>(null);\n    const afterRef = useRef<HTMLDivElement | null>(null);\n    const editableRef = useRef<HTMLDivElement | null>(null);\n    const measurerRef = useRef<HTMLDivElement | null>(null);\n    const latestTextRef = useRef(editor.getText());\n    const focusScrollTimerRef = useRef<number | undefined>(undefined);\n    const [isMultiline, setIsMultiline] = useState(false);\n    const [measurementVersion, setMeasurementVersion] = useState(0);\n\n    const hasBefore = Boolean(before);\n    const hasAfter = Boolean(after);\n    const layoutIsMultiline = !alwaysInlineEditor && (isMultiline || forceMultilineLayout);\n    const showResponsiveAfterInFooter = Boolean(responsiveAfter) && layoutIsMultiline;\n\n    const updateMultilineLayout = useCallback(() => {\n      const text = latestTextRef.current;\n      const row = rowRef.current;\n      const measurer = measurerRef.current;\n      const editable = editableRef.current;\n      if (!row || !measurer || !editable) return;\n\n      let nextMultiline = text.includes('\\n');\n      if (!nextMultiline && text.length > 0) {\n        const computedStyle = getComputedStyle(editable);\n        const beforeWidth = beforeRef.current?.offsetWidth ?? 0;\n        const afterWidth = afterRef.current?.offsetWidth ?? 0;\n        const width = Math.max(0, row.clientWidth - beforeWidth - afterWidth);\n        if (width > 0) {\n          Object.assign(measurer.style, {\n            font: computedStyle.font,\n            lineHeight: computedStyle.lineHeight,\n            letterSpacing: computedStyle.letterSpacing,\n            fontKerning: computedStyle.fontKerning,\n            fontFeatureSettings: computedStyle.fontFeatureSettings,\n            fontVariationSettings: computedStyle.fontVariationSettings,\n            textTransform: computedStyle.textTransform,\n            textIndent: computedStyle.textIndent,\n            tabSize: computedStyle.tabSize,\n            width: 'max-content',\n          });\n          measurer.textContent = 'M';\n          const singleLineHeight = measurer.scrollHeight;\n          measurer.style.width = `${width}px`;\n          measurer.textContent = normalizeMeasurementText(text);\n          nextMultiline = measurer.scrollHeight > singleLineHeight + MULTILINE_HEIGHT_EPSILON;\n        }\n      }\n      setIsMultiline(nextMultiline);\n    }, []);\n\n    useEffect(() => {\n      const root = rootRef.current;\n      if (!root) return undefined;\n      const measurerHost = document.createElement('div');\n      const measurer = document.createElement('div');\n      measurer.dataset.editorMeasurer = editableName ?? '';\n      Object.assign(measurerHost.style, {\n        position: 'absolute',\n        width: '0',\n        height: '0',\n        overflow: 'hidden',\n        pointerEvents: 'none',\n        visibility: 'hidden',\n      });\n      Object.assign(measurer.style, {\n        padding: '0',\n        border: '0',\n        margin: '0',\n        whiteSpace: 'pre-wrap',\n        overflowWrap: 'break-word',\n        wordBreak: 'break-word',\n        boxSizing: 'border-box',\n      });\n      measurerHost.appendChild(measurer);\n      root.appendChild(measurerHost);\n      measurerRef.current = measurer;\n      return () => {\n        measurerRef.current = null;\n        measurerHost.remove();\n      };\n    }, [editableName]);\n\n    useLayoutEffect(() => {\n      updateMultilineLayout();\n    }, [measurementVersion, updateMultilineLayout]);\n\n    useEffect(() => {\n      if (typeof ResizeObserver === 'undefined') return undefined;\n      const observer = new ResizeObserver(updateMultilineLayout);\n      [rowRef.current, beforeRef.current, afterRef.current].forEach((element) => {\n        if (element) observer.observe(element);\n      });\n      return () => observer.disconnect();\n    }, [updateMultilineLayout, hasBefore, hasAfter]);\n\n    useEffect(() => () => window.clearTimeout(focusScrollTimerRef.current), []);\n    const handleKeyDown: KeyboardEventHandler = useCallback(\n      (event) => {\n        onKeyDown?.(event);\n        if (\n          !event.defaultPrevented &&\n          toggleProseMirrorKeyboardShortcut(editor, event, shortcutOverrides)\n        ) {\n          event.preventDefault();\n        }\n      },\n      [editor, onKeyDown, shortcutOverrides]\n    );\n    const handlePaste: ClipboardEventHandler = useCallback(\n      (event) => {\n        onPaste?.(event);\n        if (event.defaultPrevented || !iosApp() || event.clipboardData.getData('text/plain'))\n          return;\n        event.preventDefault();\n        readClipboardText()\n          .then((text) => text && editor.insertText(text))\n          .catch((error: unknown) =>\n            log.warn('Failed to read the native clipboard on paste:', error)\n          );\n      },\n      [editor, onPaste]\n    );\n\n    useEffect(() => {\n      editor.setDomEventHandlers({\n        blur: (event) => {\n          if (!isMobileOrTablet() || suppressBlurRefocusRef?.current) return;\n          const next = event.relatedTarget as HTMLElement | null;\n          if (!next || next.isContentEditable) return;\n          // Only reclaim focus when it moved within the composer, so taps on\n          // the timeline (e.g. images) dismiss the keyboard.\n          if (!rootRef.current?.contains(next) && !next.closest('[data-autocomplete-menu]')) return;\n          editor.focus();\n        },\n        focus: () => {\n          if (!isMobileOrTablet()) return;\n          const editable = document.activeElement;\n          window.clearTimeout(focusScrollTimerRef.current);\n          const scrollIntoView = () => {\n            if (editable && editable === document.activeElement) {\n              rootRef.current?.scrollIntoView({ block: 'nearest' });\n            }\n          };\n          window.visualViewport?.addEventListener('resize', scrollIntoView, { once: true });\n          focusScrollTimerRef.current = window.setTimeout(scrollIntoView, 500);\n        },\n      });\n      return () => editor.setDomEventHandlers({});\n    }, [editor, suppressBlurRefocusRef]);\n\n    const setRootRef = useCallback(\n      (element: HTMLDivElement | null) => {\n        rootRef.current = element;\n        if (typeof ref === 'function') ref(element);\n        else if (ref) ref.current = element;\n      },\n      [ref]\n    );\n    const handleDocumentChange = useCallback(\n      (document: EditorDocument) => {\n        latestTextRef.current = editor.getText();\n        setMeasurementVersion((version) => version + 1);\n        onChange?.(document);\n      },\n      [editor, onChange]\n    );\n\n    return (\n      <div ref={setRootRef} className={`${css.Editor} ${className ?? ''}`}>\n        {top}\n        <Box\n          ref={rowRef}\n          className={`${css.EditorRow} ${layoutIsMultiline ? css.EditorRowMultiline : ''} ${showResponsiveAfterInFooter ? css.EditorRowMultilineWithResponsiveAfter : ''}`}\n          alignItems=\"Start\"\n          style={{ display: after ? 'grid' : 'flex' }}\n        >\n          {before && (\n            <Box\n              ref={beforeRef}\n              className={`${css.EditorOptions} ${layoutIsMultiline ? css.EditorOptionsMultiline : ''}`}\n              alignItems=\"Center\"\n              gap=\"100\"\n              shrink=\"No\"\n            >\n              {before}\n            </Box>\n          )}\n          <Scroll\n            className={`${css.EditorTextareaScroll} ${layoutIsMultiline ? css.EditorTextareaScrollMultiline : ''}`}\n            variant={variant}\n            style={{ maxHeight: showResponsiveAfterInFooter ? undefined : maxHeight }}\n            size=\"300\"\n            visibility=\"Always\"\n            hideTrack\n          >\n            <ProseMirrorEditable\n              onHostChange={(element) => {\n                editableRef.current = element;\n              }}\n              controller={editor}\n              editableName={editableName}\n              editorClassName={css.EditorTextarea}\n              placeholder={placeholder}\n              enterKeyHint={enterKeyHint}\n              onDocumentChange={handleDocumentChange}\n              onKeyDown={handleKeyDown}\n              onKeyUp={onKeyUp}\n              onPaste={handlePaste}\n            />\n          </Scroll>\n          {(after || (responsiveAfter && !showResponsiveAfterInFooter)) && (\n            <Box\n              ref={afterRef}\n              className={`${css.EditorOptions} ${layoutIsMultiline ? `${css.EditorOptionsMultiline} ${css.EditorOptionsAfterMultiline}` : ''}`}\n              alignItems=\"Center\"\n              gap=\"100\"\n              shrink=\"No\"\n            >\n              {!showResponsiveAfterInFooter && responsiveAfter}\n              {after}\n            </Box>\n          )}\n          {showResponsiveAfterInFooter && (\n            <Box\n              className={css.EditorResponsiveAfterMultiline}\n              alignItems=\"Center\"\n              justifyContent=\"End\"\n              gap=\"100\"\n            >\n              {responsiveAfter}\n            </Box>\n          )}\n        </Box>\n        {bottom}\n      </div>\n    );\n  }\n);\n","import { findAndReplace } from '$utils/findAndReplace';\n\n// URL-aware pattern for inline sequences\nconst URL_NEG_LB = '(?<!(?:https?|ftp|mailto|magnet):\\\\/\\\\/\\\\S*)';\nconst INLINE_SEQUENCE_SET = '[*_~`|<>]';\nconst CAP_INLINE_SEQ = `${URL_NEG_LB}${INLINE_SEQUENCE_SET}`;\n\n/**\n * Removes escape sequences from markdown inline elements in the given plain-text.\n * This function unescapes characters that are escaped with backslashes (e.g., `\\*`, `\\_`)\n * in markdown syntax, returning the original plain-text with markdown characters in effect.\n *\n * @param text - The input markdown plain-text containing escape characters (e.g., `\"some \\*italic\\*\"`)\n * @returns The plain-text with markdown escape sequences removed (e.g., `\"some *italic*\"`)\n */\nconst unescapeMarkdownInlineSequences = (text: string): string => {\n  const escapePattern = new RegExp(`${URL_NEG_LB}\\\\\\\\(${INLINE_SEQUENCE_SET})`, 'g');\n  const parts = findAndReplace(\n    text,\n    escapePattern,\n    (match) => {\n      const [, g1] = match;\n      return g1 ?? '';\n    },\n    (t) => t\n  );\n  return parts.join('');\n};\n\nconst PLACEHOLDER_START = '\\uE000';\nconst PLACEHOLDER_END = '\\uE001';\n\n/**\n * Like {@link unescapeMarkdownInlineSequences}, but leaves &lt;pre&gt;…&lt;/pre&gt; and\n * &lt;code&gt;…&lt;/code&gt; regions unchanged so backslash escapes remain literal in HTML\n * code blocks (CommonMark treats them as verbatim in the source markdown, and the post-parse\n * HTML pass must not strip viewer-intended `\\` characters there).\n */\nexport const unescapeMarkdownInlineSequencesExceptInCodeHtml = (html: string): string => {\n  const preserved: string[] = [];\n  const tag = (idx: number) => `${PLACEHOLDER_START}${idx}${PLACEHOLDER_END}`;\n\n  let masked = html.replace(/<pre\\b[^>]*>[\\s\\S]*?<\\/pre>/gi, (chunk) => {\n    preserved.push(chunk);\n    return tag(preserved.length - 1);\n  });\n\n  masked = masked.replace(/<code\\b[^>]*>[\\s\\S]*?<\\/code>/gi, (chunk) => {\n    preserved.push(chunk);\n    return tag(preserved.length - 1);\n  });\n\n  const unescaped = unescapeMarkdownInlineSequences(masked);\n\n  return unescaped.replace(\n    new RegExp(`${PLACEHOLDER_START}(\\\\d+)${PLACEHOLDER_END}`, 'g'),\n    (_, i) => preserved[parseInt(i, 10)] ?? ''\n  );\n};\n\n/**\n * Recovers the markdown escape sequences in the given plain-text.\n * This function adds backslashes (`\\`) before markdown characters that may need escaping\n * (e.g., `*`, `_`) to ensure they are treated as literal characters and not part of markdown formatting.\n *\n * @param text - The input plain-text that may contain markdown sequences (e.g., `\"some *italic*\"`)\n * @returns The plain-text with markdown escape sequences added (e.g., `\"some \\*italic\\*\"`)\n */\nexport const escapeMarkdownInlineSequences = (text: string): string => {\n  const regex = new RegExp(`(${CAP_INLINE_SEQ})`, 'g');\n  const parts = findAndReplace(\n    text,\n    regex,\n    (match) => {\n      const [, g1] = match;\n      return `\\\\${g1}`;\n    },\n    (t) => t\n  );\n\n  let out = parts.join('');\n  out = out.replace(\n    /(^|\\n)-(# +)/gm,\n    (_, lineStart: string, hashSp: string) => `${lineStart}\\\\-${hashSp}`\n  );\n  return out;\n};\n\n/**\n * CommonMark treats `>` at line start as a block quote marker even when not followed by\n * space. We only start a block quote when `>` is followed by horizontal whitespace.\n * Lines like `>:3` get a backslash so the `>` is literal.\n */\nexport const escapeLineStartBlockquoteWithoutFollowingSpace = (markdown: string): string =>\n  markdown.replace(/^(\\s*)>(?![ \\t])/gm, '$1\\\\>');\n","/**\n * marked v18.0.10 - a markdown parser\n * Copyright (c) 2018-2026, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction C(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var R=C();function j(l){R=l}var z={exec:()=>null};function A(l){let e=[];return t=>{let n=Math.max(0,Math.min(3,t-1)),s=e[n];return s||(s=l(n),e[n]=s),s}}function d(l,e=\"\"){let t=typeof l==\"string\"?l:l.source,n={replace:(s,r)=>{let i=typeof r==\"string\"?r:r.source;return i=i.replace(m.caret,\"$1\"),t=t.replace(s,i),n},getRegex:()=>new RegExp(t,e)};return n}var Te=((l=\"\")=>{try{return!!new RegExp(\"(?<=1)(?<!1)\"+l)}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:A(l=>new RegExp(`^ {0,${l}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:A(l=>new RegExp(`^ {0,${l}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`)),fencesBeginRegex:A(l=>new RegExp(`^ {0,${l}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:A(l=>new RegExp(`^ {0,${l}}#`)),htmlBeginRegex:A(l=>new RegExp(`^ {0,${l}}<(?:[a-z].*>|!--)`,\"i\")),blockquoteBeginRegex:A(l=>new RegExp(`^ {0,${l}}>`))},Oe=/^(?:[ \\t]*(?:\\n|$))+/,we=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,ye=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,q=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Pe=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,U=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,oe=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,ae=d(oe).replace(/bull/g,U).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Se=d(oe).replace(/bull/g,U).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),K=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,_e=/^[^\\n]+/,W=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,$e=d(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",W).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Le=d(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,U).getRegex(),Q=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",X=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Me=d(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",X).replace(\"tag\",Q).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),le=l=>d(K).replace(\"hr\",q).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",l).replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",Q).getRegex(),ze=le(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),Ee=le(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),Ce=d(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",Ee).getRegex(),J={blockquote:Ce,code:we,def:$e,fences:ye,heading:Pe,hr:q,html:Me,lheading:ae,list:Le,newline:Oe,paragraph:ze,table:z,text:_e},se=d(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",q).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",Q).getRegex(),Ae={...J,lheading:Se,table:se,paragraph:d(K).replace(\"hr\",q).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",se).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",Q).getRegex()},Ie={...J,html:d(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",X).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:z,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:d(K).replace(\"hr\",q).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",ae).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Be=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,De=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,pe=/^( {2,}|\\\\)\\n(?!\\s*$)/,qe=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,_=/[\\p{P}\\p{S}]/u,I=/[\\s\\p{P}\\p{S}]/u,v=/[^\\s\\p{P}\\p{S}]/u,ve=d(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,I).getRegex(),He=/[\\p{Pi}\\p{Ps}\"']/u,ue=/(?!~)[\\p{P}\\p{S}]/u,Ze=/(?!~)[\\s\\p{P}\\p{S}]/u,Ge=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Qe=d(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",Te?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ce=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,Ne=d(ce,\"u\").replace(/punct/g,_).getRegex(),je=d(ce,\"u\").replace(/punct/g,ue).getRegex(),Fe=/^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/,Ue=d(Fe,\"u\").replace(/openQuote/g,He).replace(/punct/g,_).getRegex(),he=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",Ke=d(he,\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,I).replace(/punct/g,_).getRegex(),We=d(he,\"gu\").replace(/notPunctSpace/g,Ge).replace(/punctSpace/g,Ze).replace(/punct/g,ue).getRegex(),Xe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)\",Je=d(Xe,\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,I).replace(/punct/g,_).getRegex(),Ve=d(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,I).replace(/punct/g,_).getRegex(),Ye=\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\\\s](_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)\",et=d(Ye,\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,I).replace(/punct/g,_).getRegex(),tt=d(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,_).getRegex(),nt=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",rt=d(nt,\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,I).replace(/punct/g,_).getRegex(),st=d(/\\\\(punct)/,\"gu\").replace(/punct/g,_).getRegex(),it=d(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),ot=d(X).replace(\"(?:-->|$)\",\"-->\").getRegex(),at=d(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",ot).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),G=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,lt=d(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace(\"label\",G).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),de=d(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",G).replace(\"ref\",W).getRegex(),ke=d(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",W).getRegex(),pt=d(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",de).replace(\"nolink\",ke).getRegex(),ie=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,V={_backpedal:z,anyPunctuation:st,autolink:it,blockSkip:Qe,br:pe,code:De,del:z,delLDelim:z,delRDelim:z,emStrongLDelim:Ne,emStrongRDelimAst:Ke,emStrongRDelimUnd:Ve,escape:Be,link:lt,nolink:ke,punctuation:ve,reflink:de,reflinkSearch:pt,tag:at,text:qe,url:z},ut={...V,emStrongLDelim:Ue,emStrongRDelimAst:Je,emStrongRDelimUnd:et,link:d(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",G).getRegex(),reflink:d(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",G).getRegex()},F={...V,emStrongRDelimAst:We,emStrongLDelim:je,delLDelim:tt,delRDelim:rt,url:d(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",ie).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:d(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",ie).getRegex()},ct={...F,br:d(pe).replace(\"{2,}\",\"*\").getRegex(),text:d(F.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},H={normal:J,gfm:Ae,pedantic:Ie},B={normal:V,gfm:F,breaks:ct,pedantic:ut};var ht={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},ge=l=>ht[l];function O(l,e){if(e){if(m.escapeTest.test(l))return l.replace(m.escapeReplace,ge)}else if(m.escapeTestNoEncode.test(l))return l.replace(m.escapeReplaceNoEncode,ge);return l}function Y(l){try{l=encodeURI(l).replace(m.percentDecode,\"%\")}catch{return null}return l}function ee(l,e){let t=l.replace(m.findPipe,(r,i,o)=>{let p=!1,a=i;for(;--a>=0&&o[a]===\"\\\\\";)p=!p;return p?\"|\":\" |\"}),n=t.split(m.splitPipe),s=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;s<n.length;s++)n[s]=n[s].trim().replace(m.slashPipe,\"|\");return n}function $(l,e,t){let n=l.length;if(n===0)return\"\";let s=0;for(;s<n;){let r=l.charAt(n-s-1);if(r===e&&!t)s++;else if(r!==e&&t)s++;else break}return l.slice(0,n-s)}function te(l){let e=l.split(`\n`),t=e.length-1;for(;t>=0&&m.blankLine.test(e[t]);)t--;return e.length-t<=2?l:e.slice(0,t+1).join(`\n`)}function fe(l,e){if(l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]===\"\\\\\")n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function me(l,e=0){let t=e,n=\"\";for(let s of l)if(s===\"\t\"){let r=4-t%4;n+=\" \".repeat(r),t+=r}else n+=s,t++;return n}function xe(l,e,t,n,s){let r=e.href,i=e.title||null,o=l[1].replace(s.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let p={type:l[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:r,title:i,text:o,tokens:n.inlineTokens(o)};return n.state.inLink=!1,p}function dt(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let s=n[1];return e.split(`\n`).map(r=>{let i=r.match(t.other.beginningSpace);if(i===null)return r;let[o]=i;return o.length>=s.length?r.slice(s.length):r}).join(`\n`)}var y=class{options;rules;lexer;constructor(e){this.options=e||R}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=this.options.pedantic?t[0]:te(t[0]),s=n.replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:n,codeBlockStyle:\"indented\",text:s}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=dt(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=$(n,\"#\");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(n=s.trim())}return{type:\"heading\",raw:$(t[0],`\n`),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:$(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=$(t[0],`\n`).split(`\n`),s=\"\",r=\"\",i=[];for(;n.length>0;){let o=!1,p=[],a;for(a=0;a<n.length;a++)if(this.rules.other.blockquoteStart.test(n[a]))p.push(n[a]),o=!0;else if(!o)p.push(n[a]);else break;n=n.slice(a);let u=p.join(`\n`),c=u.replace(this.rules.other.blockquoteSetextReplace,`\n    $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");s=s?`${s}\n${u}`:u,r=r?`${r}\n${c}`:c;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,i,!0),this.lexer.state.top=h,n.length===0)break;let k=i.at(-1);if(k?.type===\"code\")break;if(k?.type===\"blockquote\"){let T=k,g=n.join(`\n`),w=T.raw+`\n`+g.replace(this.rules.other.blockquoteSetextReplace2,\"\"),M=this.blockquote(w);i[i.length-1]=M,s=`${s}\n${g}`,r=r.substring(0,r.length-T.text.length)+M.text;break}else if(k?.type===\"list\"){let T=k,g=T.raw+`\n`+n.join(`\n`),w=this.list(g);i[i.length-1]=w,s=s.substring(0,s.length-k.raw.length)+w.raw,r=r.substring(0,r.length-T.raw.length)+w.raw,n=g.substring(i.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:s,tokens:i,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,r={type:\"list\",raw:\"\",ordered:s,start:s?+n.slice(0,-1):\"\",loose:!1,items:[]};n=s?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=s?n:\"[*+-]\");let i=this.rules.other.listItemRegex(n),o=!1;for(;e;){let a=!1,u=\"\",c=\"\";if(!(t=i.exec(e))||this.rules.block.hr.test(e))break;u=t[0],e=e.substring(u.length);let h=me(t[2].split(`\n`,1)[0],t[1].length),k=e.split(`\n`,1)[0],T=!h.trim(),g=0;if(this.options.pedantic?(g=2,c=h.trimStart()):T?g=t[1].length+1:(g=h.search(this.rules.other.nonSpaceChar),g=g>4?1:g,c=h.slice(g),g+=t[1].length),T&&this.rules.other.blankLine.test(k)&&(u+=k+`\n`,e=e.substring(k.length+1),a=!0),!a){let w=this.rules.other.nextBulletRegex(g),M=this.rules.other.hrRegex(g),ne=this.rules.other.fencesBeginRegex(g),re=this.rules.other.headingBeginRegex(g),be=this.rules.other.htmlBeginRegex(g),Re=this.rules.other.blockquoteBeginRegex(g);for(;e;){let N=e.split(`\n`,1)[0],D;if(k=N,this.options.pedantic?(k=k.replace(this.rules.other.listReplaceNesting,\"  \"),D=k):D=k.replace(this.rules.other.tabCharGlobal,\"    \"),ne.test(k)||re.test(k)||be.test(k)||Re.test(k)||w.test(k)||M.test(k))break;if(D.search(this.rules.other.nonSpaceChar)>=g||!k.trim())c+=`\n`+D.slice(g);else{if(T||h.replace(this.rules.other.tabCharGlobal,\"    \").search(this.rules.other.nonSpaceChar)>=4||ne.test(h)||re.test(h)||M.test(h))break;c+=`\n`+k}T=!k.trim(),u+=N+`\n`,e=e.substring(N.length+1),h=D.slice(g)}}r.loose||(o?r.loose=!0:this.rules.other.doubleBlankLine.test(u)&&(o=!0)),r.items.push({type:\"list_item\",raw:u,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),r.raw+=u}let p=r.items.at(-1);if(p)p.raw=p.raw.trimEnd(),p.text=p.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let a of r.items)if(this.lexer.state.top=!1,a.tokens=this.lexer.blockTokens(a.text,[]),!r.loose){let u=a.tokens.filter(h=>h.type===\"space\"),c=u.length>0&&u.some(h=>this.rules.other.anyLine.test(h.raw));r.loose=c}for(let a of r.items){let u=a.tokens[0];if(a.task&&(u?.type===\"text\"||u?.type===\"paragraph\")){a.text=a.text.replace(this.rules.other.listReplaceTask,\"\"),u.raw=u.raw.replace(this.rules.other.listReplaceTask,\"\"),u.text=u.text.replace(this.rules.other.listReplaceTask,\"\");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,\"\");break}let c=this.rules.other.listTaskCheckbox.exec(a.raw);if(c){let h={type:\"checkbox\",raw:c[0]+\" \",checked:c[0]!==\"[ ]\"};a.checked=h.checked,r.loose?a.tokens[0]&&[\"paragraph\",\"text\"].includes(a.tokens[0].type)&&\"tokens\"in a.tokens[0]&&a.tokens[0].tokens?(a.tokens[0].raw=h.raw+a.tokens[0].raw,a.tokens[0].text=h.raw+a.tokens[0].text,a.tokens[0].tokens.unshift(h)):a.tokens.unshift({type:\"paragraph\",raw:h.raw,text:h.raw,tokens:[h]}):a.tokens.unshift(h)}}else a.task&&(a.task=!1)}if(r.loose)for(let a of r.items){a.loose=!0;for(let u of a.tokens)u.type===\"text\"&&(u.type=\"paragraph\")}return r}}html(e){let t=this.rules.block.html.exec(e);if(t){let n=te(t[0]);return{type:\"html\",block:!0,raw:n,pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:n}}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:$(t[0],`\n`),href:s,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=ee(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),r=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],i={type:\"table\",raw:$(t[0],`\n`),header:[],align:[],rows:[]};if(n.length===s.length){for(let o of s)this.rules.other.tableAlignRight.test(o)?i.align.push(\"right\"):this.rules.other.tableAlignCenter.test(o)?i.align.push(\"center\"):this.rules.other.tableAlignLeft.test(o)?i.align.push(\"left\"):i.align.push(null);for(let o=0;o<n.length;o++)i.header.push({text:n[o],tokens:this.lexer.inline(n[o]),header:!0,align:i.align[o]});for(let o of r)i.rows.push(ee(o,i.header.length).map((p,a)=>({text:p,tokens:this.lexer.inline(p),header:!1,align:i.align[a]})));return i}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:\"heading\",raw:$(t[0],`\n`),depth:t[2].charAt(0)===\"=\"?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let i=$(n.slice(0,-1),\"\\\\\");if((n.length-i.length)%2===0)return}else{let i=fe(t[2],\"()\");if(i===-2)return;if(i>-1){let p=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,p).trim(),t[3]=\"\"}}let s=t[2],r=\"\";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(s);i&&(s=i[1],r=i[3])}else r=t[3]?t[3].slice(1,-1):\"\";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?s=s.slice(1):s=s.slice(1,-1)),xe(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,\"$1\"),title:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[s.toLowerCase()];if(!r){let i=n[0].charAt(0);return{type:\"text\",raw:i,text:i}}return xe(n,r,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(s[1]||s[3]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let i=[...s[0]].length-1,o,p,a=i,u=0,c=s[0][0],h=n===c,k=c===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(k.lastIndex=0,t=t.slice(-1*e.length+i);(s=k.exec(t))!==null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o)continue;if(p=[...o].length,s[3]||s[4]){a+=p;continue}else if(s[5]||s[6]){if(i%3&&!((i+p)%3)){u+=p;continue}if(h)break}if(a-=p,a>0)continue;p=Math.min(p,p+a+u);let T=[...s[0]][0].length,g=e.slice(0,i+s.index+T+p);if(Math.min(i,p)%2){let M=g.slice(1,-1);return{type:\"em\",raw:g,text:M,tokens:this.lexer.inlineTokens(M)}}let w=g.slice(2,-2);return{type:\"strong\",raw:g,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e,t,n=\"\"){let s=this.rules.inline.delLDelim.exec(e);if(!s)return;if(!(s[1]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let i=[...s[0]].length-1,o,p,a=i,u=this.rules.inline.delRDelim;for(u.lastIndex=0,t=t.slice(-1*e.length+i);(s=u.exec(t))!==null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o||(p=[...o].length,p!==i))continue;if(s[3]||s[4]){a+=p;continue}if(a-=p,a>0)continue;p=Math.min(p,p+a);let c=[...s[0]][0].length,h=e.slice(0,i+s.index+c+p),k=h.slice(i,-i);return{type:\"del\",raw:h,text:k,tokens:this.lexer.inlineTokens(k)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]===\"@\"?(n=t[1],s=\"mailto:\"+n):(n=t[1],s=n),{type:\"link\",raw:t[0],text:n,href:s,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]===\"@\")n=t[0],s=\"mailto:\"+n;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(r!==t[0]);n=t[0],t[1]===\"www.\"?s=\"http://\"+t[0]:s=t[0]}return{type:\"link\",raw:t[0],text:n,href:s,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var x=class l{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||R,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:H.normal,inline:B.normal};this.options.pedantic?(t.block=H.pedantic,t.inline=B.pedantic):this.options.gfm&&(t.block=H.gfm,this.options.breaks?t.inline=B.breaks:t.inline=B.gfm),this.tokenizer.rules=t}static get rules(){return{block:H,inline:B}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\"    \").replace(m.spaceLine,\"\"));let s=1/0;for(;e;){if(e.length<s)s=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let r;if(this.options.extensions?.block?.some(o=>(r=o.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let o=t.at(-1);r.raw.length===1&&o!==void 0?o.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let o=t.at(-1);o?.type===\"paragraph\"||o?.type===\"text\"?(o.raw+=(o.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,o.text+=`\n`+r.text,this.inlineQueue.at(-1).src=o.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let o=t.at(-1);o?.type===\"paragraph\"||o?.type===\"text\"?(o.raw+=(o.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,o.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=o.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let o=1/0,p=e.slice(1),a;this.options.extensions.startBlock.forEach(u=>{a=u.call({lexer:this},p),typeof a==\"number\"&&a>=0&&(o=Math.min(o,a))}),o<1/0&&o>=0&&(i=e.substring(0,o+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let o=t.at(-1);n&&o?.type===\"paragraph\"?(o.raw+=(o.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,o.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let o=t.at(-1);o?.type===\"text\"?(o.raw+=(o.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,o.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):t.push(r);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e;if(this.tokens.links){let o=Object.keys(this.tokens.links);o.length>0&&(n=n.replace(this.tokenizer.rules.inline.reflinkSearch,p=>o.includes(p.slice(p.lastIndexOf(\"[\")+1,-1))?\"[\"+\"a\".repeat(p.length-2)+\"]\":p))}n=n.replace(this.tokenizer.rules.inline.anyPunctuation,o=>\"+\".repeat(o.length)),n=n.replace(this.tokenizer.rules.inline.blockSkip,(o,p,a)=>{let u=a?a.length:0;return o.slice(0,u)+\"[\"+\"a\".repeat(o.length-u-2)+\"]\"}),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,r=\"\",i=1/0;for(;e;){if(e.length<i)i=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}s||(r=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(a=>(o=a.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let a=t.at(-1);o.type===\"text\"&&a?.type===\"text\"?(a.raw+=o.raw,a.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,r)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,n,r)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let p=e;if(this.options.extensions?.startInline){let a=1/0,u=e.slice(1),c;this.options.extensions.startInline.forEach(h=>{c=h.call({lexer:this},u),typeof c==\"number\"&&c>=0&&(a=Math.min(a,c))}),a<1/0&&a>=0&&(p=e.substring(0,a+1))}if(o=this.tokenizer.inlineText(p)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(r=o.raw.slice(-1)),s=!0;let a=t.at(-1);a?.type===\"text\"?(a.raw+=o.raw,a.text+=o.text):t.push(o);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t=\"Infinite loop on byte: \"+e;if(this.options.silent)console.error(t);else throw new Error(t)}};var P=class{options;parser;constructor(e){this.options=e||R}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let s=(t||\"\").match(m.notSpaceStart)?.[0],r=e.replace(m.endingNewline,\"\")+`\n`;return s?'<pre><code class=\"language-'+O(s)+'\">'+(n?r:O(r,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?r:O(r,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,s=\"\";for(let o=0;o<e.items.length;o++){let p=e.items[o];s+=this.listitem(p)}let r=t?\"ol\":\"ul\",i=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+r+i+`>\n`+s+\"</\"+r+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let r=0;r<e.header.length;r++)n+=this.tablecell(e.header[r]);t+=this.tablerow({text:n});let s=\"\";for(let r=0;r<e.rows.length;r++){let i=e.rows[r];n=\"\";for(let o=0;o<i.length;o++)n+=this.tablecell(i[o]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+s+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${O(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let s=this.parser.parseInline(n),r=Y(e);if(r===null)return s;e=r;let i='<a href=\"'+e+'\"';return t&&(i+=' title=\"'+O(t)+'\"'),i+=\">\"+s+\"</a>\",i}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=Y(e);if(r===null)return O(n);e=r;let i=`<img src=\"${e}\" alt=\"${O(n)}\"`;return t&&(i+=` title=\"${O(t)}\"`),i+=\">\",i}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:O(e.text)}};var L=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var b=class l{options;renderer;textRenderer;constructor(e){this.options=e||R,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new L}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=\"\";for(let n=0;n<e.length;n++){let s=e[n];if(this.options.extensions?.renderers?.[s.type]){let i=s,o=this.options.extensions.renderers[i.type].call({parser:this},i);if(o!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"checkbox\",\"html\",\"def\",\"paragraph\",\"text\"].includes(i.type)){t+=o||\"\";continue}}let r=s;switch(r.type){case\"space\":{t+=this.renderer.space(r);break}case\"hr\":{t+=this.renderer.hr(r);break}case\"heading\":{t+=this.renderer.heading(r);break}case\"code\":{t+=this.renderer.code(r);break}case\"table\":{t+=this.renderer.table(r);break}case\"blockquote\":{t+=this.renderer.blockquote(r);break}case\"list\":{t+=this.renderer.list(r);break}case\"checkbox\":{t+=this.renderer.checkbox(r);break}case\"html\":{t+=this.renderer.html(r);break}case\"def\":{t+=this.renderer.def(r);break}case\"paragraph\":{t+=this.renderer.paragraph(r);break}case\"text\":{t+=this.renderer.text(r);break}default:{let i='Token with \"'+r.type+'\" type was not found.';if(this.options.silent)return console.error(i),\"\";throw new Error(i)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=\"\";for(let s=0;s<e.length;s++){let r=e[s];if(this.options.extensions?.renderers?.[r.type]){let o=this.options.extensions.renderers[r.type].call({parser:this},r);if(o!==!1||![\"escape\",\"html\",\"link\",\"image\",\"checkbox\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(r.type)){n+=o||\"\";continue}}let i=r;switch(i.type){case\"escape\":{n+=t.text(i);break}case\"html\":{n+=t.html(i);break}case\"link\":{n+=t.link(i);break}case\"image\":{n+=t.image(i);break}case\"checkbox\":{n+=t.checkbox(i);break}case\"strong\":{n+=t.strong(i);break}case\"em\":{n+=t.em(i);break}case\"codespan\":{n+=t.codespan(i);break}case\"br\":{n+=t.br(i);break}case\"del\":{n+=t.del(i);break}case\"text\":{n+=t.text(i);break}default:{let o='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(o),\"\";throw new Error(o)}}}return n}};var S=class{options;block;constructor(e){this.options=e||R}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?x.lex:x.lexInline}provideParser(e=this.block){return e?b.parse:b.parseInline}};var Z=class{defaults=C();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=P;TextRenderer=L;Lexer=x;Tokenizer=y;Hooks=S;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case\"table\":{let r=s;for(let i of r.header)n=n.concat(this.walkTokens(i.tokens,t));for(let i of r.rows)for(let o of i)n=n.concat(this.walkTokens(o.tokens,t));break}case\"list\":{let r=s;n=n.concat(this.walkTokens(r.items,t));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(i=>{let o=r[i].flat(1/0);n=n.concat(this.walkTokens(o,t))}):r.tokens&&(n=n.concat(this.walkTokens(r.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error(\"extension name required\");if(\"renderer\"in r){let i=t.renderers[r.name];i?t.renderers[r.name]=function(...o){let p=r.renderer.apply(this,o);return p===!1&&(p=i.apply(this,o)),p}:t.renderers[r.name]=r.renderer}if(\"tokenizer\"in r){if(!r.level||r.level!==\"block\"&&r.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let i=t[r.level];i?i.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level===\"block\"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level===\"inline\"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}\"childTokens\"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),n.renderer){let r=this.defaults.renderer||new P(this.defaults);for(let i in n.renderer){if(!(i in r))throw new Error(`renderer '${i}' does not exist`);if([\"options\",\"parser\"].includes(i))continue;let o=i,p=n.renderer[o],a=r[o];r[o]=(...u)=>{let c=p.apply(r,u);return c===!1&&(c=a.apply(r,u)),c||\"\"}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new y(this.defaults);for(let i in n.tokenizer){if(!(i in r))throw new Error(`tokenizer '${i}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(i))continue;let o=i,p=n.tokenizer[o],a=r[o];r[o]=(...u)=>{let c=p.apply(r,u);return c===!1&&(c=a.apply(r,u)),c}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new S;for(let i in n.hooks){if(!(i in r))throw new Error(`hook '${i}' does not exist`);if([\"options\",\"block\"].includes(i))continue;let o=i,p=n.hooks[o],a=r[o];S.passThroughHooks.has(i)?r[o]=u=>{if(this.defaults.async&&S.passThroughHooksRespectAsync.has(i))return(async()=>{let h=await p.call(r,u);return a.call(r,h)})();let c=p.call(r,u);return a.call(r,c)}:r[o]=(...u)=>{if(this.defaults.async)return(async()=>{let h=await p.apply(r,u);return h===!1&&(h=await a.apply(r,u)),h})();let c=p.apply(r,u);return c===!1&&(c=a.apply(r,u)),c}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,i=n.walkTokens;s.walkTokens=function(o){let p=[];return p.push(i.call(this,o)),r&&(p=p.concat(r.call(this,o))),p}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,s)=>{let r={...s},i={...this.defaults,...r},o=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return o(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return o(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return o(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let p=i.hooks?await i.hooks.preprocess(n):n,u=await(i.hooks?await i.hooks.provideLexer(e):e?x.lex:x.lexInline)(p,i),c=i.hooks?await i.hooks.processAllTokens(u):u;i.walkTokens&&await Promise.all(this.walkTokens(c,i.walkTokens));let k=await(i.hooks?await i.hooks.provideParser(e):e?b.parse:b.parseInline)(c,i);return i.hooks?await i.hooks.postprocess(k):k})().catch(o);try{i.hooks&&(n=i.hooks.preprocess(n));let a=(i.hooks?i.hooks.provideLexer(e):e?x.lex:x.lexInline)(n,i);i.hooks&&(a=i.hooks.processAllTokens(a)),i.walkTokens&&this.walkTokens(a,i.walkTokens);let c=(i.hooks?i.hooks.provideParser(e):e?b.parse:b.parseInline)(a,i);return i.hooks&&(c=i.hooks.postprocess(c)),c}catch(p){return o(p)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let s=\"<p>An error occurred:</p><pre>\"+O(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}};var E=new Z;function f(l,e){return E.parse(l,e)}f.options=f.setOptions=function(l){return E.setOptions(l),f.defaults=E.defaults,j(f.defaults),f};f.getDefaults=C;f.defaults=R;function kt(...l){return E.use(...l),f.defaults=E.defaults,j(f.defaults),f}f.use=kt;f.walkTokens=function(l,e){return E.walkTokens(l,e)};f.parseInline=E.parseInline;f.Parser=b;f.parser=b.parse;f.Renderer=P;f.TextRenderer=L;f.Lexer=x;f.lexer=x.lex;f.Tokenizer=y;f.Hooks=S;f.parse=f;var nn=f.options,rn=f.setOptions,sn=f.walkTokens,on=f.parseInline,an=f,ln=b.parse,pn=x.lex;export{S as Hooks,x as Lexer,Z as Marked,b as Parser,P as Renderer,L as TextRenderer,y as Tokenizer,R as defaults,C as getDefaults,pn as lexer,f as marked,nn as options,an as parse,on as parseInline,ln as parser,rn as setOptions,kt as use,sn as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","import type { TokenizerExtension, RendererExtension, Tokens } from 'marked';\n\n// Extend marked's lexer to handle ||spoiler|| syntax\nexport const matrixSpoilerExtension = {\n  name: 'spoiler',\n  level: 'inline',\n  start(src: string) {\n    return src.indexOf('||');\n  },\n  tokenizer(\n    this: { lexer: { inlineTokens: (t: string, tokens: Tokens.Generic[]) => void } },\n    src: string\n  ) {\n    // Only match if || at the very start of the remaining text\n    if (!src.startsWith('||')) return undefined;\n    const rule = /^\\|\\|(.+?)\\|\\|/s;\n    const match = rule.exec(src);\n    if (match) {\n      const token = {\n        type: 'spoiler',\n        raw: match[0],\n        text: match[1],\n        tokens: [] as Tokens.Generic[],\n      };\n      this.lexer.inlineTokens(token.text!, token.tokens);\n      return token;\n    }\n    return undefined;\n  },\n  renderer(\n    this: { parser: { parseInline: (tokens: Tokens.Generic[]) => string } },\n    token: Tokens.Generic\n  ) {\n    const tokens = (token as { tokens: Tokens.Generic[] }).tokens || [];\n    return `<span data-mx-spoiler>${this.parser.parseInline(tokens)}</span>`;\n  },\n} satisfies TokenizerExtension & RendererExtension;\n","import type { TokenizerExtension, RendererExtension } from 'marked';\n\n/** Private-use char so math extensions do not match `$` / `$$` inside code spans. Not U+E000–U+E002 (emoticon placeholders). {@link shieldDollarRunsForMarked} uses U+E021–U+E022. */\nconst MATH_CODE_DOLLAR_MASK = '\\uE020';\n\n/**\n * Replaces the `-` of line-start `-# …` inside markdown code so the Matrix subscript block\n * extension does not match before marked's `fences` rule (custom block extensions run first).\n * {@link unmaskSubscriptCodeLinePlaceholders} restores output HTML.\n */\nconst SUBSCRIPT_CODE_LINE_MASK = '\\uE023';\n\nfunction maskSubscriptLineStartsInCodeInner(inner: string): string {\n  return inner.replace(/(^|\\n)-#( +)/g, `$1${SUBSCRIPT_CODE_LINE_MASK}#$2`);\n}\n\n/** Applies {@link MATH_CODE_DOLLAR_MASK} and subscript masking inside a fence or inline-code region. */\nfunction maskMathAndSubscriptInCodeInner(inner: string): string {\n  return maskSubscriptLineStartsInCodeInner(inner.replace(/\\$/g, MATH_CODE_DOLLAR_MASK));\n}\n\nfunction findSameLineFenceClose(md: string, from: number, tick: string, minLen: number): number {\n  let j = from;\n  while (j < md.length && md[j] !== '\\n') {\n    if (md[j] === tick) {\n      let run = 0;\n      while (j + run < md.length && md[j + run] === tick) run++;\n      if (run >= minLen) return j;\n      j += run;\n    } else {\n      j++;\n    }\n  }\n  return -1;\n}\n\nfunction findMultilineFenceEnd(\n  md: string,\n  contentStart: number,\n  tick: string,\n  minLen: number\n): { blockEnd: number; contentEnd: number } | null {\n  let p = contentStart;\n  while (p <= md.length) {\n    const nl = md.indexOf('\\n', p);\n    const lineStart = p;\n    const lineEnd = nl === -1 ? md.length : nl;\n    const line = md.slice(lineStart, lineEnd);\n    const m = tick === '`' ? /^ {0,3}(`{3,})\\s*$/.exec(line) : /^ {0,3}(~{3,})\\s*$/.exec(line);\n    const fenceRun = m?.[1];\n    if (fenceRun && fenceRun.length >= minLen && fenceRun[0] === tick) {\n      return {\n        blockEnd: nl === -1 ? md.length : nl + 1,\n        contentEnd: lineStart,\n      };\n    }\n    if (nl === -1) return null;\n    p = nl + 1;\n  }\n  return null;\n}\n\nfunction tryConsumeFence(md: string, i: number): { text: string; end: number } | null {\n  const atLineStart = i === 0 || md[i - 1] === '\\n';\n  if (!atLineStart) return null;\n\n  const rest = md.slice(i);\n  const open = /^(\\s{0,3})(`{3,}|~{3,})/.exec(rest);\n  if (!open?.[2]) return null;\n\n  const fenceStr = open[2];\n  const tick = fenceStr.charAt(0);\n  const openLen = fenceStr.length;\n  const afterOpen = i + open[0].length;\n\n  if (afterOpen < md.length && md[afterOpen] === '\\n') {\n    const contentStart = afterOpen + 1;\n    const close = findMultilineFenceEnd(md, contentStart, tick, openLen);\n    if (!close) {\n      const inner = md.slice(contentStart, md.length);\n      const masked = maskMathAndSubscriptInCodeInner(inner);\n      return { text: md.slice(i, contentStart) + masked, end: md.length };\n    }\n    const inner = md.slice(contentStart, close.contentEnd);\n    const maskedInner = maskMathAndSubscriptInCodeInner(inner);\n    return {\n      text: md.slice(i, contentStart) + maskedInner + md.slice(close.contentEnd, close.blockEnd),\n      end: close.blockEnd,\n    };\n  }\n\n  const closeIdx = findSameLineFenceClose(md, afterOpen, tick, openLen);\n  if (closeIdx < 0) return null;\n\n  let closeRun = 0;\n  while (closeIdx + closeRun < md.length && md[closeIdx + closeRun] === tick) closeRun++;\n\n  const inner = md.slice(afterOpen, closeIdx);\n  const maskedInner = maskMathAndSubscriptInCodeInner(inner);\n  return {\n    text: md.slice(i, afterOpen) + maskedInner + md.slice(closeIdx, closeIdx + closeRun),\n    end: closeIdx + closeRun,\n  };\n}\n\nfunction tryConsumeInlineCode(md: string, i: number): { text: string; end: number } | null {\n  if (md[i] !== '`') return null;\n  let run = 0;\n  while (i + run < md.length && md[i + run] === '`') run++;\n  const contentStart = i + run;\n  let j = contentStart;\n  while (j < md.length) {\n    if (md[j] === '`') {\n      let cr = 0;\n      while (j + cr < md.length && md[j + cr] === '`') cr++;\n      if (cr === run) {\n        const inner = md.slice(contentStart, j);\n        const maskedInner = maskMathAndSubscriptInCodeInner(inner);\n        return {\n          text: md.slice(i, contentStart) + maskedInner + md.slice(j, j + run),\n          end: j + run,\n        };\n      }\n      j += cr;\n    } else {\n      j++;\n    }\n  }\n  return null;\n}\n\n/**\n * Replaces `$` inside fenced and inline code so Matrix math extensions do not run on code literals.\n * {@link unmaskMathCodeDollarPlaceholders} must be applied to the final HTML.\n */\nexport function maskDollarSignsInsideMarkdownCode(markdown: string): string {\n  const md = markdown.replace(/\\r\\n/g, '\\n');\n  let out = '';\n  let i = 0;\n  const n = md.length;\n\n  while (i < n) {\n    const atLineStart = i === 0 || md[i - 1] === '\\n';\n\n    if (atLineStart) {\n      const fence = tryConsumeFence(md, i);\n      if (fence) {\n        out += fence.text;\n        i = fence.end;\n        continue;\n      }\n    }\n\n    if (md[i] === '`') {\n      const span = tryConsumeInlineCode(md, i);\n      if (span) {\n        out += span.text;\n        i = span.end;\n        continue;\n      }\n    }\n\n    out += md[i];\n    i++;\n  }\n\n  return out;\n}\n\nexport function unmaskMathCodeDollarPlaceholders(html: string): string {\n  return html.replaceAll(MATH_CODE_DOLLAR_MASK, '$');\n}\n\nexport function unmaskSubscriptCodeLinePlaceholders(html: string): string {\n  return html.replaceAll(`${SUBSCRIPT_CODE_LINE_MASK}#`, '-#');\n}\n\nconst MARKED_MATH_BLOCK_SHIELD = '\\uE021';\nconst MARKED_MATH_BLOCK_SHIELD_END = '\\uE022';\n\nexport function shieldDollarRunsForMarked(markdown: string): string {\n  const blocks: string[] = [];\n  const blockRe = /\\$\\$([^$]+)\\$\\$\\n?/g;\n  let m: RegExpExecArray | null;\n  let shielded = '';\n  let last = 0;\n  while ((m = blockRe.exec(markdown)) !== null) {\n    shielded += markdown.slice(last, m.index);\n    blocks.push(m[0]);\n    shielded += `${MARKED_MATH_BLOCK_SHIELD}${blocks.length - 1}${MARKED_MATH_BLOCK_SHIELD_END}`;\n    last = m.index + m[0].length;\n  }\n  shielded += markdown.slice(last);\n\n  shielded = shielded.replace(/\\${2,}/g, (run) => run.replace(/\\$/g, () => '\\\\$'));\n\n  return shielded.replace(\n    new RegExp(`${MARKED_MATH_BLOCK_SHIELD}(\\\\d+)${MARKED_MATH_BLOCK_SHIELD_END}`, 'g'),\n    (_, i) => blocks[parseInt(i, 10)] ?? ''\n  );\n}\n\nfunction escapeHtml(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;');\n}\n\nfunction isIgnorableMathContent(latex: string): boolean {\n  const t = latex.replace(/[\\u200B-\\u200D\\uFEFF]/g, '').trim();\n  if (t === '') return true;\n  return /^\\$+$/.test(t);\n}\n\n/**\n * Inline math delimiters use `$...$` but must not greedily pair across dollar amounts\n * (e.g. \"$10 ... $20\"). We only treat a pair as math when:\n * - the opening `$` is not followed by whitespace, and\n * - the closing `$` is not preceded by whitespace, and\n * - the closing `$` is not immediately followed by an ASCII digit.\n */\n/** Opening `$[fg.color=…]` / `$[bg.color=…]` */\nconst MFM_COLOR_FN_OPEN = /^\\$\\[(?:fg|bg)\\.color=/;\n\nfunction tryTokenizeInlineMath(\n  src: string\n): { type: 'math'; raw: string; latex: string } | undefined {\n  if (!src.startsWith('$')) {\n    return undefined;\n  }\n  if (MFM_COLOR_FN_OPEN.test(src)) {\n    return undefined;\n  }\n  if (src.startsWith('$$') && (src.length < 3 || src.charAt(2) !== '$')) {\n    return undefined;\n  }\n  if (src.length < 3 || /\\s/.test(src.charAt(1))) {\n    return undefined;\n  }\n  for (let j = 1; j < src.length; j++) {\n    if (src.charAt(j) !== '$') continue;\n    const before = src.charAt(j - 1);\n    if (/\\s/.test(before)) continue;\n    const after = j + 1 < src.length ? src.charAt(j + 1) : '';\n    if (after !== '' && /[0-9]/.test(after)) continue;\n    const latex = src.slice(1, j);\n    if (isIgnorableMathContent(latex)) continue;\n    if (latex.trimStart().startsWith('$$')) continue;\n    return {\n      type: 'math',\n      raw: src.slice(0, j + 1),\n      latex,\n    };\n  }\n  return undefined;\n}\n\n// Inline math: $...$\nexport const matrixMathExtension = {\n  name: 'math',\n  level: 'inline',\n  start(src: string) {\n    if (MFM_COLOR_FN_OPEN.test(src)) return -1;\n    return src.indexOf('$');\n  },\n  tokenizer(src: string) {\n    return tryTokenizeInlineMath(src);\n  },\n  renderer(token) {\n    return `<span data-mx-maths=\"${escapeHtml(token.latex)}\">${token.latex}</span>`;\n  },\n} satisfies TokenizerExtension & RendererExtension;\n\n// Block math: $$...$$\nexport const matrixMathBlockExtension = {\n  name: 'mathBlock',\n  level: 'block',\n  start(src: string) {\n    return src.indexOf('$$');\n  },\n  tokenizer(src: string) {\n    const match = /^\\$\\$([^$]+)\\$\\$\\n?/.exec(src);\n    if (match) {\n      const latex = match[1]?.trim() ?? '';\n      if (isIgnorableMathContent(latex)) return undefined;\n      return {\n        type: 'mathBlock',\n        raw: match[0],\n        latex,\n      };\n    }\n    return undefined;\n  },\n  renderer(token) {\n    return `<div data-mx-maths=\"${escapeHtml(token.latex)}\">${token.latex}</div>`;\n  },\n} satisfies TokenizerExtension & RendererExtension;\n","import type { TokenizerExtension, RendererExtension, Tokens } from 'marked';\n\n// Subscript extension: -# text (Matrix spec small/sub tag)\nexport const matrixSubscriptExtension = {\n  name: 'subscript',\n  level: 'block',\n  tokenizer(\n    this: {\n      lexer: { inlineTokens: (t: string, tokens: Tokens.Generic[]) => void };\n    },\n    src: string\n  ) {\n    const match = /^-# +([^\\n]+)/.exec(src);\n    if (!match) {\n      return undefined;\n    }\n    const token = {\n      type: 'subscript',\n      raw: match[0],\n      text: match[1],\n      tokens: [] as Tokens.Generic[],\n    };\n    this.lexer.inlineTokens(token.text!, token.tokens);\n    return token;\n  },\n  renderer(\n    this: { parser: { parseInline: (tokens: Tokens.Generic[]) => string } },\n    token: Tokens.Generic\n  ) {\n    const tokens = (token as { tokens: Tokens.Generic[] }).tokens || [];\n    return `<sub data-md=\"-#\">${this.parser.parseInline(tokens)}</sub>`;\n  },\n} satisfies TokenizerExtension & RendererExtension;\n","import type { TokenizerExtension, RendererExtension } from 'marked';\n\n/** Delimiters for round-tripping Matrix emoticons from HTML through markdown into the editor. */\nexport const MX_EMOTICON_MD_START = '\\uE000';\nexport const MX_EMOTICON_MD_SEP = '\\uE001';\nexport const MX_EMOTICON_MD_END = '\\uE002';\n\nexport function encodeMxEmoticonForMarkdownPlaceholder(src: string, shortcode: string): string {\n  return `${MX_EMOTICON_MD_START}${src}${MX_EMOTICON_MD_SEP}${shortcode}${MX_EMOTICON_MD_END}`;\n}\n\n/**\n * Validates that a URL is a proper mxc:// URI.\n * Returns true if valid, false otherwise.\n */\nfunction validateMxcUrlInternal(url: string): boolean {\n  if (!url.startsWith('mxc://')) return false;\n\n  try {\n    const parsed = new URL(url);\n    if (parsed.protocol !== 'mxc:') return false;\n    if (!parsed.host) return false;\n    if (!parsed.pathname || parsed.pathname.length < 1) return false;\n    if (parsed.username || parsed.password || parsed.search || parsed.hash) return false;\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n// Extension to preserve img[data-mx-emoticon] tags through markdown pipeline\nexport const matrixEmoticonExtension = {\n  name: 'emoticon',\n  level: 'inline',\n  start(src: string) {\n    return src.indexOf('data-mx-emoticon');\n  },\n  tokenizer(src: string) {\n    const rule = /^<img\\s+[^>]*data-mx-emoticon[^>]*(?:\\/>|>(?=\\s*<\\/img>))/i;\n    const match = rule.exec(src);\n    if (!match) return undefined;\n\n    const rawHtml = match[0];\n\n    const srcMatch = /src\\s*=\\s*[\"']([^\"']*)[\"']/i.exec(rawHtml);\n    if (!srcMatch) return undefined;\n\n    const srcValue = srcMatch[1];\n    if (!srcValue || !validateMxcUrlInternal(srcValue)) return undefined;\n\n    return {\n      type: 'emoticon',\n      raw: rawHtml,\n      html: rawHtml,\n    };\n  },\n  renderer(token) {\n    return token.html;\n  },\n} satisfies TokenizerExtension & RendererExtension;\n\n// Preprocessor to strip invalid emoticon img tags before marked processing\nexport function preprocessEmoticon(markdown: string): string {\n  // Remove img[data-mx-emoticon] tags with invalid src URLs\n  return markdown.replace(/<img\\s+[^>]*data-mx-emoticon[^>]*>/gi, (tag) => {\n    const srcMatch = /src\\s*=\\s*[\"']([^\"']*)[\"']/i.exec(tag);\n    if (!srcMatch) return tag; // Keep if no src attribute\n    const srcValue = srcMatch[1];\n    if (!srcValue || !validateMxcUrlInternal(srcValue)) return ''; // Remove invalid\n    return tag; // Keep valid\n  });\n}\n\n// Standalone validation function for use by htmlToMarkdown\nexport function validateMxcUrl(url: string): boolean {\n  return validateMxcUrlInternal(url);\n}\n","import type { TokenizerExtension, RendererExtension, Tokens } from 'marked';\n\n// Underline extension: __text__\nexport const matrixUnderlineExtension = {\n  name: 'matrixUnderline',\n  level: 'inline',\n  start(src: string) {\n    return src.indexOf('__');\n  },\n  tokenizer(\n    this: {\n      lexer: { inlineTokens: (t: string, tokens: Tokens.Generic[]) => void };\n    },\n    src: string\n  ) {\n    if (!src.startsWith('__')) return undefined;\n    const rule = /^__(.+?)__/;\n    const match = rule.exec(src);\n    if (match) {\n      const token = {\n        type: 'matrixUnderline',\n        raw: match[0],\n        text: match[1],\n        tokens: [] as Tokens.Generic[],\n      };\n      this.lexer.inlineTokens(token.text!, token.tokens);\n      return token;\n    }\n    return undefined;\n  },\n  renderer(\n    this: { parser: { parseInline: (tokens: Tokens.Generic[]) => string } },\n    token: Tokens.Generic\n  ) {\n    const tokens = (token as { tokens: Tokens.Generic[] }).tokens || [];\n    return `<u data-md=\"__\">${this.parser.parseInline(tokens)}</u>`;\n  },\n} satisfies TokenizerExtension & RendererExtension;\n","import type { TokenizerExtension, RendererExtension, Tokens } from 'marked';\nimport { MFM_HEX_COLOR_VALUE_PATTERN, normalizeMfmHexToMatrixColor } from '$utils/matrixHtml';\n\nexport type MfmColorArgs = {\n  fg?: string;\n  bg?: string;\n};\n\nconst MFM_COLOR_FN_START = /^\\$\\[(?=(?:fg\\.color|bg\\.color)=)/;\nconst MFM_COLOR_ARGS_PREFIX = new RegExp(\n  `^((?:(?:fg|bg)\\\\.color=${MFM_HEX_COLOR_VALUE_PATTERN}\\\\s*)+)`\n);\n\n/** Parses `fg.color=…` / `bg.color=…` tokens from the inside of `$[…]`. */\nexport function parseMfmColorFnArgs(argsPart: string): MfmColorArgs | undefined {\n  const trimmed = argsPart.trim();\n  if (!trimmed) return undefined;\n\n  const result: MfmColorArgs = {};\n  const tokens = trimmed.split(/\\s+/);\n\n  for (const token of tokens) {\n    const m = new RegExp(`^(fg|bg)\\\\.color=(${MFM_HEX_COLOR_VALUE_PATTERN})$`).exec(token);\n    if (!m) return undefined;\n    const normalized = normalizeMfmHexToMatrixColor(m[2]!);\n    if (!normalized) return undefined;\n    if (m[1] === 'fg') result.fg = normalized;\n    else result.bg = normalized;\n  }\n\n  return result.fg !== undefined || result.bg !== undefined ? result : undefined;\n}\n\n/** Opening args for `data-md` round-trip, e.g. `$[fg.color=ff0000 bg.color=00ff00`. */\nexport function formatMfmColorDataMd(args: MfmColorArgs): string {\n  const parts: string[] = [];\n  if (args.fg) {\n    parts.push(`fg.color=${args.fg.replace(/^#/, '').toLowerCase()}`);\n  }\n  if (args.bg) {\n    parts.push(`bg.color=${args.bg.replace(/^#/, '').toLowerCase()}`);\n  }\n  return `$[${parts.join(' ')}`;\n}\n\nexport function tryParseMfmColor(\n  src: string\n): { raw: string; args: MfmColorArgs; text: string; dataMd: string } | undefined {\n  if (!MFM_COLOR_FN_START.test(src)) return undefined;\n\n  const close = src.indexOf(']');\n  if (close <= 2) return undefined;\n\n  const inner = src.slice(2, close);\n  const argsMatch = MFM_COLOR_ARGS_PREFIX.exec(inner);\n  if (!argsMatch) return undefined;\n\n  const argsPart = argsMatch[1]!.trimEnd();\n  const text = inner.slice(argsMatch[0].length).trimStart();\n  if (!text) return undefined;\n  const args = parseMfmColorFnArgs(argsPart);\n  if (!args) return undefined;\n\n  return {\n    raw: src.slice(0, close + 1),\n    args,\n    text,\n    dataMd: `$[${argsPart}`,\n  };\n}\n\nexport const matrixMfmColorExtension = {\n  name: 'mfmColor',\n  level: 'inline',\n  start(src: string) {\n    const fg = src.indexOf('$[fg.color=');\n    const bg = src.indexOf('$[bg.color=');\n    if (fg === -1) return bg;\n    if (bg === -1) return fg;\n    return Math.min(fg, bg);\n  },\n  tokenizer(\n    this: { lexer: { inlineTokens: (t: string, tokens: Tokens.Generic[]) => void } },\n    src: string\n  ) {\n    const parsed = tryParseMfmColor(src);\n    if (!parsed) return undefined;\n\n    const token = {\n      type: 'mfmColor',\n      raw: parsed.raw,\n      text: parsed.text,\n      mfmArgs: parsed.args,\n      dataMd: parsed.dataMd,\n      tokens: [] as Tokens.Generic[],\n    };\n    this.lexer.inlineTokens(parsed.text, token.tokens);\n    return token;\n  },\n  renderer(\n    this: { parser: { parseInline: (tokens: Tokens.Generic[]) => string } },\n    token: Tokens.Generic\n  ) {\n    const t = token as unknown as {\n      tokens?: Tokens.Generic[];\n      mfmArgs: MfmColorArgs;\n      dataMd: string;\n    };\n    const inner = this.parser.parseInline(t.tokens ?? []);\n    const attrs: string[] = [`data-md=\"${t.dataMd}\"`];\n    if (t.mfmArgs.fg) attrs.push(`data-mx-color=\"${t.mfmArgs.fg}\"`);\n    if (t.mfmArgs.bg) attrs.push(`data-mx-bg-color=\"${t.mfmArgs.bg}\"`);\n    return `<span ${attrs.join(' ')}>${inner}</span>`;\n  },\n} satisfies TokenizerExtension & RendererExtension;\n","/**\n * Inserts an extra newline before block-level markdown lines that follow a single `\\n`,\n * so CommonMark/marked see a real paragraph boundary. Skips fenced code regions.\n */\n\nfunction findSameLineFenceClose(md: string, from: number, tick: string, minLen: number): number {\n  let j = from;\n  while (j < md.length && md[j] !== '\\n') {\n    if (md[j] === tick) {\n      let run = 0;\n      while (j + run < md.length && md[j + run] === tick) run++;\n      if (run >= minLen) return j;\n      j += run;\n    } else {\n      j++;\n    }\n  }\n  return -1;\n}\n\nfunction findMultilineFenceEnd(\n  md: string,\n  contentStart: number,\n  tick: string,\n  minLen: number\n): { blockEnd: number; contentEnd: number } | null {\n  let p = contentStart;\n  while (p <= md.length) {\n    const nl = md.indexOf('\\n', p);\n    const lineStart = p;\n    const lineEnd = nl === -1 ? md.length : nl;\n    const line = md.slice(lineStart, lineEnd);\n    const m = tick === '`' ? /^ {0,3}(`{3,})\\s*$/.exec(line) : /^ {0,3}(~{3,})\\s*$/.exec(line);\n    const fenceRun = m?.[1];\n    if (fenceRun && fenceRun.length >= minLen && fenceRun[0] === tick) {\n      return {\n        blockEnd: nl === -1 ? md.length : nl + 1,\n        contentEnd: lineStart,\n      };\n    }\n    if (nl === -1) return null;\n    p = nl + 1;\n  }\n  return null;\n}\n\n/** Returns index just past the fence block, or null if `i` is not a fence opener at line start. */\nfunction trySkipFenceEnd(md: string, i: number): number | null {\n  const atLineStart = i === 0 || md[i - 1] === '\\n';\n  if (!atLineStart) return null;\n\n  const rest = md.slice(i);\n  const open = /^( {0,3})(`{3,}|~{3,})/.exec(rest);\n  if (!open?.[2]) return null;\n\n  const fenceStr = open[2];\n  const tick = fenceStr.charAt(0);\n  const openLen = fenceStr.length;\n  const afterOpen = i + open[0].length;\n\n  const lineEnd = md.indexOf('\\n', afterOpen);\n  const closeIdx = findSameLineFenceClose(md, afterOpen, tick, openLen);\n  if (closeIdx >= 0) {\n    let closeRun = 0;\n    while (closeIdx + closeRun < md.length && md[closeIdx + closeRun] === tick) closeRun++;\n\n    return closeIdx + closeRun;\n  }\n\n  if (lineEnd >= 0) {\n    const info = md.slice(afterOpen, lineEnd);\n    if (tick === '`' && info.includes('`')) return null;\n\n    const contentStart = lineEnd + 1;\n    const close = findMultilineFenceEnd(md, contentStart, tick, openLen);\n    if (!close) return md.length;\n    return close.blockEnd;\n  }\n\n  return null;\n}\n\nfunction afterLeadingIndent(line: string): string {\n  let k = 0;\n  while (k < line.length && k < 3 && line[k] === ' ') k++;\n  return line.slice(k);\n}\n\nfunction effectiveContentAfterEscapes(line: string): string | null {\n  const rest = afterLeadingIndent(line);\n  if (rest.length === 0) return null;\n  let bs = 0;\n  while (bs < rest.length && rest[bs] === '\\\\') bs++;\n  if (bs % 2 === 1) return null;\n  return rest.slice(bs);\n}\n\nfunction looksLikeBlockStart(effective: string): boolean {\n  if (effective.length === 0) return false;\n\n  if (/^#{1,6}(?:\\s|$)/.test(effective)) return true;\n  if (/^-# +/.test(effective)) return true;\n  if (/^>\\s/.test(effective)) return true;\n  if (/^[-*+]\\s/.test(effective)) return true;\n  if (/^\\d{1,9}\\.\\s/.test(effective)) return true;\n  if (/^(?:`{3,}|~{3,})/.test(effective)) return true;\n  if (effective.startsWith('$$')) return true;\n  if (/^(?:-{3,}|\\*{3,}|_{3,})\\s*$/.test(effective)) return true;\n\n  return false;\n}\n\nfunction lineAtNewline(md: string, newlineIdx: number): string {\n  let start = newlineIdx - 1;\n  while (start >= 0 && md[start] !== '\\n') start--;\n  return md.slice(start + 1, newlineIdx);\n}\n\nfunction lineAfterNewline(md: string, newlineIdx: number): string {\n  const start = newlineIdx + 1;\n  if (start >= md.length) return '';\n  const nextNl = md.indexOf('\\n', start);\n  return nextNl === -1 ? md.slice(start) : md.slice(start, nextNl);\n}\n\nfunction prevLineIsBlockquote(md: string, newlineIdx: number): boolean {\n  const effective = effectiveContentAfterEscapes(lineAtNewline(md, newlineIdx));\n  if (effective === null) return false;\n  return /^>\\s/.test(effective);\n}\n\nfunction nextLineContinuesBlockquote(md: string, newlineIdx: number): boolean {\n  const effective = effectiveContentAfterEscapes(lineAfterNewline(md, newlineIdx));\n  if (effective === null) return false;\n  return effective.startsWith('>');\n}\n\nfunction nextLineIsBlockStarter(md: string, newlineIdx: number): boolean {\n  const effective = effectiveContentAfterEscapes(lineAfterNewline(md, newlineIdx));\n  if (effective === null) return false;\n  return looksLikeBlockStart(effective);\n}\n\nfunction leadingSpaces(line: string): number {\n  let k = 0;\n  while (k < line.length && line[k] === ' ') k++;\n  return k;\n}\n\nfunction lineLooksLikeListItem(line: string): boolean {\n  const effective = effectiveContentAfterEscapes(line);\n  if (effective === null) return false;\n  return /^\\d{1,9}\\.\\s/.test(effective) || /^[-*+]\\s/.test(effective);\n}\n\nfunction nextLineIsNestedListItem(md: string, newlineIdx: number): boolean {\n  const prevLine = lineAtNewline(md, newlineIdx);\n  const nextLine = lineAfterNewline(md, newlineIdx);\n  if (!lineLooksLikeListItem(nextLine)) return false;\n  return leadingSpaces(nextLine) > leadingSpaces(prevLine);\n}\n\nfunction nextLineIsSiblingListItem(md: string, newlineIdx: number): boolean {\n  const prevLine = lineAtNewline(md, newlineIdx);\n  const nextLine = lineAfterNewline(md, newlineIdx);\n  if (!lineLooksLikeListItem(prevLine) || !lineLooksLikeListItem(nextLine)) return false;\n  return leadingSpaces(prevLine) === leadingSpaces(nextLine);\n}\n\nfunction shouldExpandSingleNewline(md: string, newlineIdx: number): boolean {\n  // Consecutive `>` lines belong to one blockquote, keep the single `\\n` between them.\n  if (prevLineIsBlockquote(md, newlineIdx) && nextLineContinuesBlockquote(md, newlineIdx)) {\n    return false;\n  }\n  // Keep single `\\n` between list items (siblings) and before nested sublists (2- or 4-space indent).\n  if (nextLineIsSiblingListItem(md, newlineIdx) || nextLineIsNestedListItem(md, newlineIdx)) {\n    return false;\n  }\n  if (nextLineIsBlockStarter(md, newlineIdx)) return true;\n  // CommonMark lazy continuation keeps non-`>` lines inside blockquotes, close on single `\\n`.\n  if (prevLineIsBlockquote(md, newlineIdx) && !nextLineContinuesBlockquote(md, newlineIdx)) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * After a single newline (not part of `\\n\\n`), inserts one more `\\n` when the following line\n * opens a block the marked stack understands. Fenced code is copied verbatim without changes.\n */\nexport function expandBlockBoundariesAfterSingleNewlines(markdown: string): string {\n  const md = markdown.replace(/\\r\\n/g, '\\n');\n  let out = '';\n  let i = 0;\n  const n = md.length;\n\n  while (i < n) {\n    const atLineStart = i === 0 || md[i - 1] === '\\n';\n    if (atLineStart) {\n      const fenceEnd = trySkipFenceEnd(md, i);\n      if (fenceEnd !== null) {\n        out += md.slice(i, fenceEnd);\n        i = fenceEnd;\n        continue;\n      }\n    }\n\n    if (\n      md[i] === '\\n' &&\n      (i === 0 || md[i - 1] !== '\\n') &&\n      (i + 1 >= n || md[i + 1] !== '\\n') &&\n      shouldExpandSingleNewline(md, i)\n    ) {\n      out += '\\n\\n';\n      i += 1;\n      continue;\n    }\n\n    out += md[i];\n    i += 1;\n  }\n\n  return out;\n}\n","import { getMarkdownCodeSpanRanges } from '$components/editor/utils';\n\nexport const MARKDOWN_ALLOWED_HTML_TAGS = new Set([\n  'a',\n  'blockquote',\n  'br',\n  'code',\n  'del',\n  'details',\n  'div',\n  'em',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'hr',\n  'img',\n  'li',\n  'mx-reply',\n  'ol',\n  'p',\n  'pre',\n  's',\n  'span',\n  'strong',\n  'sub',\n  'summary',\n  'table',\n  'tbody',\n  'td',\n  'th',\n  'thead',\n  'tr',\n  'u',\n  'ul',\n]);\n\n/** Void elements that do not require a separate closing tag. */\nconst VOID_HTML_TAGS = new Set(['br', 'hr', 'img']);\n\nexport const isAllowedHtmlTag = (tagName: string): boolean =>\n  MARKDOWN_ALLOWED_HTML_TAGS.has(tagName.toLowerCase());\n\n/** Matches HTML open/close/self-closing tags (not `<https://…>` preview suppressors). */\nconst RAW_HTML_TAG = /<\\/?([a-zA-Z][\\da-zA-Z-]*)(?:\\s(?:[^>\"']|\"[^\"]*\"|'[^']*')*)?\\s*\\/?>/g;\n\nconst CODE_PLACEHOLDER_START = '\\uE000';\nconst CODE_PLACEHOLDER_END = '\\uE001';\n\ntype HtmlTagToken = {\n  index: number;\n  length: number;\n  raw: string;\n  tagName: string;\n  kind: 'open' | 'close' | 'void';\n};\n\nconst entityEscapeTag = (raw: string): string =>\n  raw.replaceAll('<', '&lt;').replaceAll('>', '&gt;');\n\n/** True when an odd number of `\\` immediately precedes `index` (CommonMark escape). */\nconst isMarkdownEscapedAt = (input: string, index: number): boolean => {\n  let slashes = 0;\n  for (let i = index - 1; i >= 0 && input[i] === '\\\\'; i -= 1) {\n    slashes += 1;\n  }\n  return slashes % 2 === 1;\n};\n\nconst isVoidHtmlTag = (tagName: string, raw: string): boolean =>\n  VOID_HTML_TAGS.has(tagName.toLowerCase()) || /\\/>\\s*$/.test(raw);\n\nconst scanHtmlTags = (input: string): HtmlTagToken[] => {\n  const tokens: HtmlTagToken[] = [];\n  const re = new RegExp(RAW_HTML_TAG.source, 'g');\n  let match: RegExpExecArray | null;\n\n  while ((match = re.exec(input)) !== null) {\n    const raw = match[0];\n    const tagName = match[1]!.toLowerCase();\n    const isClose = raw.startsWith('</');\n    const kind: HtmlTagToken['kind'] = isClose\n      ? 'close'\n      : isVoidHtmlTag(tagName, raw)\n        ? 'void'\n        : 'open';\n\n    tokens.push({\n      index: match.index,\n      length: raw.length,\n      raw,\n      tagName,\n      kind,\n    });\n  }\n\n  return tokens;\n};\n\nconst collectTagsToEscape = (input: string, tokens: HtmlTagToken[]): Set<number> => {\n  const escapeAt = new Set<number>();\n  const openStack: { tagName: string; index: number }[] = [];\n\n  for (const token of tokens) {\n    if (isMarkdownEscapedAt(input, token.index)) {\n      continue;\n    }\n\n    if (!isAllowedHtmlTag(token.tagName)) {\n      escapeAt.add(token.index);\n      continue;\n    }\n\n    if (token.kind === 'void') {\n      continue;\n    }\n\n    if (token.kind === 'open') {\n      openStack.push({ tagName: token.tagName, index: token.index });\n      continue;\n    }\n\n    const top = openStack[openStack.length - 1];\n    if (top && top.tagName === token.tagName) {\n      openStack.pop();\n    } else {\n      escapeAt.add(token.index);\n    }\n  }\n\n  for (const { index } of openStack) {\n    escapeAt.add(index);\n  }\n\n  return escapeAt;\n};\n\nconst applyTagEscapes = (input: string, tokens: HtmlTagToken[], escapeAt: Set<number>): string => {\n  if (escapeAt.size === 0) return input;\n\n  let out = '';\n  let cursor = 0;\n\n  for (const token of tokens) {\n    out += input.slice(cursor, token.index);\n    out += escapeAt.has(token.index) ? entityEscapeTag(token.raw) : token.raw;\n    cursor = token.index + token.length;\n  }\n\n  return out + input.slice(cursor);\n};\n\nconst maskMarkdownVerbatimRegions = (text: string): { masked: string; chunks: string[] } => {\n  const chunks: string[] = [];\n  const placeholder = (index: number) =>\n    `${CODE_PLACEHOLDER_START}CODE${index}${CODE_PLACEHOLDER_END}`;\n\n  let masked = text.replace(/```[^\\n`]*\\n[\\s\\S]*?```/g, (chunk) => {\n    chunks.push(chunk);\n    return placeholder(chunks.length - 1);\n  });\n  masked = masked.replace(/```[\\s\\S]*?```/g, (chunk) => {\n    chunks.push(chunk);\n    return placeholder(chunks.length - 1);\n  });\n\n  const inlineRanges = getMarkdownCodeSpanRanges(masked);\n  for (let i = inlineRanges.length - 1; i >= 0; i -= 1) {\n    const [start, end] = inlineRanges[i]!;\n    const chunk = masked.slice(start, end);\n    chunks.push(chunk);\n    masked = `${masked.slice(0, start)}${placeholder(chunks.length - 1)}${masked.slice(end)}`;\n  }\n\n  return { masked, chunks };\n};\n\nconst unmaskMarkdownVerbatimRegions = (text: string, chunks: string[]): string =>\n  text.replace(\n    new RegExp(`${CODE_PLACEHOLDER_START}CODE(\\\\d+)${CODE_PLACEHOLDER_END}`, 'g'),\n    (_, index) => chunks[parseInt(index, 10)] ?? ''\n  );\n\nconst escapeHtmlTagsInMarkdown = (input: string): string => {\n  const tokens = scanHtmlTags(input);\n  if (tokens.length === 0) return input;\n  const escapeAt = collectTagsToEscape(input, tokens);\n  return applyTagEscapes(input, tokens, escapeAt);\n};\n\n/**\n * Entity-escapes HTML tags that are not on the allowlist or are structurally invalid\n * (e.g. missing a required closing tag, or a mismatched close) so marked/DOMPurify never\n * interpret them as HTML.\n */\nexport const escapeNonAllowlistedHtmlTags = (input: string): string => {\n  const { masked, chunks } = maskMarkdownVerbatimRegions(input);\n  const escaped = escapeHtmlTagsInMarkdown(masked);\n  return unmaskMarkdownVerbatimRegions(escaped, chunks);\n};\n","import { marked } from 'marked';\nimport DOMPurify from 'dompurify';\nimport { matrixSpoilerExtension } from './extensions/matrix-spoiler';\nimport {\n  matrixMathExtension,\n  matrixMathBlockExtension,\n  maskDollarSignsInsideMarkdownCode,\n  shieldDollarRunsForMarked,\n  unmaskMathCodeDollarPlaceholders,\n  unmaskSubscriptCodeLinePlaceholders,\n} from './extensions/matrix-math';\nimport { matrixSubscriptExtension } from './extensions/matrix-subscript';\nimport { matrixEmoticonExtension, preprocessEmoticon } from './extensions/matrix-emoticon';\nimport { matrixUnderlineExtension } from './extensions/matrix-underline';\nimport { matrixMfmColorExtension } from './extensions/matrix-mfm-color';\nimport {\n  escapeLineStartBlockquoteWithoutFollowingSpace,\n  unescapeMarkdownInlineSequencesExceptInCodeHtml,\n} from './utils';\nimport { expandBlockBoundariesAfterSingleNewlines } from './expandBlockNewlines';\nimport { escapeNonAllowlistedHtmlTags, MARKDOWN_ALLOWED_HTML_TAGS } from './allowedHtmlTags';\n\n// Configure marked with Matrix extensions\nconst processor = marked.use({\n  breaks: true,\n  renderer: {\n    // `input` is not a Matrix-permitted tag, keep the literal `[ ]`/`[x]` marker.\n    checkbox({ raw }) {\n      return raw;\n    },\n  },\n  extensions: [\n    matrixMfmColorExtension,\n    matrixUnderlineExtension,\n    matrixSpoilerExtension,\n    matrixMathExtension,\n    matrixMathBlockExtension,\n    matrixSubscriptExtension,\n    matrixEmoticonExtension,\n  ],\n});\n\n/**\n * Decodes common HTML entities in text for markdown processing.\n * This allows markdown parsers to correctly interpret entities like &lt; as <.\n */\nconst decodeHtmlEntities = (text: string): string => {\n  const entities: Record<string, string> = {\n    '&lt;': '<',\n    '&gt;': '>',\n    '&amp;': '&',\n    '&quot;': '\"',\n    '&#39;': \"'\",\n    '&nbsp;': ' ',\n  };\n  let result = text;\n  for (const [entity, char] of Object.entries(entities)) {\n    result = result.split(entity).join(char);\n  }\n  return result;\n};\n\nconst MATRIX_TO_PLACEHOLDER_PREFIX = 'MATRIXTORAWLINKTOKEN';\n\nconst ORDERED_LIST_START_REGEX = /^-?\\d+$/;\n\nconst escapeHtml = (text: string): string =>\n  text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n\nconst shieldBareMatrixToLinks = (\n  input: string\n): { shielded: string; placeholders: Map<string, string> } => {\n  const placeholders = new Map<string, string>();\n  let index = 0;\n\n  const shielded = input.replace(/(?<!\\]\\()https?:\\/\\/matrix\\.to\\/[^\\s<)]+/gi, (url) => {\n    const key = `${MATRIX_TO_PLACEHOLDER_PREFIX}${index++}X`;\n    placeholders.set(key, url);\n    return key;\n  });\n\n  return { shielded, placeholders };\n};\n\nconst unshieldBareMatrixToLinks = (html: string, placeholders: Map<string, string>): string => {\n  let result = html;\n  const keys = [...placeholders.keys()].toSorted((a, b) => b.length - a.length);\n  for (const key of keys) {\n    const url = placeholders.get(key);\n    if (url) result = result.split(key).join(escapeHtml(url));\n  }\n  return result;\n};\n\n/** When the whole message is a single paragraph, drop the redundant wrapper. */\nconst unwrapSingleOuterParagraph = (html: string): string => {\n  const trimmed = html.trim();\n  const m = trimmed.match(/^<p\\b[^>]*>([\\s\\S]*)<\\/p>$/i);\n  if (!m) return html;\n  const inner = m[1] ?? '';\n  if (/<\\/p>/i.test(inner)) return html;\n  return inner;\n};\n\n/**\n * For `m.emote`, the sender display name is added at render time. Strips the leading `<p>…</p>`\n * block (when its inner HTML has no `</p>`) so we don't send `<p>` around the action.\n */\nconst stripLeadingEmoteParagraph = (html: string): string | null => {\n  const trimmed = html.trim();\n  const m = trimmed.match(/^<p\\b[^>]*>([\\s\\S]*?)<\\/p>/i);\n  if (!m) return null;\n  const inner = m[1] ?? '';\n  if (/<\\/p>/i.test(inner)) return null;\n  const rest = trimmed.slice(m[0].length).trimStart();\n  return rest.length > 0 ? `${inner}${rest}` : inner;\n};\n\nexport type MarkdownToHtmlOptions = {\n  emote?: boolean;\n};\n\n/**\n * Converts markdown string to sanitized Matrix-compatible HTML.\n * Uses marked for parsing and DOMPurify for sanitization per Matrix spec.\n *\n * @param markdown - Input markdown string\n * @param options - Optional; set `emote` for `/me` outgoing HTML\n * @returns Sanitized HTML string safe for Matrix client output\n */\nexport function markdownToHtml(markdown: string, options?: MarkdownToHtmlOptions): string {\n  // Decode HTML entities so marked can properly parse markdown syntax\n  // (e.g., &lt; becomes < for link URLs)\n  const decoded = decodeHtmlEntities(markdown);\n\n  // Only treat `> ` as block quote, escape bare `>` at line start (e.g. `>:3`)\n  const blockquotePrefixed = escapeLineStartBlockquoteWithoutFollowingSpace(decoded);\n\n  const allowlistedOnly = escapeNonAllowlistedHtmlTags(blockquotePrefixed);\n\n  const preprocessed = preprocessEmoticon(allowlistedOnly);\n\n  const boundaryExpanded = expandBlockBoundariesAfterSingleNewlines(preprocessed);\n\n  const { shielded: matrixToShielded, placeholders: matrixToPlaceholders } =\n    shieldBareMatrixToLinks(boundaryExpanded);\n\n  const mathInput = shieldDollarRunsForMarked(maskDollarSignsInsideMarkdownCode(matrixToShielded));\n\n  // Parse markdown to HTML using marked with our Matrix extensions\n  const html = processor.parse(mathInput) as string;\n\n  // Unescape inline sequences (e.g., \\*, \\_) after parsing, but not inside <pre>/<code>\n  const unescapedInline = unescapeMarkdownInlineSequencesExceptInCodeHtml(html);\n\n  const allowlistedHtml = escapeNonAllowlistedHtmlTags(unescapedInline);\n\n  // Validate <ol start> after sanitization.\n  DOMPurify.addHook('afterSanitizeAttributes', (node) => {\n    if (node.tagName === 'OL') {\n      const start = node.getAttribute('start');\n      if (start !== null && !ORDERED_LIST_START_REGEX.test(start)) {\n        node.removeAttribute('start');\n      }\n    }\n  });\n\n  const sanitized = DOMPurify.sanitize(allowlistedHtml, {\n    ALLOWED_TAGS: [...MARKDOWN_ALLOWED_HTML_TAGS],\n    ALLOWED_ATTR: [\n      'href',\n      'src',\n      'alt',\n      'title',\n      'height',\n      'width',\n      'data-mx-emoticon',\n      'data-mx-spoiler',\n      'data-mx-maths',\n      'data-md',\n      'data-mx-color',\n      'data-mx-bg-color',\n      'data-lang',\n      'class',\n      'start',\n      'type',\n      'open',\n    ],\n    // Ensure these safe attrs survive sanitization even when the input HTML\n    // originates from markdown-embedded tags (e.g. custom emoji <img>).\n    // `start` must be URI-safe or DOMPurify drops it when ALLOWED_URI_REGEXP is set.\n    ADD_ATTR: ['height', 'width'],\n    ADD_URI_SAFE_ATTR: ['start'],\n    FORCE_BODY: false,\n    ALLOWED_URI_REGEXP: /^(?:https?|ftp|mailto|magnet|mxc):/i,\n  });\n\n  DOMPurify.removeHook('afterSanitizeAttributes');\n\n  const unmasked = unmaskSubscriptCodeLinePlaceholders(unmaskMathCodeDollarPlaceholders(sanitized));\n\n  // DOMPurify's Node/JSdom build can drop <img> size attributes even when allowlisted.\n  // For Matrix custom emojis, always emit a stable height so outgoing messages have\n  // consistent layout across clients.\n  const restoredMxEmoticonHeight = unmasked.replace(\n    /<img\\b([^>]*\\bdata-mx-emoticon\\b[^>]*)>/gi,\n    (full, attrs: string) => {\n      if (/\\bheight\\s*=/i.test(attrs)) return full;\n      return `<img${attrs} height=\"32\">`;\n    }\n  );\n\n  const unshieldedMatrixTo = unshieldBareMatrixToLinks(\n    restoredMxEmoticonHeight,\n    matrixToPlaceholders\n  );\n\n  const listFixed = unshieldedMatrixTo.replace(/<li>(<p><\\/p>)?<\\/li>/gi, '<li><br></li>');\n  if (options?.emote) {\n    return stripLeadingEmoteParagraph(listFixed) ?? unwrapSingleOuterParagraph(listFixed);\n  }\n  return unwrapSingleOuterParagraph(listFixed);\n}\n","//#region src/client/constants.ts\n/**\n* SVG elements are case-sensitive.\n*\n* @see https://developer.mozilla.org/docs/Web/SVG/Element#svg_elements_a_to_z\n*/\nconst CASE_SENSITIVE_TAG_NAMES = [\n\t\"animateMotion\",\n\t\"animateTransform\",\n\t\"clipPath\",\n\t\"feBlend\",\n\t\"feColorMatrix\",\n\t\"feComponentTransfer\",\n\t\"feComposite\",\n\t\"feConvolveMatrix\",\n\t\"feDiffuseLighting\",\n\t\"feDisplacementMap\",\n\t\"feDropShadow\",\n\t\"feFlood\",\n\t\"feFuncA\",\n\t\"feFuncB\",\n\t\"feFuncG\",\n\t\"feFuncR\",\n\t\"feGaussianBlur\",\n\t\"feImage\",\n\t\"feMerge\",\n\t\"feMergeNode\",\n\t\"feMorphology\",\n\t\"feOffset\",\n\t\"fePointLight\",\n\t\"feSpecularLighting\",\n\t\"feSpotLight\",\n\t\"feTile\",\n\t\"feTurbulence\",\n\t\"foreignObject\",\n\t\"linearGradient\",\n\t\"radialGradient\",\n\t\"textPath\"\n];\nconst CASE_SENSITIVE_TAG_NAMES_MAP = CASE_SENSITIVE_TAG_NAMES.reduce((accumulator, tagName) => {\n\taccumulator[tagName.toLowerCase()] = tagName;\n\treturn accumulator;\n}, {});\n//#endregion\nexport { CASE_SENSITIVE_TAG_NAMES, CASE_SENSITIVE_TAG_NAMES_MAP };\n\n//# sourceMappingURL=constants.mjs.map","import { CASE_SENSITIVE_TAG_NAMES_MAP } from \"./constants.mjs\";\nimport { Comment, Element, ProcessingInstruction, Text } from \"domhandler\";\n//#region src/client/utilities.ts\nconst CARRIAGE_RETURN = \"\\r\";\nconst CARRIAGE_RETURN_REGEX = new RegExp(CARRIAGE_RETURN, \"g\");\nconst CARRIAGE_RETURN_PLACEHOLDER = `__HTML_DOM_PARSER_CARRIAGE_RETURN_PLACEHOLDER_${Date.now().toString()}__`;\nconst CARRIAGE_RETURN_PLACEHOLDER_REGEX = new RegExp(CARRIAGE_RETURN_PLACEHOLDER, \"g\");\n/**\n* Gets case-sensitive tag name.\n*\n* @param tagName - Tag name in lowercase.\n* @returns - Case-sensitive tag name.\n*/\nfunction getCaseSensitiveTagName(tagName) {\n\treturn CASE_SENSITIVE_TAG_NAMES_MAP[tagName];\n}\n/**\n* Formats DOM attributes to a hash map.\n*\n* @param attributes - List of attributes.\n* @returns - Map of attribute name to value.\n*/\nfunction formatAttributes(attributes) {\n\tconst map = {};\n\tlet index = 0;\n\tconst attributesLength = attributes.length;\n\tfor (; index < attributesLength; index++) {\n\t\tconst attribute = attributes[index];\n\t\tmap[attribute.name] = attribute.value;\n\t}\n\treturn map;\n}\n/**\n* Corrects the tag name if it is case-sensitive (SVG).\n* Otherwise, returns the lowercase tag name (HTML).\n*\n* @param tagName - Lowercase tag name.\n* @returns - Formatted tag name.\n*/\nfunction formatTagName(tagName) {\n\ttagName = tagName.toLowerCase();\n\tconst caseSensitiveTagName = getCaseSensitiveTagName(tagName);\n\tif (caseSensitiveTagName) return caseSensitiveTagName;\n\treturn tagName;\n}\n/**\n* Checks if an HTML string contains an opening tag (case-insensitive).\n*\n* @param html - HTML string.\n* @param tagName - Tag name to search for (e.g., 'head' or 'body').\n* @returns - Whether the tag is found.\n*/\nfunction hasOpenTag(html, tagName) {\n\tconst openTag = \"<\" + tagName;\n\tconst index = html.toLowerCase().indexOf(openTag);\n\tif (index === -1) return false;\n\tconst char = html[index + openTag.length];\n\treturn char === \">\" || char === \" \" || char === \"\t\" || char === \"\\n\" || char === \"\\r\" || char === \"/\";\n}\n/**\n* Escapes special characters before parsing.\n*\n* @param html - The HTML string.\n* @returns - HTML string with escaped special characters.\n*/\nfunction escapeSpecialCharacters(html) {\n\treturn html.replace(CARRIAGE_RETURN_REGEX, CARRIAGE_RETURN_PLACEHOLDER);\n}\n/**\n* Reverts escaped special characters back to actual characters.\n*\n* @param text - The text with escaped characters.\n* @returns - Text with escaped characters reverted.\n*/\nfunction revertEscapedCharacters(text) {\n\treturn text.replace(CARRIAGE_RETURN_PLACEHOLDER_REGEX, CARRIAGE_RETURN);\n}\n/**\n* Transforms DOM nodes to `domhandler` nodes.\n*\n* @param nodes - DOM nodes.\n* @param parent - Parent node.\n* @param directive - Directive.\n* @returns - Nodes.\n*/\nfunction formatDOM(nodes, parent = null, directive) {\n\tconst domNodes = [];\n\tlet current;\n\tlet index = 0;\n\tconst nodesLength = nodes.length;\n\tfor (; index < nodesLength; index++) {\n\t\tconst node = nodes[index];\n\t\tswitch (node.nodeType) {\n\t\t\tcase 1: {\n\t\t\t\tconst tagName = formatTagName(node.nodeName);\n\t\t\t\tcurrent = new Element(tagName, formatAttributes(node.attributes));\n\t\t\t\tcurrent.children = formatDOM(tagName === \"template\" ? node.content.childNodes : node.childNodes, current);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/* v8 ignore start */\n\t\t\tcase 3:\n\t\t\t\tcurrent = new Text(revertEscapedCharacters(node.nodeValue ?? \"\"));\n\t\t\t\tbreak;\n\t\t\tcase 8:\n\t\t\t\tcurrent = new Comment(node.nodeValue ?? \"\");\n\t\t\t\tbreak;\n\t\t\t/* v8 ignore stop */\n\t\t\tdefault: continue;\n\t\t}\n\t\tconst prev = domNodes[index - 1] ?? null;\n\t\tif (prev) prev.next = current;\n\t\tcurrent.parent = parent;\n\t\tcurrent.prev = prev;\n\t\tcurrent.next = null;\n\t\tdomNodes.push(current);\n\t}\n\tif (directive) {\n\t\tcurrent = new ProcessingInstruction(directive.substring(0, directive.indexOf(\" \")).toLowerCase(), directive);\n\t\tcurrent.next = domNodes[0] ?? null;\n\t\tcurrent.parent = parent;\n\t\tdomNodes.unshift(current);\n\t\tif (domNodes[1]) domNodes[1].prev = domNodes[0];\n\t}\n\treturn domNodes;\n}\n//#endregion\nexport { escapeSpecialCharacters, formatDOM, hasOpenTag, revertEscapedCharacters };\n\n//# sourceMappingURL=utilities.mjs.map","import { escapeSpecialCharacters, hasOpenTag } from \"./utilities.mjs\";\n//#region src/client/domparser.ts\nconst HTML = \"html\";\nconst HEAD = \"head\";\nconst BODY = \"body\";\nconst FIRST_TAG_REGEX = /<([a-zA-Z]+[0-9]?)/;\nfunction getHTMLForInnerHTML(html, trustedTypePolicy) {\n\treturn trustedTypePolicy ? trustedTypePolicy.createHTML(html) : html;\n}\n/* v8 ignore start */\nlet parseFromDocument = (html, tagName, trustedTypePolicy) => {\n\tthrow new Error(\"This browser does not support `document.implementation.createHTMLDocument`\");\n};\nlet parseFromString = (html, tagName, trustedTypePolicy) => {\n\tthrow new Error(\"This browser does not support `DOMParser.prototype.parseFromString`\");\n};\nconst DOMParser = typeof window === \"object\" && window.DOMParser;\n/**\n* DOMParser (performance: slow).\n*\n* @see https://developer.mozilla.org/docs/Web/API/DOMParser#Parsing_an_SVG_or_HTML_document\n*/\nif (typeof DOMParser === \"function\") {\n\tconst domParser = new DOMParser();\n\tconst mimeType = \"text/html\";\n\t/**\n\t* Creates an HTML document using `DOMParser.parseFromString`.\n\t*\n\t* @param html - The HTML string.\n\t* @param tagName - The element to render the HTML (with 'body' as fallback).\n\t* @returns - Document.\n\t*/\n\tparseFromString = (html, tagName, trustedTypePolicy) => {\n\t\tif (tagName) html = `<${tagName}>${html}</${tagName}>`;\n\t\treturn domParser.parseFromString(html, mimeType);\n\t};\n\tparseFromDocument = parseFromString;\n}\n/**\n* DOMImplementation (performance: fair).\n*\n* @see https://developer.mozilla.org/docs/Web/API/DOMImplementation/createHTMLDocument\n*/\nif (typeof document === \"object\" && document.implementation) {\n\tconst htmlDocument = document.implementation.createHTMLDocument();\n\t/**\n\t* Use HTML document created by `document.implementation.createHTMLDocument`.\n\t*\n\t* @param html - The HTML string.\n\t* @param tagName - The element to render the HTML (with 'body' as fallback).\n\t* @returns - Document\n\t*/\n\tparseFromDocument = function(html, tagName, trustedTypePolicy) {\n\t\tif (tagName) {\n\t\t\tconst element = htmlDocument.documentElement.querySelector(tagName);\n\t\t\tif (element) element.innerHTML = getHTMLForInnerHTML(html, trustedTypePolicy);\n\t\t\treturn htmlDocument;\n\t\t}\n\t\thtmlDocument.documentElement.innerHTML = getHTMLForInnerHTML(html, trustedTypePolicy);\n\t\treturn htmlDocument;\n\t};\n}\n/**\n* Template (performance: fast).\n*\n* @see https://developer.mozilla.org/docs/Web/HTML/Element/template\n*/\nconst template = typeof document === \"object\" && document.createElement(\"template\");\nlet parseFromTemplate;\nif (template && template.content)\n /**\n* Uses a template element (content fragment) to parse HTML.\n*\n* @param html - HTML string.\n* @returns - Nodes.\n*/\nparseFromTemplate = (html, trustedTypePolicy) => {\n\ttemplate.innerHTML = getHTMLForInnerHTML(html, trustedTypePolicy);\n\treturn template.content.childNodes;\n};\nconst createNodeList = () => document.createDocumentFragment().childNodes;\n/* v8 ignore stop */\n/**\n* Parses HTML string to DOM nodes.\n*\n* @param html - HTML markup.\n* @param trustedTypePolicy - Trusted Types policy.\n* @returns - DOM nodes.\n*/\nfunction domparser(html, trustedTypePolicy) {\n\thtml = escapeSpecialCharacters(html);\n\tconst firstTagName = FIRST_TAG_REGEX.exec(html)?.[1]?.toLowerCase();\n\tswitch (firstTagName) {\n\t\tcase HTML: {\n\t\t\tconst doc = parseFromString(html);\n\t\t\tif (!hasOpenTag(html, HEAD)) {\n\t\t\t\tconst element = doc.querySelector(HEAD);\n\t\t\t\telement?.parentNode?.removeChild(element);\n\t\t\t}\n\t\t\tif (!hasOpenTag(html, BODY)) {\n\t\t\t\tconst element = doc.querySelector(BODY);\n\t\t\t\telement?.parentNode?.removeChild(element);\n\t\t\t}\n\t\t\treturn doc.querySelectorAll(HTML);\n\t\t}\n\t\tcase HEAD:\n\t\tcase BODY: {\n\t\t\tconst elements = parseFromDocument(html, void 0, trustedTypePolicy).querySelectorAll(firstTagName);\n\t\t\t/* v8 ignore next */\n\t\t\tif (hasOpenTag(html, BODY) && hasOpenTag(html, HEAD)) return elements[0].parentNode?.childNodes ?? createNodeList();\n\t\t\treturn elements;\n\t\t}\n\t\t/* v8 ignore start */\n\t\tdefault:\n\t\t\tif (parseFromTemplate) return parseFromTemplate(html, trustedTypePolicy);\n\t\t\treturn parseFromDocument(html, BODY, trustedTypePolicy).querySelector(BODY)?.childNodes ?? createNodeList();\n\t}\n}\n//#endregion\nexport { domparser as default, getHTMLForInnerHTML };\n\n//# sourceMappingURL=domparser.mjs.map","import { formatDOM } from \"./utilities.mjs\";\nimport domparser from \"./domparser.mjs\";\n//#region src/client/html-to-dom.ts\nconst DIRECTIVE_REGEX = /<(![a-zA-Z\\s]+)>/;\n/**\n* Parses HTML string to DOM nodes in browser.\n*\n* @param html - HTML markup.\n* @param options - Parser options.\n* @returns - DOM elements.\n*/\nfunction HTMLDOMParser(html, options) {\n\tif (typeof html !== \"string\") throw new TypeError(\"First argument must be a string\");\n\tif (!html) return [];\n\tconst match = DIRECTIVE_REGEX.exec(html);\n\tconst directive = match ? match[1] : void 0;\n\treturn formatDOM(domparser(html, options?.trustedTypePolicy), null, directive);\n}\n//#endregion\nexport { HTMLDOMParser as default };\n\n//# sourceMappingURL=html-to-dom.mjs.map","import parse from 'html-dom-parser';\nimport type { ChildNode, Element } from 'domhandler';\nimport { isText, isTag } from 'domhandler';\nimport {\n  encodeMxEmoticonForMarkdownPlaceholder,\n  validateMxcUrl,\n} from './extensions/matrix-emoticon';\nimport { escapeMarkdownInlineSequences } from './utils';\nimport { testMatrixTo } from '$plugins/matrix-to';\nimport { isAllowedHtmlTag } from './allowedHtmlTags';\nimport { formatMfmColorDataMd } from './extensions/matrix-mfm-color';\nimport { isMatrixHexColor } from '$utils/matrixHtml';\n\n/** CommonMark list nesting indent (four spaces per level). */\nconst LIST_MARKDOWN_INDENT = '    ';\n\n/**\n * Converts Matrix-compatible HTML back to markdown for round-trip editing.\n * Preserves original markdown syntax via data-md attributes and converts\n * Matrix-specific elements (spoilers, math) back to their markdown equivalents.\n *\n * @param html - Input HTML string (should be pre-sanitized)\n * @returns Markdown string for editor editing\n */\nexport function htmlToMarkdown(html: string): string {\n  const domNodes = parse(html);\n  return processNodes(domNodes).trim();\n}\n\nfunction isBlockTag(node: ChildNode | undefined): boolean {\n  if (!node || !isTag(node)) return false;\n  const blocks = [\n    'p',\n    'div',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'ul',\n    'ol',\n    'li',\n    'blockquote',\n    'pre',\n    'hr',\n    'table',\n    'details',\n    'summary',\n  ];\n  return blocks.includes(node.name.toLowerCase());\n}\n\nfunction processNodes(nodes: ChildNode[]): string {\n  const filtered = nodes.filter((n, i) => {\n    if (isText(n) && /^\\s*$/.test(n.data)) {\n      const prev = nodes[i - 1];\n      const next = nodes[i + 1];\n      // Ignore whitespace between block tags or at the edges\n      const isBetweenBlocks = (!prev || isBlockTag(prev)) && (!next || isBlockTag(next));\n      if (isBetweenBlocks) return false;\n    }\n    return true;\n  });\n\n  const parts: string[] = [];\n  for (let i = 0; i < filtered.length; i += 1) {\n    const cur = filtered[i]!;\n    const prev = filtered[i - 1];\n    // Adjacent <p> blocks must become \\n\\n in markdown so the editor gets separate paragraphs.\n    // paragraphs and marked emits <p> per block again on send (single \\n would collapse).\n    if (i > 0 && prev && isTag(prev) && isTag(cur)) {\n      const prevTag = prev.name.toLowerCase();\n      const curTag = cur.name.toLowerCase();\n      if (\n        (prevTag === 'p' && curTag === 'p') ||\n        (prevTag === 'blockquote' && curTag === 'blockquote')\n      ) {\n        parts.push('\\n');\n      }\n    }\n    parts.push(processNode(cur));\n  }\n  return parts.join('');\n}\n\nfunction processNode(node: ChildNode, listDepth: number = 0, insideCode: boolean = false): string {\n  if (isText(node)) {\n    return insideCode ? node.data : escapeMarkdownInlineSequences(node.data);\n  }\n\n  if (!isTag(node)) {\n    return '';\n  }\n\n  const tag = node.name.toLowerCase();\n\n  // Handle Matrix-specific attributes\n  if (tag === 'span') {\n    if (node.attribs['data-mx-spoiler'] !== undefined) {\n      return processSpoiler(node, listDepth, insideCode);\n    }\n    if (node.attribs['data-mx-maths'] !== undefined) {\n      return processMath(node, 'inline');\n    }\n    if (node.attribs['data-md'] !== undefined) {\n      const dataMd = node.attribs['data-md'];\n      if (typeof dataMd === 'string' && dataMd.startsWith('$[')) {\n        return processMfmColorSpan(node, listDepth, insideCode);\n      }\n      return processInlineMarkdown(node, listDepth, insideCode);\n    }\n    if (\n      node.attribs['data-mx-color'] !== undefined ||\n      node.attribs['data-mx-bg-color'] !== undefined\n    ) {\n      return processMfmColorSpan(node, listDepth, insideCode);\n    }\n  }\n\n  if (tag === 'div') {\n    if (node.attribs['data-mx-maths'] !== undefined) {\n      return processMath(node, 'block');\n    }\n  }\n\n  // Handle block elements\n  switch (tag) {\n    case 'h1':\n    case 'h2':\n    case 'h3':\n    case 'h4':\n    case 'h5':\n    case 'h6':\n      return processHeading(node, tag, listDepth, insideCode);\n\n    case 'p':\n      return processParagraph(node, listDepth, insideCode);\n\n    case 'strong':\n    case 'b':\n      return processInlineWrapper(node, '**', listDepth, insideCode);\n\n    case 'em':\n    case 'i':\n      return processInlineWrapper(node, '*', listDepth, insideCode);\n\n    case 'u': {\n      const md = node.attribs['data-md'];\n      return processInlineWrapper(node, md ?? '__');\n    }\n\n    case 's':\n    case 'del':\n      return processInlineWrapper(node, '~~', listDepth, insideCode);\n\n    case 'code':\n      return processCode(node, listDepth);\n\n    case 'pre':\n      return processPre(node, listDepth);\n\n    case 'blockquote':\n      return processBlockquote(node, listDepth, insideCode);\n\n    case 'ul':\n      return processUnorderedList(node, listDepth, insideCode);\n\n    case 'ol':\n      return processOrderedList(node, listDepth, insideCode);\n\n    case 'li':\n      return processListItem(node, listDepth, insideCode);\n\n    case 'a':\n      return processLink(node, listDepth, insideCode);\n\n    case 'br':\n      return '\\n';\n\n    case 'hr':\n      return '---\\n';\n\n    case 'sub':\n      return processSubscript(node, listDepth, insideCode);\n\n    case 'img':\n      return processImage(node);\n\n    default:\n      if (!isAllowedHtmlTag(tag)) {\n        return processUnknownHtmlTag(node, listDepth, insideCode);\n      }\n      return processInlineElements(node, listDepth, insideCode);\n  }\n}\n\nfunction formatHtmlTagAttributes(attribs: Element['attribs']): string {\n  return Object.entries(attribs)\n    .map(([key, value]) => ` ${key}=\"${value}\"`)\n    .join('');\n}\n\nfunction processUnknownHtmlTag(\n  node: Element,\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  const content = processChildren(node.children, listDepth, insideCode);\n  const attrs = formatHtmlTagAttributes(node.attribs);\n  const raw = `<${node.name}${attrs}>${content}</${node.name}>`;\n  return escapeMarkdownInlineSequences(raw);\n}\nfunction reconstructTag(node: Element, listDepth: number = 0, insideCode: boolean = false): string {\n  const content = processInlineElements(node, listDepth, insideCode);\n  const attributes = Object.entries(node.attribs)\n    .map(([key, value]) => ` ${key}=\"${value}\"`)\n    .join('');\n  return `<${node.name}${attributes}>${content}</${node.name}>`;\n}\n\nfunction processInlineElements(\n  node: Element,\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  return processChildren(node.children, listDepth, insideCode);\n}\n\n/** Text node is a literal or entity-encoded angle bracket (preview-suppressed autolink wrapper). */\nfunction isOpeningAngleBracketText(data: string): boolean {\n  const t = data.trim();\n  return t === '<' || t === '&lt;' || t === '&#60;' || t === '&#x3c;';\n}\n\nfunction isClosingAngleBracketText(data: string): boolean {\n  const t = data.trim();\n  return t === '>' || t === '&gt;' || t === '&#62;' || t === '&#x3e;';\n}\n\nfunction processChildren(\n  children: ChildNode[],\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  const out: string[] = [];\n\n  for (let i = 0; i < children.length; i += 1) {\n    const cur = children[i];\n    const next = children[i + 1];\n    const next2 = children[i + 2];\n\n    if (\n      cur &&\n      next &&\n      next2 &&\n      isText(cur) &&\n      isOpeningAngleBracketText(cur.data) &&\n      isTag(next) &&\n      next.name.toLowerCase() === 'a' &&\n      isText(next2) &&\n      isClosingAngleBracketText(next2.data)\n    ) {\n      const href = next.attribs.href ?? '';\n      const content = next.children.map((c) => processNode(c, listDepth, insideCode)).join('');\n      if (testMatrixTo(href)) {\n        out.push(`[${content}](${href})`);\n      } else {\n        out.push(`[${content}](<${href}>)`);\n      }\n      i += 2;\n      continue;\n    }\n\n    if (cur) {\n      out.push(processNode(cur, listDepth, insideCode));\n    }\n  }\n\n  return out.join('');\n}\n\nfunction processInlineWrapper(\n  node: Element,\n  marker: string,\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  const content = processChildren(node.children, listDepth, insideCode);\n  return `${marker}${content}${marker}`;\n}\n\nfunction processCode(node: Element, listDepth: number = 0): string {\n  const codeContent = node.children.map((c) => processNode(c, listDepth, true)).join('');\n\n  // Check if this is inside a pre (code block)\n  if (node.parent && isTag(node.parent) && node.parent.name === 'pre') {\n    return codeContent;\n  }\n\n  // Single backtick for inline code\n  return `\\`${codeContent}\\``;\n}\n\nfunction processPre(node: Element, listDepth: number = 0): string {\n  // Get language from class=\"language-xxx\"\n  const codeChild = node.children.find((c): c is Element => isTag(c) && c.name === 'code');\n  const className = codeChild?.attribs.class ?? '';\n  const langMatch = className.match(/language-(\\S+)/);\n  const lang = langMatch ? langMatch[1] : '';\n\n  const codeContent = codeChild\n    ? codeChild.children.map((c) => processNode(c, listDepth, true)).join('')\n    : node.children.map((c) => processNode(c, listDepth, true)).join('');\n\n  return `\\`\\`\\`${lang}\\n${codeContent}\\`\\`\\`\\n`;\n}\n\nfunction processHeading(\n  node: Element,\n  tag: string,\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  const level = tag.charAt(1);\n  const content = processChildren(node.children, listDepth, insideCode);\n  return `${'#'.repeat(parseInt(level, 10))} ${content}\\n`;\n}\n\nfunction processParagraph(\n  node: Element,\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  const content = processChildren(node.children, listDepth, insideCode);\n  return `${content}\\n`;\n}\n\nfunction collectBlockquoteBodyLines(\n  node: Element,\n  listDepth: number,\n  insideCode: boolean\n): string[] {\n  const lines: string[] = [];\n  const pushLine = (line: string) => {\n    lines.push(line);\n  };\n  const pushMultiline = (text: string) => {\n    for (const part of text.split('\\n')) {\n      pushLine(part);\n    }\n  };\n\n  for (const child of node.children) {\n    if (isText(child)) {\n      if (/^\\s*$/.test(child.data)) continue;\n      const text = insideCode ? child.data : escapeMarkdownInlineSequences(child.data);\n      pushMultiline(text);\n      continue;\n    }\n\n    if (!isTag(child)) continue;\n\n    const tag = child.name.toLowerCase();\n    if (tag === 'p') {\n      pushMultiline(processChildren(child.children, listDepth, insideCode));\n    } else if (tag === 'br') {\n      pushLine('');\n    } else if (tag === 'blockquote') {\n      lines.push(...collectBlockquoteBodyLines(child, listDepth, insideCode));\n    } else {\n      pushMultiline(processNode(child, listDepth, insideCode).trimEnd());\n    }\n  }\n\n  return lines;\n}\n\nfunction processBlockquote(\n  node: Element,\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  const marker = node.attribs['data-md'] ? `${node.attribs['data-md']} ` : '> ';\n  const lines = collectBlockquoteBodyLines(node, listDepth, insideCode);\n  const body = lines\n    .map((line) => (line.length === 0 ? marker.trimEnd() : `${marker}${line}`))\n    .join('\\n');\n  return `${body}\\n`;\n}\n\n/**\n * Process children of a list item, separating inline content from nested lists.\n * Nested lists are processed with increased depth for indentation.\n */\nfunction processListItemChildren(li: Element, depth: number, insideCode: boolean = false): string {\n  const inlineParts: string[] = [];\n  const nestedParts: string[] = [];\n\n  li.children.forEach((child) => {\n    if (isTag(child) && (child.name === 'ul' || child.name === 'ol')) {\n      // Nested list, process with increased depth\n      nestedParts.push(processNode(child, depth + 1, insideCode));\n    } else if (isTag(child) && child.name === 'p') {\n      // Unwrap <p> inside <li>\n      inlineParts.push(child.children.map((c) => processNode(c, depth, insideCode)).join(''));\n    } else {\n      inlineParts.push(processNode(child, depth, insideCode));\n    }\n  });\n\n  let result = inlineParts.join('').trim();\n  if (nestedParts.length > 0) {\n    result += '\\n' + nestedParts.join('').trimEnd();\n  }\n  return result;\n}\n\nfunction processUnorderedList(\n  node: Element,\n  depth: number = 0,\n  insideCode: boolean = false\n): string {\n  const mdSequence = node.attribs['data-md'] || '-';\n  const indent = LIST_MARKDOWN_INDENT.repeat(depth);\n  const items = node.children\n    .filter((c): c is Element => isTag(c) && c.name === 'li')\n    .map((li) => {\n      const content = processListItemChildren(li, depth, insideCode);\n      return `${indent}${mdSequence} ${content}`;\n    })\n    .join('\\n');\n  return items + '\\n';\n}\n\nfunction processOrderedList(node: Element, depth: number = 0, insideCode: boolean = false): string {\n  const mdSequence = node.attribs['data-md'] || '1.';\n  const [starOrHyphen] = mdSequence.match(/^\\*|-$/) ?? [];\n  const outPrefix = starOrHyphen\n    ? starOrHyphen\n    : mdSequence.endsWith('.')\n      ? mdSequence\n      : `${mdSequence}.`;\n\n  const indent = LIST_MARKDOWN_INDENT.repeat(depth);\n  const items = node.children\n    .filter((c): c is Element => isTag(c) && c.name === 'li')\n    .map((li, index) => {\n      let currentPrefix = outPrefix;\n      if (!starOrHyphen) {\n        const start = parseInt(node.attribs.start || mdSequence, 10);\n        if (!isNaN(start)) {\n          currentPrefix = `${start + index}.`;\n        }\n      }\n      const content = processListItemChildren(li, depth, insideCode);\n      return `${indent}${currentPrefix} ${content}`;\n    })\n    .join('\\n');\n  return items + '\\n';\n}\n\nfunction processListItem(node: Element, listDepth = 0, insideCode = false): string {\n  const content = node.children\n    .map((child) => {\n      if (isTag(child) && child.name === 'p') {\n        return child.children.map((c) => processNode(c, listDepth, insideCode)).join('');\n      }\n      return processNode(child, listDepth, insideCode);\n    })\n    .join('');\n  return `- ${content}\\n`;\n}\n\nfunction processSubscript(node: Element, listDepth = 0, insideCode = false): string {\n  const content = node.children.map((c) => processNode(c, listDepth, insideCode)).join('');\n  return `-# ${content}\\n`;\n}\n\nfunction processLink(node: Element, listDepth = 0, insideCode = false): string {\n  const href = node.attribs.href ?? '';\n  const content = node.children.map((c) => processNode(c, listDepth, insideCode)).join('');\n  return `[${content}](${href})`;\n}\n\nfunction processMfmColorSpan(\n  node: Element,\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  const content = processChildren(node.children, listDepth, insideCode);\n  const dataMd = node.attribs['data-md'];\n  if (typeof dataMd === 'string' && dataMd.startsWith('$[')) {\n    return `${dataMd} ${content}]`;\n  }\n\n  const args: { fg?: string; bg?: string } = {};\n  const fg = node.attribs['data-mx-color'];\n  const bg = node.attribs['data-mx-bg-color'];\n  if (typeof fg === 'string' && isMatrixHexColor(fg)) args.fg = fg;\n  if (typeof bg === 'string' && isMatrixHexColor(bg)) args.bg = bg;\n\n  if (args.fg !== undefined || args.bg !== undefined) {\n    return `${formatMfmColorDataMd(args)} ${content}]`;\n  }\n\n  return reconstructTag(node, listDepth, insideCode);\n}\n\nfunction processSpoiler(node: Element, listDepth = 0, insideCode = false): string {\n  const content = node.children.map((c) => processNode(c, listDepth, insideCode)).join('');\n  return `||${content}||`;\n}\n\nfunction processMath(node: Element, mode: 'inline' | 'block'): string {\n  const latex = node.attribs['data-mx-maths'] ?? '';\n  if (mode === 'block') {\n    return `$$${latex}$$`;\n  }\n  return `$${latex}$`;\n}\n\nfunction processInlineMarkdown(\n  node: Element,\n  listDepth: number = 0,\n  insideCode: boolean = false\n): string {\n  const mdSequence = node.attribs['data-md'] ?? '';\n  const content = node.children.map((c) => processNode(c, listDepth, insideCode)).join('');\n  return `${mdSequence}${content}${mdSequence}`;\n}\n\nfunction processImage(node: Element): string {\n  if (node.attribs['data-mx-emoticon'] === undefined) {\n    return '';\n  }\n\n  const src = node.attribs.src ?? '';\n  const alt = node.attribs.alt ?? node.attribs.title ?? '';\n\n  if (!validateMxcUrl(src)) {\n    return '';\n  }\n\n  const shortcode = alt.replace(/^:|:$/g, '');\n  if (!shortcode) {\n    return '';\n  }\n\n  return encodeMxEmoticonForMarkdownPlaceholder(src, shortcode);\n}\n","/**\n * Injects data-md attributes into HTML to preserve markdown syntax for round-trip editing.\n * This is used when receiving HTML from a sender that may not have preserved data-md.\n *\n * The function identifies common HTML patterns and adds the appropriate data-md attribute\n * so that when converting back to markdown, the original syntax is preserved.\n *\n * @param html - Input HTML string\n * @returns HTML string with data-md attributes injected\n */\nexport function injectDataMd(html: string): string {\n  // Inject heading data-md (e.g., <h1 data-md=\"#\">)\n  html = html.replace(/<h([1-6])([^>]*)>/g, (_, level, attrs) => {\n    if (attrs.includes('data-md')) return `<h${level}${attrs}>`;\n    const hashes = '#'.repeat(parseInt(level, 10));\n    return `<h${level} data-md=\"${hashes}\"${attrs}>`;\n  });\n\n  // Inject blockquote data-md\n  html = html.replace(/<blockquote([^>]*)>/g, (_, attrs) => {\n    if (attrs.includes('data-md')) return `<blockquote${attrs}>`;\n    return `<blockquote data-md=\"&gt;\"${attrs}>`;\n  });\n\n  // Inject code block data-md\n  html = html.replace(/<pre([^>]*)><code([^>]*)>/g, (_, preAttrs, codeAttrs) => {\n    if (preAttrs.includes('data-md')) return `<pre${preAttrs}><code${codeAttrs}>`;\n    return `<pre data-md=\"\\`\\`\\`\"${preAttrs}><code${codeAttrs}>`;\n  });\n\n  // Inject horizontal rule data-md\n  html = html.replace(/<hr([^>]*)>/g, (_, attrs) => {\n    if (attrs.includes('data-md')) return `<hr${attrs}>`;\n    return `<hr data-md=\"---\"${attrs}>`;\n  });\n\n  // Inject subscript data-md\n  html = html.replace(/<sub([^>]*)>/g, (_, attrs) => {\n    if (attrs.includes('data-md')) return `<sub${attrs}>`;\n    return `<sub data-md=\"-#\"${attrs}>`;\n  });\n\n  // Inject ordered list data-md\n  html = html.replace(/<ol([^>]*)>/g, (_, attrs) => {\n    if (attrs.includes('data-md')) return `<ol${attrs}>`;\n    return `<ol data-md=\"1.\"${attrs}>`;\n  });\n\n  // Inject unordered list data-md\n  html = html.replace(/<ul([^>]*)>/g, (_, attrs) => {\n    if (attrs.includes('data-md')) return `<ul${attrs}>`;\n    return `<ul data-md=\"-\"${attrs}>`;\n  });\n\n  // Inject inline markdown markers for strong/bold\n  html = html.replace(/<strong([^>]*)>([^<]*)<\\/strong>/g, (_, attrs, content) => {\n    if (attrs.includes('data-md')) return `<strong${attrs}>${content}</strong>`;\n    return `<strong data-md=\"**\"${attrs}>${content}</strong>`;\n  });\n  html = html.replace(/<b([^>]*)>([^<]*)<\\/b>/g, (_, attrs, content) => {\n    if (attrs.includes('data-md')) return `<b${attrs}>${content}</b>`;\n    return `<b data-md=\"**\"${attrs}>${content}</b>`;\n  });\n\n  // Inject inline markdown markers for emphasis/italic\n  html = html.replace(/<em([^>]*)>([^<]*)<\\/em>/g, (_, attrs, content) => {\n    if (attrs.includes('data-md')) return `<em${attrs}>${content}</em>`;\n    return `<em data-md=\"*\"${attrs}>${content}</em>`;\n  });\n  html = html.replace(/<i([^>]*)>([^<]*)<\\/i>/g, (_, attrs, content) => {\n    if (attrs.includes('data-md')) return `<i${attrs}>${content}</i>`;\n    return `<i data-md=\"*\"${attrs}>${content}</i>`;\n  });\n\n  // Inject inline markdown markers for underline\n  html = html.replace(/<u([^>]*)>([^<]*)<\\/u>/g, (_, attrs, content) => {\n    if (attrs.includes('data-md')) return `<u${attrs}>${content}</u>`;\n    return `<u data-md=\"__\"${attrs}>${content}</u>`;\n  });\n\n  // Inject inline markdown markers for strikethrough\n  html = html.replace(/<s([^>]*)>([^<]*)<\\/s>/g, (_, attrs, content) => {\n    if (attrs.includes('data-md')) return `<s${attrs}>${content}</s>`;\n    return `<s data-md=\"~~\"${attrs}>${content}</s>`;\n  });\n  html = html.replace(/<del([^>]*)>([^<]*)<\\/del>/g, (_, attrs, content) => {\n    if (attrs.includes('data-md')) return `<del${attrs}>${content}</del>`;\n    return `<del data-md=\"~~\"${attrs}>${content}</del>`;\n  });\n\n  // Inject MFM color data-md on colored spans from other clients\n  html = html.replace(\n    /<span([^>]*data-mx-color=\"(#[0-9a-fA-F]{6})\"[^>]*)>([^<]*)<\\/span>/g,\n    (match, attrs, _color, content) => {\n      if (attrs.includes('data-md')) return match;\n      const bgMatch = /data-mx-bg-color=\"(#[0-9a-fA-F]{6})\"/.exec(attrs);\n      const fg = _color as string;\n      const bg = bgMatch?.[1];\n      const parts: string[] = [`fg.color=${fg.replace(/^#/, '').toLowerCase()}`];\n      if (bg) parts.push(`bg.color=${bg.replace(/^#/, '').toLowerCase()}`);\n      return `<span data-md=\"$[${parts.join(' ')}\"${attrs}>${content}</span>`;\n    }\n  );\n  html = html.replace(\n    /<span([^>]*data-mx-bg-color=\"(#[0-9a-fA-F]{6})\"[^>]*)>([^<]*)<\\/span>/g,\n    (match, attrs, bg, content) => {\n      if (attrs.includes('data-md') || attrs.includes('data-mx-color')) return match;\n      return `<span data-md=\"$[bg.color=${(bg as string).replace(/^#/, '').toLowerCase()}\"${attrs}>${content}</span>`;\n    }\n  );\n\n  // Inject inline code marker\n  html = html.replace(/<code([^>]*)>([^<]*)<\\/code>/g, (_, attrs, content) => {\n    if (attrs.includes('data-md')) return `<code${attrs}>${content}</code>`;\n    // Don't add data-md for inline code inside pre (code blocks handled separately)\n    if (content.includes('\\n')) return `<code${attrs}>${content}</code>`;\n    return `<code data-md=\"\\`\"${attrs}>${content}</code>`;\n  });\n\n  return html;\n}\n","import type { EditorDocument, EditorParagraph, EditorText, InlineToken } from './model';\nimport { editorDocumentText, isEditorText } from './model';\nimport type { MatrixClient, Room } from '$types/matrix-sdk';\nimport { sanitizeText } from '$utils/sanitize';\nimport { markdownToHtml, injectDataMd } from '$plugins/markdown';\nimport { sanitizeForRegex } from '$utils/regex';\nimport { getMxIdLocalPart, isUserId } from '$utils/matrix';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { BlockType } from './types';\nimport { getMarkdownCodeSpanRanges, isInsideMarkdownCodeSpan } from './utils';\nimport { MATRIX_TO_BASE, testMatrixTo } from '$plugins/matrix-to';\n\ntype EditorNode = EditorParagraph | InlineToken;\n\nexport type OutputOptions = {\n  /**\n   * if true it will remove the nickname of the person from the message\n   */\n  stripNickname?: boolean;\n  /**\n   * a map of regex patterns to replace nicknames with, used when stripNickname is true\n   */\n  nickNameReplacement?: Map<RegExp, string>;\n  /** When true, markdown HTML omits the leading `<p>` wrapper (for `m.emote` / `/me`). */\n  forEmote?: boolean;\n  room?: Room;\n};\n\nconst textToCustomHtml = (node: EditorText): string => sanitizeText(node.text);\n\nconst markdownInlineLinkLabel = (label: string, fallback: string): string => {\n  const t = label.trim();\n  if (!t) return fallback;\n  if (t.includes(']')) return fallback;\n  for (let i = 0; i < t.length; i++) {\n    if (t.charCodeAt(i) <= 0x1f) return fallback;\n  }\n  return t;\n};\n\nconst userMentionMarkdownLinkLabel = (userId: string, room: Room | undefined): string => {\n  const fallback = getMxIdLocalPart(userId) ?? userId;\n  if (!room) return fallback;\n  const fromMembership = getMemberDisplayName(room, userId);\n  return markdownInlineLinkLabel(fromMembership ?? '', fallback);\n};\n\nconst elementToCustomHtml = (\n  node: Exclude<EditorParagraph | InlineToken, EditorText>,\n  children: string,\n  opts: OutputOptions\n): string => {\n  switch (node.type) {\n    case BlockType.Paragraph:\n      return `${children}<br/>`;\n\n    case BlockType.Mention: {\n      let fragment = node.id;\n\n      if (node.eventId) {\n        fragment += `/${node.eventId}`;\n      }\n      if (node.viaServers && node.viaServers.length > 0) {\n        fragment += `?${node.viaServers.map((server) => `via=${server}`).join('&')}`;\n      }\n\n      const matrixTo = `${MATRIX_TO_BASE}#/${fragment}`;\n      if (node.name === '@room') {\n        return `[@room](${encodeURI(matrixTo)})`;\n      }\n      if (isUserId(node.id)) {\n        const label = userMentionMarkdownLinkLabel(node.id, opts.room);\n        return `[${label}](${encodeURI(matrixTo)})`;\n      }\n      return sanitizeText(matrixTo);\n    }\n    case BlockType.Emoticon:\n      return node.key?.startsWith('mxc://')\n        ? `<img data-mx-emoticon src=\"${node.key}\" alt=\"${sanitizeText(\n            node.shortcode\n          )}\" title=\"${sanitizeText(node.shortcode)}\" height=\"32\" />`\n        : sanitizeText(node.key ?? '');\n    case BlockType.Link:\n      return testMatrixTo(node.href)\n        ? sanitizeText(node.href)\n        : `<a href=\"${encodeURI(node.href)}\">${children}</a>`;\n    case BlockType.Command:\n      return `/${sanitizeText(node.command)}`;\n    default:\n      return children;\n  }\n};\n\n/**\n * Convert Sable's engine-neutral representation to Matrix custom HTML.\n * @param node Sable editor document or token\n * @param opts options for output\n * @returns custom HTML string\n */\nexport const toMatrixCustomHTML = (\n  node: EditorDocument | EditorParagraph | InlineToken,\n  opts: OutputOptions\n): string => {\n  let markdownLines = '';\n  const parseNode = (n: EditorNode, index: number, targetNodes: readonly EditorNode[]) => {\n    if ('type' in n && n.type === BlockType.Paragraph) {\n      let line = toMatrixCustomHTML(n, opts);\n\n      // Use \\n for all paragraphs to prevent extra blank lines from\n      // accumulating on each edit cycle.\n      line = line.replace(/<br\\/>$/, '\\n').replace(/^(\\\\*)&gt;/, '$1>');\n\n      // strip nicknames if needed\n      if (opts.stripNickname && opts.nickNameReplacement) {\n        for (const [key, replacement] of opts.nickNameReplacement) {\n          line = line.replaceAll(key, replacement);\n        }\n      }\n      markdownLines += line;\n      if (index === targetNodes.length - 1) {\n        const html = markdownToHtml(markdownLines, { emote: opts.forEmote });\n        return injectDataMd(html);\n      }\n      return '';\n    }\n\n    const parsedMarkdown = markdownToHtml(markdownLines, { emote: opts.forEmote });\n    markdownLines = '';\n    return `${parsedMarkdown}${toMatrixCustomHTML(n, opts)}`;\n  };\n  if (Array.isArray(node))\n    return node.map((element, index, array) => parseNode(element, index, array)).join('');\n  if (isEditorText(node)) return textToCustomHtml(node);\n\n  const children = node.children\n    .map((element, index, array) => parseNode(element, index, array as readonly EditorNode[]))\n    .join('');\n  return elementToCustomHtml(node, children, opts);\n};\n\nconst elementToPlainText = (\n  node: Exclude<EditorParagraph | InlineToken, EditorText>,\n  children: string\n): string => {\n  switch (node.type) {\n    case BlockType.Paragraph:\n      return `${children}\\n`;\n    case BlockType.Mention:\n      return node.name === '@room' ? node.name : node.id;\n    case BlockType.Emoticon:\n      return node.key?.startsWith('mxc://') ? `:${node.shortcode}:` : (node.key ?? '');\n    case BlockType.Link:\n      return `[${children}](${node.href})`;\n    case BlockType.Command:\n      return `/${node.command}`;\n    default:\n      return children;\n  }\n};\n\nconst SPOILERINPUTREGEX = /\\|\\|.+?\\|\\|/g;\nconst LINK_URL = `(https?:\\\\/\\\\/.[A-Za-z0-9-._~:/?#[\\\\()@!$&'*+,;%=]+)`;\nexport const LINKINPUTREGEX = new RegExp(`\\\\(?(${LINK_URL})\\\\)?`, 'g');\nconst SPOILEREDLINKINPUTREGEX = new RegExp(`<(${LINK_URL})>`, 'g');\nconst SPOILEREDLINKDIRECTREGEX = new RegExp(`\\\\|\\\\|(${LINK_URL})\\\\|\\\\|`, 'g');\n/**\n * Convert Sable's engine-neutral representation to a plain text string that can be sent to the server.\n * @param node the Sable editor document or token\n * @param isMarkdown set true if it's a markdown formatted text\n * @param stripNickname whether to strip nicknames\n * @param nickNameReplacement the nickname replacement\n * @returns the plain text we want to send\n */\nexport const toPlainText = (\n  node: EditorDocument | EditorParagraph | InlineToken,\n  stripNickname = false,\n  stripSpoilers = true,\n  nickNameReplacement?: Map<RegExp, string>\n): string => {\n  if (Array.isArray(node))\n    return node\n      .map((n) => toPlainText(n, stripNickname, stripSpoilers, nickNameReplacement))\n      .join('');\n  if (isEditorText(node)) {\n    let { text } = node;\n\n    if (stripSpoilers) {\n      text = text.replaceAll(SPOILERINPUTREGEX, '[Spoiler]');\n      text = text.replaceAll(SPOILEREDLINKINPUTREGEX, '$1');\n    }\n\n    if (stripNickname && nickNameReplacement) {\n      for (const [key, replacement] of nickNameReplacement) {\n        text = text.replaceAll(key, replacement);\n      }\n    }\n    return text;\n  }\n\n  const children = node.children\n    .map((n) => toPlainText(n, stripNickname, stripSpoilers, nickNameReplacement))\n    .join('');\n  return elementToPlainText(node, children);\n};\n\n/**\n * Check if customHtml is equals to plainText\n * by replacing `<br/>` with `/n` in customHtml\n * and sanitizing plainText before comparison\n * because text are sanitized in customHtml\n * @param customHtml string\n * @param plain string\n * @returns boolean\n */\nexport const customHtmlEqualsPlainText = (customHtml: string, plain: string): boolean =>\n  customHtml.replaceAll('<br/>', '\\n') === sanitizeText(plain);\n\nexport const trimCustomHtml = (customHtml: string) => customHtml.replaceAll(/<br\\/>$/g, '').trim();\n\nexport const trimCommand = (cmdName: string, str: string) => {\n  const escapedCmd = sanitizeForRegex(cmdName);\n  // Allow optional leading whitespace and/or <p> tag for HTML strings\n  const cmdRegX = new RegExp(`^(?:\\\\s+)?(?:<p>)?(?:\\\\/${escapedCmd})(?:[^\\\\S\\n]+)?`, 'i');\n\n  const match = cmdRegX.exec(str);\n  if (!match) return str;\n  return str.slice(match[0].length);\n};\n\n/**\n * Type representing Mentions\n */\nexport type MentionsData = {\n  /**\n   * a boolean to denote if it's a room mention\n   */\n  room: boolean;\n  /**\n   * a set of user ids that are mentioned in the message\n   */\n  users: Set<string>;\n};\n\n/**\n * get the mentions in a message\n * @param mx the matrix client\n * @param roomId the room id we will send the message in\n * @param document the current Sable editor document\n * @returns the mentions in a message {@link MentionsData}\n */\nexport const getMentions = (\n  mx: MatrixClient,\n  roomId: string,\n  document: { children: EditorDocument }\n): MentionsData => {\n  const mentionData: MentionsData = {\n    room: false,\n    users: new Set(),\n  };\n\n  const parseMentions = (node: InlineToken | EditorDocument[number]): void => {\n    if (!('type' in node)) return;\n    if (node.type === BlockType.Paragraph) {\n      node.children.forEach(parseMentions);\n      return;\n    }\n\n    if (node.type === BlockType.Mention) {\n      if (node.name === '@room') {\n        mentionData.room = true;\n      }\n\n      if (isUserId(node.id) && node.id !== mx.getUserId()) {\n        mentionData.users.add(node.id);\n      }\n\n      return;\n    }\n\n    node.children.forEach(parseMentions);\n  };\n\n  document.children.forEach(parseMentions);\n\n  return mentionData;\n};\n\n/** Link extraction for the engine-neutral document used by outgoing messages. */\nexport const getDocumentLinks = (document: EditorDocument): string[] | undefined =>\n  linksFromText(editorDocumentText(document));\n\nconst linksFromText = (text: string): string[] | undefined => {\n  const finalList = new Set<string>();\n\n  // 1. Find all potential URLs\n  const urlsMatch = text.matchAll(LINKINPUTREGEX);\n  const spoileredUrlsMatch = [...text.matchAll(SPOILEREDLINKINPUTREGEX)].map((m) => m[1]);\n  const directSpoileredUrlsMatch = [...text.matchAll(SPOILEREDLINKDIRECTREGEX)].map((m) => m[1]);\n  const allSpoilered = new Set([...spoileredUrlsMatch, ...directSpoileredUrlsMatch]);\n\n  const codeSpanRanges = getMarkdownCodeSpanRanges(text);\n\n  for (const match of urlsMatch) {\n    let url = match[1]!;\n    const fullMatch = match[0];\n    const index = match.index;\n\n    // Clean up surrounding parens from markdown [label](url) or (url)\n    if (fullMatch.startsWith('(') && fullMatch.endsWith(')')) {\n      url = fullMatch.substring(1, fullMatch.length - 1);\n    } else if (fullMatch.startsWith('(')) {\n      url = fullMatch.substring(1);\n    } else if (fullMatch.endsWith('/)')) {\n      url = fullMatch.substring(0, fullMatch.length - 1);\n    }\n\n    if (allSpoilered.has(url)) continue;\n\n    // Check if it's inside a code span/block\n    if (isInsideMarkdownCodeSpan(index, index + fullMatch.length, codeSpanRanges)) {\n      continue;\n    }\n\n    if (url.startsWith(MATRIX_TO_BASE)) continue;\n\n    finalList.add(url);\n  }\n\n  return Array.from(finalList);\n};\n","import type { InlineToken } from './model';\nimport { BlockType } from './types';\nimport {\n  parseMatrixToRoom,\n  parseMatrixToRoomEvent,\n  parseMatrixToUser,\n  isMatrixToMentionHref,\n} from '$plugins/matrix-to';\nimport type { MentionResolveOptions } from './utils';\nimport {\n  getMarkdownCodeSpanRanges,\n  isInsideMarkdownCodeSpan,\n  resolveRoomMentionHighlight,\n  resolveRoomMentionName,\n  resolveUserMentionHighlight,\n  resolveUserMentionName,\n} from './utils';\n\n/** [label](href) or [label](<href>) */\nconst MD_INLINE_LINK = /\\[((?:[^\\]\\]\\\\]|\\\\.)*)\\]\\((?:<([^>]+)>|([^)]+))\\)/g;\n\nexport const mentionFromMatrixToMarkdownLink = (\n  label: string,\n  href: string,\n  options?: MentionResolveOptions\n): InlineToken | null => {\n  const trimmedHref = href.trim();\n  if (!isMatrixToMentionHref(trimmedHref)) return null;\n\n  const userId = parseMatrixToUser(trimmedHref);\n  if (userId) {\n    return {\n      type: BlockType.Mention,\n      id: userId,\n      name: resolveUserMentionName(userId, options),\n      highlight: resolveUserMentionHighlight(userId, options),\n      children: [{ text: '' }],\n    };\n  }\n\n  const roomEvent = parseMatrixToRoomEvent(trimmedHref);\n  if (roomEvent) {\n    return {\n      type: BlockType.Mention,\n      id: roomEvent.roomIdOrAlias,\n      name: resolveRoomMentionName(roomEvent.roomIdOrAlias, label, options),\n      highlight: resolveRoomMentionHighlight(roomEvent.roomIdOrAlias, options),\n      eventId: roomEvent.eventId,\n      viaServers: roomEvent.viaServers,\n      children: [{ text: '' }],\n    };\n  }\n\n  const room = parseMatrixToRoom(trimmedHref);\n  if (room) {\n    return {\n      type: BlockType.Mention,\n      id: room.roomIdOrAlias,\n      name: resolveRoomMentionName(room.roomIdOrAlias, label, options),\n      highlight: resolveRoomMentionHighlight(room.roomIdOrAlias, options),\n      viaServers: room.viaServers,\n      children: [{ text: '' }],\n    };\n  }\n\n  return null;\n};\n\nexport const expandMatrixMentionMarkdownInText = (\n  text: string,\n  options?: MentionResolveOptions\n): InlineToken[] => {\n  const codeSpanRanges = getMarkdownCodeSpanRanges(text);\n  const parts: InlineToken[] = [];\n  let last = 0;\n\n  MD_INLINE_LINK.lastIndex = 0;\n  let match: RegExpExecArray | null;\n  while ((match = MD_INLINE_LINK.exec(text)) !== null) {\n    const start = match.index;\n    const end = start + match[0].length;\n    if (isInsideMarkdownCodeSpan(start, end, codeSpanRanges)) continue;\n\n    const label = match[1] ?? '';\n    const href = (match[2] ?? match[3] ?? '').trim();\n\n    if (start > last) {\n      parts.push({ text: text.slice(last, start) });\n    }\n\n    const mention = mentionFromMatrixToMarkdownLink(label, href, options);\n    if (mention) {\n      parts.push(mention);\n    } else {\n      parts.push({ text: match[0] });\n    }\n    last = end;\n  }\n\n  if (last < text.length) {\n    parts.push({ text: text.slice(last) });\n  }\n\n  return parts.length > 0 ? parts : [{ text: '' }];\n};\n","import type { MentionResolveOptions } from './utils';\nimport {\n  MX_EMOTICON_MD_END,\n  MX_EMOTICON_MD_SEP,\n  MX_EMOTICON_MD_START,\n  validateMxcUrl,\n} from '$plugins/markdown/extensions/matrix-emoticon';\nimport { BlockType } from './types';\nimport type { EditorDocument, EditorParagraph } from './model';\nimport { expandMatrixMentionMarkdownInText } from './matrixMentionMarkdown';\n\n/** Matches placeholders emitted by htmlToMarkdown for &lt;img data-mx-emoticon&gt;. */\nconst MX_EMOTICON_MD_TOKEN = new RegExp(\n  `${MX_EMOTICON_MD_START}([^${MX_EMOTICON_MD_SEP}]+)${MX_EMOTICON_MD_SEP}([^${MX_EMOTICON_MD_END}]+)${MX_EMOTICON_MD_END}`,\n  'g'\n);\n\nfunction mergeAdjacentTextNodes(\n  children: EditorParagraph['children']\n): EditorParagraph['children'] {\n  const out: EditorParagraph['children'] = [];\n  for (const c of children) {\n    if ('type' in c) {\n      out.push(c);\n      continue;\n    }\n    const prev = out[out.length - 1];\n    if (prev && !('type' in prev)) {\n      prev.text += c.text;\n    } else {\n      out.push({ ...c });\n    }\n  }\n  return out.length > 0 ? out : [{ text: '' }];\n}\n\nfunction lineToParagraphChildren(\n  line: string,\n  mentionOptions?: MentionResolveOptions\n): EditorParagraph['children'] {\n  MX_EMOTICON_MD_TOKEN.lastIndex = 0;\n  const parts: EditorParagraph['children'] = [];\n  let last = 0;\n  let match: RegExpExecArray | null;\n  while ((match = MX_EMOTICON_MD_TOKEN.exec(line)) !== null) {\n    if (match.index > last) {\n      parts.push(\n        ...expandMatrixMentionMarkdownInText(line.slice(last, match.index), mentionOptions)\n      );\n    }\n    const [, src, shortcode] = match;\n    if (src && shortcode && validateMxcUrl(src)) {\n      parts.push({ type: BlockType.Emoticon, key: src, shortcode, children: [{ text: '' }] });\n    } else if (shortcode) {\n      parts.push({ text: `:${shortcode.replace(/^:|:$/g, '')}:` });\n    }\n    last = MX_EMOTICON_MD_TOKEN.lastIndex;\n  }\n  if (last < line.length) {\n    parts.push(...expandMatrixMentionMarkdownInText(line.slice(last), mentionOptions));\n  }\n  return mergeAdjacentTextNodes(parts);\n}\n\nexport const plainToEditorInput = (\n  text: string,\n  mentionOptions?: MentionResolveOptions\n): EditorDocument => {\n  const lines = text.split('\\n');\n  return lines.map((lineText) => ({\n    type: BlockType.Paragraph,\n    children: lineToParagraphChildren(lineText, mentionOptions),\n  }));\n};\n","import FocusTrap from 'focus-trap-react';\nimport type { RectCords } from 'folds';\nimport { Badge, Box, config, IconButton, Line, Menu, Scroll, Text, Tooltip, toRem } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { PopOut } from '$components/overlay-stack';\nimport type { MouseEventHandler, ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { stopPropagation } from '$utils/keyboard';\nimport { floatingToolbar } from '$styles/overrides/Composer.css';\nimport { BLOCK_PREFIXES, INLINE_MARKERS } from './keyboard';\nimport type { ShortcutId, ShortcutOverrides } from '../../keyboard/shortcuts';\nimport { formatShortcut, getShortcutBinding } from '../../keyboard/shortcuts';\nimport * as css from './Editor.css';\nimport type { ProseMirrorEditorController } from './prosemirrorController';\nimport {\n  CaretDown,\n  Code,\n  CodeBlock,\n  composerIcon,\n  EyeSlash,\n  sizedIcon,\n  ListBullets,\n  ListNumbers,\n  Quotes,\n  TextAa,\n  TextB,\n  TextHOne,\n  TextHThree,\n  TextHTwo,\n  TextItalic,\n  TextStrikethrough,\n  TextUnderline,\n  type PhosphorIcon,\n} from '$components/icons/phosphor';\n\nfunction BtnTooltip({ text, shortCode }: { text: string; shortCode?: string }) {\n  return (\n    <Tooltip style={{ padding: config.space.S300 }}>\n      <Box gap=\"200\" direction=\"Column\" alignItems=\"Center\">\n        <Text align=\"Center\">{text}</Text>\n        {shortCode && (\n          <Badge as=\"kbd\" radii=\"300\" size=\"500\">\n            <Text size=\"T200\" align=\"Center\">\n              {shortCode}\n            </Text>\n          </Badge>\n        )}\n      </Box>\n    </Tooltip>\n  );\n}\n\nconst shortcutLabel = (id: ShortcutId, overrides: ShortcutOverrides) =>\n  formatShortcut(getShortcutBinding(id, overrides));\n\ntype MarkdownInlineButtonProps = {\n  actions: MarkdownEditorActions;\n  marker: string;\n  icon: PhosphorIcon;\n  tooltip: ReactNode;\n};\n\nfunction MarkdownInlineButton({ actions, marker, icon, tooltip }: MarkdownInlineButtonProps) {\n  const handleClick = () => {\n    actions.applyInline(marker);\n    actions.focus();\n  };\n\n  return (\n    <TooltipProvider tooltip={tooltip} delay={500}>\n      {(triggerRef) => (\n        <IconButton\n          ref={triggerRef}\n          variant=\"SurfaceVariant\"\n          onClick={handleClick}\n          size=\"400\"\n          radii=\"300\"\n        >\n          {sizedIcon(icon, '200')}\n        </IconButton>\n      )}\n    </TooltipProvider>\n  );\n}\n\ntype MarkdownBlockButtonProps = {\n  actions: MarkdownEditorActions;\n  prefix: string;\n  icon: PhosphorIcon;\n  tooltip: ReactNode;\n};\n\nfunction MarkdownBlockButton({ actions, prefix, icon, tooltip }: MarkdownBlockButtonProps) {\n  const handleClick = () => {\n    actions.applyBlock(prefix);\n    actions.focus();\n  };\n\n  return (\n    <TooltipProvider tooltip={tooltip} delay={500}>\n      {(triggerRef) => (\n        <IconButton\n          ref={triggerRef}\n          variant=\"SurfaceVariant\"\n          onClick={handleClick}\n          size=\"400\"\n          radii=\"300\"\n        >\n          {sizedIcon(icon, '200')}\n        </IconButton>\n      )}\n    </TooltipProvider>\n  );\n}\n\nfunction MarkdownHeadingButton({ actions }: { actions: MarkdownEditorActions }) {\n  const [anchor, setAnchor] = useState<RectCords>();\n  const [shortcutOverrides] = useSetting(settingsAtom, 'shortcutOverrides');\n\n  const handleMenuSelect = (prefix: string) => {\n    setAnchor(undefined);\n    actions.applyBlock(prefix);\n    actions.focus();\n  };\n\n  const handleMenuOpen: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setAnchor(evt.currentTarget.getBoundingClientRect());\n  };\n\n  return (\n    <PopOut\n      anchor={anchor}\n      offset={5}\n      position=\"Top\"\n      content={\n        <FocusTrap\n          focusTrapOptions={{\n            initialFocus: false,\n            onDeactivate: () => setAnchor(undefined),\n            clickOutsideDeactivates: true,\n            isKeyForward: (evt: KeyboardEvent) =>\n              evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n            isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n            escapeDeactivates: stopPropagation,\n          }}\n        >\n          <Menu style={{ padding: config.space.S100 }}>\n            <Box gap=\"100\">\n              <TooltipProvider\n                tooltip={\n                  <BtnTooltip\n                    text=\"Heading 1\"\n                    shortCode={shortcutLabel('composer.heading1', shortcutOverrides)}\n                  />\n                }\n                delay={500}\n              >\n                {(triggerRef) => (\n                  <IconButton\n                    ref={triggerRef}\n                    onClick={() => handleMenuSelect('# ')}\n                    size=\"400\"\n                    radii=\"300\"\n                  >\n                    {sizedIcon(TextHOne, '200')}\n                  </IconButton>\n                )}\n              </TooltipProvider>\n              <TooltipProvider\n                tooltip={\n                  <BtnTooltip\n                    text=\"Heading 2\"\n                    shortCode={shortcutLabel('composer.heading2', shortcutOverrides)}\n                  />\n                }\n                delay={500}\n              >\n                {(triggerRef) => (\n                  <IconButton\n                    ref={triggerRef}\n                    onClick={() => handleMenuSelect('## ')}\n                    size=\"400\"\n                    radii=\"300\"\n                  >\n                    {sizedIcon(TextHTwo, '200')}\n                  </IconButton>\n                )}\n              </TooltipProvider>\n              <TooltipProvider\n                tooltip={\n                  <BtnTooltip\n                    text=\"Heading 3\"\n                    shortCode={shortcutLabel('composer.heading3', shortcutOverrides)}\n                  />\n                }\n                delay={500}\n              >\n                {(triggerRef) => (\n                  <IconButton\n                    ref={triggerRef}\n                    onClick={() => handleMenuSelect('### ')}\n                    size=\"400\"\n                    radii=\"300\"\n                  >\n                    {sizedIcon(TextHThree, '200')}\n                  </IconButton>\n                )}\n              </TooltipProvider>\n            </Box>\n          </Menu>\n        </FocusTrap>\n      }\n    >\n      <IconButton\n        style={{ width: 'unset' }}\n        variant=\"SurfaceVariant\"\n        onClick={handleMenuOpen}\n        size=\"400\"\n        radii=\"300\"\n        aria-haspopup=\"menu\"\n        aria-expanded={!!anchor}\n      >\n        {sizedIcon(TextHOne, '200')}\n        {sizedIcon(CaretDown, '200')}\n      </IconButton>\n    </PopOut>\n  );\n}\n\ntype MarkdownEditorActions = {\n  applyBlock: (prefix: string) => void;\n  applyInline: (marker: string) => void;\n  focus: () => void;\n};\n\nfunction MarkdownToolbar({ actions }: { actions: MarkdownEditorActions }) {\n  const [shortcutOverrides] = useSetting(settingsAtom, 'shortcutOverrides');\n\n  return (\n    <Box className={`${css.EditorToolbarBase} ${floatingToolbar}`}>\n      <Scroll direction=\"Horizontal\" size=\"0\" data-gestures=\"scroll\">\n        <Box className={css.EditorToolbar} alignItems=\"Center\" gap=\"300\">\n          <Box shrink=\"No\" gap=\"100\">\n            <MarkdownInlineButton\n              actions={actions}\n              marker={INLINE_MARKERS['composer.bold']}\n              icon={TextB}\n              tooltip={\n                <BtnTooltip\n                  text=\"Bold\"\n                  shortCode={shortcutLabel('composer.bold', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownInlineButton\n              actions={actions}\n              marker={INLINE_MARKERS['composer.italic']}\n              icon={TextItalic}\n              tooltip={\n                <BtnTooltip\n                  text=\"Italic\"\n                  shortCode={shortcutLabel('composer.italic', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownInlineButton\n              actions={actions}\n              marker={INLINE_MARKERS['composer.underline']}\n              icon={TextUnderline}\n              tooltip={\n                <BtnTooltip\n                  text=\"Underline\"\n                  shortCode={shortcutLabel('composer.underline', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownInlineButton\n              actions={actions}\n              marker={INLINE_MARKERS['composer.strikethrough']}\n              icon={TextStrikethrough}\n              tooltip={\n                <BtnTooltip\n                  text=\"Strike Through\"\n                  shortCode={shortcutLabel('composer.strikethrough', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownInlineButton\n              actions={actions}\n              marker={INLINE_MARKERS['composer.inlineCode']}\n              icon={Code}\n              tooltip={\n                <BtnTooltip\n                  text=\"Inline Code\"\n                  shortCode={shortcutLabel('composer.inlineCode', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownInlineButton\n              actions={actions}\n              marker={INLINE_MARKERS['composer.spoiler']}\n              icon={EyeSlash}\n              tooltip={\n                <BtnTooltip\n                  text=\"Spoiler\"\n                  shortCode={shortcutLabel('composer.spoiler', shortcutOverrides)}\n                />\n              }\n            />\n          </Box>\n          <Line variant=\"SurfaceVariant\" direction=\"Vertical\" style={{ height: toRem(12) }} />\n          <Box shrink=\"No\" gap=\"100\">\n            <MarkdownBlockButton\n              actions={actions}\n              prefix={BLOCK_PREFIXES['composer.blockquote']}\n              icon={Quotes}\n              tooltip={\n                <BtnTooltip\n                  text=\"Block Quote\"\n                  shortCode={shortcutLabel('composer.blockquote', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownBlockButton\n              actions={actions}\n              prefix={BLOCK_PREFIXES['composer.codeBlock']}\n              icon={CodeBlock}\n              tooltip={\n                <BtnTooltip\n                  text=\"Block Code\"\n                  shortCode={shortcutLabel('composer.codeBlock', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownBlockButton\n              actions={actions}\n              prefix={BLOCK_PREFIXES['composer.orderedList']}\n              icon={ListNumbers}\n              tooltip={\n                <BtnTooltip\n                  text=\"Ordered List\"\n                  shortCode={shortcutLabel('composer.orderedList', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownBlockButton\n              actions={actions}\n              prefix={BLOCK_PREFIXES['composer.unorderedList']}\n              icon={ListBullets}\n              tooltip={\n                <BtnTooltip\n                  text=\"Unordered List\"\n                  shortCode={shortcutLabel('composer.unorderedList', shortcutOverrides)}\n                />\n              }\n            />\n            <MarkdownHeadingButton actions={actions} />\n          </Box>\n        </Box>\n      </Scroll>\n    </Box>\n  );\n}\n\nexport type MarkdownFormattingToolbarToggleVariant = 'SurfaceVariant' | 'Background';\n\nexport function MarkdownFormattingToolbarToggle({\n  variant,\n}: {\n  variant: MarkdownFormattingToolbarToggleVariant;\n}) {\n  const [editorToolbar] = useSetting(settingsAtom, 'editorToolbar');\n  const [composerToolbarOpen, setComposerToolbarOpen] = useSetting(\n    settingsAtom,\n    'composerToolbarOpen'\n  );\n\n  useEffect(() => {\n    if (!editorToolbar) setComposerToolbarOpen(false);\n  }, [editorToolbar, setComposerToolbarOpen]);\n\n  if (!editorToolbar) return null;\n\n  return (\n    <IconButton\n      variant={variant}\n      size=\"300\"\n      radii=\"300\"\n      title={composerToolbarOpen ? 'Hide formatting toolbar' : 'Show formatting toolbar'}\n      aria-pressed={composerToolbarOpen}\n      aria-label={composerToolbarOpen ? 'Hide formatting toolbar' : 'Show formatting toolbar'}\n      onClick={() => setComposerToolbarOpen(!composerToolbarOpen)}\n    >\n      {composerToolbarOpen ? composerIcon(TextUnderline) : composerIcon(TextAa)}\n    </IconButton>\n  );\n}\n\nexport function MarkdownFormattingToolbarBottom({\n  controller,\n}: {\n  controller: ProseMirrorEditorController;\n}) {\n  const [editorToolbar] = useSetting(settingsAtom, 'editorToolbar');\n  const [composerToolbarOpen] = useSetting(settingsAtom, 'composerToolbarOpen');\n\n  if (!editorToolbar || !composerToolbarOpen) return null;\n\n  return (\n    <div>\n      <Line variant=\"SurfaceVariant\" size=\"300\" />\n      <MarkdownToolbar\n        actions={{\n          applyInline: (marker) => controller.applyMarkdownInline(marker),\n          applyBlock: (prefix) => controller.applyMarkdownBlockPrefix(prefix),\n          focus: () => controller.focus(),\n        }}\n      />\n    </div>\n  );\n}\n","import type { KeyboardEventHandler, ReactNode } from 'react';\nimport { Scroll } from 'folds';\nimport type { EditorDocument } from './model';\nimport { ProseMirrorEditable } from './ProseMirrorEditable';\nimport type { ProseMirrorEditorController } from './prosemirrorController';\nimport * as css from './Editor.css';\n\ntype ProseMirrorEditorSurfaceProps = {\n  bottom?: ReactNode;\n  controller: ProseMirrorEditorController;\n  maxHeight?: string;\n  onDocumentChange?: (document: EditorDocument) => void;\n  onKeyDown?: KeyboardEventHandler;\n  onKeyUp?: KeyboardEventHandler;\n  placeholder: string;\n  variant?: 'Surface' | 'SurfaceVariant' | 'Background';\n};\n\n/** Shared visual host for ProseMirror editors; feature code only sees the controller seam. */\nexport function ProseMirrorEditorSurface({\n  bottom,\n  controller,\n  maxHeight = '50dvh',\n  onDocumentChange,\n  onKeyDown,\n  onKeyUp,\n  placeholder,\n  variant = 'SurfaceVariant',\n}: ProseMirrorEditorSurfaceProps) {\n  return (\n    <div className={css.Editor}>\n      <Scroll\n        className={css.EditorTextareaScroll}\n        variant={variant}\n        style={{ maxHeight }}\n        size=\"300\"\n        visibility=\"Always\"\n        hideTrack\n      >\n        <ProseMirrorEditable\n          controller={controller}\n          editorClassName={css.EditorTextarea}\n          placeholder={placeholder}\n          onDocumentChange={onDocumentChange}\n          onKeyDown={onKeyDown}\n          onKeyUp={onKeyUp}\n        />\n      </Scroll>\n      {bottom}\n    </div>\n  );\n}\n","import { lazy, Suspense, type CSSProperties, type ReactNode, useMemo } from 'react';\nimport { ArrowSquareOut, sizedIcon, Link } from '$components/icons/phosphor';\nimport { Box, Chip, Text, toRem } from 'folds';\nimport { type IContent, type IPreviewUrlResponse, type MatrixClient } from '$types/matrix-sdk';\nimport { isJumboEmojiText } from '$utils/emojiDetection';\nimport { trimReplyFromBody } from '$utils/room/display';\nimport type {\n  IAudioContent,\n  IAudioInfo,\n  IEncryptedFile,\n  IFileContent,\n  IFileInfo,\n  IImageContent,\n  IImageInfo,\n  IThumbnailContent,\n  IVideoContent,\n  IVideoInfo,\n} from '$types/matrix/common';\nimport * as prefix from '$unstable/prefixes';\nimport { FALLBACK_MIMETYPE, getBlobSafeMimeType } from '$utils/mimeTypes';\nimport { parseGeoUri, scaleYDimension } from '$utils/common';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport {\n  stripPerMessageProfileFormattedBody,\n  stripPerMessageProfilePlainBody,\n  type PerMessageProfileBeeperFormat,\n} from '$hooks/usePerMessageProfile';\nimport { Attachment, AttachmentBox, AttachmentContent, AttachmentHeader } from './attachment';\nimport { FileHeader, FileDownloadButton } from './FileHeader';\nimport {\n  MessageBadEncryptedContent,\n  MessageBrokenContent,\n  MessageDeletedContent,\n  MessageEditedContent,\n  MessageUnsupportedContent,\n  ReactionDeletedContent,\n} from './content';\nimport { MessageTextBody } from './layout';\nimport { unwrapForwardedContent } from './modals/MessageForward';\nimport { LINKINPUTREGEX } from '$components/editor';\nimport { MATRIX_TO_BASE } from '$plugins/matrix-to';\nimport { copyToClipboard } from '$utils/dom';\nimport { getAttachmentFilename } from '$utils/download';\nimport * as css from './MsgTypeRenderers.css';\nimport { isNumber } from 'matrix-js-sdk/lib/utils';\n\nconst LocationMap = lazy(() =>\n  import('./LocationMap').then((module) => ({ default: module.LocationMap }))\n);\n\nexport interface BundleContent extends IPreviewUrlResponse {\n  matched_url: string;\n}\n\nexport function MBadEncrypted() {\n  return (\n    <Text>\n      <MessageBadEncryptedContent />\n    </Text>\n  );\n}\n\ntype RedactedContentProps = {\n  reason?: string;\n};\nexport function RedactedContent({ reason }: RedactedContentProps) {\n  return (\n    <Text>\n      <MessageDeletedContent reason={reason} />\n    </Text>\n  );\n}\n\ntype RedactedReactionContentProps = {\n  reactionKey?: string;\n  shortcode?: string;\n  mx?: MatrixClient;\n  useAuthentication?: boolean;\n  reason?: string;\n};\nexport function RedactedReactionContent({\n  reactionKey,\n  shortcode,\n  mx,\n  useAuthentication,\n  reason,\n}: RedactedReactionContentProps) {\n  return (\n    <Text>\n      <ReactionDeletedContent\n        reactionKey={reactionKey}\n        shortcode={shortcode}\n        mx={mx}\n        useAuthentication={useAuthentication}\n        reason={reason}\n        hideIcon\n      />\n    </Text>\n  );\n}\n\ntype BrokenContentProps = {\n  body?: string;\n};\n\nexport function UnsupportedContent({ body }: BrokenContentProps) {\n  return (\n    <Text>\n      <MessageUnsupportedContent body={body} />\n    </Text>\n  );\n}\n\nfunction BrokenContent({ body }: BrokenContentProps) {\n  return (\n    <Text>\n      <MessageBrokenContent body={body} />\n    </Text>\n  );\n}\n\nexport function getIncomingMediaMxcUrl(url: unknown): string | undefined {\n  return typeof url === 'string' && url.startsWith('mxc://') ? url : undefined;\n}\n\ntype RenderBodyProps = {\n  body: string;\n  customBody?: string;\n};\ntype MTextProps = {\n  edited?: boolean;\n  content: Record<string, unknown>;\n  renderBody: (props: RenderBodyProps) => ReactNode;\n  renderUrlsPreview?: (urls: string[]) => ReactNode;\n  renderBundledPreviews?: (bundles: IPreviewUrlResponse[]) => ReactNode;\n  style?: CSSProperties;\n};\n\nconst getUrlsFromContent = (\n  content: Record<string, unknown>,\n  renderUrlsPreview?: (urls: string[]) => ReactNode\n): { urls?: string[]; bundleContent?: BundleContent[] } => {\n  const body = typeof content.body === 'string' ? content.body : '';\n  const customBody =\n    typeof content.formatted_body === 'string' ? content.formatted_body : undefined;\n  const trimmedBody = trimReplyFromBody(body);\n\n  const urlsMatch = trimmedBody.match(LINKINPUTREGEX);\n  let urls = urlsMatch ? [...new Set(urlsMatch)] : undefined;\n  urls = urls?.map(\n    (url) =>\n      (url.startsWith('(') && url.endsWith(')') && url.substring(1, url.length - 1)) ||\n      (url.startsWith('(') && url.substring(1)) ||\n      (url.endsWith('/)') && url.substring(0, url.length - 1)) ||\n      url\n  );\n\n  if (urls && customBody) {\n    // Filter out URLs that only appear inside <code> or <pre> tags in the formatted body\n    const safeHtml = customBody\n      .replace(/<pre[^>]*>.*?<\\/pre>/gs, '')\n      .replace(/<code[^>]*>.*?<\\/code>/gs, '');\n    const safeText = safeHtml.replace(/<[^a][^>]*>/g, '');\n    const safeUrlsMatch = safeText.match(LINKINPUTREGEX);\n    let safeUrls = safeUrlsMatch ? [...new Set(safeUrlsMatch)] : [];\n    safeUrls = safeUrls.map(\n      (url) =>\n        (url.startsWith('(') && url.endsWith(')') && url.substring(1, url.length - 1)) ||\n        (url.startsWith('(') && url.substring(1)) ||\n        (url.endsWith('/)') && url.substring(0, url.length - 1)) ||\n        url\n    );\n    const safeUrlsSet = new Set(safeUrls);\n    urls = urls.filter((url) => safeUrlsSet.has(url) && !url.startsWith(MATRIX_TO_BASE));\n  }\n\n  let bundleContent = content[\n    prefix.MATRIX_UNSTABLE_EMBEDDED_LINK_PREVIEW_PROPERTY_NAME\n  ] as BundleContent[];\n  try {\n    bundleContent = bundleContent?.filter((bundle) => !!urls?.includes(bundle.matched_url));\n    if (renderUrlsPreview && bundleContent)\n      urls = bundleContent.map((bundle) => bundle.matched_url);\n  } catch {\n    urls = [];\n  }\n\n  return { urls, bundleContent };\n};\n\nexport function MText({\n  edited,\n  content,\n  renderBody,\n  renderUrlsPreview,\n  renderBundledPreviews,\n  style,\n}: MTextProps) {\n  const [jumboEmojiSize] = useSetting(settingsAtom, 'jumboEmojiSize');\n\n  const body = typeof content.body === 'string' ? content.body : '';\n  const customBody =\n    typeof content.formatted_body === 'string' ? content.formatted_body : undefined;\n  const cleanedMessage = useMemo(\n    () => customBody?.replace(/<li>(<p><\\/p>)?<\\/li>/gi, '<li><br></li>'),\n    [customBody]\n  );\n\n  const trimmedBody = useMemo(() => trimReplyFromBody(body), [body]);\n  const unwrappedForwardedContent = useMemo(\n    () => unwrapForwardedContent(cleanedMessage ?? customBody ?? body),\n    [cleanedMessage, customBody, body]\n  );\n\n  const isForwarded = useMemo(() => {\n    const forwardMeta = content[prefix.MATRIX_SABLE_UNSTABLE_MESSAGE_FORWARD_META_PROPERTY_NAME];\n    return typeof forwardMeta === 'object';\n  }, [content]);\n\n  /**\n   * For the unwrapping of per-message profile fallbacks, we look for <strong> tags with the data-mx-profile-fallback attribute\n   */\n  const hadPerMessageProfileFallback = useMemo(\n    () => cleanedMessage?.match(/<strong[^>]*data-mx-profile-fallback[^>]*>(.*?):\\s*<\\/strong>/i),\n    [cleanedMessage]\n  );\n  // the html body, with PMP fallback removed\n  const unwrappedPmpCustomBody = useMemo(\n    () => (cleanedMessage ? stripPerMessageProfileFormattedBody(cleanedMessage) : undefined),\n    [cleanedMessage]\n  );\n  // the plain body, with PMP fallback removed\n  const unwrappedPmpBody = useMemo(\n    () =>\n      hadPerMessageProfileFallback\n        ? stripPerMessageProfilePlainBody(trimmedBody ?? '')\n        : trimmedBody,\n    [trimmedBody, hadPerMessageProfileFallback]\n  );\n\n  const isJumbo = useMemo(() => {\n    if (!trimmedBody || trimmedBody.length >= 500) return false;\n    if (\n      (unwrappedPmpCustomBody ?? cleanedMessage ?? customBody)?.match(\n        /^(<img[^>]*data-mx-emoticon[^>]*\\/>){1,20}$/i\n      )\n    )\n      return true;\n    if (!isJumboEmojiText(unwrappedPmpBody)) return false;\n\n    // we need to strip the plainbody fallback because it contains a colon\n    if (unwrappedPmpBody.includes(':')) {\n      const newCustomBody = hadPerMessageProfileFallback ? unwrappedPmpCustomBody : customBody;\n\n      const hasImage = newCustomBody && /<img[^>]*>/i.test(newCustomBody);\n      if (!hasImage) return false;\n    }\n\n    return true;\n  }, [\n    unwrappedPmpCustomBody,\n    cleanedMessage,\n    trimmedBody,\n    customBody,\n    unwrappedPmpBody,\n    hadPerMessageProfileFallback,\n  ]);\n\n  const { urls, bundleContent } = getUrlsFromContent(content, renderUrlsPreview);\n\n  if (\n    (\n      content[\n        prefix.MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME\n      ] as PerMessageProfileBeeperFormat\n    )?.has_fallback\n  ) {\n    // unwrap per-message profile fallback if present\n    return (\n      <>\n        <MessageTextBody\n          preWrap={typeof cleanedMessage !== 'string'}\n          style={style}\n          jumboEmoji={isJumbo ? jumboEmojiSize : 'none'}\n        >\n          {renderBody({\n            body: trimmedBody,\n            customBody: unwrappedPmpCustomBody,\n          })}\n          {edited && <MessageEditedContent />}\n        </MessageTextBody>\n        {(renderUrlsPreview && urls && urls.length > 0 && renderUrlsPreview(urls)) ||\n          (renderBundledPreviews &&\n            bundleContent &&\n            bundleContent.length > 0 &&\n            renderBundledPreviews(bundleContent as IPreviewUrlResponse[]))}\n      </>\n    );\n  }\n\n  if (isForwarded && unwrappedForwardedContent) {\n    return (\n      <MessageTextBody preWrap={typeof unwrappedForwardedContent !== 'string'} style={style}>\n        {renderBody({\n          body: trimmedBody,\n          customBody: unwrappedForwardedContent,\n        })}\n        {edited && <MessageEditedContent />}\n        {(renderUrlsPreview && urls && urls.length > 0 && renderUrlsPreview(urls)) ||\n          (renderBundledPreviews &&\n            bundleContent &&\n            bundleContent.length > 0 &&\n            renderBundledPreviews(bundleContent as IPreviewUrlResponse[]))}\n      </MessageTextBody>\n    );\n  }\n\n  return (\n    <>\n      <MessageTextBody\n        preWrap={typeof cleanedMessage !== 'string'}\n        jumboEmoji={isJumbo ? jumboEmojiSize : 'none'}\n        style={style}\n      >\n        {renderBody({\n          body: trimmedBody,\n          customBody: typeof cleanedMessage === 'string' ? cleanedMessage : undefined,\n        })}\n        {edited && <MessageEditedContent />}\n      </MessageTextBody>\n      {(renderUrlsPreview && urls && urls.length > 0 && renderUrlsPreview(urls)) ||\n        (renderBundledPreviews &&\n          bundleContent &&\n          bundleContent.length > 0 &&\n          renderBundledPreviews(bundleContent as IPreviewUrlResponse[]))}\n    </>\n  );\n}\n\ntype MEmoteProps = {\n  displayName: string;\n  edited?: boolean;\n  content: Record<string, unknown>;\n  renderBody: (props: RenderBodyProps) => ReactNode;\n  renderUrlsPreview?: (urls: string[]) => ReactNode;\n  renderBundledPreviews?: (bundles: IPreviewUrlResponse[]) => ReactNode;\n};\nexport function MEmote({\n  displayName,\n  edited,\n  content,\n  renderBody,\n  renderUrlsPreview,\n  renderBundledPreviews,\n}: MEmoteProps) {\n  const { body, formatted_body: customBody } = content;\n  const cleanedMessage = useMemo(\n    () =>\n      typeof customBody === 'string'\n        ? customBody.replace(/<li>(<p><\\/p>)?<\\/li>/gi, '<li><br></li>')\n        : undefined,\n    [customBody]\n  );\n  const [jumboEmojiSize] = useSetting(settingsAtom, 'jumboEmojiSize');\n\n  if (typeof body !== 'string') {\n    return <BrokenContent body={typeof customBody === 'string' ? customBody : undefined} />;\n  }\n  const trimmedBody = trimReplyFromBody(body);\n  const isJumbo = isJumboEmojiText(trimmedBody);\n\n  const { urls, bundleContent } = getUrlsFromContent(content, renderUrlsPreview);\n\n  return (\n    <>\n      <MessageTextBody\n        emote\n        preWrap={typeof cleanedMessage !== 'string'}\n        jumboEmoji={isJumbo ? jumboEmojiSize : 'none'}\n      >\n        <b>{`${displayName} `}</b>\n        {renderBody({\n          body: trimmedBody,\n          customBody: typeof cleanedMessage === 'string' ? cleanedMessage : undefined,\n        })}\n        {edited && <MessageEditedContent />}\n      </MessageTextBody>\n      {(renderUrlsPreview && urls && urls.length > 0 && renderUrlsPreview(urls)) ||\n        (renderBundledPreviews &&\n          bundleContent &&\n          bundleContent.length > 0 &&\n          renderBundledPreviews(bundleContent as IPreviewUrlResponse[]))}\n    </>\n  );\n}\n\ntype MNoticeProps = {\n  edited?: boolean;\n  content: Record<string, unknown>;\n  renderBody: (props: RenderBodyProps) => ReactNode;\n  renderUrlsPreview?: (urls: string[]) => ReactNode;\n  renderBundledPreviews?: (bundles: IPreviewUrlResponse[]) => ReactNode;\n};\nexport function MNotice({\n  edited,\n  content,\n  renderBody,\n  renderUrlsPreview,\n  renderBundledPreviews,\n}: MNoticeProps) {\n  const { body, formatted_body: customBody } = content;\n  const cleanedMessage = useMemo(\n    () =>\n      typeof customBody === 'string'\n        ? customBody.replace(/<li>(<p><\\/p>)?<\\/li>/gi, '<li><br></li>')\n        : undefined,\n    [customBody]\n  );\n  const [jumboEmojiSize] = useSetting(settingsAtom, 'jumboEmojiSize');\n\n  if (typeof body !== 'string') {\n    return <BrokenContent body={typeof customBody === 'string' ? customBody : undefined} />;\n  }\n  const trimmedBody = trimReplyFromBody(body);\n  const isJumbo = isJumboEmojiText(trimmedBody);\n\n  const { urls, bundleContent } = getUrlsFromContent(content, renderUrlsPreview);\n\n  return (\n    <>\n      <MessageTextBody\n        notice\n        preWrap={typeof cleanedMessage !== 'string'}\n        jumboEmoji={isJumbo ? jumboEmojiSize : 'none'}\n      >\n        {renderBody({\n          body: trimmedBody,\n          customBody: typeof cleanedMessage === 'string' ? cleanedMessage : undefined,\n        })}\n        {edited && <MessageEditedContent />}\n      </MessageTextBody>\n      {(renderUrlsPreview && urls && urls.length > 0 && renderUrlsPreview(urls)) ||\n        (renderBundledPreviews &&\n          bundleContent &&\n          bundleContent.length > 0 &&\n          renderBundledPreviews(bundleContent as IPreviewUrlResponse[]))}\n    </>\n  );\n}\n\nexport type RenderImageContentProps = {\n  body: string;\n  filename?: string;\n  info?: IImageInfo & IThumbnailContent;\n  mimeType?: string;\n  url: string;\n  encInfo?: IEncryptedFile;\n  markedAsSpoiler?: boolean;\n  spoilerReason?: string;\n};\ntype MImageProps = {\n  content: IImageContent;\n  renderImageContent: (props: RenderImageContentProps) => ReactNode;\n  outlined?: boolean;\n  fitParent?: boolean;\n};\nexport function MImage({ content, renderImageContent, outlined, fitParent }: MImageProps) {\n  const imgInfo = content?.info;\n  const mxcUrl = getIncomingMediaMxcUrl(content.file?.url ?? content.url);\n  if (!mxcUrl) {\n    return <BrokenContent body={content.body ?? content.filename} />;\n  }\n  const MIN_SIZE = 150;\n  const MAX_SIZE = 400;\n  const filename = getAttachmentFilename(content.filename, content.body, 'Image');\n\n  // lazy approach to make sure that both horizontal and vertical images fit\n  // checks whether the image has width and height and if it does it sets a width that matches the aspect ratio\n  const hasIntrinsicSize =\n    isNumber(imgInfo?.w) && imgInfo.w > 0 && isNumber(imgInfo?.h) && imgInfo.h > 0;\n  const portraitWidth =\n    !imgInfo || !imgInfo.w || !imgInfo.h || imgInfo.w > imgInfo.h\n      ? undefined\n      : toRem((MAX_SIZE * imgInfo.w) / imgInfo.h);\n\n  return (\n    <Attachment\n      style={{\n        flexShrink: 0,\n        width: fitParent ? '100%' : portraitWidth,\n        height: fitParent ? '100%' : undefined,\n        // A bare MAX_SIZE cap would drop the container's own `max-width: 100%`.\n        maxWidth: fitParent ? undefined : `min(100%, ${toRem(MAX_SIZE)})`,\n        maxHeight: fitParent ? undefined : toRem(MAX_SIZE),\n        // ImageContent's aspect-ratio box already reserves the space when the\n        // dimensions are known; a square floor on top of it letterboxes wide images.\n        minWidth: fitParent || hasIntrinsicSize ? undefined : MIN_SIZE,\n        minHeight: fitParent || hasIntrinsicSize ? undefined : MIN_SIZE,\n      }}\n      outlined={outlined}\n    >\n      <AttachmentBox\n        style={{\n          flexGrow: 1,\n          width: fitParent ? '100%' : portraitWidth,\n          height: fitParent ? '100%' : undefined,\n        }}\n      >\n        {renderImageContent({\n          body: content.body || content.filename || 'Image',\n          filename,\n          info: imgInfo,\n          mimeType: imgInfo?.mimetype,\n          url: mxcUrl,\n          encInfo: content.file,\n          markedAsSpoiler: content[prefix.MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME],\n          spoilerReason: content[prefix.MATRIX_UNSTABLE_SPOILER_REASON_PROPERTY_NAME],\n        })}\n      </AttachmentBox>\n    </Attachment>\n  );\n}\n\ntype RenderVideoContentProps = {\n  body: string;\n  info: IVideoInfo & IThumbnailContent;\n  mimeType: string;\n  url: string;\n  encInfo?: IEncryptedFile;\n  markedAsSpoiler?: boolean;\n  spoilerReason?: string;\n};\ntype MVideoProps = {\n  content: IVideoContent;\n  renderAsFile: () => ReactNode;\n  renderVideoContent: (props: RenderVideoContentProps) => ReactNode;\n  outlined?: boolean;\n  fitParent?: boolean;\n};\nexport function MVideo({ content, renderAsFile, renderVideoContent, outlined }: MVideoProps) {\n  const videoInfo = content?.info;\n  const mxcUrl = getIncomingMediaMxcUrl(content.file?.url ?? content.url);\n  const safeMimeType = getBlobSafeMimeType(videoInfo?.mimetype ?? '');\n\n  if (!mxcUrl) {\n    return <BrokenContent body={content.body ?? content.filename} />;\n  }\n  if (!videoInfo || !safeMimeType.startsWith('video')) return renderAsFile();\n\n  const displayWidth = Math.min(videoInfo.w || 400, 400);\n  const height = Math.min(scaleYDimension(videoInfo.w || 400, 400, videoInfo.h || 400), 400);\n\n  const filename = getAttachmentFilename(content.filename, content.body, 'Video');\n\n  return (\n    <Attachment\n      style={{\n        flexGrow: 1,\n        flexShrink: 0,\n        width: toRem(displayWidth),\n        height: 'auto',\n      }}\n      outlined={outlined}\n    >\n      <AttachmentHeader>\n        <FileHeader\n          body={filename}\n          mimeType={safeMimeType}\n          after={\n            <FileDownloadButton\n              filename={filename}\n              url={mxcUrl}\n              mimeType={safeMimeType}\n              encInfo={content.file}\n            />\n          }\n        />\n      </AttachmentHeader>\n      <AttachmentBox\n        style={{\n          flexGrow: 1,\n          width: toRem(displayWidth),\n          height: toRem(height < 48 ? 48 : height),\n        }}\n      >\n        {renderVideoContent({\n          body: content.body || 'Video',\n          info: videoInfo,\n          mimeType: safeMimeType,\n          url: mxcUrl,\n          encInfo: content.file,\n          markedAsSpoiler: content[prefix.MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME],\n          spoilerReason: content[prefix.MATRIX_UNSTABLE_SPOILER_REASON_PROPERTY_NAME],\n        })}\n      </AttachmentBox>\n    </Attachment>\n  );\n}\n\nconst getAudioDurationMs = (content: IAudioContent, info?: IAudioInfo): number | undefined => {\n  const fromInfo = info?.duration;\n  if (typeof fromInfo === 'number' && Number.isFinite(fromInfo) && fromInfo > 0) {\n    return fromInfo;\n  }\n  const voiceV2 = (content as Record<string, unknown>)['org.matrix.msc3245.voice.v2'];\n  if (voiceV2 && typeof voiceV2 === 'object') {\n    const seconds = (voiceV2 as { duration?: number }).duration;\n    if (typeof seconds === 'number' && Number.isFinite(seconds) && seconds > 0) {\n      return seconds * 1000;\n    }\n  }\n  const msc1767Audio = (content as Record<string, unknown>)['org.matrix.msc1767.audio'];\n  if (msc1767Audio && typeof msc1767Audio === 'object') {\n    const ms = (msc1767Audio as { duration?: number }).duration;\n    if (typeof ms === 'number' && Number.isFinite(ms) && ms > 0) {\n      return ms;\n    }\n  }\n  return undefined;\n};\n\ntype RenderAudioContentProps = {\n  info: IAudioInfo;\n  mimeType: string;\n  url: string;\n  encInfo?: IEncryptedFile;\n};\ntype MAudioProps = {\n  content: IAudioContent;\n  renderAsFile: () => ReactNode;\n  renderAudioContent: (props: RenderAudioContentProps) => ReactNode;\n  outlined?: boolean;\n  fitParent?: boolean;\n};\nexport function MAudio({\n  content,\n  renderAsFile,\n  renderAudioContent,\n  outlined,\n  fitParent,\n}: MAudioProps) {\n  const audioInfo = content?.info;\n  const mxcUrl = getIncomingMediaMxcUrl(content.file?.url ?? content.url);\n  const safeMimeType = getBlobSafeMimeType(audioInfo?.mimetype ?? '');\n\n  if (!mxcUrl) {\n    return <BrokenContent body={content.body ?? content.filename} />;\n  }\n  if (!audioInfo || !safeMimeType.startsWith('audio')) return renderAsFile();\n\n  const filename = getAttachmentFilename(content.filename, content.body, 'Audio');\n  const durationMs = getAudioDurationMs(content, audioInfo);\n  const resolvedInfo =\n    durationMs !== undefined ? { ...audioInfo, duration: durationMs } : audioInfo;\n  return (\n    <Attachment\n      outlined={outlined}\n      style={{ width: fitParent ? '100%' : toRem(400), height: fitParent ? '100%' : 'auto' }}\n    >\n      <AttachmentHeader>\n        <FileHeader\n          body={filename}\n          mimeType={safeMimeType}\n          after={\n            <FileDownloadButton\n              filename={filename}\n              url={mxcUrl}\n              mimeType={safeMimeType}\n              encInfo={content.file}\n            />\n          }\n        />\n      </AttachmentHeader>\n      <AttachmentBox>\n        <AttachmentContent>\n          {renderAudioContent({\n            info: resolvedInfo,\n            mimeType: safeMimeType,\n            url: mxcUrl,\n            encInfo: content.file,\n          })}\n        </AttachmentContent>\n      </AttachmentBox>\n    </Attachment>\n  );\n}\n\ntype RenderFileContentProps = {\n  fileName: string;\n  info: IFileInfo & IThumbnailContent;\n  mimeType: string;\n  url: string;\n  encInfo?: IEncryptedFile;\n};\ntype MFileProps = {\n  content: IFileContent;\n  renderFileContent: (props: RenderFileContentProps) => ReactNode;\n  outlined?: boolean;\n  fitParent?: boolean;\n};\nexport function MFile({ content, renderFileContent, outlined }: MFileProps) {\n  const fileInfo = content?.info;\n  const mxcUrl = getIncomingMediaMxcUrl(content.file?.url ?? content.url);\n\n  if (!mxcUrl) {\n    return <BrokenContent body={content.body ?? content.filename} />;\n  }\n\n  const filename = getAttachmentFilename(content.filename, content.body, 'File');\n\n  return (\n    <Attachment outlined={outlined} style={{ width: toRem(400), height: 'auto' }}>\n      <AttachmentHeader>\n        <FileHeader body={filename} mimeType={fileInfo?.mimetype ?? FALLBACK_MIMETYPE} />\n      </AttachmentHeader>\n      <AttachmentBox>\n        <AttachmentContent>\n          {renderFileContent({\n            fileName: filename,\n            info: fileInfo ?? {},\n            mimeType: fileInfo?.mimetype ?? FALLBACK_MIMETYPE,\n            url: mxcUrl,\n            encInfo: content.file,\n          })}\n        </AttachmentContent>\n      </AttachmentBox>\n    </Attachment>\n  );\n}\n\ntype MLocationProps = {\n  content: IContent;\n  showMaps?: boolean;\n};\nexport function MLocation({ content, showMaps }: MLocationProps) {\n  const geoUri = content.geo_uri;\n  if (typeof geoUri !== 'string') {\n    return <BrokenContent body={typeof content.body === 'string' ? content.body : undefined} />;\n  }\n  const location = parseGeoUri(geoUri);\n  if (!location) return <BrokenContent />;\n  const isValid = isNumber(Number(location.latitude)) && isNumber(Number(location.longitude));\n  const coordinates: [number, number] = [Number(location.latitude), Number(location.longitude)];\n\n  return (\n    <Box\n      direction=\"Column\"\n      className={css.LocationRendererBody}\n      onPointerMove={(evt) => evt.stopPropagation()}\n    >\n      <Box\n        direction=\"Row\"\n        alignItems=\"Center\"\n        gap=\"100\"\n        justifyContent=\"SpaceBetween\"\n        className={css.LocationRendererHeader}\n      >\n        <Chip\n          size=\"400\"\n          variant=\"SurfaceVariant\"\n          onClick={() => copyToClipboard(`${location.latitude}, ${location.longitude}`)}\n          before={sizedIcon(Link, '50')}\n          className={css.LocationCoordsChip}\n        >\n          <Text size=\"T400\">{`${location.latitude}, ${location.longitude}`}</Text>\n        </Chip>\n\n        <Chip\n          as=\"a\"\n          size=\"400\"\n          href={\n            isValid\n              ? `https://www.openstreetmap.org/?mlat=${location.latitude}&mlon=${location.longitude}#map=16/${location.latitude}/${location.longitude}`\n              : undefined\n          }\n          target=\"_blank\"\n          rel=\"noreferrer noopener\"\n          variant=\"Primary\"\n          radii=\"Pill\"\n          className={css.LocationExternalChip}\n          before={sizedIcon(ArrowSquareOut, '50')}\n          aria-disabled={!isValid}\n        >\n          <Text size=\"B300\">Open Location</Text>\n        </Chip>\n      </Box>\n      {showMaps && isValid && (\n        <Suspense fallback={null}>\n          <LocationMap coordinates={coordinates} className={css.LocationMapContainer} />\n        </Suspense>\n      )}\n    </Box>\n  );\n}\n\ntype MStickerProps = {\n  content: IImageContent;\n  renderImageContent: (props: RenderImageContentProps) => ReactNode;\n};\nexport function MSticker({ content, renderImageContent }: MStickerProps) {\n  const imgInfo = content?.info;\n  const mxcUrl = getIncomingMediaMxcUrl(content.file?.url ?? content.url);\n  if (!mxcUrl) {\n    return <MessageBrokenContent body={content.body} />;\n  }\n  const height = scaleYDimension(imgInfo?.w || 152, 152, imgInfo?.h || 152);\n\n  return (\n    <AttachmentBox\n      style={{\n        height: toRem(height < 48 ? 48 : height),\n        width: toRem(152),\n      }}\n    >\n      {renderImageContent({\n        body: content.body || 'Sticker',\n        info: imgInfo,\n        mimeType: imgInfo?.mimetype,\n        url: mxcUrl,\n        encInfo: content.file,\n      })}\n    </AttachmentBox>\n  );\n}\n","import type { JSX, KeyboardEventHandler, MouseEventHandler } from 'react';\nimport { useEffect, useState } from 'react';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport parse from 'html-react-parser';\nimport Linkify from 'linkify-react';\nimport type { Opts } from 'linkifyjs';\nimport { find } from 'linkifyjs';\nimport type { RectCords } from 'folds';\nimport { Text, Tooltip, toRem } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { PopOut } from '$components/overlay-stack';\nimport { sanitizeCustomHtml } from '$utils/sanitize';\nimport { highlightText, scaleSystemEmoji } from '$plugins/react-custom-html-parser';\nimport { useRoomAbbreviationsContext } from '$hooks/useRoomAbbreviations';\nimport { isMobileOrTablet } from '$utils/platform';\nimport type { TextSegment } from '$utils/abbreviations';\nimport { splitByAbbreviations } from '$utils/abbreviations';\nimport { MessageEmptyContent } from './content';\n\nfunction getRenderedBodyText(text: string, highlightRegex?: RegExp): (string | JSX.Element)[] {\n  const emojiScaledText = scaleSystemEmoji(text);\n\n  return highlightRegex ? highlightText(highlightRegex, emojiScaledText) : emojiScaledText;\n}\n\nfunction renderLinkifiedBodyText(\n  text: string,\n  linkifyOpts: Opts,\n  highlightRegex: RegExp | undefined,\n  key?: string\n): JSX.Element {\n  return (\n    <Linkify key={key} options={linkifyOpts}>\n      {getRenderedBodyText(text, highlightRegex)}\n    </Linkify>\n  );\n}\n\ntype RenderTextFn = (text: string, key?: string) => JSX.Element;\n\nfunction splitBodyTextByAbbreviations(\n  text: string,\n  abbrMap: Map<string, string>,\n  linkifyOpts?: Opts\n): TextSegment[] {\n  if (abbrMap.size === 0) return [{ id: 'txt-0', text }];\n\n  const linkMatches = find(text, linkifyOpts).filter((match) => match.isLink);\n  if (linkMatches.length === 0) return splitByAbbreviations(text, abbrMap);\n\n  const segments: Array<Omit<TextSegment, 'id'>> = [];\n  let lastIndex = 0;\n\n  linkMatches.forEach(({ start, end }) => {\n    if (start > lastIndex) {\n      splitByAbbreviations(text.slice(lastIndex, start), abbrMap).forEach(\n        ({ text: segmentText, termKey }) => {\n          segments.push({ text: segmentText, termKey });\n        }\n      );\n    }\n\n    segments.push({ text: text.slice(start, end) });\n    lastIndex = end;\n  });\n\n  if (lastIndex < text.length) {\n    splitByAbbreviations(text.slice(lastIndex), abbrMap).forEach(\n      ({ text: segmentText, termKey }) => {\n        segments.push({ text: segmentText, termKey });\n      }\n    );\n  }\n\n  if (segments.length === 0) {\n    return [{ id: 'txt-0', text }];\n  }\n  const result = segments as TextSegment[];\n  for (let i = 0; i < result.length; i += 1) {\n    result[i]!.id = `txt-${i}`;\n  }\n  return result;\n}\n\ntype AbbreviationTermProps = {\n  text: string;\n  definition: string;\n};\nfunction AbbreviationTerm({ text, definition }: AbbreviationTermProps) {\n  const [anchor, setAnchor] = useState<RectCords | undefined>();\n\n  const toggleAnchor = (target: HTMLElement) => {\n    setAnchor((prev) => (prev ? undefined : target.getBoundingClientRect()));\n  };\n\n  const handleClick: MouseEventHandler<HTMLElement> = (e) => {\n    if (!window.getSelection()?.isCollapsed) return;\n    e.stopPropagation();\n    toggleAnchor(e.currentTarget);\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLElement> = (e) => {\n    if (e.key !== 'Enter' && e.key !== ' ') return;\n    e.preventDefault();\n    e.stopPropagation();\n    toggleAnchor(e.currentTarget);\n  };\n\n  // On mobile, tapping an abbreviation pins the tooltip open.\n  // Tapping anywhere else (outside the abbr) dismisses it.\n  useEffect(() => {\n    if (!anchor) return undefined;\n    const dismiss = () => setAnchor(undefined);\n    document.addEventListener('click', dismiss, { once: true });\n    return () => document.removeEventListener('click', dismiss);\n  }, [anchor]);\n\n  const tooltipContent = (\n    <Tooltip style={{ maxWidth: toRem(250) }}>\n      <Text size=\"T200\">{definition}</Text>\n    </Tooltip>\n  );\n\n  return (\n    <>\n      {anchor && (\n        <PopOut anchor={anchor} position=\"Top\" align=\"Center\" content={tooltipContent}>\n          {null}\n        </PopOut>\n      )}\n      <TooltipProvider position=\"Top\" tooltip={tooltipContent}>\n        {(triggerRef) => (\n          <button\n            type=\"button\"\n            data-no-button-motion\n            ref={triggerRef as React.Ref<HTMLButtonElement>}\n            onClick={handleClick}\n            onKeyDown={handleKeyDown}\n            style={{\n              textDecoration: 'underline dotted',\n              cursor: 'help',\n              background: 'none',\n              border: 'none',\n              padding: 0,\n              font: 'inherit',\n              color: 'inherit',\n              userSelect: isMobileOrTablet() ? 'none' : 'text',\n            }}\n          >\n            {text}\n          </button>\n        )}\n      </TooltipProvider>\n    </>\n  );\n}\n\n/**\n * Builds a `replaceTextNode` callback for use with {@link getReactCustomHtmlParser}.\n * Returns `undefined` when there are no abbreviations to apply (avoids creating\n * extra closures in the common case).\n */\nexport function buildAbbrReplaceTextNode(\n  abbrMap: Map<string, string>,\n  linkifyOpts?: Opts\n): ((text: string, renderText: RenderTextFn) => JSX.Element | undefined) | undefined {\n  if (abbrMap.size === 0) return undefined;\n  return function replaceTextNode(text: string, renderText: RenderTextFn) {\n    const segments = splitBodyTextByAbbreviations(text, abbrMap, linkifyOpts);\n    if (!segments.some((s) => s.termKey !== undefined)) return undefined;\n    return (\n      <>\n        {segments.map((seg) =>\n          seg.termKey !== undefined ? (\n            <AbbreviationTerm\n              key={seg.id}\n              text={seg.text}\n              definition={abbrMap.get(seg.termKey) ?? ''}\n            />\n          ) : (\n            renderText(seg.text, seg.id)\n          )\n        )}\n      </>\n    );\n  };\n}\n\ntype RenderBodyProps = {\n  body: string;\n  customBody?: string;\n  highlightRegex?: RegExp;\n  htmlReactParserOptions: HTMLReactParserOptions;\n  linkifyOpts: Opts;\n};\nexport function RenderBody({\n  body,\n  customBody,\n  highlightRegex,\n  htmlReactParserOptions,\n  linkifyOpts,\n}: Readonly<RenderBodyProps>) {\n  const abbrMap = useRoomAbbreviationsContext();\n\n  if (customBody) {\n    return parse(sanitizeCustomHtml(customBody), htmlReactParserOptions);\n  }\n  if (body === '') return <MessageEmptyContent />;\n\n  if (abbrMap.size > 0) {\n    const segments = splitBodyTextByAbbreviations(body, abbrMap, linkifyOpts);\n    if (segments.some((s) => s.termKey !== undefined)) {\n      return (\n        <>\n          {segments.map((seg) => {\n            if (seg.termKey !== undefined) {\n              const definition = abbrMap.get(seg.termKey) ?? '';\n              return <AbbreviationTerm key={seg.id} text={seg.text} definition={definition} />;\n            }\n            return renderLinkifiedBodyText(seg.text, linkifyOpts, highlightRegex, seg.id);\n          })}\n        </>\n      );\n    }\n  }\n\n  return renderLinkifiedBodyText(body, linkifyOpts, highlightRegex);\n}\n","import { type ReactNode } from 'react';\nimport { Box } from 'folds';\nimport { MsgType, type IContent } from 'matrix-js-sdk';\nimport type {\n  IGalleryContent,\n  IGalleryImageItem,\n  IGalleryItem,\n  IGalleryVideoItem,\n} from '$types/matrix/common';\nimport * as css from './MGallery.css';\n\nfunction galleryItemToContent(item: IGalleryItem): IContent {\n  const { itemtype, ...rest } = item;\n  return { ...rest, msgtype: itemtype } as IContent;\n}\n\ntype MGalleryProps = {\n  content: IGalleryContent;\n  renderItem: (content: IContent, index: number) => ReactNode;\n};\n\ntype PartitionedMediaItem = {\n  items: (IGalleryImageItem | IGalleryVideoItem)[];\n  type: 'ThreeByThree' | 'TwoByTwo' | 'OneByOne' | 'ThreeItems';\n};\n\nexport function MGallery({ content, renderItem }: MGalleryProps) {\n  const items = Array.isArray(content.itemtypes) ? content.itemtypes : [];\n\n  let mediaItems = items.filter(\n    (item) => item.itemtype == MsgType.Video || item.itemtype == MsgType.Image\n  );\n  const columnItems = items.filter(\n    (item) => item.itemtype == MsgType.File || item.itemtype == MsgType.Audio\n  );\n\n  let partitionedMediaItems: PartitionedMediaItem[] = [];\n  while (mediaItems.length > 0) {\n    if (mediaItems.length >= 9) {\n      partitionedMediaItems.unshift({\n        items: mediaItems.slice(-9),\n        type: 'ThreeByThree',\n      });\n      mediaItems = mediaItems.slice(0, mediaItems.length - 9);\n      continue;\n    }\n    if (mediaItems.length >= 6) {\n      partitionedMediaItems.unshift({\n        items: mediaItems.slice(-6),\n        type: 'ThreeByThree',\n      });\n      mediaItems = mediaItems.slice(0, mediaItems.length - 6);\n      continue;\n    }\n    if (mediaItems.length >= 4) {\n      partitionedMediaItems.unshift({\n        items: mediaItems.slice(-4),\n        type: 'TwoByTwo',\n      });\n      mediaItems = mediaItems.slice(0, mediaItems.length - 4);\n      continue;\n    }\n    if (mediaItems.length > 3) {\n      partitionedMediaItems.unshift({\n        items: mediaItems.slice(-3),\n        type: 'ThreeByThree',\n      });\n      mediaItems = mediaItems.slice(0, mediaItems.length - 3);\n      continue;\n    }\n    if (mediaItems.length == 3) {\n      partitionedMediaItems.unshift({\n        items: mediaItems.slice(-3),\n        type: 'ThreeItems',\n      });\n      mediaItems = mediaItems.slice(0, mediaItems.length - 3);\n      continue;\n    }\n    if (mediaItems.length >= 2) {\n      partitionedMediaItems.unshift({\n        items: mediaItems.slice(-2),\n        type: 'TwoByTwo',\n      });\n      mediaItems = mediaItems.slice(0, mediaItems.length - 2);\n      continue;\n    }\n    if (mediaItems.length >= 1) {\n      partitionedMediaItems.unshift({\n        items: mediaItems.slice(-1),\n        type: 'OneByOne',\n      });\n      mediaItems = mediaItems.slice(0, mediaItems.length - 1);\n      continue;\n    }\n  }\n  return (\n    <Box display=\"Flex\" direction=\"Column\" gap=\"400\">\n      {partitionedMediaItems.length > 0 && (\n        <Box direction=\"Column\" gap=\"200\">\n          {partitionedMediaItems.map((item) => (\n            <div\n              key={`${item.type}-${item.items[0]?.url ?? item.items[0]?.file?.url}`}\n              className={css.GalleryImageGrid({\n                type: item.type,\n              })}\n            >\n              {item.items.map((mediaItem, index) => (\n                <div key={mediaItem.url ?? mediaItem.file?.url} className={css.GalleryItem()}>\n                  {renderItem(galleryItemToContent(mediaItem), index)}\n                </div>\n              ))}\n            </div>\n          ))}\n        </Box>\n      )}\n      {columnItems.length > 0 && (\n        <Box alignItems=\"Start\" gap=\"200\" direction=\"Column\">\n          {columnItems.map((item, index) => (\n            <div key={item.url ?? item.file?.url ?? index}>\n              {renderItem(galleryItemToContent(item), index)}\n            </div>\n          ))}\n        </Box>\n      )}\n    </Box>\n  );\n}\n","import type { VirtualItem } from '@tanstack/react-virtual';\nimport { as } from 'folds';\nimport classNames from 'classnames';\nimport * as css from './style.css';\n\ntype VirtualTileProps = {\n  virtualItem: VirtualItem;\n};\nexport const VirtualTile = as<'div', VirtualTileProps>(\n  ({ className, virtualItem, style, ...props }, ref) => (\n    <div\n      className={classNames(css.VirtualTile, className)}\n      style={{ top: virtualItem.start, ...style }}\n      data-index={virtualItem.index}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { useElementSizeObserver } from './useElementSizeObserver';\n\ninterface Vector2 {\n  x: number;\n  y: number;\n}\n\ntype FittedSwipeOptions = {\n  onDismiss?: () => void;\n  onPrevious?: () => void;\n  onNext?: () => void;\n};\n\n// calculate pointer position relative to the image center\n//\n// use container rect & manually apply transforms as if we get two+ events quickly,\n// the second one might use an outdated image rect (before new transforms are applied)\nfunction getCursorOffsetFromImageCenter(\n  event: React.MouseEvent,\n  containerRect: DOMRect,\n  pan: Vector2\n): Vector2 {\n  return {\n    x: containerRect.width / 2 - (event.clientX - containerRect.x - pan.x),\n    y: containerRect.height / 2 - (event.clientY - containerRect.y - pan.y),\n  };\n}\n\nexport const useImageGestures = (\n  active: boolean,\n  step = 0.2,\n  min = 0.1,\n  max = 500,\n  fittedSwipeOptions?: FittedSwipeOptions\n) => {\n  const [transforms, setTransforms] = useState({\n    zoom: 1,\n    pan: { x: 0, y: 0 },\n  });\n  const [cursor, setCursor] = useState<'grab' | 'grabbing' | 'initial'>(\n    active ? 'grab' : 'initial'\n  );\n  const [shouldResizeWithWindow, setShouldResizeWithWindowState] = useState(true);\n  const shouldResizeWithWindowRef = useRef(true);\n  const [fitRatio, setFitRatio] = useState(1);\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const imageRef = useRef<HTMLImageElement | HTMLCanvasElement | null>(null);\n\n  const setShouldResizeWithWindow = useCallback((next: boolean) => {\n    shouldResizeWithWindowRef.current = next;\n    setShouldResizeWithWindowState(next);\n  }, []);\n\n  const enableResizeWithWindow = useCallback(\n    () => setShouldResizeWithWindow(true),\n    [setShouldResizeWithWindow]\n  );\n  const disableResizeWithWindow = useCallback(\n    () => setShouldResizeWithWindow(false),\n    [setShouldResizeWithWindow]\n  );\n\n  const activePointers = useRef(new Map<number, Vector2>());\n  const pendingPan = useRef({ x: 0, y: 0 });\n  const gestureFrame = useRef(0);\n  const pinchRef = useRef<\n    | {\n        startDist: number;\n        startZoom: number;\n        startPan: Vector2;\n        startCenter: Vector2;\n        origin: Vector2;\n      }\n    | undefined\n  >(undefined);\n  const didPinchRef = useRef(false);\n  const transformsRef = useRef(transforms);\n  transformsRef.current = transforms;\n  const lastTapRef = useRef(0);\n  const fittedSwipeRef = useRef<\n    | {\n        startX: number;\n        startY: number;\n        direction?: 'horizontal' | 'vertical';\n      }\n    | undefined\n  >(undefined);\n  const fittedSwipeOptionsRef = useRef(fittedSwipeOptions);\n  fittedSwipeOptionsRef.current = fittedSwipeOptions;\n\n  const prepareForTransform = useCallback(() => {\n    const img = imageRef.current;\n    if (img) {\n      img.style.transition = '';\n    }\n  }, []);\n\n  const updateZoom = useCallback((next: number | ((prev: number) => number)) => {\n    setTransforms((prev) => {\n      if (typeof next === 'function') {\n        return {\n          ...prev,\n          zoom: next(prev.zoom),\n        };\n      }\n      return {\n        ...prev,\n        zoom: next,\n      };\n    });\n  }, []);\n\n  const setZoom = useCallback(\n    (next: number | ((prev: number) => number)) => {\n      disableResizeWithWindow();\n      prepareForTransform();\n      updateZoom(next);\n    },\n    [disableResizeWithWindow, prepareForTransform, updateZoom]\n  );\n\n  const setZoomSilently = useCallback(\n    (next: number | ((prev: number) => number)) => {\n      prepareForTransform();\n      updateZoom(next);\n    },\n    [prepareForTransform, updateZoom]\n  );\n\n  const setPan = useCallback((next: Vector2 | ((prev: Vector2) => Vector2)) => {\n    setTransforms((prev) => {\n      if (typeof next === 'function') {\n        return {\n          ...prev,\n          pan: next(prev.pan),\n        };\n      }\n      return {\n        ...prev,\n        pan: next,\n      };\n    });\n  }, []);\n\n  const resetTransforms = useCallback(() => {\n    setTransforms({ zoom: 1, pan: { x: 0, y: 0 } });\n  }, []);\n\n  const beginPinch = useCallback(() => {\n    const points = Array.from(activePointers.current.values());\n    if (points.length < 2) return;\n    const [a, b] = points as [Vector2, Vector2];\n    const startDist = Math.hypot(a.x - b.x, a.y - b.y);\n    if (!startDist) return;\n\n    const rect = containerRef.current?.getBoundingClientRect();\n    const origin = rect\n      ? { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 }\n      : { x: 0, y: 0 };\n    pinchRef.current = {\n      startDist,\n      startZoom: transformsRef.current.zoom,\n      startPan: transformsRef.current.pan,\n      startCenter: { x: (a.x + b.x) / 2 - origin.x, y: (a.y + b.y) / 2 - origin.y },\n      origin,\n    };\n    pendingPan.current = { x: 0, y: 0 };\n    didPinchRef.current = true;\n  }, []);\n\n  const onPointerDown = useCallback(\n    (e: React.PointerEvent) => {\n      if (!active || (e.pointerType === 'mouse' && e.button === 2)) return;\n\n      disableResizeWithWindow();\n      prepareForTransform();\n      e.stopPropagation();\n      const target = e.target as HTMLElement;\n\n      // Double click zoom\n      const now = Date.now();\n      if (now - lastTapRef.current < 300 && now - lastTapRef.current > 30) {\n        // If two cursors are active, this isn't a double click.\n        if (activePointers.current.size === 2) {\n          beginPinch();\n          return;\n        }\n\n        const container = target.parentElement ?? target;\n        const containerRect = container.getBoundingClientRect();\n        setTransforms((prev) => {\n          if (Math.abs(prev.zoom - fitRatio) > 0.01 || prev.pan.x !== 0 || prev.pan.y !== 0) {\n            return { zoom: fitRatio, pan: { x: 0, y: 0 } };\n          }\n\n          // pan using the pointer's offset relative to the center of the image\n          const offset = getCursorOffsetFromImageCenter(e, containerRect, prev.pan);\n          return {\n            zoom: fitRatio * 2,\n            pan: {\n              x: offset.x + prev.pan.x,\n              y: offset.y + prev.pan.y,\n            },\n          };\n        });\n        lastTapRef.current = 0;\n        return;\n      }\n      lastTapRef.current = now;\n\n      activePointers.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n      if (activePointers.current.size === 1 && transforms.zoom <= fitRatio + 0.01) {\n        fittedSwipeRef.current = { startX: e.clientX, startY: e.clientY };\n      }\n      setCursor('grabbing');\n\n      // Initialize pinch zoom\n      if (activePointers.current.size === 2) {\n        fittedSwipeRef.current = undefined;\n        beginPinch();\n      }\n    },\n    [active, beginPinch, disableResizeWithWindow, fitRatio, prepareForTransform, transforms.zoom]\n  );\n\n  const applyTransforms = useCallback((next: { zoom: number; pan: Vector2 }) => {\n    // Gestures read back what they just wrote, so the ref leads the state.\n    transformsRef.current = next;\n    setTransforms(next);\n  }, []);\n\n  const flushGesture = useCallback(() => {\n    gestureFrame.current = 0;\n    const pinch = pinchRef.current;\n\n    if (pinch && activePointers.current.size >= 2) {\n      const [a, b] = Array.from(activePointers.current.values()) as [Vector2, Vector2];\n      const zoom = Math.min(\n        Math.max((Math.hypot(a.x - b.x, a.y - b.y) / pinch.startDist) * pinch.startZoom, min),\n        max\n      );\n      const factor = zoom / pinch.startZoom;\n      // Pins the midpoint between the fingers as the zoom changes.\n      const center = {\n        x: (a.x + b.x) / 2 - pinch.origin.x,\n        y: (a.y + b.y) / 2 - pinch.origin.y,\n      };\n      applyTransforms({\n        zoom,\n        pan: {\n          x: center.x - (pinch.startCenter.x - pinch.startPan.x) * factor,\n          y: center.y - (pinch.startCenter.y - pinch.startPan.y) * factor,\n        },\n      });\n      return;\n    }\n\n    const { x, y } = pendingPan.current;\n    pendingPan.current = { x: 0, y: 0 };\n    if (x === 0 && y === 0) return;\n    const prev = transformsRef.current;\n    applyTransforms({ zoom: prev.zoom, pan: { x: prev.pan.x + x, y: prev.pan.y + y } });\n  }, [min, max, applyTransforms]);\n\n  const scheduleGesture = useCallback(() => {\n    if (gestureFrame.current) return;\n    gestureFrame.current = requestAnimationFrame(flushGesture);\n  }, [flushGesture]);\n\n  const handlePointerMove = useCallback(\n    (e: PointerEvent) => {\n      const previous = activePointers.current.get(e.pointerId);\n      if (!previous) return;\n\n      activePointers.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n      // Off for the whole gesture, or every frame chases the css tween.\n      const img = imageRef.current;\n      if (img) img.style.transition = 'none';\n\n      // Pinch zoom\n      if (activePointers.current.size === 2) {\n        if (!pinchRef.current) beginPinch();\n        scheduleGesture();\n        return;\n      }\n\n      // Pan\n      if (activePointers.current.size === 1) {\n        const fittedSwipe = fittedSwipeRef.current;\n        if (fittedSwipe) {\n          const deltaX = e.clientX - fittedSwipe.startX;\n          const deltaY = e.clientY - fittedSwipe.startY;\n          if (!fittedSwipe.direction && Math.max(Math.abs(deltaX), Math.abs(deltaY)) > 12) {\n            fittedSwipe.direction = Math.abs(deltaX) > Math.abs(deltaY) ? 'horizontal' : 'vertical';\n          }\n          return;\n        }\n        // movementX/Y is unreliable for touch pointers.\n        pendingPan.current.x += e.clientX - previous.x;\n        pendingPan.current.y += e.clientY - previous.y;\n        scheduleGesture();\n      }\n    },\n    [beginPinch, scheduleGesture]\n  );\n\n  const releasePointer = useCallback(\n    (e: PointerEvent, cancelled: boolean) => {\n      const fittedSwipe = fittedSwipeRef.current;\n      if (fittedSwipe && !cancelled && activePointers.current.size === 1) {\n        const deltaX = e.clientX - fittedSwipe.startX;\n        const deltaY = e.clientY - fittedSwipe.startY;\n        const options = fittedSwipeOptionsRef.current;\n        if (fittedSwipe.direction === 'vertical' && deltaY > 96) options?.onDismiss?.();\n        if (fittedSwipe.direction === 'horizontal' && Math.abs(deltaX) > 72) {\n          if (deltaX > 0) options?.onPrevious?.();\n          else options?.onNext?.();\n        }\n      }\n      activePointers.current.delete(e.pointerId);\n      if (activePointers.current.size < 2) {\n        pinchRef.current = undefined;\n      }\n      if (activePointers.current.size === 0) {\n        fittedSwipeRef.current = undefined;\n        setCursor(active ? 'grab' : 'initial');\n        if (gestureFrame.current) {\n          cancelAnimationFrame(gestureFrame.current);\n          flushGesture();\n        }\n        const img = imageRef.current;\n        if (img) img.style.transition = '';\n\n        if (didPinchRef.current && transformsRef.current.zoom < fitRatio - 0.01) {\n          applyTransforms({ zoom: fitRatio, pan: { x: 0, y: 0 } });\n          enableResizeWithWindow();\n        }\n        didPinchRef.current = false;\n      }\n    },\n    [active, applyTransforms, enableResizeWithWindow, fitRatio, flushGesture]\n  );\n\n  const handlePointerUp = useCallback(\n    (e: PointerEvent) => releasePointer(e, false),\n    [releasePointer]\n  );\n  const handlePointerCancel = useCallback(\n    (e: PointerEvent) => releasePointer(e, true),\n    [releasePointer]\n  );\n\n  useEffect(() => {\n    window.addEventListener('pointermove', handlePointerMove);\n    window.addEventListener('pointerup', handlePointerUp);\n    window.addEventListener('pointercancel', handlePointerCancel);\n    return () => {\n      window.removeEventListener('pointermove', handlePointerMove);\n      window.removeEventListener('pointerup', handlePointerUp);\n      window.removeEventListener('pointercancel', handlePointerCancel);\n      if (gestureFrame.current) cancelAnimationFrame(gestureFrame.current);\n    };\n  }, [handlePointerMove, handlePointerUp, handlePointerCancel]);\n\n  // When the size of the container changes, zoom without a transition.\n  const handleContainerResize = useCallback(\n    (width: number, height: number) => {\n      const img = imageRef.current;\n      if (\n        !img || // Image not loaded\n        !shouldResizeWithWindowRef.current || // Resizing disabled\n        !(img instanceof HTMLCanvasElement ? img.width : img.naturalWidth) ||\n        !(img instanceof HTMLCanvasElement ? img.height : img.naturalHeight) // Invalid dimensions\n      ) {\n        return;\n      }\n      const imageHeight = img instanceof HTMLCanvasElement ? img.height : img.naturalHeight;\n      const imageWidth = img instanceof HTMLCanvasElement ? img.width : img.naturalWidth;\n      const heightRatio = height / imageHeight;\n      const widthRatio = width / imageWidth;\n      const fitZoom = Math.min(heightRatio, widthRatio, 1);\n\n      img.style.transition = 'none';\n      setFitRatio(fitZoom);\n      updateZoom(fitZoom);\n      setTimeout(() => {\n        img.style.transition = '';\n      }, 15);\n    },\n    [updateZoom]\n  );\n\n  useElementSizeObserver(() => containerRef.current, handleContainerResize);\n\n  const handleImageLoad = useCallback(\n    (event: React.SyntheticEvent<HTMLImageElement>) => {\n      const img = event.currentTarget;\n      imageRef.current = img;\n\n      const container = containerRef.current;\n      if (!container) return;\n\n      const imgHeight = img.naturalHeight;\n      const imgWidth = img.naturalWidth;\n      const containerHeight = container.clientHeight || 0;\n      const containerWidth = container.clientWidth || 0;\n\n      const heightRatio = containerHeight / imgHeight;\n      const widthRatio = containerWidth / imgWidth;\n      const fitZoom = Math.min(heightRatio, widthRatio, 1);\n\n      img.style.transition = 'none';\n      setFitRatio(fitZoom);\n      updateZoom(fitZoom);\n      setTimeout(() => {\n        img.style.transition = '';\n      }, 15);\n    },\n    [updateZoom]\n  );\n\n  const handleImageDimensions = useCallback(\n    (width: number, height: number) => {\n      const container = containerRef.current;\n      if (!container || width <= 0 || height <= 0) return;\n\n      const heightRatio = container.clientHeight / height;\n      const widthRatio = container.clientWidth / width;\n      const fitZoom = Math.min(heightRatio, widthRatio, 1);\n\n      setFitRatio(fitZoom);\n      updateZoom(fitZoom);\n    },\n    [updateZoom]\n  );\n\n  const zoomIn = useCallback(() => {\n    disableResizeWithWindow();\n    prepareForTransform();\n    setTransforms((prev) => {\n      const newZoom = Math.min(prev.zoom * (1 + step), max);\n      const zoomMult = newZoom / prev.zoom;\n\n      return {\n        zoom: newZoom,\n        pan: {\n          x: prev.pan.x * zoomMult,\n          y: prev.pan.y * zoomMult,\n        },\n      };\n    });\n  }, [step, max, disableResizeWithWindow, prepareForTransform]);\n\n  const zoomOut = useCallback(() => {\n    disableResizeWithWindow();\n    prepareForTransform();\n    setTransforms((prev) => {\n      const newZoom = Math.min(prev.zoom / (1 + step), max);\n      const zoomMult = newZoom / prev.zoom;\n\n      return {\n        zoom: newZoom,\n        pan: {\n          x: prev.pan.x * zoomMult,\n          y: prev.pan.y * zoomMult,\n        },\n      };\n    });\n  }, [step, max, disableResizeWithWindow, prepareForTransform]);\n\n  const handleWheel = useCallback(\n    (e: React.WheelEvent) => {\n      const { deltaY } = e;\n      // Mouse wheel scrolls only by integer delta values, therefore\n      // If deltaY is an integer, then it's a mouse wheel action\n      if (!Number.isInteger(deltaY)) {\n        // If it's not an integer, then it's a touchpad action, do nothing and let the browser handle the zooming\n        return;\n      }\n\n      disableResizeWithWindow();\n      prepareForTransform();\n\n      // the wheel handler is attached to the container element, not the image\n      const containerRect = e.currentTarget.getBoundingClientRect();\n\n      setTransforms((prev) => {\n        // calculate multiplicative zoom\n        const newZoom =\n          deltaY < 0\n            ? Math.min(prev.zoom * (1 + step), max)\n            : Math.max(prev.zoom / (1 + step), min);\n        const zoomMult = newZoom / prev.zoom - 1;\n\n        // calculate pointer position relative to the image center\n        //\n        // manually apply transforms as if we get two+ wheel events quickly,\n        // the second one might use an outdated image rect (before new transforms are applied)\n        const offset = getCursorOffsetFromImageCenter(e, containerRect, prev.pan);\n\n        return {\n          zoom: newZoom,\n          // magic math that happens to do what i want it to do\n          pan: {\n            x: offset.x * zoomMult + prev.pan.x,\n            y: offset.y * zoomMult + prev.pan.y,\n          },\n        };\n      });\n    },\n    [max, min, step, disableResizeWithWindow, prepareForTransform]\n  );\n\n  return {\n    transforms,\n    cursor,\n    onPointerDown,\n    handleWheel,\n    handleImageLoad,\n    handleImageDimensions,\n    setZoom,\n    setZoomSilently,\n    setPan,\n    setTransforms,\n    resetTransforms,\n    zoomIn,\n    zoomOut,\n    fitRatio,\n    imageRef,\n    containerRef,\n    shouldResizeWithWindow,\n    shouldResizeWithWindowRef,\n    enableResizeWithWindow,\n    disableResizeWithWindow,\n  };\n};\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport {\n  Box,\n  Chip,\n  Header,\n  IconButton,\n  Menu,\n  MenuItem,\n  Text,\n  as,\n  config,\n  toRem,\n  type RectCords,\n} from 'folds';\nimport {\n  ArrowLeft,\n  CaretLeft,\n  CaretRight,\n  ArrowsClockwise,\n  Download,\n  DownloadSimple,\n  DotsThree,\n  Image,\n  Minus,\n  Plus,\n  ShareNetwork,\n  menuIcon,\n  phosphorSizeRem,\n  sizedIcon,\n} from '$components/icons/phosphor';\nimport { Image as MediaImage } from '$components/media';\nimport { useImageGestures } from '$hooks/useImageGestures';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { useDismissOnBack } from '$utils/androidBack';\nimport { useSetting } from '$state/hooks/settings';\nimport { isPixelatedRendering, settingsAtom } from '$state/settings';\nimport { showToast } from '$state/toast';\nimport { downloadMedia } from '$utils/matrix';\nimport * as css from './ImageViewer.css';\nimport type { IImageInfo } from '$types/matrix/common';\nimport { CheckerboardIcon, CopyIcon, ImagesIcon } from '@phosphor-icons/react';\nimport { copyImageToClipboard } from '$utils/dom';\nimport {\n  getDownloadFilename,\n  reportDownloadFailure,\n  saveFileToDevice,\n  saveMediaToGallery,\n} from '$utils/download';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { isAndroidTauri, iosApp } from '$utils/platform';\nimport { setImmersiveMode } from '$generated/tauri/commands';\nimport { ScreenSize, useScreenSizeOptionally } from '$hooks/useScreenSize';\nimport { useMobileTapActivation } from '$hooks/useMobileTapActivation';\n\ntype ImageViewerProps = {\n  alt: string;\n  filename?: string;\n  src: string;\n  requestClose: () => void;\n  info?: IImageInfo;\n  sender?: string;\n  sentAt?: string;\n  onPrevious?: () => void;\n  onNext?: () => void;\n  getDownloadBlob?: () => Promise<Blob>;\n};\n\nexport const ImageViewer = as<'div', ImageViewerProps>(\n  (\n    {\n      className,\n      alt,\n      filename,\n      src,\n      requestClose,\n      info,\n      sender,\n      sentAt,\n      onPrevious,\n      onNext,\n      getDownloadBlob,\n      ...props\n    },\n    ref\n  ) => {\n    const zoomInputRef = useRef<HTMLInputElement>(null);\n    const [pixelatedImageRendering] = useSetting(settingsAtom, 'pixelatedImageRendering');\n    const isMobile = useScreenSizeOptionally() === ScreenSize.Mobile;\n\n    useEffect(() => {\n      if (!isMobile || !isAndroidTauri()) return undefined;\n      void setImmersiveMode({ enabled: true });\n      return () => {\n        void setImmersiveMode({ enabled: false });\n      };\n    }, [isMobile]);\n\n    // Android back closes the viewer instead of navigating away.\n    useDismissOnBack(requestClose);\n\n    const [isImageReady, setIsImageReady] = useState(false);\n    const [isEditingZoom, setIsEditingZoom] = useState(false);\n    const [zoomInput, setZoomInput] = useState('100');\n    const [isPixelated, setIsPixelated] = useState(\n      isPixelatedRendering(pixelatedImageRendering, info)\n    );\n\n    const {\n      transforms,\n      cursor,\n      handleWheel,\n      onPointerDown,\n      resetTransforms,\n      zoomIn,\n      zoomOut,\n      setZoom,\n      fitRatio,\n      imageRef,\n      containerRef,\n      handleImageLoad,\n      handleImageDimensions,\n      enableResizeWithWindow,\n    } = useImageGestures(\n      true,\n      0.2,\n      0.1,\n      500,\n      isMobile ? { onDismiss: requestClose, onPrevious, onNext } : undefined\n    );\n    useEffect(() => {\n      setIsImageReady(false);\n      enableResizeWithWindow();\n      setIsEditingZoom(false);\n      setZoomInput('100');\n      resetTransforms();\n      if (imageRef.current) {\n        imageRef.current = null;\n      }\n    }, [src, enableResizeWithWindow, imageRef, resetTransforms]);\n\n    // When not actively editing the zoom input, keep it in sync with the current zoom level.\n    useEffect(() => {\n      if (!isEditingZoom) {\n        setZoomInput(Math.round(transforms.zoom * 100).toString());\n      }\n    }, [isEditingZoom, transforms.zoom]);\n\n    // When entering zoom edit mode, focus the input automatically.\n    useEffect(() => {\n      if (isEditingZoom) {\n        zoomInputRef.current?.focus();\n      }\n    }, [isEditingZoom]);\n\n    const galleryMimeType = info?.mimetype?.toLowerCase();\n    // On iOS the primary action saves trusted images straight to Photos (PhotoKit).\n    const iosSaveToPhotos = iosApp() && (galleryMimeType?.startsWith('image/') ?? false);\n    const downloadFilename = getDownloadFilename(filename, alt, 'image');\n    const canSaveToGallery = isAndroidTauri() && (galleryMimeType?.startsWith('image/') ?? false);\n\n    const loadDownloadBlob = () => (getDownloadBlob ? getDownloadBlob() : downloadMedia(src));\n\n    const saveToGallery = async () => {\n      try {\n        await saveMediaToGallery(await loadDownloadBlob(), downloadFilename, galleryMimeType!);\n      } catch (error) {\n        reportDownloadFailure(error, 'fetch', downloadFilename, galleryMimeType);\n        const message = error instanceof Error ? error.message : 'unknown error';\n        showToast(`Failed to save to gallery: ${message}`);\n      }\n    };\n\n    const handleDownload = async () => {\n      if (iosSaveToPhotos) {\n        await saveToGallery();\n        return;\n      }\n      let fileContent: Blob;\n      try {\n        fileContent = await loadDownloadBlob();\n      } catch (error) {\n        reportDownloadFailure(error, 'fetch', downloadFilename, galleryMimeType);\n        const message = error instanceof Error ? error.message : 'unknown error';\n        showToast(`Failed to download file: ${message}`);\n        return;\n      }\n      await saveFileToDevice(\n        fileContent,\n        downloadFilename,\n        galleryMimeType || fileContent.type || undefined\n      );\n    };\n\n    const menu = useMenuAnchor<HTMLElement>();\n    const [mobileMenuAnchor, setMobileMenuAnchor] = useState<RectCords>();\n    const closeMenu = useCallback(() => {\n      menu.close();\n      setMobileMenuAnchor(undefined);\n    }, [menu]);\n\n    const closeActivation = useMobileTapActivation(isMobile, requestClose);\n    const menuActivation = useMobileTapActivation(isMobile, (evt) => {\n      if (isMobile) {\n        const rect = evt.currentTarget.getBoundingClientRect();\n        setMobileMenuAnchor({ x: rect.x, y: rect.y, width: rect.width, height: rect.height });\n      } else menu.openAt(evt.currentTarget);\n    });\n    const pixelatedActivation = useMobileTapActivation(isMobile, () =>\n      setIsPixelated(!isPixelated)\n    );\n    const originalSizeActivation = useMobileTapActivation(isMobile, () => setZoom(1));\n    const resetZoomActivation = useMobileTapActivation(isMobile, () => {\n      resetTransforms();\n      enableResizeWithWindow();\n      setZoom(fitRatio);\n    });\n    const zoomOutActivation = useMobileTapActivation(isMobile, zoomOut);\n    const zoomInputActivation = useMobileTapActivation(isMobile, () => {\n      setZoomInput(Math.round(transforms.zoom * 100).toString());\n      setIsEditingZoom(true);\n    });\n    const zoomInActivation = useMobileTapActivation(isMobile, zoomIn);\n    const downloadActivation = useMobileTapActivation(isMobile, () => {\n      void handleDownload();\n    });\n    const canShare = isMobile && typeof navigator.share === 'function';\n    const shareActivation = useMobileTapActivation(isMobile, () => {\n      void (async () => {\n        try {\n          const blob = await loadDownloadBlob();\n          const file = new File([blob], downloadFilename, {\n            type: blob.type || galleryMimeType || 'application/octet-stream',\n          });\n          if (navigator.canShare?.({ files: [file] })) {\n            await navigator.share({ files: [file], title: filename ?? alt });\n            return;\n          }\n          await navigator.share({ title: filename ?? alt, text: filename ?? alt });\n        } catch {}\n      })();\n    });\n    const copyImageActivation = useMobileTapActivation(isMobile, () => {\n      closeMenu();\n      void loadDownloadBlob().then(copyImageToClipboard);\n    });\n    const pixelatedMenuActivation = useMobileTapActivation(isMobile, () => {\n      setIsPixelated(!isPixelated);\n      closeMenu();\n    });\n    const originalSizeMenuActivation = useMobileTapActivation(isMobile, () => {\n      setZoom(1);\n      closeMenu();\n    });\n    const previousActivation = useMobileTapActivation(isMobile, () => onPrevious?.());\n    const nextActivation = useMobileTapActivation(isMobile, () => onNext?.());\n    const galleryActivation = useMobileTapActivation(isMobile, () => {\n      closeMenu();\n      void saveToGallery();\n    });\n    const resetZoomMenuActivation = useMobileTapActivation(isMobile, () => {\n      resetTransforms();\n      enableResizeWithWindow();\n      setZoom(fitRatio);\n      closeMenu();\n    });\n\n    const handleContextMenu: MouseEventHandler<HTMLDivElement> = (evt) => {\n      if (evt.altKey || !window.getSelection()?.isCollapsed) return;\n      const tag = (evt.target as HTMLElement).tagName;\n      if (typeof tag === 'string' && tag.toLowerCase() === 'a') return;\n      menu.triggerProps.onContextMenu(evt);\n    };\n\n    return (\n      <>\n        <ResponsiveMenu\n          anchor={isMobile ? mobileMenuAnchor : menu.anchor}\n          requestClose={closeMenu}\n          align=\"Start\"\n          offset={0}\n          mobile=\"inline-dialog\"\n          menu={\n            <Menu\n              variant=\"Surface\"\n              data-gestures=\"ignore\"\n              style={{\n                maxWidth: toRem(160),\n                width: isMobile ? 'auto' : '100vw',\n                paddingTop: isMobile ? '0.5rem' : undefined,\n              }}\n            >\n              <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                {isMobile && (\n                  <MenuItem\n                    as=\"button\"\n                    radii=\"300\"\n                    size=\"300\"\n                    after={\n                      <CheckerboardIcon\n                        size={phosphorSizeRem(20)}\n                        weight={isPixelated ? 'duotone' : 'fill'}\n                      />\n                    }\n                    {...pixelatedMenuActivation}\n                  >\n                    <Text size=\"T300\" style={{ flexGrow: 1 }}>\n                      {isPixelated ? 'Turn anti-aliasing on' : 'Turn pixelation on'}\n                    </Text>\n                  </MenuItem>\n                )}\n                {isMobile && fitRatio !== 1 && transforms.zoom !== 1 && (\n                  <MenuItem\n                    as=\"button\"\n                    radii=\"300\"\n                    size=\"300\"\n                    after={sizedIcon(Image, '200')}\n                    {...originalSizeMenuActivation}\n                  >\n                    <Text size=\"T300\" style={{ flexGrow: 1 }}>\n                      View original size\n                    </Text>\n                  </MenuItem>\n                )}\n                {isMobile &&\n                  (transforms.zoom !== fitRatio ||\n                    transforms.pan.x !== 0 ||\n                    transforms.pan.y !== 0) && (\n                    <MenuItem\n                      as=\"button\"\n                      radii=\"300\"\n                      size=\"300\"\n                      after={sizedIcon(ArrowsClockwise, '200')}\n                      {...resetZoomMenuActivation}\n                    >\n                      <Text size=\"T300\" style={{ flexGrow: 1 }}>\n                        Reset zoom\n                      </Text>\n                    </MenuItem>\n                  )}\n                <MenuItem\n                  as=\"button\"\n                  radii=\"300\"\n                  size=\"300\"\n                  after={menuIcon(CopyIcon)}\n                  {...copyImageActivation}\n                >\n                  <Text size=\"T300\" style={{ flexGrow: 1 }}>\n                    Copy image\n                  </Text>\n                </MenuItem>\n                {canSaveToGallery && (\n                  <MenuItem\n                    as=\"button\"\n                    radii=\"300\"\n                    size=\"300\"\n                    after={menuIcon(ImagesIcon)}\n                    {...galleryActivation}\n                  >\n                    <Text size=\"T300\" style={{ flexGrow: 1 }}>\n                      Save to Gallery\n                    </Text>\n                  </MenuItem>\n                )}\n              </Box>\n            </Menu>\n          }\n        />\n        <Box\n          className={classNames(css.ImageViewer, className)}\n          direction=\"Column\"\n          data-gestures=\"ignore\"\n          {...props}\n          ref={ref}\n        >\n          <Header\n            className={classNames(css.ImageViewerHeader, isMobile && css.ImageViewerMobileHeader)}\n            size=\"400\"\n            style={\n              isMobile\n                ? {\n                    position: 'absolute',\n                    top: 0,\n                    left: 0,\n                    right: 0,\n                    zIndex: 1,\n                    minHeight: `calc(64px + ${css.safeAreaTop})`,\n                    paddingTop: `calc(${config.space.S200} + ${css.safeAreaTop})`,\n                    paddingBottom: config.space.S200,\n                    paddingLeft: `calc(${config.space.S200} + ${css.safeAreaLeft})`,\n                    paddingRight: `calc(${config.space.S200} + ${css.safeAreaRight})`,\n                    borderBottomWidth: 0,\n                    color: '#fff',\n                    flexWrap: 'nowrap',\n                  }\n                : undefined\n            }\n          >\n            {isMobile ? (\n              <>\n                <Box grow=\"Yes\" basis=\"No\" alignItems=\"Center\" gap=\"100\">\n                  <IconButton\n                    className={css.ImageViewerMobileControl}\n                    fill=\"None\"\n                    aria-label=\"Close\"\n                    size=\"500\"\n                    radii=\"300\"\n                    style={{ flexShrink: 0 }}\n                    {...closeActivation}\n                  >\n                    {sizedIcon(ArrowLeft, '300')}\n                  </IconButton>\n                  <Box direction=\"Column\">\n                    <Text size=\"T300\" truncate style={{ fontWeight: config.fontWeight.W600 }}>\n                      {sender ?? alt}\n                    </Text>\n                    {sentAt && (\n                      <Text size=\"T200\" truncate style={{ opacity: 0.66 }}>\n                        {sentAt}\n                      </Text>\n                    )}\n                  </Box>\n                </Box>\n                <Box shrink=\"No\" alignItems=\"Center\">\n                  {canShare && (\n                    <IconButton\n                      className={css.ImageViewerMobileControl}\n                      fill=\"None\"\n                      aria-label=\"Share\"\n                      size=\"500\"\n                      radii=\"300\"\n                      {...shareActivation}\n                    >\n                      {sizedIcon(ShareNetwork, '300')}\n                    </IconButton>\n                  )}\n                  <IconButton\n                    className={css.ImageViewerMobileControl}\n                    fill=\"None\"\n                    aria-label={iosSaveToPhotos ? 'Save to Photos' : 'Download'}\n                    size=\"500\"\n                    radii=\"300\"\n                    {...downloadActivation}\n                  >\n                    {sizedIcon(DownloadSimple, '300')}\n                  </IconButton>\n                  <IconButton\n                    className={css.ImageViewerMobileControl}\n                    fill=\"None\"\n                    aria-label=\"More options\"\n                    size=\"500\"\n                    radii=\"300\"\n                    {...menuActivation}\n                  >\n                    {sizedIcon(DotsThree, '300')}\n                  </IconButton>\n                </Box>\n              </>\n            ) : (\n              <>\n                <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n                  <IconButton size=\"300\" radii=\"300\" {...closeActivation}>\n                    {sizedIcon(ArrowLeft, '200')}\n                  </IconButton>\n                  <Text size=\"T300\" truncate>\n                    {alt}\n                  </Text>\n                </Box>\n                <Box shrink=\"No\" alignItems=\"Center\" gap=\"200\">\n                  <IconButton\n                    variant=\"Surface\"\n                    size=\"300\"\n                    radii=\"Pill\"\n                    {...pixelatedActivation}\n                    aria-label=\"Toggle Pixelation\"\n                    title={`Turn ${isPixelated ? 'Anti-aliasing' : 'Pixelation'} on`}\n                  >\n                    <CheckerboardIcon\n                      size={phosphorSizeRem(20)}\n                      weight={isPixelated ? 'duotone' : 'fill'}\n                    />\n                  </IconButton>\n                  <IconButton\n                    variant=\"Surface\"\n                    style={{\n                      // Only show when the image isn't already larger than the container\n                      // and isn't already at 100% zoom\n                      // (Otherwise, the Reset Zoom button does the same thing)\n                      display: fitRatio !== 1 && transforms.zoom !== 1 ? 'flex' : 'none',\n                    }}\n                    size=\"300\"\n                    radii=\"Pill\"\n                    {...originalSizeActivation}\n                    aria-label=\"View Original Size\"\n                    title=\"View Original Size\"\n                  >\n                    {sizedIcon(Image, '200')}\n                  </IconButton>\n                  <IconButton\n                    variant=\"Surface\"\n                    style={{\n                      // Only show when the image has had any transforms applied (zoom or pan)\n                      display:\n                        transforms.zoom !== fitRatio ||\n                        transforms.pan.x !== 0 ||\n                        transforms.pan.y !== 0\n                          ? 'flex'\n                          : 'none',\n                    }}\n                    size=\"300\"\n                    radii=\"Pill\"\n                    {...resetZoomActivation}\n                    aria-label=\"Reset Zoom\"\n                    title=\"Zoom to Fill Container\"\n                  >\n                    {sizedIcon(ArrowsClockwise, '200')}\n                  </IconButton>\n                  <IconButton\n                    variant={transforms.zoom < 1 ? 'Success' : 'SurfaceVariant'}\n                    outlined={transforms.zoom < 1}\n                    size=\"300\"\n                    radii=\"Pill\"\n                    {...zoomOutActivation}\n                    aria-label=\"Zoom Out\"\n                    title=\"Zoom Out\"\n                  >\n                    {sizedIcon(Minus, '50')}\n                  </IconButton>\n                  <Chip\n                    variant=\"SurfaceVariant\"\n                    radii=\"Pill\"\n                    style={{\n                      // For zoom levels below 100%, keep the pill at the same size as it would be at 100% zoom.\n                      // This prevents the Zoom Out button from moving from the pill changing size.\n                      // 4em should be generous enough to fit without manually determining the width of the text.\n                      minWidth: '4em',\n                    }}\n                    {...zoomInputActivation}\n                    title=\"Update Zoom\"\n                  >\n                    <Text\n                      size=\"B300\"\n                      style={{\n                        cursor: 'text',\n                        margin: 'auto',\n                      }}\n                    >\n                      {isEditingZoom ? (\n                        <span>\n                          <input\n                            className={css.ImageViewerInput}\n                            ref={zoomInputRef}\n                            type=\"text\"\n                            aria-label=\"Set Zoom Level\"\n                            value={zoomInput}\n                            onChange={(e) => {\n                              setZoomInput(e.target.value);\n                            }}\n                            onBlur={() => {\n                              const next = parseInt(zoomInput, 10);\n                              if (!Number.isNaN(next)) {\n                                setZoom(next / 100);\n                              }\n                              setIsEditingZoom(false);\n                            }}\n                            onKeyDown={(e) => {\n                              if (e.key === 'Enter') {\n                                const next = parseInt(zoomInput, 10);\n                                if (!Number.isNaN(next)) {\n                                  setZoom(next / 100);\n                                }\n                                setIsEditingZoom(false);\n                              }\n                            }}\n                          />\n                          <span>%</span>\n                        </span>\n                      ) : (\n                        `${Math.round(transforms.zoom * 100)}%`\n                      )}\n                    </Text>\n                  </Chip>\n                  <IconButton\n                    variant={transforms.zoom > 1 ? 'Success' : 'SurfaceVariant'}\n                    outlined={transforms.zoom > 1}\n                    size=\"300\"\n                    radii=\"Pill\"\n                    {...zoomInActivation}\n                    aria-label=\"Zoom In\"\n                    title=\"Zoom In\"\n                  >\n                    {sizedIcon(Plus, '50')}\n                  </IconButton>\n                  <Chip\n                    variant=\"Primary\"\n                    {...downloadActivation}\n                    radii=\"300\"\n                    before={sizedIcon(Download, '50')}\n                    outlined\n                  >\n                    <Text size=\"B300\">{iosSaveToPhotos ? 'Save to Photos' : 'Download'}</Text>\n                  </Chip>\n                </Box>\n              </>\n            )}\n          </Header>\n          <Box\n            grow=\"Yes\"\n            ref={containerRef}\n            onWheel={handleWheel}\n            className={classNames(css.ImageViewerContent, isMobile && css.ImageViewerContentMobile)}\n            data-gestures=\"ignore\"\n            justifyContent=\"Center\"\n            alignItems=\"Center\"\n            style={{ overflow: 'hidden', touchAction: 'none', cursor }}\n            onPointerDown={onPointerDown}\n            onContextMenu={handleContextMenu}\n            onTouchStart={menu.triggerProps.onTouchStart}\n            onTouchEnd={menu.triggerProps.onTouchEnd}\n            onTouchMove={menu.triggerProps.onTouchMove}\n            onTouchCancel={menu.triggerProps.onTouchCancel}\n          >\n            {isMobile && onPrevious && (\n              <IconButton\n                className={css.ImageViewerPrevious}\n                aria-label=\"Previous image\"\n                size=\"400\"\n                radii=\"300\"\n                {...previousActivation}\n              >\n                {sizedIcon(CaretLeft, '200')}\n              </IconButton>\n            )}\n            {isMobile && onNext && (\n              <IconButton\n                className={css.ImageViewerNext}\n                aria-label=\"Next image\"\n                size=\"400\"\n                radii=\"300\"\n                {...nextActivation}\n              >\n                {sizedIcon(CaretRight, '200')}\n              </IconButton>\n            )}\n            <MediaImage\n              ref={imageRef}\n              className={classNames(css.ImageViewerImg, isPixelated && css.ImageViewerImgPixelated)}\n              draggable={false}\n              data-gestures=\"ignore\"\n              style={{\n                cursor,\n                opacity: isImageReady ? 1 : 0, // Hide image until fit to container\n                transform: `translate(${transforms.pan.x}px, ${transforms.pan.y}px) scale(${transforms.zoom})`,\n              }}\n              src={src}\n              alt={alt}\n              info={info}\n              pixelated={isPixelated}\n              onPointerDown={onPointerDown}\n              onLoad={(event: React.SyntheticEvent<HTMLImageElement>) => {\n                handleImageLoad(event);\n                setIsImageReady(true);\n              }}\n              onLottieLoad={(canvas) => {\n                handleImageDimensions(\n                  info?.w ?? canvas?.width ?? 0,\n                  info?.h ?? canvas?.height ?? 0\n                );\n                setIsImageReady(true);\n              }}\n            />\n            {isMobile && sender && alt && (\n              <Text className={css.ImageViewerMobileCaption} size=\"T200\">\n                {alt}\n              </Text>\n            )}\n          </Box>\n        </Box>\n      </>\n    );\n  }\n);\n","import classNames from 'classnames';\nimport { Box, as } from 'folds';\nimport * as css from './UrlPreview.css';\n\nexport const UrlPreview = as<'div'>(({ className, ...props }, ref) => (\n  <Box shrink=\"No\" className={classNames(css.UrlPreview, className)} {...props} ref={ref} />\n));\n\nexport const UrlPreviewContent = as<'div'>(({ className, ...props }, ref) => (\n  <Box\n    grow=\"Yes\"\n    shrink=\"No\"\n    direction=\"Column\"\n    gap=\"100\"\n    className={classNames(css.UrlPreviewContent, className)}\n    {...props}\n    ref={ref}\n  />\n));\n\nexport const UrlPreviewDescription = as<'span'>(({ className, ...props }, ref) => (\n  <span className={classNames(css.UrlPreviewDescription, className)} {...props} ref={ref} />\n));\n","import { Children, useCallback, useEffect, useRef, useState } from 'react';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport type { IPreviewUrlResponse } from '$types/matrix-sdk';\nimport { Box, IconButton, Scroll, Text, as, color, config, toRem } from 'folds';\nimport { ArrowLeft, ArrowRight, sizedIcon } from '$components/icons/phosphor';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { mxcUrlToHttp, downloadMedia } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { safeDecodeUrl } from '$plugins/react-custom-html-parser';\nimport * as css from './UrlPreviewCard.css';\nimport * as urlPreviewChrome from './UrlPreview.css';\nimport { UrlPreview, UrlPreviewContent, UrlPreviewDescription } from './UrlPreview';\nimport { AudioContent, ImageContent, VideoContent } from '../message';\nimport { LinePlaceholder } from '../message/placeholder';\nimport { Image, MediaControl, Video } from '../media';\nimport { ImageViewer } from '../image-viewer';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport type { IImageInfo } from '$types/matrix/common';\nimport { MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME } from '$unstable/prefixes';\n\nconst linkStyles = { color: color.Success.Main };\n\n// Module-level in-flight deduplication: prevents N+1 concurrent requests when a\n// large event batch renders many UrlPreviewCard instances for the same URL.\n// Scoped by MatrixClient to avoid cross-account dedup if multiple clients exist.\n// Inner cache keyed by URL only (not ts) â€ Ethe same URL shows the same preview\n// regardless of which message referenced it. Promises are evicted after settling\n// so a later render can retry after network recovery.\nconst previewRequestCache = new WeakMap<MatrixClient, Map<string, Promise<IPreviewUrlResponse>>>();\n\nconst getClientCache = (mx: MatrixClient): Map<string, Promise<IPreviewUrlResponse>> => {\n  let clientCache = previewRequestCache.get(mx);\n  if (!clientCache) {\n    clientCache = new Map();\n    previewRequestCache.set(mx, clientCache);\n  }\n  return clientCache;\n};\n\n// Settled outcomes are kept so a row scrolled back into view renders at its final size.\ntype SettledPreview = { data: IPreviewUrlResponse } | { failed: true };\n\nconst PREVIEW_RESULT_LIMIT = 500;\nconst previewResultCache = new WeakMap<MatrixClient, Map<string, SettledPreview>>();\n\nconst getResultCache = (mx: MatrixClient): Map<string, SettledPreview> => {\n  let resultCache = previewResultCache.get(mx);\n  if (!resultCache) {\n    resultCache = new Map();\n    previewResultCache.set(mx, resultCache);\n  }\n  return resultCache;\n};\n\nconst rememberPreview = (mx: MatrixClient, url: string, settled: SettledPreview): void => {\n  const resultCache = getResultCache(mx);\n  resultCache.set(url, settled);\n  const oldest = resultCache.keys().next();\n  if (resultCache.size > PREVIEW_RESULT_LIMIT && !oldest.done) resultCache.delete(oldest.value);\n};\n\nconst requestUrlPreview = (\n  mx: MatrixClient,\n  url: string,\n  ts: number\n): Promise<IPreviewUrlResponse | null> => {\n  const remembered = getResultCache(mx).get(url);\n  if (remembered) {\n    return 'failed' in remembered\n      ? Promise.reject(new Error('preview previously refused'))\n      : Promise.resolve(remembered.data);\n  }\n  const clientCache = getClientCache(mx);\n  const cached = clientCache.get(url);\n  if (cached !== undefined) return cached;\n  const previewResult = mx?.getUrlPreview(url, ts);\n  if (!previewResult) return Promise.resolve(null);\n  clientCache.set(url, previewResult);\n  previewResult\n    .then((data) => rememberPreview(mx, url, { data }))\n    .catch(() => rememberPreview(mx, url, { failed: true }))\n    .finally(() => clientCache.delete(url));\n  return previewResult;\n};\n\n// A card whose result is already cached renders at its final height, so it never grows in place.\nexport const prefetchUrlPreview = (mx: MatrixClient, url: string, ts: number): Promise<void> => {\n  if (getResultCache(mx).has(url) || getClientCache(mx).has(url)) return Promise.resolve();\n  return requestUrlPreview(mx, url, ts).then(\n    () => undefined,\n    () => undefined\n  );\n};\n\nconst openMediaInNewTab = async (url: string | undefined) => {\n  if (!url) {\n    console.warn('Attempted to open an empty url');\n    return;\n  }\n  const blob = await downloadMedia(url);\n  const blobUrl = URL.createObjectURL(blob);\n  const child = window.open(blobUrl, '_blank');\n  if (!child) {\n    URL.revokeObjectURL(blobUrl);\n    return;\n  }\n  // Retain the URL until the tab closes since video playback can re-fetch it.\n  const timer = window.setInterval(() => {\n    if (child.closed) {\n      window.clearInterval(timer);\n      URL.revokeObjectURL(blobUrl);\n    }\n  }, 1000);\n};\n\nfunction ogPositiveDimension(value: unknown): number | undefined {\n  if (typeof value === 'number' && Number.isFinite(value) && value > 0) return value;\n  if (typeof value === 'string') {\n    const n = Number.parseFloat(value);\n    if (Number.isFinite(n) && n > 0) return n;\n  }\n  return undefined;\n}\n\nfunction isLikelyPlayableOgVideo(prev: IPreviewUrlResponse): boolean {\n  const raw = prev['og:video'];\n  if (typeof raw !== 'string') return false;\n  const url = raw.trim();\n  if (!url) return false;\n  const mime =\n    typeof prev['og:video:type'] === 'string' ? prev['og:video:type'].toLowerCase().trim() : '';\n  if (mime.startsWith('video/')) return true;\n  if (/^mxc:\\/\\//i.test(url)) {\n    return mime.startsWith('video/') || /\\.(mp4|webm|ogg|mov|m4v)(\\?|$)/i.test(url);\n  }\n  if (/^https?:\\/\\//i.test(url)) {\n    return /\\.(mp4|webm|ogg|mov|m4v)(\\?|$)/i.test(url) || mime.startsWith('video/');\n  }\n  return false;\n}\n\nexport const UrlPreviewCard = as<\n  'div',\n  {\n    urlPreview: boolean;\n    url: string;\n    ts?: number;\n    bundle?: IPreviewUrlResponse;\n  }\n>(({ urlPreview, url, ts, bundle, ...props }, ref) => {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const [linkPreviewImageMaxHeight] = useSetting(settingsAtom, 'linkPreviewImageMaxHeight');\n  const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad');\n\n  const settled = urlPreview && ts ? getResultCache(mx).get(url) : undefined;\n\n  const [previewStatus, loadPreview] = useAsyncCallback(\n    useCallback(() => {\n      if (!ts && !bundle) return Promise.resolve(null);\n      if (urlPreview && ts) return requestUrlPreview(mx, url, ts);\n      return Promise.resolve(bundle);\n    }, [ts, bundle, urlPreview, mx, url])\n  );\n\n  useEffect(() => {\n    // A homeserver refusing to preview a URL is an ordinary answer and the card already\n    // renders nothing on error, so the rejection must not reach the global handler.\n    loadPreview().catch(() => undefined);\n  }, [url, loadPreview]);\n\n  const failed = previewStatus.status === AsyncStatus.Error || (settled && 'failed' in settled);\n\n  // Holding space for a card that never arrives leaves a permanent hole in the message.\n  if (failed) return null;\n\n  const renderContent = (prev: IPreviewUrlResponse) => {\n    const siteName = prev['og:site_name'];\n    const title = prev['og:title'];\n    const description = prev['og:description'];\n    const imgUrl = mxcUrlToHttp(\n      mx,\n      prev['og:image'] || '',\n      useAuthentication,\n      256,\n      256,\n      'scale',\n      false\n    );\n    const handleAuxClick = (ev: React.MouseEvent) => {\n      if (!prev['og:image']) {\n        console.warn('No image');\n        return;\n      }\n      if (ev.button === 1) {\n        ev.preventDefault();\n        const mxcUrl = mxcUrlToHttp(mx, prev['og:image'], /* useAuthentication */ true);\n        if (!mxcUrl) {\n          console.error('Error converting mxc:// url.');\n          return;\n        }\n        openMediaInNewTab(mxcUrl);\n      }\n    };\n\n    const videoW = prev['og:video'] ? ogPositiveDimension(prev['og:video:width']) : undefined;\n    const videoH = prev['og:video'] ? ogPositiveDimension(prev['og:video:height']) : undefined;\n    const ogImgW = ogPositiveDimension(prev['og:image:width']);\n    const ogImgH = ogPositiveDimension(prev['og:image:height']);\n\n    const aspectRatio =\n      videoW && videoH\n        ? `${videoW} / ${videoH}`\n        : ogImgW && ogImgH\n          ? `${ogImgW} / ${ogImgH}`\n          : undefined;\n\n    const previewBlurRaw =\n      typeof prev['matrix:image:blurhash'] === 'string' ? prev['matrix:image:blurhash'].trim() : '';\n\n    const ogImageInfo: IImageInfo | undefined = (() => {\n      const matrixSize = prev['matrix:image:size'];\n      const size =\n        typeof matrixSize === 'number' && Number.isFinite(matrixSize) ? matrixSize : undefined;\n      if (ogImgW && ogImgH) {\n        return {\n          w: ogImgW,\n          h: ogImgH,\n          ...(size !== undefined ? { size } : {}),\n          ...(previewBlurRaw ? { [MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]: previewBlurRaw } : {}),\n        };\n      }\n      if (previewBlurRaw || size !== undefined) {\n        return {\n          w: 16,\n          h: 9,\n          ...(size !== undefined ? { size } : {}),\n          ...(previewBlurRaw ? { [MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]: previewBlurRaw } : {}),\n        };\n      }\n      return undefined;\n    })();\n\n    const previewThumbMaxEdge = Math.min(\n      2048,\n      Math.max(1, Math.round(Math.max(1, linkPreviewImageMaxHeight) * 2))\n    );\n    const showOgVideo = isLikelyPlayableOgVideo(prev);\n\n    return (\n      <Box\n        grow=\"Yes\"\n        direction=\"Column\"\n        style={{\n          overflow: 'hidden',\n          width: '100%',\n        }}\n      >\n        <UrlPreviewContent\n          style={{\n            minWidth: 0,\n            display: 'flex',\n            flexDirection: 'column',\n            justifyContent: 'center',\n          }}\n        >\n          <Text\n            style={linkStyles}\n            truncate\n            as=\"a\"\n            href={url}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            size=\"T200\"\n            priority=\"300\"\n          >\n            {typeof siteName === 'string' && `${siteName} | `}\n            {safeDecodeUrl(url)}\n          </Text>\n          {title && (\n            <Text truncate priority=\"400\">\n              <b>{title}</b>\n            </Text>\n          )}\n          {description && (\n            <Text size=\"T200\" priority=\"300\">\n              <UrlPreviewDescription>{description}</UrlPreviewDescription>\n            </Text>\n          )}\n        </UrlPreviewContent>\n        {showOgVideo && (\n          <Box\n            shrink=\"No\"\n            className={urlPreviewChrome.UrlPreviewMediaWell}\n            style={{\n              width: '100%',\n              maxHeight: toRem(linkPreviewImageMaxHeight),\n              aspectRatio: aspectRatio ?? '16 / 9',\n              flexShrink: 1,\n              minHeight: 0,\n              overflow: 'hidden',\n              position: 'relative',\n            }}\n          >\n            <VideoContent\n              style={{\n                position: 'absolute',\n                inset: 0,\n                width: '100%',\n                height: '100%',\n              }}\n              body={prev['og:title']}\n              info={{}}\n              url={(prev['og:video'] as string).trim()}\n              mimeType={(prev['og:video:type'] as string) ?? ''}\n              renderVideo={(vidProps) => (\n                <Video\n                  style={{ width: '100%', height: '100%', objectFit: 'contain' }}\n                  {...vidProps}\n                />\n              )}\n              renderThumbnail={() => <Image src={imgUrl ?? undefined} />}\n            />\n          </Box>\n        )}\n        {!showOgVideo && prev['og:image'] && (\n          <Box\n            shrink=\"No\"\n            className={urlPreviewChrome.UrlPreviewMediaWell}\n            style={{\n              width: '100%',\n              maxHeight: toRem(linkPreviewImageMaxHeight),\n              aspectRatio: aspectRatio ?? '16 / 9',\n              flexShrink: 1,\n              minHeight: 0,\n              overflow: 'hidden',\n              position: 'relative',\n            }}\n          >\n            <ImageContent\n              style={{\n                position: 'absolute',\n                inset: 0,\n                width: '100%',\n                height: '100%',\n              }}\n              mediaLayout=\"contained\"\n              fillsPreviewSlot\n              autoPlay={mediaAutoLoad}\n              onAuxClick={handleAuxClick}\n              body={prev['og:title']}\n              url={prev['og:image']}\n              info={ogImageInfo}\n              matrixThumbnailMaxEdge={previewThumbMaxEdge}\n              renderViewer={(p) => <ImageViewer {...p} />}\n              renderImage={(p) => (\n                <Image\n                  info={ogImageInfo}\n                  {...p}\n                  style={{\n                    display: 'block',\n                    maxWidth: '100%',\n                    maxHeight: '100%',\n                    width: 'auto',\n                    height: 'auto',\n                    objectFit: 'contain',\n                    objectPosition: 'center',\n                  }}\n                />\n              )}\n            />\n          </Box>\n        )}\n        {!showOgVideo && !prev['og:image'] && prev['og:audio'] && (\n          <Box className={css.UrlPreviewAudio} style={{ flexShrink: 0 }}>\n            <AudioContent\n              url={(prev['og:audio'] as string) ?? ''}\n              mimeType={(prev['og:audio:type'] as string) ?? ''}\n              info={{}}\n              renderMediaControl={(p) => <MediaControl {...p} />}\n            />\n          </Box>\n        )}\n      </Box>\n    );\n  };\n\n  const resolved: IPreviewUrlResponse | null | undefined =\n    settled && !('failed' in settled)\n      ? settled.data\n      : previewStatus.status === AsyncStatus.Success\n        ? (previewStatus.data as IPreviewUrlResponse | null)\n        : undefined;\n\n  let previewContent;\n  if (resolved !== undefined) {\n    previewContent = resolved ? (\n      renderContent(resolved)\n    ) : (\n      <UrlPreviewContent>\n        <Text\n          style={linkStyles}\n          truncate\n          as=\"a\"\n          href={url}\n          target=\"_blank\"\n          rel=\"noreferrer\"\n          size=\"T200\"\n          priority=\"300\"\n        >\n          {safeDecodeUrl(url)}\n        </Text>\n      </UrlPreviewContent>\n    );\n  } else {\n    // Kept midway between a refused preview and a text card: whichever lands, the height\n    // this was wrong by is as small as it can be.\n    previewContent = (\n      <Box grow=\"Yes\" direction=\"Column\" style={{ overflow: 'hidden', width: '100%' }}>\n        <UrlPreviewContent style={{ minWidth: 0 }}>\n          <LinePlaceholder style={{ maxWidth: toRem(160) }} />\n          <LinePlaceholder style={{ maxWidth: toRem(240) }} />\n        </UrlPreviewContent>\n      </Box>\n    );\n  }\n  return (\n    <UrlPreview {...props} ref={ref} style={{ alignSelf: 'start' }}>\n      {previewContent}\n    </UrlPreview>\n  );\n});\n\nexport const UrlPreviewHolder = as<'div'>(({ children, ...props }, ref) => {\n  // An empty holder still contributes its top margin, e.g. when every widget kind is disabled.\n  const hasCard = Children.toArray(children).length > 0;\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const innerBoxRef = useRef<HTMLDivElement>(null);\n  const [canScrollLeft, setCanScrollLeft] = useState(false);\n  const [canScrollRight, setCanScrollRight] = useState(false);\n\n  const updateArrows = useCallback(() => {\n    const scroll = scrollRef.current;\n    if (!scroll) return;\n    const { scrollLeft, scrollWidth, clientWidth } = scroll;\n    setCanScrollLeft(scrollLeft > 1);\n    setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n  }, []);\n\n  useEffect(() => {\n    const scroll = scrollRef.current;\n    if (!scroll) return undefined;\n\n    updateArrows();\n    scroll.addEventListener('scroll', updateArrows, { passive: true });\n\n    const resizeObserver = new ResizeObserver(updateArrows);\n    resizeObserver.observe(scroll);\n    if (innerBoxRef.current) resizeObserver.observe(innerBoxRef.current);\n\n    return () => {\n      scroll.removeEventListener('scroll', updateArrows);\n      resizeObserver.disconnect();\n    };\n  }, [updateArrows]);\n\n  const handleScrollBack = () => {\n    const scroll = scrollRef.current;\n    if (!scroll) return;\n    const { offsetWidth, scrollLeft } = scroll;\n    scroll.scrollTo({\n      left: scrollLeft - offsetWidth / 1.3,\n      behavior: 'smooth',\n    });\n  };\n  const handleScrollFront = () => {\n    const scroll = scrollRef.current;\n    if (!scroll) return;\n    const { offsetWidth, scrollLeft } = scroll;\n    scroll.scrollTo({\n      left: scrollLeft + offsetWidth / 1.3,\n      behavior: 'smooth',\n    });\n  };\n\n  if (!hasCard) return null;\n\n  return (\n    <Box\n      direction=\"Column\"\n      {...props}\n      ref={ref}\n      style={{ marginTop: config.space.S200, position: 'relative' }}\n    >\n      <Scroll\n        ref={scrollRef}\n        direction=\"Horizontal\"\n        size=\"0\"\n        visibility=\"Hover\"\n        hideTrack\n        data-gestures=\"scroll\"\n      >\n        <Box shrink=\"No\" alignItems=\"Center\">\n          {canScrollLeft && (\n            <>\n              <div className={css.UrlPreviewHolderGradient({ position: 'Left' })} />\n              <IconButton\n                className={css.UrlPreviewHolderBtn({ position: 'Left' })}\n                variant=\"Secondary\"\n                radii=\"Pill\"\n                size=\"300\"\n                outlined\n                onClick={handleScrollBack}\n              >\n                {sizedIcon(ArrowLeft, '300')}\n              </IconButton>\n            </>\n          )}\n          <Box\n            ref={innerBoxRef}\n            alignItems=\"Inherit\"\n            gap=\"200\"\n            style={{\n              alignItems: 'baseline',\n            }}\n          >\n            {children}\n          </Box>\n          {canScrollRight && (\n            <>\n              <div className={css.UrlPreviewHolderGradient({ position: 'Right' })} />\n              <IconButton\n                className={css.UrlPreviewHolderBtn({ position: 'Right' })}\n                variant=\"Primary\"\n                radii=\"Pill\"\n                size=\"300\"\n                outlined\n                onClick={handleScrollFront}\n              >\n                {sizedIcon(ArrowRight, '300')}\n              </IconButton>\n            </>\n          )}\n        </Box>\n      </Scroll>\n    </Box>\n  );\n});\n","import type { ReactNode } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { Box, Badge, IconButton, Spinner, Text, as, toRem } from 'folds';\nimport { Link, sizedIcon } from '$components/icons/phosphor';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { encodeBlurHash } from '$utils/blurHash';\nimport { fetch } from '$utils/fetch';\nimport { Attachment, AttachmentBox, AttachmentHeader } from '../message/attachment';\nimport { Image as MediaImage } from '../media';\nimport { UrlPreview } from './UrlPreview';\nimport { VideoContent } from '../message';\nimport { MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME } from '../../../unstable/prefixes';\n\ninterface OEmbed {\n  type: 'photo' | 'video' | 'link' | 'rich';\n  version: '1.0';\n  title?: string;\n  author_name?: string;\n  author_url?: string;\n  provider_name?: string;\n  provider_url?: string;\n  cache_age?: string;\n  thumbnail_url?: string;\n  thumbnail_width?: number;\n  thumbnail_height?: number;\n  url?: string;\n  html?: string;\n  width?: number;\n  height?: number;\n}\n\nasync function oEmbedData(url: string): Promise<OEmbed> {\n  const response = await fetch(url);\n  // YouTube answers errors with a plain-text body under an application/json content type,\n  // so the status has to be checked before parsing.\n  if (!response.ok) {\n    throw new Error(`oEmbed request failed: ${response.status}`);\n  }\n\n  return response.json();\n}\n\ntype EmbedHeaderProps = {\n  title: string;\n  source: string;\n  after?: ReactNode;\n};\nconst EmbedHeader = as<'div', EmbedHeaderProps>(({ title, source, after }) => (\n  <AttachmentHeader>\n    <Box alignItems=\"Center\" gap=\"200\" grow=\"Yes\">\n      <Box shrink=\"No\">\n        <Badge style={{ maxWidth: toRem(100) }} variant=\"Secondary\" radii=\"Pill\">\n          <Text size=\"O400\" truncate>\n            {source}\n          </Text>\n        </Badge>\n      </Box>\n      <Box grow=\"Yes\">\n        <Text size=\"T300\" truncate>\n          {title}\n        </Text>\n      </Box>\n      {after}\n    </Box>\n  </AttachmentHeader>\n));\n\ntype EmbedOpenButtonProps = {\n  url: string;\n};\nfunction EmbedOpenButton({ url }: EmbedOpenButtonProps) {\n  return (\n    <IconButton size=\"300\" radii=\"300\" onClick={() => window.open(url, '_blank')}>\n      {sizedIcon(Link, '100')}\n    </IconButton>\n  );\n}\n\ntype YoutubeElementProps = {\n  videoInfo: YoutubeLink;\n  embedData: OEmbed;\n};\n\nconst YoutubeElement = as<'div', YoutubeElementProps>(({ videoInfo, embedData }) => {\n  const thumbnailUrl = `https://i.ytimg.com/vi/${videoInfo.videoId}/hqdefault.jpg`;\n\n  const timestamp = videoInfo.timestamp ? `&start=${videoInfo.timestamp}` : '';\n  const playlist = videoInfo.playlist ? `&${videoInfo.playlist}` : '';\n\n  const iframeSrc = `https://www.youtube-nocookie.com/embed/${encodeURIComponent(videoInfo.videoId)}?autoplay=1${timestamp}`;\n  const videoUrl = videoInfo.isMusic\n    ? `https://music.youtube.com/watch?v=${videoInfo.videoId}${timestamp}${playlist}`\n    : `https://youtube.com/watch?v=${videoInfo.videoId}${timestamp}${playlist}`;\n\n  const [blurHash, setBlurHash] = useState<string | undefined>();\n\n  const title = embedData.title ? embedData.title : '';\n\n  return (\n    <Attachment\n      style={{\n        flexGrow: 1,\n        flexShrink: 0,\n        width: '640px',\n        height: '400px',\n      }}\n    >\n      <AttachmentHeader>\n        <EmbedHeader title={title} source=\"YOUTUBE\" after={EmbedOpenButton({ url: videoUrl })} />\n      </AttachmentHeader>\n      <AttachmentBox\n        style={{\n          height: '100%',\n          width: '100%',\n        }}\n      >\n        <VideoContent\n          body={title}\n          mimeType=\"fake\"\n          url={videoUrl}\n          info={{\n            thumbnail_info: { [MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]: blurHash },\n          }}\n          renderThumbnail={() => (\n            <MediaImage\n              src={thumbnailUrl}\n              /*\n\t\t\t\t\t\t\t\tthis allows the blurhash to be computed, otherwise it throws an \"insecure operation\" error\n\t\t\t\t\t\t\t\tmaybe that happens for a good reason, in which case this should probably be removed\n\t\t\t\t\t\t\t\t*/\n              crossOrigin=\"anonymous\"\n              onLoad={(e) => {\n                setBlurHash(encodeBlurHash(e.currentTarget, 32, 32));\n              }}\n            />\n          )}\n          renderVideo={({ onLoadedMetadata }) => (\n            <iframe\n              src={iframeSrc}\n              title=\"YouTube embed\"\n              onLoad={onLoadedMetadata}\n              allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n              referrerPolicy=\"strict-origin-when-cross-origin\"\n              width=\"640\"\n              height=\"360\"\n              allowFullScreen\n            />\n          )}\n        />\n      </AttachmentBox>\n    </Attachment>\n  );\n});\n\nexport const youtubeUrl = (url: string) =>\n  url.match(/(https:\\/\\/)(www\\.|music\\.|m\\.|)(youtube\\.com|youtu\\.be)\\//);\n\ntype YoutubeLink = {\n  videoId: string;\n  timestamp?: string;\n  playlist?: string;\n  isMusic: boolean;\n};\n\nfunction parseYoutubeLink(url: Readonly<string>): YoutubeLink | null {\n  /**\n   * the parsed version of `url`\n   */\n  let parsedURL: URL;\n  try {\n    parsedURL = new URL(url);\n  } catch {\n    // new URL can throw\n    return null;\n  }\n  const urlHost = parsedURL.host;\n  const urlSearchParams = parsedURL.searchParams;\n\n  /**\n   * The id of the youtube video, for example `MTn_bhTVr2U`\n   */\n  let videoId: string | undefined;\n\n  if (urlHost === 'youtu.be' || urlHost.endsWith('.youtu.be')) {\n    // example https://youtu.be/MTn_bhTVr2U?si=xxxx\n    // pathname includes the leading `/` so we have to split that\n    videoId = parsedURL.pathname.slice(1);\n  } else if (parsedURL.pathname.startsWith('/shorts/')) {\n    // example https://youtube.com/shorts/R0KZIPOqITw?si=xxxx\n    videoId = parsedURL.pathname.split('/').findLast(Boolean);\n  } else if (\n    (urlHost === 'youtube.com' || urlHost.endsWith('.youtube.com')) &&\n    parsedURL.pathname === '/watch'\n  ) {\n    // example: https://www.youtube.com/watch?v=MTn_bhTVr2U&list=RDjcB4zu4KX10&index=3\n    // get returns null if `v` is not in the url\n    videoId = urlSearchParams.get('v') ?? undefined;\n  } else return null;\n\n  if (!videoId) return null;\n\n  // playlist is not used for the embed, it can be appended as is\n  // returns null if `list` doesn't exist\n  const playlist = urlSearchParams.get('list') ?? undefined;\n  // returns null if `t` doesn't exist\n  const timestamp = urlSearchParams.get('t') ?? urlSearchParams.get('start') ?? undefined;\n\n  return {\n    videoId,\n    timestamp,\n    playlist,\n    isMusic: url.includes('music.youtube.com'),\n  };\n}\n\nexport const ClientPreview = as<'div', { url: string }>(({ url, ...props }, ref) => {\n  const [showYoutube] = useSetting(settingsAtom, 'clientPreviewYoutube');\n\n  // this component is overly complicated, because it was designed to support more embed types than just youtube\n  // i'm leaving this mess here to support later expansion\n  const isYoutube = !!youtubeUrl(url);\n  const videoInfo = isYoutube ? parseYoutubeLink(url) : null;\n\n  const fetchUrl =\n    isYoutube && videoInfo\n      ? `https://www.youtube.com/oembed?url=${encodeURIComponent(`https://youtube.com/watch?v=${videoInfo.videoId}`)}`\n      : url;\n\n  const [embedStatus, loadEmbed] = useAsyncCallback(\n    useCallback(() => oEmbedData(fetchUrl), [fetchUrl])\n  );\n\n  useEffect(() => {\n    const fetchYoutube = isYoutube && showYoutube;\n\n    // The card renders nothing on error; keep the failure out of the global handler.\n    if (fetchYoutube) loadEmbed().catch(() => undefined);\n  }, [isYoutube, showYoutube, loadEmbed]);\n\n  let previewContent;\n\n  if (videoInfo) {\n    if (showYoutube) {\n      if (embedStatus.status === AsyncStatus.Error) return null;\n\n      if (embedStatus.status === AsyncStatus.Success && embedStatus.data) {\n        previewContent = <YoutubeElement videoInfo={videoInfo} embedData={embedStatus.data} />;\n      } else {\n        previewContent = (\n          <Box grow=\"Yes\" alignItems=\"Center\" justifyContent=\"Center\">\n            <Spinner variant=\"Secondary\" size=\"400\" />\n          </Box>\n        );\n      }\n    }\n  }\n\n  return (\n    <UrlPreview\n      {...props}\n      ref={ref}\n      style={{\n        background: 'transparent',\n        border: 'none',\n        padding: 0,\n        boxShadow: 'none',\n        display: 'inline-block',\n        verticalAlign: 'middle',\n        width: 'max-content',\n        minWidth: 0,\n        maxWidth: '100%',\n        margin: 0,\n      }}\n    >\n      {previewContent}\n    </UrlPreview>\n  );\n});\n","export function isHttpsFullSableCssUrl(url: string): boolean {\n  return (\n    /^https:\\/\\//i.test(url) &&\n    /\\.sable\\.css(\\?|#|$)/i.test(url) &&\n    !/\\.preview\\.sable\\.css(\\?|#|$)/i.test(url)\n  );\n}\n\nexport function previewUrlFromFullThemeUrl(fullUrl: string): string | undefined {\n  if (!/\\.sable\\.css$/i.test(fullUrl)) return undefined;\n  return fullUrl.replace(/\\.sable\\.css$/i, '.preview.sable.css');\n}\n\nexport function fullUrlFromPreviewUrl(previewUrl: string, metaFull?: string): string | undefined {\n  if (metaFull && /^https:\\/\\//i.test(metaFull)) return metaFull;\n  if (!/\\.preview\\.sable\\.css(\\?|#|$)/i.test(previewUrl)) return undefined;\n  return previewUrl.replace(/\\.preview\\.sable\\.css(\\?|#|$)/i, '.sable.css$1');\n}\n","import { Box, Text, toRem, config } from 'folds';\nimport { Warning, sizedIcon } from '$components/icons/phosphor';\n\ntype ThemeThirdPartyBannerProps = {\n  hostLabel: string;\n  /** Default `theme` for backward compatibility. */\n  kind?: 'theme' | 'tweak';\n};\n\nexport function ThemeThirdPartyBanner({ hostLabel, kind = 'theme' }: ThemeThirdPartyBannerProps) {\n  const title = kind === 'tweak' ? 'Third-party tweak' : 'Third-party theme';\n  const body =\n    kind === 'tweak'\n      ? `This tweak is hosted on ${hostLabel}, outside the Sable catalog allowlist. Saving or enabling applies CSS from that host. Only use tweaks from providers you trust.`\n      : `This preview is hosted on ${hostLabel}, outside the Sable catalog allowlist. Saving or applying installs full theme CSS from that host. Only use themes from providers you trust.`;\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"200\"\n      style={{\n        padding: toRem(10),\n        borderRadius: config.radii.R300,\n        background: 'var(--sable-warn-container)',\n        border: `${toRem(1)} solid var(--sable-warn-container-line)`,\n        color: 'var(--sable-warn-on-container)',\n      }}\n    >\n      <Box direction=\"Row\" gap=\"200\" alignItems=\"Start\">\n        {sizedIcon(Warning, '100', { filled: true })}\n        <Box direction=\"Column\" gap=\"100\" grow=\"Yes\" style={{ minWidth: 0 }}>\n          <Text size=\"T300\" style={{ fontWeight: 600 }}>\n            {title}\n          </Text>\n          <Text size=\"T200\" priority=\"300\" style={{ wordBreak: 'break-word' }}>\n            {body}\n          </Text>\n        </Box>\n      </Box>\n    </Box>\n  );\n}\n","import { Box, Button, Text, config, toRem } from 'folds';\n\nimport { ThemeThirdPartyBanner } from './ThemeThirdPartyBanner';\n\nexport type SableChatPreviewPlaceholderProps = {\n  kind: 'theme' | 'tweak';\n  url: string;\n  hostLabel: string;\n  isApprovedHost: boolean;\n  onLoadPreview: () => void;\n};\n\nexport function SableChatPreviewPlaceholder({\n  kind,\n  url,\n  hostLabel,\n  isApprovedHost,\n  onLoadPreview,\n}: SableChatPreviewPlaceholderProps) {\n  const title = kind === 'theme' ? 'Theme preview' : 'Tweak preview';\n  const bodyApproved =\n    kind === 'theme'\n      ? 'This message links to a catalog theme preview. Nothing is fetched until you load it.'\n      : 'This message links to a catalog tweak. Nothing is fetched until you load it.';\n  const bodyThirdParty =\n    kind === 'theme'\n      ? 'This message links to third-party theme CSS. Nothing is fetched until you confirm. Only load previews you trust.'\n      : 'This message links to third-party tweak CSS. Nothing is fetched until you confirm. Only load previews you trust.';\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"300\"\n      style={{\n        width: '400px',\n        maxWidth: '100%',\n        flexShrink: 0,\n        boxSizing: 'border-box',\n        padding: toRem(12),\n        borderRadius: config.radii.R300,\n        border: `${toRem(1)} solid var(--sable-surface-container-line)`,\n        background: 'var(--sable-surface-container)',\n      }}\n    >\n      <Box direction=\"Column\" gap=\"100\" style={{ minWidth: 0 }}>\n        <Text size=\"H6\">{title}</Text>\n        {!isApprovedHost ? <ThemeThirdPartyBanner kind={kind} hostLabel={hostLabel} /> : null}\n        <Text size=\"T200\" priority=\"300\" style={{ wordBreak: 'break-word' }}>\n          {isApprovedHost ? bodyApproved : bodyThirdParty}\n        </Text>\n        <Text size=\"T200\" priority=\"300\">\n          {isApprovedHost ? 'Official catalog' : hostLabel}\n        </Text>\n        <Text\n          size=\"T200\"\n          priority=\"300\"\n          style={{\n            wordBreak: 'break-all',\n            fontFamily: 'monospace',\n            opacity: 0.85,\n          }}\n        >\n          {url}\n        </Text>\n      </Box>\n      <Button variant=\"Primary\" fill=\"Soft\" outlined size=\"300\" radii=\"300\" onClick={onLoadPreview}>\n        <Text size=\"B300\">Load preview</Text>\n      </Button>\n    </Box>\n  );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { Box, Text } from 'folds';\nimport { useStore } from 'jotai/react';\n\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { ThemeKind } from '$hooks/useTheme';\nimport { usePatchSettings } from '$features/settings/cosmetics/themeSettingsPatch';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom, type Settings, type ThemeRemoteFavorite } from '$state/settings';\nimport {\n  extractFullThemeUrlFromPreview,\n  parseSableThemeMetadata,\n  type SableThemeContrast,\n} from '../../theme/metadata';\nimport { getCachedThemeCss, putCachedThemeCss } from '../../theme/cache';\nimport { fullUrlFromPreviewUrl } from '../../theme/previewUrls';\nimport { isApprovedCatalogHostUrl } from '../../theme/themeApproval';\nimport { ThemePreviewCard } from '../theme/ThemePreviewCard';\nimport { SableChatPreviewPlaceholder } from './SableChatPreviewPlaceholder';\nimport { ThemeThirdPartyBanner } from './ThemeThirdPartyBanner';\nimport { pruneThemeFavorites, themeUrlHostLabel } from '../../theme/themeLibrary';\nimport { fetch } from '$utils/fetch';\n\nfunction isHttps(url: string): boolean {\n  return /^https:\\/\\//i.test(url);\n}\n\nfunction isPreviewThemeUrl(url: string): boolean {\n  return /\\.preview\\.sable\\.css(\\?|#|$)/i.test(url);\n}\n\nfunction basenameFromUrl(url: string): string {\n  const tail = url.split('/').pop() ?? url;\n  return tail.replace(/\\.preview\\.sable\\.css(\\?|#|$)/i, '').replace(/\\.sable\\.css(\\?|#|$)/i, '');\n}\n\nexport function ThemePreviewUrlCard({ url }: { url: string }) {\n  const clientConfig = useClientConfig();\n  const store = useStore();\n  const patchSettings = usePatchSettings();\n  const mountedRef = useRef(true);\n\n  useEffect(() => {\n    mountedRef.current = true;\n    return () => {\n      mountedRef.current = false;\n    };\n  }, []);\n\n  const [autoPreviewApproved] = useSetting(settingsAtom, 'themeChatAutoPreviewApprovedUrls');\n  const [autoPreviewAny] = useSetting(settingsAtom, 'themeChatAutoPreviewAnyUrl');\n  const [favorites] = useSetting(settingsAtom, 'themeRemoteFavorites');\n  const [systemTheme] = useSetting(settingsAtom, 'useSystemTheme');\n  const [manualRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteManualFullUrl');\n  const [lightRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteLightFullUrl');\n  const [darkRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteDarkFullUrl');\n\n  const isEligibleUrl = useMemo(() => isHttps(url) && isPreviewThemeUrl(url), [url]);\n\n  const prefixes = clientConfig.themeCatalogApprovedHostPrefixes;\n\n  const isOfficial = useMemo(() => isApprovedCatalogHostUrl(url, prefixes), [prefixes, url]);\n\n  const shouldAutoFetch = useMemo(\n    () => (isOfficial && autoPreviewApproved) || (!isOfficial && autoPreviewAny),\n    [isOfficial, autoPreviewApproved, autoPreviewAny]\n  );\n\n  const [userTriggeredLoad, setUserTriggeredLoad] = useState(false);\n\n  useEffect(() => {\n    setUserTriggeredLoad(false);\n  }, [url]);\n\n  const fetchEnabled = useMemo(\n    () => isEligibleUrl && (shouldAutoFetch || userTriggeredLoad),\n    [isEligibleUrl, shouldAutoFetch, userTriggeredLoad]\n  );\n\n  const showThirdPartyBanner = useMemo(\n    () => !isApprovedCatalogHostUrl(url, prefixes),\n    [prefixes, url]\n  );\n\n  const previewQuery = useQuery({\n    queryKey: ['theme-preview-embed', url],\n    enabled: fetchEnabled,\n    staleTime: 10 * 60_000,\n    queryFn: async () => {\n      const res = await fetch(url, { mode: 'cors' });\n      if (!res.ok) throw new Error(`theme preview fetch failed: ${res.status}`);\n      const previewText = await res.text();\n      const meta = parseSableThemeMetadata(previewText);\n      const fullFromMeta = extractFullThemeUrlFromPreview(previewText);\n      const fullUrl = fullUrlFromPreviewUrl(url, fullFromMeta);\n      const kind = meta.kind ?? ThemeKind.Light;\n      const displayName = meta.name?.trim() || basenameFromUrl(url);\n      const author = meta.author?.trim() || undefined;\n      const contrast: SableThemeContrast = meta.contrast === 'high' ? 'high' : 'low';\n      const tags = meta.tags ?? [];\n      return { previewText, fullUrl, kind, displayName, author, contrast, tags };\n    },\n  });\n\n  const revertRef = useRef<Partial<Settings> | null>(null);\n  const lastAutoSavedUrlRef = useRef<string | null>(null);\n  const [canRevert, setCanRevert] = useState(false);\n  const [favoriteTouched, setFavoriteTouched] = useState(false);\n  const [favoriteError, setFavoriteError] = useState<string | null>(null);\n\n  const appliedHere = useMemo(() => {\n    const u = previewQuery.data?.fullUrl;\n    if (!u) return false;\n    if (systemTheme) {\n      return lightRemoteFullUrl === u || darkRemoteFullUrl === u;\n    }\n    return manualRemoteFullUrl === u;\n  }, [\n    previewQuery.data?.fullUrl,\n    systemTheme,\n    lightRemoteFullUrl,\n    darkRemoteFullUrl,\n    manualRemoteFullUrl,\n  ]);\n\n  const canRevertUi = useMemo(() => canRevert || appliedHere, [canRevert, appliedHere]);\n\n  const isFav = useMemo(\n    () => favorites.some((f) => f.fullUrl === previewQuery.data?.fullUrl),\n    [favorites, previewQuery.data?.fullUrl]\n  );\n\n  const toggleFavorite = useCallback(async () => {\n    const fullUrl = previewQuery.data?.fullUrl;\n    if (!fullUrl) return;\n\n    setFavoriteError(null);\n\n    const existing = favorites.find((f) => f.fullUrl === fullUrl);\n    if (existing) {\n      setFavoriteTouched(false);\n      const cleared: Partial<Settings> = {};\n      if (lightRemoteFullUrl === fullUrl) {\n        cleared.themeRemoteLightFullUrl = undefined;\n        cleared.themeRemoteLightKind = undefined;\n      }\n      if (darkRemoteFullUrl === fullUrl) {\n        cleared.themeRemoteDarkFullUrl = undefined;\n        cleared.themeRemoteDarkKind = undefined;\n      }\n      if (manualRemoteFullUrl === fullUrl) {\n        cleared.themeRemoteManualFullUrl = undefined;\n        cleared.themeRemoteManualKind = undefined;\n      }\n\n      const nextFavs = favorites.filter((f) => f.fullUrl !== fullUrl);\n      const nextActive = [manualRemoteFullUrl, lightRemoteFullUrl, darkRemoteFullUrl]\n        .filter((u): u is string => Boolean(u && u.trim().length > 0))\n        .filter((u) => u !== fullUrl);\n      patchSettings({\n        ...cleared,\n        themeRemoteFavorites: pruneThemeFavorites(nextFavs, nextActive),\n      });\n      return;\n    }\n\n    setFavoriteTouched(true);\n    const res = await fetch(fullUrl, { mode: 'cors' });\n    if (!mountedRef.current) return;\n    if (!res.ok) {\n      setFavoriteError(`Theme CSS not found (${res.status})`);\n      return;\n    }\n    const cssText = await res.text();\n    if (!mountedRef.current) return;\n    await putCachedThemeCss(fullUrl, cssText);\n    if (!mountedRef.current) return;\n\n    const next: ThemeRemoteFavorite = {\n      fullUrl,\n      displayName: previewQuery.data?.displayName ?? basenameFromUrl(fullUrl),\n      basename: basenameFromUrl(fullUrl),\n      kind: previewQuery.data?.kind === ThemeKind.Dark ? 'dark' : 'light',\n      pinned: true,\n    };\n\n    patchSettings({ themeRemoteFavorites: [...favorites, next] });\n  }, [\n    darkRemoteFullUrl,\n    favorites,\n    lightRemoteFullUrl,\n    manualRemoteFullUrl,\n    patchSettings,\n    previewQuery.data,\n  ]);\n\n  const applyManual = useCallback(() => {\n    const fullUrl = previewQuery.data?.fullUrl;\n    if (!fullUrl) return;\n    const kind = previewQuery.data?.kind === ThemeKind.Dark ? 'dark' : 'light';\n    patchSettings({ themeRemoteManualFullUrl: fullUrl, themeRemoteManualKind: kind });\n  }, [patchSettings, previewQuery.data]);\n\n  const applyLightSlot = useCallback(() => {\n    const fullUrl = previewQuery.data?.fullUrl;\n    if (!fullUrl) return;\n    const kind = previewQuery.data?.kind === ThemeKind.Dark ? 'dark' : 'light';\n    patchSettings({ themeRemoteLightFullUrl: fullUrl, themeRemoteLightKind: kind });\n  }, [patchSettings, previewQuery.data]);\n\n  const applyDarkSlot = useCallback(() => {\n    const fullUrl = previewQuery.data?.fullUrl;\n    if (!fullUrl) return;\n    const kind = previewQuery.data?.kind === ThemeKind.Dark ? 'dark' : 'light';\n    patchSettings({ themeRemoteDarkFullUrl: fullUrl, themeRemoteDarkKind: kind });\n  }, [patchSettings, previewQuery.data]);\n\n  const ensureFavorited = useCallback(async (): Promise<boolean> => {\n    const fullUrl = previewQuery.data?.fullUrl;\n    if (!fullUrl) return false;\n    if (favorites.some((f) => f.fullUrl === fullUrl)) return false;\n\n    const res = await fetch(fullUrl, { mode: 'cors' });\n    if (!mountedRef.current) return false;\n    if (!res.ok) return false;\n    const cssText = await res.text();\n    if (!mountedRef.current) return false;\n    await putCachedThemeCss(fullUrl, cssText);\n    if (!mountedRef.current) return false;\n\n    const next: ThemeRemoteFavorite = {\n      fullUrl,\n      displayName: previewQuery.data!.displayName,\n      basename: basenameFromUrl(fullUrl),\n      kind: previewQuery.data!.kind === ThemeKind.Dark ? 'dark' : 'light',\n      pinned: false,\n    };\n\n    patchSettings({ themeRemoteFavorites: [...favorites, next] });\n    return true;\n  }, [favorites, patchSettings, previewQuery.data]);\n\n  const snapshotAnd = useCallback(\n    async (fn: () => void, nextApplied: Partial<Settings>) => {\n      const current = store.get(settingsAtom);\n      if (\n        nextApplied.themeRemoteManualFullUrl &&\n        current.themeRemoteManualFullUrl === nextApplied.themeRemoteManualFullUrl\n      ) {\n        return;\n      }\n      if (\n        nextApplied.themeRemoteLightFullUrl &&\n        current.themeRemoteLightFullUrl === nextApplied.themeRemoteLightFullUrl\n      ) {\n        return;\n      }\n      if (\n        nextApplied.themeRemoteDarkFullUrl &&\n        current.themeRemoteDarkFullUrl === nextApplied.themeRemoteDarkFullUrl\n      ) {\n        return;\n      }\n      revertRef.current = {\n        themeId: current.themeId,\n        themeRemoteManualFullUrl: current.themeRemoteManualFullUrl,\n        themeRemoteManualKind: current.themeRemoteManualKind,\n        themeRemoteLightFullUrl: current.themeRemoteLightFullUrl,\n        themeRemoteLightKind: current.themeRemoteLightKind,\n        themeRemoteDarkFullUrl: current.themeRemoteDarkFullUrl,\n        themeRemoteDarkKind: current.themeRemoteDarkKind,\n      } satisfies Partial<Settings>;\n      setCanRevert(true);\n\n      if (!favoriteTouched) {\n        const added = await ensureFavorited();\n        if (!mountedRef.current) return;\n        lastAutoSavedUrlRef.current = added ? (previewQuery.data?.fullUrl ?? null) : null;\n      } else {\n        lastAutoSavedUrlRef.current = null;\n      }\n\n      fn();\n      if (!mountedRef.current) return;\n\n      const nextActive = [\n        nextApplied.themeRemoteManualFullUrl ?? manualRemoteFullUrl,\n        nextApplied.themeRemoteLightFullUrl ?? lightRemoteFullUrl,\n        nextApplied.themeRemoteDarkFullUrl ?? darkRemoteFullUrl,\n      ].filter((u): u is string => Boolean(u && u.trim().length > 0));\n\n      patchSettings({\n        themeRemoteFavorites: pruneThemeFavorites(\n          store.get(settingsAtom).themeRemoteFavorites,\n          nextActive\n        ),\n      });\n    },\n    [\n      ensureFavorited,\n      favoriteTouched,\n      lightRemoteFullUrl,\n      darkRemoteFullUrl,\n      manualRemoteFullUrl,\n      patchSettings,\n      previewQuery.data?.fullUrl,\n      store,\n    ]\n  );\n\n  const revert = useCallback(() => {\n    const syncFavoritesAfterRevert = (removeAutoSavedFullUrl: string | null) => {\n      const after = store.get(settingsAtom);\n      let favs = after.themeRemoteFavorites;\n      if (removeAutoSavedFullUrl) {\n        favs = favs.filter((f) => f.fullUrl !== removeAutoSavedFullUrl);\n      }\n      const nextActive = [\n        after.themeRemoteManualFullUrl,\n        after.themeRemoteLightFullUrl,\n        after.themeRemoteDarkFullUrl,\n      ].filter((u): u is string => Boolean(u && u.trim().length > 0));\n      patchSettings({\n        themeRemoteFavorites: pruneThemeFavorites(favs, nextActive),\n      });\n    };\n\n    const snap = revertRef.current;\n    if (snap) {\n      patchSettings(snap);\n      syncFavoritesAfterRevert(lastAutoSavedUrlRef.current);\n\n      revertRef.current = null;\n      lastAutoSavedUrlRef.current = null;\n      setCanRevert(false);\n      return;\n    }\n\n    const u = previewQuery.data?.fullUrl;\n    if (!u) return;\n    const partial: Partial<Settings> = {};\n    if (lightRemoteFullUrl === u) {\n      partial.themeRemoteLightFullUrl = undefined;\n      partial.themeRemoteLightKind = undefined;\n    }\n    if (darkRemoteFullUrl === u) {\n      partial.themeRemoteDarkFullUrl = undefined;\n      partial.themeRemoteDarkKind = undefined;\n    }\n    if (manualRemoteFullUrl === u) {\n      partial.themeRemoteManualFullUrl = undefined;\n      partial.themeRemoteManualKind = undefined;\n      partial.themeId = previewQuery.data?.kind === ThemeKind.Dark ? 'dark-theme' : 'light-theme';\n    }\n    if (Object.keys(partial).length === 0) return;\n    patchSettings(partial);\n    syncFavoritesAfterRevert(null);\n  }, [\n    darkRemoteFullUrl,\n    lightRemoteFullUrl,\n    manualRemoteFullUrl,\n    patchSettings,\n    previewQuery.data?.fullUrl,\n    previewQuery.data?.kind,\n    store,\n  ]);\n\n  if (!isEligibleUrl) return null;\n\n  if (!shouldAutoFetch && !userTriggeredLoad) {\n    return (\n      <SableChatPreviewPlaceholder\n        kind=\"theme\"\n        url={url}\n        hostLabel={themeUrlHostLabel(url, 'Unofficial theme')}\n        isApprovedHost={isOfficial}\n        onLoadPreview={() => {\n          setUserTriggeredLoad(true);\n        }}\n      />\n    );\n  }\n\n  const title = previewQuery.data?.displayName ?? 'Theme preview';\n  let kindLabel = 'Theme';\n  if (previewQuery.data?.kind === ThemeKind.Dark) kindLabel = 'Dark';\n  else if (previewQuery.data?.kind === ThemeKind.Light) kindLabel = 'Light';\n  const contrastLabel = previewQuery.data?.contrast ? `${previewQuery.data.contrast} contrast` : '';\n  const authorLabel = previewQuery.data?.author ? `by ${previewQuery.data.author}` : '';\n  const tagsLabel =\n    previewQuery.data?.tags && previewQuery.data.tags.length > 0\n      ? previewQuery.data.tags.join(', ')\n      : '';\n  const sourceLabel = isOfficial ? 'Official catalog' : themeUrlHostLabel(url, 'Unofficial theme');\n  const subtitleLine1 = [kindLabel, contrastLabel].filter(Boolean).join(' · ');\n  const subtitleLine2 = [authorLabel, tagsLabel].filter(Boolean).join(' · ');\n  const subtitle = (\n    <>\n      {subtitleLine1}\n      {subtitleLine2 ? (\n        <>\n          <br />\n          {subtitleLine2}\n        </>\n      ) : null}\n    </>\n  );\n  const fullUrl = previewQuery.data?.fullUrl;\n  const loadFullCssText = async (): Promise<string> => {\n    if (!fullUrl) throw new Error('Full theme URL is unavailable.');\n    const cached = await getCachedThemeCss(fullUrl);\n    if (cached) return cached;\n    const response = await fetch(fullUrl, { mode: 'cors' });\n    if (!response.ok) throw new Error(`Theme CSS fetch failed: ${response.status}`);\n    const text = await response.text();\n    await putCachedThemeCss(fullUrl, text);\n    return text;\n  };\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"300\"\n      style={{\n        width: '400px',\n        maxWidth: '100%',\n        flexShrink: 0,\n        boxSizing: 'border-box',\n      }}\n    >\n      <ThemePreviewCard\n        title={title}\n        subtitle={subtitle}\n        beforePreview={\n          showThirdPartyBanner ? (\n            <ThemeThirdPartyBanner hostLabel={themeUrlHostLabel(url, 'Unofficial theme')} />\n          ) : undefined\n        }\n        previewCssText={previewQuery.data?.previewText ?? ''}\n        loadFullCssText={fullUrl ? loadFullCssText : undefined}\n        scopeSlug={`chat-${basenameFromUrl(url)}`}\n        sourceLabel={sourceLabel}\n        copyText={url}\n        isFavorited={fullUrl ? isFav : false}\n        onToggleFavorite={fullUrl ? () => toggleFavorite() : undefined}\n        systemTheme={systemTheme}\n        onApplyLight={\n          systemTheme && fullUrl\n            ? () => snapshotAnd(() => applyLightSlot(), { themeRemoteLightFullUrl: fullUrl })\n            : undefined\n        }\n        onApplyDark={\n          systemTheme && fullUrl\n            ? () => snapshotAnd(() => applyDarkSlot(), { themeRemoteDarkFullUrl: fullUrl })\n            : undefined\n        }\n        onApplyManual={\n          !systemTheme && fullUrl\n            ? () => snapshotAnd(() => applyManual(), { themeRemoteManualFullUrl: fullUrl })\n            : undefined\n        }\n        isAppliedLight={fullUrl ? lightRemoteFullUrl === fullUrl : false}\n        isAppliedDark={fullUrl ? darkRemoteFullUrl === fullUrl : false}\n        isAppliedManual={fullUrl ? manualRemoteFullUrl === fullUrl : false}\n        canRevert={canRevertUi}\n        onRevert={revert}\n      />\n      {previewQuery.isPending && (\n        <Text size=\"T200\" priority=\"300\">\n          Loading preview…\n        </Text>\n      )}\n      {favoriteError && (\n        <Text size=\"T200\" priority=\"300\">\n          {favoriteError}\n        </Text>\n      )}\n    </Box>\n  );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { Box, IconButton, Spinner, Switch, Text, Tooltip, config, toRem } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { Check, Link, Star, Warning, sizedIcon } from '$components/icons/phosphor';\n\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { useTimeoutToggle } from '$hooks/useTimeoutToggle';\nimport { getCspNonce } from '$utils/cspNonce';\nimport { usePatchSettings } from '$features/settings/cosmetics/themeSettingsPatch';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom, type ThemeRemoteTweakFavorite } from '$state/settings';\nimport { copyToClipboard } from '$utils/dom';\nimport { putCachedThemeCss } from '../../theme/cache';\nimport { getSableCssPackageKind, parseSableTweakMetadata } from '../../theme/metadata';\nimport { isHttpsFullSableCssUrl } from '../../theme/previewUrls';\nimport { buildPreviewStyleBlock, extractSafePreviewCustomProperties } from '../../theme/previewCss';\nimport { isApprovedCatalogHostUrl, isThirdPartyThemeUrl } from '../../theme/themeApproval';\nimport { SableChatPreviewPlaceholder } from './SableChatPreviewPlaceholder';\nimport { ThemeThirdPartyBanner } from './ThemeThirdPartyBanner';\nimport { CssViewerButton } from '../theme/CssViewerButton';\nimport { pruneThemeTweakFavorites, themeUrlHostLabel } from '../../theme/themeLibrary';\nimport { fetch } from '$utils/fetch';\n\nfunction basenameFromFullSableUrl(url: string): string {\n  const tail = url.split('/').pop() ?? url;\n  return tail.replace(/\\.sable\\.css(\\?.*)?$/i, '') || 'tweak';\n}\n\nfunction safeSlug(input: string): string {\n  return (input || 'tweak').replace(/[^a-zA-Z0-9_-]/g, '-') || 'tweak';\n}\n\ntype TweakPreviewData = {\n  cssText: string;\n  displayName: string;\n  description?: string;\n  author?: string;\n  tags: string[];\n  basename: string;\n};\n\nexport function TweakPreviewUrlCard({ url }: { url: string }) {\n  const clientConfig = useClientConfig();\n  const patchSettings = usePatchSettings();\n  const mountedRef = useRef(true);\n\n  useEffect(() => {\n    mountedRef.current = true;\n    return () => {\n      mountedRef.current = false;\n    };\n  }, []);\n\n  const [autoPreviewApproved] = useSetting(settingsAtom, 'themeChatAutoPreviewApprovedUrls');\n  const [autoPreviewAny] = useSetting(settingsAtom, 'themeChatAutoPreviewAnyUrl');\n  const [tweakFavorites] = useSetting(settingsAtom, 'themeRemoteTweakFavorites');\n  const [enabledTweakFullUrls] = useSetting(settingsAtom, 'themeRemoteEnabledTweakFullUrls');\n\n  const [copied, setCopied] = useTimeoutToggle();\n\n  const isEligibleUrl = useMemo(() => isHttpsFullSableCssUrl(url), [url]);\n\n  const prefixes = clientConfig.themeCatalogApprovedHostPrefixes;\n\n  const isOfficial = useMemo(() => isApprovedCatalogHostUrl(url, prefixes), [prefixes, url]);\n\n  const shouldAutoFetch = useMemo(\n    () => (isOfficial && autoPreviewApproved) || (!isOfficial && autoPreviewAny),\n    [isOfficial, autoPreviewApproved, autoPreviewAny]\n  );\n\n  const [userTriggeredLoad, setUserTriggeredLoad] = useState(false);\n\n  useEffect(() => {\n    setUserTriggeredLoad(false);\n  }, [url]);\n\n  const fetchEnabled = useMemo(\n    () => isEligibleUrl && (shouldAutoFetch || userTriggeredLoad),\n    [isEligibleUrl, shouldAutoFetch, userTriggeredLoad]\n  );\n\n  const showThirdPartyBanner = useMemo(\n    () => !isApprovedCatalogHostUrl(url, prefixes),\n    [prefixes, url]\n  );\n\n  const tweakPreviewQuery = useQuery({\n    queryKey: ['tweak-preview-embed', url],\n    enabled: fetchEnabled,\n    staleTime: 10 * 60_000,\n    queryFn: async (): Promise<TweakPreviewData | null> => {\n      const res = await fetch(url, { mode: 'cors' });\n      if (!res.ok) throw new Error(`tweak fetch failed: ${res.status}`);\n      const cssText = await res.text();\n      if (getSableCssPackageKind(cssText) !== 'tweak') return null;\n      const meta = parseSableTweakMetadata(cssText);\n      const basename = meta.id?.trim() || basenameFromFullSableUrl(url);\n      return {\n        cssText,\n        displayName: meta.name?.trim() || basenameFromFullSableUrl(url),\n        description: meta.description?.trim() || undefined,\n        author: meta.author?.trim() || undefined,\n        tags: meta.tags ?? [],\n        basename,\n      };\n    },\n  });\n\n  const { data } = tweakPreviewQuery;\n\n  const scopeClass = useMemo(() => `sable-tweak-preview--${safeSlug(url)}`, [url]);\n\n  const styleBlock = useMemo(() => {\n    if (!data?.cssText) return '';\n    const vars = extractSafePreviewCustomProperties(data.cssText);\n    return buildPreviewStyleBlock(vars, scopeClass);\n  }, [data?.cssText, scopeClass]);\n\n  const handleCopy = useCallback(async () => {\n    if (await copyToClipboard(url)) setCopied();\n  }, [setCopied, url]);\n\n  const toggleFavorite = useCallback(async () => {\n    if (!data) return;\n    const existing = tweakFavorites.find((f) => f.fullUrl === url);\n    if (existing) {\n      const nextFavs = tweakFavorites.filter((f) => f.fullUrl !== url);\n      const nextEnabled = enabledTweakFullUrls.filter((u) => u !== url);\n      patchSettings({\n        themeRemoteTweakFavorites: pruneThemeTweakFavorites(nextFavs, nextEnabled),\n        themeRemoteEnabledTweakFullUrls: nextEnabled,\n      });\n      return;\n    }\n    await putCachedThemeCss(url, data.cssText);\n    if (!mountedRef.current) return;\n    const next: ThemeRemoteTweakFavorite = {\n      fullUrl: url,\n      displayName: data.displayName,\n      basename: data.basename,\n      pinned: true,\n    };\n    patchSettings({\n      themeRemoteTweakFavorites: pruneThemeTweakFavorites(\n        [...tweakFavorites, next],\n        enabledTweakFullUrls\n      ),\n    });\n  }, [data, enabledTweakFullUrls, patchSettings, tweakFavorites, url]);\n\n  const setTweakEnabled = useCallback(\n    async (apply: boolean) => {\n      if (!data) return;\n      if (apply) {\n        await putCachedThemeCss(url, data.cssText);\n        if (!mountedRef.current) return;\n        const nextEnabled = enabledTweakFullUrls.includes(url)\n          ? [...enabledTweakFullUrls]\n          : [...enabledTweakFullUrls, url];\n        const nextFavs = [...tweakFavorites];\n        if (!nextFavs.some((f) => f.fullUrl === url)) {\n          nextFavs.push({\n            fullUrl: url,\n            displayName: data.displayName,\n            basename: data.basename,\n            pinned: false,\n          });\n        }\n        patchSettings({\n          themeRemoteEnabledTweakFullUrls: nextEnabled,\n          themeRemoteTweakFavorites: pruneThemeTweakFavorites(nextFavs, nextEnabled),\n        });\n      } else {\n        const nextEnabled = enabledTweakFullUrls.filter((u) => u !== url);\n        patchSettings({\n          themeRemoteEnabledTweakFullUrls: nextEnabled,\n        });\n      }\n    },\n    [data, enabledTweakFullUrls, patchSettings, tweakFavorites, url]\n  );\n\n  if (!isEligibleUrl) return null;\n\n  if (!shouldAutoFetch && !userTriggeredLoad) {\n    return (\n      <SableChatPreviewPlaceholder\n        kind=\"tweak\"\n        url={url}\n        hostLabel={themeUrlHostLabel(url, 'Unofficial tweak')}\n        isApprovedHost={isOfficial}\n        onLoadPreview={() => {\n          setUserTriggeredLoad(true);\n        }}\n      />\n    );\n  }\n\n  if (tweakPreviewQuery.isPending) {\n    return (\n      <Box\n        direction=\"Column\"\n        gap=\"200\"\n        style={{\n          width: '400px',\n          maxWidth: '100%',\n          flexShrink: 0,\n          boxSizing: 'border-box',\n        }}\n      >\n        <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\">\n          <Spinner variant=\"Primary\" size=\"400\" />\n          <Text size=\"T300\">Loading tweak…</Text>\n        </Box>\n      </Box>\n    );\n  }\n\n  if (tweakPreviewQuery.isError || data === null || data === undefined) {\n    return null;\n  }\n\n  const isFav = tweakFavorites.some((f) => f.fullUrl === url);\n  const isOn = enabledTweakFullUrls.includes(url);\n  const thirdPartyIcon = isThirdPartyThemeUrl(url, clientConfig.themeCatalogApprovedHostPrefixes);\n\n  const descParts = [\n    data.description,\n    data.author ? `by ${data.author}` : '',\n    data.tags.length > 0 ? data.tags.join(', ') : '',\n  ].filter(Boolean);\n  const descLine = descParts.join(' · ');\n  const sourceLabel = isOfficial ? 'Official catalog' : themeUrlHostLabel(url, 'Unofficial tweak');\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"300\"\n      style={{\n        width: '400px',\n        maxWidth: '100%',\n        flexShrink: 0,\n        boxSizing: 'border-box',\n        padding: toRem(12),\n        borderRadius: config.radii.R300,\n        border: `${toRem(1)} solid var(--sable-surface-container-line)`,\n        background: 'var(--sable-surface-container)',\n      }}\n    >\n      <Box direction=\"Row\" alignItems=\"Start\" justifyContent=\"SpaceBetween\" gap=\"200\">\n        <Box direction=\"Column\" gap=\"100\" grow=\"Yes\" style={{ minWidth: 0 }}>\n          <Box direction=\"Row\" gap=\"100\" alignItems=\"Center\" wrap=\"Wrap\">\n            <Text size=\"H6\">{data.displayName}</Text>\n            {thirdPartyIcon && (\n              <TooltipProvider\n                position=\"Top\"\n                tooltip={\n                  <Tooltip style={{ maxWidth: toRem(280) }}>\n                    <Text size=\"T200\">Third-party tweak. Only enable CSS you trust.</Text>\n                  </Tooltip>\n                }\n              >\n                {(triggerRef) => (\n                  <span\n                    ref={triggerRef}\n                    aria-label=\"Third-party tweak\"\n                    style={{\n                      color: 'var(--sable-warn-on-container)',\n                      flexShrink: 0,\n                      display: 'inline-flex',\n                    }}\n                  >\n                    {sizedIcon(Warning, '100', { filled: true })}\n                  </span>\n                )}\n              </TooltipProvider>\n            )}\n          </Box>\n          {descLine ? (\n            <Text size=\"T200\" priority=\"300\" style={{ wordBreak: 'break-word' }}>\n              {descLine}\n            </Text>\n          ) : null}\n          <Text size=\"T200\" priority=\"300\">\n            {sourceLabel}\n          </Text>\n        </Box>\n\n        <Box direction=\"Row\" gap=\"100\" alignItems=\"Center\" shrink=\"No\">\n          <CssViewerButton\n            title={`${data.displayName} — CSS`}\n            cssText={data.cssText}\n            ariaLabel=\"View tweak CSS\"\n          />\n          <IconButton\n            size=\"300\"\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            outlined\n            radii=\"300\"\n            aria-label={copied ? 'Copied tweak link' : 'Copy tweak link'}\n            onClick={() => {\n              handleCopy().catch(() => undefined);\n            }}\n          >\n            {sizedIcon(copied ? Check : Link, '200')}\n          </IconButton>\n          <IconButton\n            size=\"300\"\n            variant={isFav ? 'Primary' : 'Secondary'}\n            fill=\"Soft\"\n            outlined\n            radii=\"300\"\n            aria-label={isFav ? 'Remove tweak from saved' : 'Save tweak'}\n            onClick={() => {\n              toggleFavorite().catch(() => undefined);\n            }}\n          >\n            {sizedIcon(Star, '200', { filled: isFav })}\n          </IconButton>\n          <Switch\n            variant=\"Primary\"\n            value={isOn}\n            onChange={(v) => {\n              setTweakEnabled(v).catch(() => undefined);\n            }}\n          />\n        </Box>\n      </Box>\n\n      {showThirdPartyBanner ? (\n        <ThemeThirdPartyBanner\n          kind=\"tweak\"\n          hostLabel={themeUrlHostLabel(url, 'Unofficial tweak')}\n        />\n      ) : undefined}\n\n      {styleBlock ? (\n        <>\n          <style nonce={getCspNonce()}>{styleBlock}</style>\n          <Box\n            className={scopeClass}\n            direction=\"Column\"\n            gap=\"200\"\n            style={{\n              padding: toRem(12),\n              borderRadius: config.radii.R300,\n              background: 'var(--sable-bg-container)',\n              border: `${toRem(1)} solid var(--sable-surface-container-line)`,\n            }}\n          >\n            <Text size=\"T300\" style={{ color: 'var(--sable-bg-on-container)' }}>\n              Sample text\n            </Text>\n            <Box direction=\"Row\" gap=\"200\" wrap=\"Wrap\">\n              <span\n                style={{\n                  display: 'inline-flex',\n                  alignItems: 'center',\n                  padding: `${toRem(6)} ${toRem(12)}`,\n                  borderRadius: config.radii.Pill,\n                  background: 'var(--sable-primary-main)',\n                  color: 'var(--sable-primary-on-main)',\n                  fontSize: toRem(12),\n                  fontWeight: 500,\n                }}\n              >\n                Primary\n              </span>\n              <span\n                style={{\n                  display: 'inline-flex',\n                  alignItems: 'center',\n                  padding: `${toRem(6)} ${toRem(12)}`,\n                  borderRadius: config.radii.Pill,\n                  background: 'var(--sable-surface-container)',\n                  color: 'var(--sable-surface-on-container)',\n                  fontSize: toRem(12),\n                  fontWeight: 500,\n                }}\n              >\n                Surface\n              </span>\n            </Box>\n          </Box>\n        </>\n      ) : null}\n    </Box>\n  );\n}\n","import { useCallback } from 'react';\nimport type * as PdfJsDist from 'pdfjs-dist';\nimport type {\n  DocumentInitParameters,\n  GetViewportParameters,\n} from 'pdfjs-dist/types/src/display/api';\nimport { useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { trimTrailingSlash } from '$utils/common';\n\nexport const usePdfJSLoader = () =>\n  useAsyncCallback(\n    useCallback(async () => {\n      const pdf = await import('pdfjs-dist');\n      pdf.GlobalWorkerOptions.workerSrc = `${trimTrailingSlash(\n        import.meta.env.BASE_URL\n      )}/pdf.worker.min.js`;\n      return pdf;\n    }, [])\n  );\n\nexport const usePdfDocumentLoader = (pdfJS: typeof PdfJsDist | undefined, src: string) =>\n  useAsyncCallback(\n    useCallback(async () => {\n      if (!pdfJS) {\n        throw new Error('PdfJS is not loaded');\n      }\n      const doc = await pdfJS.getDocument({\n        url: src,\n        enableScripting: false,\n      } as DocumentInitParameters & { enableScripting: false }).promise;\n      return doc;\n    }, [pdfJS, src])\n  );\n\nexport const createPage = async (\n  doc: PdfJsDist.PDFDocumentProxy,\n  pNo: number,\n  opts: GetViewportParameters\n): Promise<HTMLCanvasElement> => {\n  const page = await doc.getPage(pNo);\n  const pageViewport = page.getViewport(opts);\n  const canvas = document.createElement('canvas');\n  const context = canvas.getContext('2d');\n\n  if (!context) throw new Error('failed to render page.');\n\n  canvas.width = pageViewport.width;\n  canvas.height = pageViewport.height;\n\n  await page.render({\n    canvas,\n    canvasContext: context,\n    viewport: pageViewport,\n  }).promise;\n\n  return canvas;\n};\n","import type { FormEventHandler, MouseEventHandler } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport type { RectCords } from 'folds';\nimport {\n  Box,\n  Button,\n  Chip,\n  Header,\n  IconButton,\n  Input,\n  Menu,\n  Scroll,\n  Spinner,\n  Text,\n  as,\n  config,\n} from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport {\n  ArrowLeft,\n  CaretLeft,\n  CaretRight,\n  Download,\n  Minus,\n  Plus,\n  Warning,\n  sizedIcon,\n} from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport { getDownloadFilename, saveFileToDevice } from '$utils/download';\nimport { AsyncStatus } from '$hooks/useAsyncCallback';\nimport { useImageGestures } from '$hooks/useImageGestures';\nimport { createPage, usePdfDocumentLoader, usePdfJSLoader } from '$plugins/pdfjs-dist';\nimport { stopPropagation } from '$utils/keyboard';\nimport * as css from './PdfViewer.css';\n\nexport type PdfViewerProps = {\n  name: string;\n  src: string;\n  requestClose: () => void;\n};\n\nexport const PdfViewer = as<'div', PdfViewerProps>(\n  ({ className, name, src, requestClose, ...props }, ref) => {\n    const containerRef = useRef<HTMLDivElement>(null);\n    const scrollRef = useRef<HTMLDivElement>(null);\n\n    const {\n      transforms: { zoom },\n      zoomIn,\n      zoomOut,\n      setZoom,\n      onPointerDown,\n    } = useImageGestures(true, 0.2, 0.1, 5);\n\n    const [pdfJSState, loadPdfJS] = usePdfJSLoader();\n    const [docState, loadPdfDocument] = usePdfDocumentLoader(\n      pdfJSState.status === AsyncStatus.Success ? pdfJSState.data : undefined,\n      src\n    );\n    const isLoading =\n      pdfJSState.status === AsyncStatus.Loading || docState.status === AsyncStatus.Loading;\n    const [renderError, setRenderError] = useState(false);\n    const isError =\n      pdfJSState.status === AsyncStatus.Error ||\n      docState.status === AsyncStatus.Error ||\n      renderError;\n    const [pageNo, setPageNo] = useState(1);\n    const [jumpAnchor, setJumpAnchor] = useState<RectCords>();\n\n    useEffect(() => {\n      loadPdfJS();\n    }, [loadPdfJS]);\n    useEffect(() => {\n      if (pdfJSState.status === AsyncStatus.Success) {\n        loadPdfDocument();\n      }\n    }, [pdfJSState, loadPdfDocument]);\n\n    useEffect(() => {\n      if (docState.status !== AsyncStatus.Success) return undefined;\n      const doc = docState.data;\n      if (pageNo < 0 || pageNo > doc.numPages) return undefined;\n      let cancelled = false;\n      setRenderError(false);\n      createPage(doc, pageNo, { scale: zoom })\n        .then((canvas) => {\n          if (cancelled) return;\n          const container = containerRef.current;\n          if (!container) return;\n          container.textContent = '';\n          container.append(canvas);\n          canvas.style.touchAction = 'pan-x pan-y';\n        })\n        .catch(() => {\n          if (!cancelled) setRenderError(true);\n        });\n      return () => {\n        cancelled = true;\n      };\n    }, [docState, pageNo, zoom]);\n\n    const handleDownload = () => {\n      void saveFileToDevice(src, getDownloadFilename(name, undefined, 'document.pdf'));\n    };\n\n    const handleJumpSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n      evt.preventDefault();\n      if (docState.status !== AsyncStatus.Success) return;\n      const jumpInput = evt.currentTarget.jumpInput as HTMLInputElement;\n      if (!jumpInput) return;\n      const jumpTo = Number.parseInt(jumpInput.value, 10);\n      setPageNo(Math.max(1, Math.min(docState.data.numPages, jumpTo)));\n      setJumpAnchor(undefined);\n    };\n\n    const handlePrevPage = () => {\n      setPageNo((n) => Math.max(n - 1, 1));\n    };\n\n    const handleNextPage = () => {\n      if (docState.status !== AsyncStatus.Success) return;\n      setPageNo((n) => Math.min(n + 1, docState.data.numPages));\n    };\n\n    const handleOpenJump: MouseEventHandler<HTMLButtonElement> = (evt) => {\n      setJumpAnchor(evt.currentTarget.getBoundingClientRect());\n    };\n\n    return (\n      <Box\n        className={classNames(css.PdfViewer, className)}\n        direction=\"Column\"\n        data-gestures=\"ignore\"\n        onPointerDown={(e) => e.stopPropagation()}\n        {...props}\n        ref={ref}\n      >\n        <Header className={css.PdfViewerHeader} size=\"400\">\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            <IconButton size=\"300\" radii=\"300\" onClick={requestClose}>\n              {sizedIcon(ArrowLeft, '50')}\n            </IconButton>\n            <Text size=\"T300\" truncate>\n              {name}\n            </Text>\n          </Box>\n          <Box shrink=\"No\" alignItems=\"Center\" gap=\"200\">\n            <IconButton\n              variant={zoom < 1 ? 'Success' : 'SurfaceVariant'}\n              outlined={zoom < 1}\n              size=\"300\"\n              radii=\"Pill\"\n              onClick={zoomOut}\n              aria-label=\"Zoom Out\"\n            >\n              {sizedIcon(Minus, '50')}\n            </IconButton>\n            <Chip variant=\"SurfaceVariant\" radii=\"Pill\" onClick={() => setZoom(zoom === 1 ? 2 : 1)}>\n              <Text size=\"B300\">{Math.round(zoom * 100)}%</Text>\n            </Chip>\n            <IconButton\n              variant={zoom > 1 ? 'Success' : 'SurfaceVariant'}\n              outlined={zoom > 1}\n              size=\"300\"\n              radii=\"Pill\"\n              onClick={zoomIn}\n              aria-label=\"Zoom In\"\n            >\n              {sizedIcon(Plus, '50')}\n            </IconButton>\n            <Chip\n              variant=\"Primary\"\n              onClick={handleDownload}\n              radii=\"300\"\n              before={sizedIcon(Download, '50')}\n            >\n              <Text size=\"B300\">Download</Text>\n            </Chip>\n          </Box>\n        </Header>\n        <Box direction=\"Column\" grow=\"Yes\" alignItems=\"Center\" justifyContent=\"Center\" gap=\"200\">\n          {isLoading && <Spinner variant=\"Secondary\" size=\"600\" />}\n          {isError && (\n            <>\n              <Text>Failed to load PDF</Text>\n              <Button\n                variant=\"Critical\"\n                fill=\"Soft\"\n                size=\"300\"\n                radii=\"300\"\n                before={sizedIcon(Warning, '50')}\n                onClick={loadPdfJS}\n              >\n                <Text size=\"B300\">Retry</Text>\n              </Button>\n            </>\n          )}\n          {docState.status === AsyncStatus.Success && !renderError && (\n            <Scroll\n              ref={scrollRef}\n              size=\"300\"\n              direction=\"Both\"\n              variant=\"Surface\"\n              visibility=\"Hover\"\n              style={{\n                width: '100%',\n                height: '100%',\n                touchAction: 'pan-x pan-y',\n              }}\n            >\n              <Box style={{ minWidth: '100%', minHeight: '100%' }} onPointerDown={onPointerDown}>\n                <div className={css.PdfViewerContent} ref={containerRef} />\n              </Box>\n            </Scroll>\n          )}\n        </Box>\n        {docState.status === AsyncStatus.Success && (\n          <Header as=\"footer\" className={css.PdfViewerFooter} size=\"400\">\n            <Chip\n              variant=\"Secondary\"\n              radii=\"300\"\n              before={sizedIcon(CaretLeft, '50')}\n              onClick={handlePrevPage}\n              aria-disabled={pageNo <= 1}\n            >\n              <Text size=\"B300\">Previous</Text>\n            </Chip>\n            <Box grow=\"Yes\" justifyContent=\"Center\" alignItems=\"Center\" gap=\"200\">\n              <PopOut\n                anchor={jumpAnchor}\n                align=\"Center\"\n                position=\"Top\"\n                content={\n                  <FocusTrap\n                    focusTrapOptions={{\n                      initialFocus: false,\n                      onDeactivate: () => setJumpAnchor(undefined),\n                      clickOutsideDeactivates: true,\n                      escapeDeactivates: stopPropagation,\n                    }}\n                  >\n                    <Menu variant=\"Surface\">\n                      <Box\n                        as=\"form\"\n                        onSubmit={handleJumpSubmit}\n                        style={{ padding: config.space.S200 }}\n                        direction=\"Column\"\n                        gap=\"200\"\n                      >\n                        <Input\n                          name=\"jumpInput\"\n                          size=\"300\"\n                          variant=\"Background\"\n                          defaultValue={pageNo}\n                          min={1}\n                          max={docState.data.numPages}\n                          step={1}\n                          outlined\n                          type=\"number\"\n                          radii=\"300\"\n                          aria-label=\"Page Number\"\n                        />\n                        <Button type=\"submit\" size=\"300\" variant=\"Primary\" radii=\"300\">\n                          <Text size=\"B300\">Jump To Page</Text>\n                        </Button>\n                      </Box>\n                    </Menu>\n                  </FocusTrap>\n                }\n              >\n                <Chip\n                  onClick={handleOpenJump}\n                  variant=\"SurfaceVariant\"\n                  radii=\"300\"\n                  aria-pressed={jumpAnchor !== undefined}\n                >\n                  <Text size=\"B300\">{`${pageNo}/${docState.data.numPages}`}</Text>\n                </Chip>\n              </PopOut>\n            </Box>\n            <Chip\n              variant=\"Primary\"\n              radii=\"300\"\n              after={sizedIcon(CaretRight, '50')}\n              onClick={handleNextPage}\n              aria-disabled={pageNo >= docState.data.numPages}\n            >\n              <Text size=\"B300\">Next</Text>\n            </Chip>\n          </Header>\n        )}\n      </Box>\n    );\n  }\n);\n","// rendering for cute events (e.g. hug, cuddle, etc.)\n\nimport { MessageTextBody } from './layout';\n\nexport enum CuteEventType {\n  Hug = 'hug',\n  Cuddle = 'cuddle',\n  Wave = 'wave',\n  Poke = 'poke',\n  Headpat = 'headpat',\n  // currently unused, but could be added in the future if there's demand for it\n  Kiss = 'kiss',\n}\n\ntype MCuteEventProps = {\n  // Content is only used to check if the event is valid, the actual text is generated based on the type and mentioned users\n  content: string | undefined;\n  // The type of cute event (e.g. hug, cuddle, etc.)\n  type: CuteEventType;\n  // The user IDs mentioned in the event (e.g. the target of the hug/cuddle/etc.)\n  mentionedUserIds?: string[];\n};\n\nexport function MCuteEvent({ content, type, mentionedUserIds }: MCuteEventProps) {\n  if (!content) return null;\n\n  let cuteText = '';\n  switch (type) {\n    case CuteEventType.Hug:\n      cuteText = `hugs ${mentionedUserIds?.[0] || 'you'}`;\n      break;\n    case CuteEventType.Cuddle:\n      cuteText = `cuddles ${mentionedUserIds?.[0] || 'you'}`;\n      break;\n    case CuteEventType.Kiss:\n      // in here for future expansion\n      // would need some kind of filtering to prevent abuse (e.g. someone sending a kiss event to a random user to harass them)\n      // cuteText = `kisses ${mentionedUserIds?.[0] || 'you'}`;\n      cuteText =\n        'currently disabled kiss event, in light of potential abuse, may be added in the future with proper filtering';\n      break;\n    case CuteEventType.Wave:\n      cuteText = `waves at ${mentionedUserIds?.[0] || 'you'}`;\n      break;\n    case CuteEventType.Poke:\n      cuteText = `pokes ${mentionedUserIds?.[0] || 'you'}`;\n      break;\n    case CuteEventType.Headpat:\n      cuteText = `gives headpats to ${mentionedUserIds?.[0] || 'you'}`;\n      break;\n    default:\n      cuteText = `sends ${mentionedUserIds?.[0] || 'you'} a cute event`;\n  }\n\n  return (\n    <MessageTextBody notice>\n      <em data-cute-event data-cute-type={type}>\n        {cuteText}\n      </em>\n    </MessageTextBody>\n  );\n}\n","import { createContext, useContext } from 'react';\nimport { type SettingsSectionId } from './routes';\n\ntype SettingsLinkContextValue = {\n  section: SettingsSectionId;\n  baseUrl: string;\n};\n\nconst SettingsLinkContext = createContext<SettingsLinkContextValue | null>(null);\n\nexport const SettingsLinkProvider = SettingsLinkContext.Provider;\n\nexport const useSettingsLinkContext = (): SettingsLinkContextValue | null =>\n  useContext(SettingsLinkContext);\n\nexport type { SettingsLinkContextValue };\n","import type { ReactNode } from 'react';\nimport { Box, IconButton, Text } from 'folds';\nimport { Check, Link, sizedIcon } from '$components/icons/phosphor';\nimport { BreakWord } from '$styles/Text.css';\nimport { buildSettingsLink } from '$features/settings/settingsLink';\nimport { copyToClipboard } from '$utils/dom';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { useTimeoutToggle } from '$hooks/useTimeoutToggle';\nimport { useSettingsLinkContext } from '$features/settings/SettingsLinkContext';\nimport { type SettingsSectionId } from '$features/settings/routes';\nimport {\n  settingTileSettingLinkAction,\n  settingTileSettingLinkActionDesktopHidden,\n  settingTileSettingLinkActionMobileVisible,\n  settingTileSettingLinkActionTransparentBackground,\n  settingTileRoot,\n  settingTileMain,\n  settingTileTrailing,\n  settingTileTitleRow,\n} from './SettingTile.css';\n\ntype SettingTileProps = {\n  focusId?: string;\n  showSettingLinkAction?: boolean;\n  className?: string;\n  title?: ReactNode;\n  description?: ReactNode;\n  before?: ReactNode;\n  after?: ReactNode;\n  children?: ReactNode;\n};\n\nfunction SettingTileSettingLinkAction({\n  baseUrl,\n  section,\n  focusId,\n}: {\n  baseUrl: string;\n  section: SettingsSectionId;\n  focusId: string;\n}) {\n  const screenSize = useScreenSizeContext();\n  const [copied, setCopied] = useTimeoutToggle();\n  const copyPath = buildSettingsLink(baseUrl, section, focusId);\n\n  return (\n    <IconButton\n      aria-label={copied ? 'Copied settings link' : 'Copy settings link'}\n      className={[\n        settingTileSettingLinkAction,\n        settingTileSettingLinkActionTransparentBackground,\n        screenSize === ScreenSize.Desktop\n          ? settingTileSettingLinkActionDesktopHidden\n          : settingTileSettingLinkActionMobileVisible,\n      ].join(' ')}\n      onClick={async () => {\n        if (await copyToClipboard(copyPath)) setCopied();\n      }}\n      size=\"300\"\n      variant=\"Surface\"\n      fill=\"None\"\n      radii=\"Inherit\"\n    >\n      {sizedIcon(copied ? Check : Link, '50')}\n    </IconButton>\n  );\n}\n\nexport function SettingTile({\n  focusId,\n  showSettingLinkAction = true,\n  className,\n  title,\n  description,\n  before,\n  after,\n  children,\n}: SettingTileProps) {\n  const settingsLink = useSettingsLinkContext();\n  const copyAction =\n    settingsLink && focusId && showSettingLinkAction ? (\n      <SettingTileSettingLinkAction\n        baseUrl={settingsLink.baseUrl}\n        section={settingsLink.section}\n        focusId={focusId}\n      />\n    ) : null;\n  const titleAction = title ? copyAction : null;\n  const trailingCopyAction = title ? null : copyAction;\n\n  const trailing =\n    after || trailingCopyAction ? (\n      <Box className={settingTileTrailing} shrink=\"No\" alignItems=\"Center\" gap=\"200\">\n        {after}\n        {trailingCopyAction}\n      </Box>\n    ) : null;\n\n  return (\n    <Box\n      id={focusId}\n      data-settings-focus={focusId}\n      className={[settingTileRoot, className].filter(Boolean).join(' ')}\n      alignItems=\"Center\"\n      gap=\"300\"\n    >\n      {before && <Box shrink=\"No\">{before}</Box>}\n      <Box className={settingTileMain} grow=\"Yes\" direction=\"Column\" gap=\"100\">\n        {title && (\n          <Box\n            data-setting-tile-title-row=\"true\"\n            className={settingTileTitleRow}\n            alignItems=\"Center\"\n            gap=\"100\"\n          >\n            <Text className={BreakWord} size=\"T300\">\n              {title}\n            </Text>\n            {titleAction}\n          </Box>\n        )}\n        {description && (\n          <Text className={BreakWord} size=\"T200\" priority=\"300\">\n            {description}\n          </Text>\n        )}\n        {children}\n      </Box>\n      {trailing}\n    </Box>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Switch } from 'folds';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from './SettingTile';\n\ntype SettingToggleProps = {\n  title: string;\n  focusId: string;\n  description?: ReactNode;\n  value: boolean;\n  onChange: (value: boolean) => void;\n  disabled?: boolean;\n  switchVariant?: 'Primary' | 'Secondary';\n  ariaLabel?: string;\n  switchTitle?: string;\n};\n\nexport function SettingToggle({\n  title,\n  focusId,\n  description,\n  value,\n  onChange,\n  disabled,\n  switchVariant,\n  ariaLabel,\n  switchTitle,\n}: SettingToggleProps) {\n  return (\n    <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n      <SettingTile\n        title={title}\n        focusId={focusId}\n        description={description}\n        after={\n          <Switch\n            variant={switchVariant ?? 'Primary'}\n            value={value}\n            onChange={onChange}\n            disabled={disabled}\n            aria-label={ariaLabel ?? focusId}\n            title={switchTitle}\n          />\n        }\n      />\n    </SequenceCard>\n  );\n}\n","import {\n  Dialog,\n  Header,\n  Box,\n  Text,\n  IconButton,\n  Button,\n  Input,\n  Chip,\n  Switch,\n  color,\n  Scroll,\n} from 'folds';\nimport { chipIcon, composerIcon, ListBullets, Minus, X } from '$components/icons/phosphor';\nimport type { ChangeEventHandler, KeyboardEventHandler } from 'react';\nimport { useCallback, useRef, useState } from 'react';\nimport type { PollAnswerItem } from '$components/message/PollEvent';\nimport { randomStr } from '$utils/common';\nimport { SettingTile } from '$components/setting-tile';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport type { IContent } from 'matrix-js-sdk';\nimport {\n  M_POLL_KIND_DISCLOSED,\n  M_POLL_KIND_UNDISCLOSED,\n  M_POLL_START,\n  M_TEXT,\n} from 'matrix-js-sdk';\nimport { MsgType } from '$types/matrix-sdk';\nimport { isKeyHotkey } from 'is-hotkey';\nimport * as css from './PollDialog.css';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\ntype PollDialogProps = {\n  onCancel: () => void;\n  onSubmit: (content: IContent) => Promise<void>;\n};\n\ntype ErrorProps = {\n  errorcode: 'title' | 'option' | 'maxOptions';\n  errorString: string;\n};\n\nexport function PollDialog({ onCancel, onSubmit }: PollDialogProps) {\n  const [isDisclosed, setIsDisclosed] = useState(true);\n  const [maxSelections, setMaxSelections] = useState(1);\n  const [inputValue, setInputValue] = useState(1);\n  const title = useRef<string>('');\n  const [error, setError] = useState<ErrorProps | undefined>(undefined);\n  const [submitError, setSubmitError] = useState<string | undefined>(undefined);\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const [answers, setAnswers] = useState<PollAnswerItem[]>([\n    {\n      id: randomStr(),\n      [M_TEXT.name]: '',\n    },\n    {\n      id: randomStr(),\n      [M_TEXT.name]: '',\n    },\n  ]);\n  const addOption = useCallback(() => {\n    if (maxSelections === answers.length) {\n      setMaxSelections(maxSelections + 1);\n      setInputValue(maxSelections + 1);\n    }\n    setAnswers([\n      ...answers,\n      {\n        id: randomStr(),\n        [M_TEXT.name]: '',\n      },\n    ]);\n  }, [answers, setAnswers, maxSelections, setMaxSelections]);\n  const delOption = useCallback(\n    (id: string) => {\n      if (answers.length > 2) {\n        if (maxSelections === answers.length) {\n          setMaxSelections(maxSelections - 1);\n          setInputValue(maxSelections - 1);\n        }\n        setAnswers(answers.filter((answer) => answer.id !== id));\n      }\n    },\n    [answers, setAnswers, maxSelections, setMaxSelections]\n  );\n\n  const handleSubmit = async () => {\n    if (isSubmitting) return;\n    if (title.current.length === 0) {\n      setError({ errorcode: 'title', errorString: 'Missing Title' });\n      return;\n    }\n    const emptyAnswers = answers.filter((item) => item['org.matrix.msc1767.text'].length === 0);\n    if (emptyAnswers.length > 0) {\n      setError({\n        errorcode: 'option',\n        errorString: `Missing option text${emptyAnswers.length > 1 ? 's' : ''}`,\n      });\n      return;\n    }\n    if (maxSelections < 1 || maxSelections > answers.length) {\n      setError({\n        errorcode: 'maxOptions',\n        errorString: `You can only have between 1 and ${answers.length} selections`,\n      });\n      return;\n    }\n    // its an IContent instead of the proper object because the proper object doesnt work w other clients :>\n    const pollContent: IContent = {\n      [M_POLL_START.name]: {\n        question: {\n          [M_TEXT.name]: title.current,\n          body: title.current,\n          msgtype: MsgType.Text,\n        },\n        kind: isDisclosed ? M_POLL_KIND_DISCLOSED.name : M_POLL_KIND_UNDISCLOSED.name,\n        max_selections: maxSelections,\n        answers: answers,\n      },\n      [M_TEXT.name]: `New poll\\n Question: ${title.current}\\nAnswers:\\n ${answers.map((item) => item[M_TEXT.name]).join('\\n')}`,\n    };\n    setSubmitError(undefined);\n    setIsSubmitting(true);\n    try {\n      await onSubmit(pollContent);\n      onCancel();\n    } catch (err) {\n      setSubmitError(\n        err instanceof Error ? err.message : 'Failed to create poll. Please try again.'\n      );\n    } finally {\n      setIsSubmitting(false);\n    }\n  };\n\n  const handleMaxOptions: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    const parsed = Number.parseInt(val, 10);\n    setInputValue(parsed);\n    if (!Number.isNaN(parsed)) setMaxSelections(parsed);\n  };\n  const handleMaxKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('enter', evt)) {\n      (evt.target as HTMLInputElement).blur();\n      if (inputValue < 1) setInputValue(1);\n      if (inputValue > answers.length) setInputValue(1);\n    }\n  };\n  return (\n    <ModalOverlay requestClose={onCancel}>\n      <Dialog variant=\"Surface\" className={css.PollDialogBody}>\n        <Header className={css.PollDialogHeader} variant=\"Surface\" size=\"500\">\n          <Box grow=\"Yes\" gap=\"200\">\n            {composerIcon(ListBullets)}\n            <Text size=\"H4\">New Poll</Text>\n          </Box>\n          <IconButton\n            size=\"300\"\n            onClick={onCancel}\n            radii=\"300\"\n            title=\"Cancel Creating Poll\"\n            aria-label=\"Cancel Creating Poll\"\n          >\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        <Box direction=\"Column\" gap=\"500\" className={css.PollDialogTitle}>\n          <Box direction=\"Column\">\n            <Text> Title </Text>\n            <Input\n              variant={error?.errorcode === 'title' ? 'Critical' : 'SurfaceVariant'}\n              size=\"400\"\n              aria-label=\"Insert Title\"\n              onChange={(evt) => (title.current = evt.currentTarget.value.trim())}\n              placeholder={'What should we have for dinner?'}\n            />\n          </Box>\n          <Box direction=\"Column\" gap=\"100\">\n            <Box direction=\"Row\" justifyContent=\"SpaceBetween\">\n              <Text>Options ({answers.length})</Text>\n              <Chip\n                type=\"submit\"\n                variant=\"Secondary\"\n                onClick={addOption}\n                aria-label=\"Add Option\"\n                radii=\"Pill\"\n              >\n                <Text size=\"B400\">Add Option</Text>\n              </Chip>\n            </Box>\n            <Scroll hideTrack direction=\"Vertical\" size=\"300\" className={css.PollDialogAnswerBody}>\n              {answers.map((item, index) => (\n                <Box\n                  className={css.PollDialogAnswerContainer}\n                  direction=\"Row\"\n                  grow=\"Yes\"\n                  shrink=\"No\"\n                  alignItems=\"Center\"\n                  key={item.id}\n                >\n                  <Input\n                    variant={\n                      error?.errorcode === 'option' && item[M_TEXT.name].length === 0\n                        ? 'Critical'\n                        : 'SurfaceVariant'\n                    }\n                    size=\"400\"\n                    className={css.PollDialogAnswerInput}\n                    aria-label={`Type Option ${index + 1}`}\n                    onChange={(evt) => {\n                      let newAnswers = answers;\n                      newAnswers[index] = {\n                        id: answers[index]?.id ?? randomStr(),\n                        [M_TEXT.name]: evt.currentTarget.value.trim() ?? '',\n                      };\n                      setAnswers(newAnswers);\n                    }}\n                    placeholder={`Type Option ${index + 1}`}\n                    after={\n                      <IconButton\n                        fill=\"None\"\n                        size=\"400\"\n                        disabled={answers.length <= 2}\n                        aria-disabled={answers.length <= 2}\n                        aria-label=\"Remove Option\"\n                        onClick={() => delOption(item.id)}\n                      >\n                        {chipIcon(Minus)}\n                      </IconButton>\n                    }\n                  />\n                </Box>\n              ))}\n            </Scroll>\n          </Box>\n          <Box direction=\"Column\" gap=\"100\">\n            <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n              <SettingTile\n                title=\"Show results as the poll is ongoing\"\n                after={<Switch variant=\"Primary\" value={isDisclosed} onChange={setIsDisclosed} />}\n              />\n            </SequenceCard>\n            <SequenceCard\n              className={SequenceCardStyle}\n              variant=\"SurfaceVariant\"\n              direction=\"Column\"\n              gap=\"300\"\n            >\n              <SettingTile\n                title=\"Maximum amount of selections\"\n                after={\n                  <Input\n                    className={css.PollDialogMaxSelectionNumber}\n                    variant={error?.errorcode === 'maxOptions' ? 'Critical' : 'SurfaceVariant'}\n                    size=\"300\"\n                    radii=\"300\"\n                    type=\"number\"\n                    min=\"1\"\n                    max={answers.length}\n                    value={inputValue}\n                    onChange={handleMaxOptions}\n                    onKeyDown={handleMaxKeyDown}\n                    outlined\n                  />\n                }\n              />\n              <input\n                type=\"range\"\n                min=\"1\"\n                max={answers.length}\n                step=\"1\"\n                value={maxSelections}\n                onChange={(e) => {\n                  const val = Number.parseInt(e.target.value);\n                  if (val) {\n                    setInputValue(val);\n                    setMaxSelections(val);\n                  }\n                }}\n                className={css.PollDialogMaxSelectionSlider}\n              />\n            </SequenceCard>\n          </Box>\n          <Button\n            type=\"submit\"\n            variant=\"Primary\"\n            onClick={handleSubmit}\n            disabled={isSubmitting}\n            fill=\"Soft\"\n            title=\"Create Poll\"\n            aria-label=\"Create Poll\"\n          >\n            <Text size=\"B400\">Create Poll</Text>\n          </Button>\n          {!!error && (\n            <Text align=\"Center\" size=\"B500\" style={{ color: color.Critical.OnContainer }}>\n              {error.errorString}\n            </Text>\n          )}\n          {!!submitError && (\n            <Text align=\"Center\" size=\"B500\" style={{ color: color.Critical.OnContainer }}>\n              {submitError}\n            </Text>\n          )}\n        </Box>\n      </Dialog>\n    </ModalOverlay>\n  );\n}\n","import classNames from 'classnames';\nimport {\n  Avatar,\n  Box,\n  Button,\n  Header,\n  IconButton,\n  Line,\n  MenuItem,\n  Scroll,\n  Text,\n  as,\n  config,\n} from 'folds';\nimport type { MatrixEvent, Room, RoomMember } from '$types/matrix-sdk';\nimport { getAvatarUrl, getMemberDisplayName } from '$utils/room/display';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useAtomValue } from 'jotai';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { UserAvatar } from '$components/user-avatar';\nimport { composerIcon, userFallbackIcon, X } from '$components/icons/phosphor';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { getMouseEventCords } from '$utils/dom';\nimport * as css from './PollResponses.css';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { getCountedSelections, type PollAnswerItem } from '$components/message/PollEvent';\nimport { M_TEXT } from 'matrix-js-sdk';\n\ntype PollResponsesViewerProps = {\n  room: Room;\n  answers: PollAnswerItem[];\n  maxSelections: number;\n  events: MatrixEvent[];\n  initialSelection: PollAnswerItem;\n  onClose: () => void;\n};\nexport const PollResponsesViewer = as<'div', PollResponsesViewerProps>(\n  (\n    { className, room, answers, maxSelections, events, initialSelection, onClose, ...props },\n    ref\n  ) => {\n    const mx = useMatrixClient();\n    const useAuthentication = useMediaAuthentication();\n    const space = useSpaceOptionally();\n    const openProfile = useOpenUserRoomProfile();\n    const nicknames = useAtomValue(nicknamesAtom);\n    const [selectedOption, setSelectedOption] = useState(initialSelection);\n    const answerIds = useMemo(() => new Set(answers.map((item) => item.id)), [answers]);\n    const getVotes = useCallback(() => {\n      let votes: MatrixEvent[] = [];\n      events.forEach((item) => {\n        const counted = getCountedSelections(item, answerIds, maxSelections);\n        if (counted.includes(selectedOption.id) && item.event.sender) votes.push(item);\n      });\n      return votes;\n    }, [selectedOption, events, answerIds, maxSelections]);\n    const [votes, setVotes] = useState(getVotes());\n    useEffect(() => {\n      setSelectedOption(initialSelection);\n    }, [initialSelection]);\n    useEffect(() => {\n      setVotes(getVotes());\n    }, [getVotes]);\n\n    if (answers.length < 1 || !initialSelection) return <></>;\n\n    const getName = (member: RoomMember) =>\n      getMemberDisplayName(room, member.userId, nicknames) ??\n      getMxIdLocalPart(member.userId) ??\n      member.userId;\n\n    return (\n      <Box\n        className={classNames(css.ReactionViewer, className)}\n        direction=\"Row\"\n        {...props}\n        ref={ref}\n      >\n        <Box shrink=\"No\" className={css.Sidebar}>\n          <Scroll visibility=\"Hover\" hideTrack size=\"300\">\n            <Box className={css.SidebarContent} grow=\"Yes\" direction=\"Column\" gap=\"200\">\n              {answers.map((item) => (\n                <Button\n                  variant=\"Secondary\"\n                  style={{\n                    maxWidth: '100%',\n                    flexShrink: '1',\n                  }}\n                  key={item.id}\n                  onClick={() => setSelectedOption(item)}\n                >\n                  <Text truncate>{item[M_TEXT.name]}</Text>\n                </Button>\n              ))}\n            </Box>\n          </Scroll>\n        </Box>\n        <Line variant=\"Surface\" direction=\"Vertical\" size=\"300\" />\n        <Box grow=\"Yes\" direction=\"Column\">\n          <Header className={css.Header} variant=\"Surface\" size=\"600\">\n            <Box grow=\"Yes\">\n              <Text size=\"H3\" truncate>\n                {votes.length > 0\n                  ? `'${selectedOption[M_TEXT.name]}' voters:`\n                  : `Nobody has voted for '${selectedOption[M_TEXT.name]}' yet`}\n              </Text>\n            </Box>\n            <IconButton size=\"300\" onClick={onClose}>\n              {composerIcon(X)}\n            </IconButton>\n          </Header>\n\n          <Box grow=\"Yes\">\n            <Scroll visibility=\"Hover\" hideTrack size=\"300\">\n              <Box className={css.Content} direction=\"Column\">\n                {votes.map((mEvent) => {\n                  const senderId = mEvent.getSender();\n                  if (!senderId) return null;\n                  const member = room.getMember(senderId);\n                  const name = (member ? getName(member) : getMxIdLocalPart(senderId)) ?? senderId;\n\n                  const avatarMxcUrl = member?.getMxcAvatarUrl();\n                  const avatarUrl = getAvatarUrl(mx, avatarMxcUrl, 100, useAuthentication);\n\n                  return (\n                    <MenuItem\n                      key={senderId}\n                      style={{ padding: `0 ${config.space.S200}` }}\n                      radii=\"400\"\n                      onClick={(event) => {\n                        openProfile(\n                          room.roomId,\n                          space?.roomId,\n                          senderId,\n                          undefined,\n                          getMouseEventCords(event.nativeEvent),\n                          'Bottom'\n                        );\n                      }}\n                      before={\n                        <Avatar size=\"200\">\n                          <UserAvatar\n                            userId={senderId}\n                            src={avatarUrl ?? undefined}\n                            alt={name}\n                            renderFallback={() => userFallbackIcon('sm')}\n                          />\n                        </Avatar>\n                      }\n                    >\n                      <Box grow=\"Yes\">\n                        <Text size=\"T400\" truncate>\n                          {name}\n                        </Text>\n                      </Box>\n                    </MenuItem>\n                  );\n                })}\n              </Box>\n            </Scroll>\n          </Box>\n        </Box>\n      </Box>\n    );\n  }\n);\n","import { Box, Button, Checkbox, Line, Modal, ProgressBar, RadioButton, Text } from 'folds';\nimport type { MatrixClient, PollStartSubtype, Room, TimelineEvents } from 'matrix-js-sdk';\nimport { M_TEXT } from 'matrix-js-sdk';\nimport {\n  EventTimeline,\n  M_POLL_END,\n  M_POLL_KIND_DISCLOSED,\n  M_POLL_RESPONSE,\n  M_POLL_START,\n  REFERENCE_RELATION,\n  RoomEvent,\n  type MatrixEvent,\n} from 'matrix-js-sdk';\nimport { MsgType, RelationType } from '$types/matrix-sdk';\nimport * as css from './PollEvent.css';\nimport { useCallback, useEffect, useState } from 'react';\nimport { PollResponsesViewer } from '$features/room/poll-modals';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { useMatrixEvent } from '$hooks/useMatrixEvent';\n\ntype PollEventProps = {\n  content: Record<string, unknown>;\n  mEvent: MatrixEvent;\n  mx: MatrixClient;\n  room: Room;\n};\n\nexport type PollAnswerItem = {\n  id: string;\n  [M_TEXT.name]: string;\n};\n\ntype PollVotes = {\n  [vote: string]: number;\n};\n\ntype PollResponse = {\n  'm.relates_to': {\n    rel_type: string;\n    event_id: string;\n  };\n  [M_POLL_RESPONSE.name]: {\n    answers: string[];\n  };\n};\n\nexport function getPollResponseAnswers(mEvent: MatrixEvent): string[] | undefined {\n  const response = M_POLL_RESPONSE.findIn<{ answers?: unknown } | undefined>(mEvent.getContent());\n  if (!Array.isArray(response?.answers)) return undefined;\n  return response.answers.filter((answer): answer is string => typeof answer === 'string');\n}\n\nconst isPollEnd = (mEvent: MatrixEvent): boolean =>\n  M_POLL_END.includedIn(Object.keys(mEvent.getContent()));\n\nexport function getCountedSelections(\n  mEvent: MatrixEvent,\n  answerIds: Set<string>,\n  maxSelections: number\n): string[] {\n  const selections = getPollResponseAnswers(mEvent)?.slice(0, maxSelections);\n  if (!selections?.length || selections.some((id) => !answerIds.has(id))) return [];\n  return [...new Set(selections)];\n}\n\nexport function PollEvent({ content, mEvent, mx, room }: PollEventProps) {\n  const eventId = mEvent.getId();\n  const userId = mx.getUserId() ?? '';\n  const roomId = room.roomId;\n  const roomState = room.getLiveTimeline()?.getState(EventTimeline.FORWARDS);\n  const pollSender = mEvent.getSender();\n\n  const poll = content[M_POLL_START.name] as PollStartSubtype;\n  const questionBody = (poll?.question as { body?: string })?.body ?? '';\n  const answers = (poll as { answers?: PollAnswerItem[] })?.answers ?? [];\n  const maxSelections = (poll as { max_selections?: number })?.max_selections ?? 1;\n  const isDisclosed = M_POLL_KIND_DISCLOSED.matches((poll as { kind?: string })?.kind ?? '');\n  const canEnd =\n    userId === mEvent.sender?.userId || roomState?.maySendRedactionForEvent(mEvent, userId);\n\n  let votes: PollVotes = {};\n  answers.forEach((item) => (votes[item.id] = 0));\n\n  const [ViewVotersAnswer, setViewVotersAnswer] = useState<PollAnswerItem | undefined>(undefined);\n  const [isSnooping, setIsSnooping] = useState<boolean>(false);\n\n  // This should technically request the permissions at the time of the end of the event but that doesnt seem to be supported by the sdk\n  const getEndIndex = useCallback(\n    (events: MatrixEvent[]) =>\n      events.findLastIndex((item) => {\n        const itemSender = item.getSender();\n        return (\n          isPollEnd(item) &&\n          typeof item.getSender() === 'string' &&\n          pollSender &&\n          itemSender &&\n          (itemSender === pollSender || roomState?.maySendRedactionForEvent(mEvent, itemSender))\n        );\n      }),\n    [roomState, mEvent, pollSender]\n  );\n\n  const sortChildEvents = useCallback((events: MatrixEvent[]) => {\n    if (!events) return [];\n\n    const sortedArray = events.toSorted((a: MatrixEvent, b: MatrixEvent) =>\n      a.event.origin_server_ts && b.event.origin_server_ts\n        ? b.event.origin_server_ts - a.event.origin_server_ts\n        : 0\n    );\n\n    return sortedArray;\n  }, []);\n\n  const childEvents = room\n    ?.getUnfilteredTimelineSet()\n    .relations.getAllChildEventsForEvent(eventId ?? '')\n    .filter((event) => event.getRelation()?.rel_type === REFERENCE_RELATION.name);\n\n  // manual sorting because the timeline is sometimes sent stupidly <3\n  const [sortedChildEvents, setSortedChildEvents] = useState(sortChildEvents(childEvents));\n  const [isEnded, setIsEnded] = useState(getEndIndex(sortedChildEvents) !== -1);\n  const [updateCounter, setUpdateCounter] = useState(0);\n\n  const handleUpdate = useCallback(\n    (event: MatrixEvent) => {\n      const relation = event.getRelation();\n      if (\n        relation?.event_id === eventId ||\n        event.getAssociatedId() === eventId ||\n        event.getId() === eventId\n      ) {\n        setUpdateCounter((c) => c + 1);\n      }\n    },\n    [eventId]\n  );\n\n  useMatrixEvent(room, RoomEvent.Timeline, handleUpdate);\n\n  // ensure a new sorted array is only generated when a new list is made\n  useEffect(() => {\n    const latestChildEvents = room\n      ?.getUnfilteredTimelineSet()\n      .relations.getAllChildEventsForEvent(eventId ?? '')\n      .filter((event) => event.getRelation()?.rel_type === REFERENCE_RELATION.name);\n\n    let newChildEvents = latestChildEvents ? sortChildEvents(latestChildEvents) : [];\n    const newEndIndex = getEndIndex(newChildEvents);\n\n    setSortedChildEvents(newChildEvents);\n    setIsEnded(newEndIndex !== -1);\n    // oxlint-disable-next-line eslint-plugin-react-hooks/exhaustive-deps\n  }, [updateCounter, sortChildEvents, getEndIndex, room, eventId]);\n\n  if (!content) return null;\n  const finalArray = isEnded\n    ? sortedChildEvents.slice(getEndIndex(sortedChildEvents) + 1)\n    : sortedChildEvents;\n  //filter for a unique event from each sender\n  let voters = new Set<string>();\n  let filteredChildEvents: MatrixEvent[] = [];\n  if (isDisclosed || isEnded)\n    finalArray?.forEach((item) => {\n      if (isPollEnd(item)) {\n        return;\n      }\n      if (item.event.sender && !voters.has(item.event.sender)) {\n        voters.add(item.event.sender);\n        filteredChildEvents.push(item);\n      }\n    });\n\n  const answerIds = new Set(answers.map((item) => item.id));\n\n  filteredChildEvents?.forEach((item) => {\n    const counted = getCountedSelections(item, answerIds, maxSelections);\n    if (counted.length === 0) {\n      if (item.event.sender) voters.delete(item.event.sender);\n      return;\n    }\n\n    counted.forEach((selection) => {\n      votes[selection] = (votes[selection] ?? 0) + 1;\n    });\n  });\n  const totalVotes = Object.values(votes).reduce((a, b) => a + b, 0);\n\n  const userSelectionEvent =\n    filteredChildEvents.length > 0\n      ? filteredChildEvents.find((item) => item.event.sender === userId)\n      : finalArray.find((item) => item.event.sender === userId);\n  const userSelection = userSelectionEvent ? getPollResponseAnswers(userSelectionEvent) : undefined;\n  const hasVoted = (userSelection?.length ?? 0) > 0;\n  const showAnswers = (isDisclosed && (hasVoted || isSnooping)) || isEnded;\n\n  function handleNewVote(id: string) {\n    if (!eventId || !roomId || maxSelections < 1) return;\n    let newAnswers: string[] = [];\n    if (userSelection?.includes(id)) newAnswers = userSelection.filter((item) => item !== id);\n    else newAnswers = userSelection ? [...userSelection, id] : [id];\n\n    if (newAnswers.length > maxSelections) {\n      newAnswers = newAnswers.slice(newAnswers.length - maxSelections);\n    }\n\n    let newContent: PollResponse = {\n      'm.relates_to': {\n        rel_type: RelationType.Reference,\n        event_id: eventId,\n      },\n      [M_POLL_RESPONSE.name]: {\n        answers: newAnswers,\n      },\n    };\n    mx.sendEvent(\n      roomId,\n      M_POLL_RESPONSE.name as keyof TimelineEvents,\n      newContent as TimelineEvents[keyof TimelineEvents]\n    );\n  }\n  function handleEndVote() {\n    const maxValue = Math.max(...Object.values(votes));\n    let endText = 'The Poll has ended and';\n    const winnerArray = answers.filter((item) => votes[item.id] === maxValue);\n    if (maxValue === 0) endText += ' nobody voted';\n    else if (winnerArray.length === 1 && winnerArray[0] && winnerArray[0][M_TEXT.name])\n      endText += `${winnerArray[0][M_TEXT.name]} won`;\n    else {\n      endText += ': ';\n      winnerArray.forEach((item, index) => {\n        endText += item[M_TEXT.name];\n        if (index < winnerArray.length - 2) endText += ', ';\n        else if (index < winnerArray.length - 1) endText += ', and ';\n      });\n      endText += ' won';\n    }\n\n    const endContent = {\n      'm.relates_to': {\n        rel_type: RelationType.Reference,\n        event_id: eventId,\n      },\n      [M_POLL_END.name]: {},\n      [M_TEXT.name]: endText,\n      body: endText,\n      msgtype: MsgType.Text,\n    };\n    mx.sendEvent(\n      roomId,\n      M_POLL_END.name as keyof TimelineEvents,\n      endContent as TimelineEvents[keyof TimelineEvents]\n    );\n  }\n  // The choice of making it not the same size and style as an Attachment is deliberate as Polls tipically are Way more wordy and this feels more spacious\n  return (\n    <>\n      <Box direction=\"Column\" className={css.PollEvent} grow=\"Yes\" gap=\"200\">\n        <Box className={css.PollHeader} shrink=\"No\">\n          <Text>{questionBody} </Text>\n        </Box>\n        <Line direction=\"Horizontal\" variant=\"SurfaceVariant\" className={css.PollEventSeparator} />\n        <Box direction=\"Column\" grow=\"Yes\" shrink=\"No\" gap=\"300\" className={css.PollAnswersBody}>\n          {answers.map((item) => {\n            const optionBody = item[M_TEXT.name];\n            const voteCount = votes[item.id];\n            const isSelected = userSelection?.includes(item.id);\n            return (\n              <Box key={item.id} gap=\"100\" direction=\"Column\" className={css.PollAnswerItem}>\n                <Box gap=\"100\" alignItems=\"Center\">\n                  {maxSelections === 1 ? (\n                    <RadioButton\n                      size=\"100\"\n                      aria-disabled={isEnded}\n                      disabled={isEnded}\n                      checked={isSelected}\n                      aria-label={`${isSelected ? 'Remove vote from' : 'vote for'} ${optionBody}`}\n                      variant={isSelected ? 'Primary' : 'Secondary'}\n                      onClick={() => handleNewVote(item.id)}\n                    />\n                  ) : (\n                    <Checkbox\n                      size=\"100\"\n                      aria-disabled={isEnded}\n                      disabled={isEnded}\n                      checked={isSelected}\n                      aria-label={`${isSelected ? 'Remove vote from' : 'vote for'} ${optionBody}`}\n                      variant={isSelected ? 'Primary' : 'Secondary'}\n                      onClick={() => handleNewVote(item.id)}\n                    />\n                  )}\n                  <Box justifyContent=\"SpaceBetween\" grow=\"Yes\" alignItems=\"Center\">\n                    <Text>{optionBody}</Text>\n\n                    {showAnswers && (\n                      <Text\n                        size=\"T200\"\n                        className={css.PollAnswerCount}\n                        onClick={() => setViewVotersAnswer(item)}\n                      >\n                        {`(${voteCount} vote${voteCount !== 1 ? 's' : ''})`}\n                      </Text>\n                    )}\n                  </Box>\n                </Box>\n                {(isDisclosed || isEnded) && (\n                  <ProgressBar\n                    size=\"400\"\n                    value={showAnswers ? (voteCount ?? 0) / voters.size : 0}\n                    max={1}\n                    variant={isSelected ? 'Primary' : 'Secondary'}\n                    title={voteCount ? `${Math.round((voteCount / voters.size) * 100)}%` : '0%'}\n                    className={css.PollAnswerBar}\n                  />\n                )}\n              </Box>\n            );\n          })}\n          <Box gap=\"200\" grow=\"Yes\" shrink=\"No\" justifyContent=\"SpaceBetween\" alignItems=\"Center\">\n            {showAnswers ? (\n              <Text size=\"T200\">\n                {`${totalVotes} vote${totalVotes !== 1 ? 's' : ''} ${totalVotes !== voters.size ? `by ${voters.size} voter${voters.size !== 1 ? 's' : ''}` : ''}`}\n              </Text>\n            ) : isDisclosed ? (\n              <Text onClick={() => setIsSnooping(true)} style={{ cursor: 'pointer' }} size=\"T200\">\n                Click here to show results\n              </Text>\n            ) : (\n              <Text size=\"T200\">Results will be shown when the poll is over </Text>\n            )}\n            <Box alignItems=\"Center\" gap=\"200\">\n              <Text size=\"T200\">\n                {maxSelections !== 1 && maxSelections !== answers.length\n                  ? `Max ${maxSelections} options.`\n                  : ''}\n              </Text>\n              {!isEnded && canEnd && (\n                <Button\n                  size=\"300\"\n                  radii=\"400\"\n                  variant=\"Critical\"\n                  fill=\"Soft\"\n                  onClick={handleEndVote}\n                >\n                  End Poll\n                </Button>\n              )}\n              {isEnded && <Text size=\"T200\">This poll has ended.</Text>}\n            </Box>\n          </Box>\n        </Box>\n      </Box>\n      {ViewVotersAnswer && (\n        <ModalOverlay requestClose={() => setViewVotersAnswer(undefined)}>\n          <Modal variant=\"Surface\">\n            <PollResponsesViewer\n              room={room}\n              answers={answers}\n              maxSelections={maxSelections}\n              events={filteredChildEvents}\n              initialSelection={ViewVotersAnswer}\n              onClose={() => setViewVotersAnswer(undefined)}\n            />\n          </Modal>\n        </ModalOverlay>\n      )}\n    </>\n  );\n}\n","import type { SerializableMap } from '$types/wrapper/SerializableMap';\nimport type { SerializableSet } from '$types/wrapper/SerializableSet';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport type { MsgType } from '$types/matrix-sdk';\nimport type { RelationType } from '$types/matrix-sdk';\nimport type * as prefix from '$unstable/prefixes';\n\nexport type IImageInfo = {\n  w?: number;\n  h?: number;\n  mimetype?: string;\n  size?: number;\n  [prefix.MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]?: string;\n};\n\nexport type MatrixRelatesTo = {\n  rel_type: RelationType.Annotation;\n  event_id: string;\n  key?: string;\n};\n\n/**\n * Image Pack Reference\n * as per https://github.com/matrix-org/matrix-spec-proposals/pull/4459\n */\nexport type MSC4459ImagePackReference = {\n  /**\n   * Id of the room where the image pack lives\n   */\n  room_id?: string;\n  /**\n   * via servers to help join the room,\n   * optional\n   */\n  via?: SerializableSet<string>;\n  /**\n   * TODO doc\n   */\n  state_key?: string;\n  /**\n   * the shortcode this emoji is refered by\n   */\n  shortcode?: string;\n};\n\nexport type MSC1767Text = {\n  body: string;\n  mimetype?: string;\n};\n\nexport type MatrixReactionEvent = {\n  'm.relates_to': MatrixRelatesTo;\n  shortcode?: string;\n  'com.beeper.reaction.shortcode'?: string;\n  /**\n   * a map of image pack references\n   */\n  [prefix.MATRIX_UNSTABLE_IMAGE_SOURCE_PACK_PROPERTY_NAME]?: SerializableMap<\n    string,\n    MSC4459ImagePackReference\n  >;\n};\n\nexport interface IGenericMSC4459 {\n  [prefix.MATRIX_UNSTABLE_IMAGE_SOURCE_PACK_PROPERTY_NAME]?: SerializableMap<\n    string,\n    MSC4459ImagePackReference\n  >;\n}\n\nexport type IVideoInfo = {\n  w?: number;\n  h?: number;\n  mimetype?: string;\n  size?: number;\n  duration?: number;\n};\n\nexport type IAudioInfo = {\n  mimetype?: string;\n  size?: number;\n  duration?: number;\n};\n\nexport type IFileInfo = {\n  mimetype?: string;\n  size?: number;\n};\n\nexport type IEncryptedFile = EncryptedAttachmentInfo & {\n  url: string;\n};\n\nexport type IThumbnailContent = {\n  thumbnail_info?: IImageInfo;\n  thumbnail_file?: IEncryptedFile;\n  thumbnail_url?: string;\n};\n\nexport type IImageContent = {\n  msgtype: MsgType.Image;\n  body?: string;\n  filename?: string;\n  url?: string;\n  info?: IImageInfo & IThumbnailContent;\n  file?: IEncryptedFile;\n  [prefix.MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME]?: boolean;\n  [prefix.MATRIX_UNSTABLE_SPOILER_REASON_PROPERTY_NAME]?: string;\n};\n\nexport type IVideoContent = {\n  msgtype: MsgType.Video;\n  body?: string;\n  filename?: string;\n  url?: string;\n  info?: IVideoInfo & IThumbnailContent;\n  file?: IEncryptedFile;\n  [prefix.MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME]?: boolean;\n  [prefix.MATRIX_UNSTABLE_SPOILER_REASON_PROPERTY_NAME]?: string;\n};\n\nexport type IAudioContent = {\n  msgtype: MsgType.Audio;\n  body?: string;\n  filename?: string;\n  url?: string;\n  info?: IAudioInfo;\n  file?: IEncryptedFile;\n};\n\nexport type IFileContent = {\n  msgtype: MsgType.File;\n  body?: string;\n  filename?: string;\n  url?: string;\n  info?: IFileInfo & IThumbnailContent;\n  file?: IEncryptedFile;\n};\n\nexport type IGalleryImageItem = Omit<IImageContent, 'msgtype'> & { itemtype: MsgType.Image };\nexport type IGalleryVideoItem = Omit<IVideoContent, 'msgtype'> & { itemtype: MsgType.Video };\nexport type IGalleryAudioItem = Omit<IAudioContent, 'msgtype'> & { itemtype: MsgType.Audio };\nexport type IGalleryFileItem = Omit<IFileContent, 'msgtype'> & { itemtype: MsgType.File };\nexport type IGalleryItem =\n  | IGalleryImageItem\n  | IGalleryVideoItem\n  | IGalleryAudioItem\n  | IGalleryFileItem;\n\nexport const GALLERY_MSGTYPE = 'dm.filament.gallery';\n\nexport type IGalleryContent = {\n  msgtype: typeof GALLERY_MSGTYPE;\n  body: string;\n  format?: string;\n  formatted_body?: string;\n  itemtypes: IGalleryItem[];\n};\n","import type { CSSProperties, JSX } from 'react';\nimport { memo, useMemo, useCallback } from 'react';\nimport type { IPreviewUrlResponse, MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk';\nimport { MsgType } from '$types/matrix-sdk';\nimport { parseSettingsLink } from '$features/settings/settingsLink';\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport { testMatrixTo } from '$plugins/matrix-to';\nimport { testMatrixUri } from '$plugins/matrix-uri';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom, CaptionPosition } from '$state/settings';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport type { Opts } from 'linkifyjs';\nimport { Box, config } from 'folds';\nimport {\n  AudioContent,\n  DownloadFile,\n  FileContent,\n  ImageContent,\n  MAudio,\n  MBadEncrypted,\n  MEmote,\n  MFile,\n  MImage,\n  MLocation,\n  MNotice,\n  MText,\n  MVideo,\n  MGallery,\n  ReadPdfFile,\n  ReadTextFile,\n  RenderBody,\n  ThumbnailContent,\n  UnsupportedContent,\n  UploadedSableCssContent,\n  VideoContent,\n} from './message';\nimport {\n  UrlPreviewCard,\n  UrlPreviewHolder,\n  ClientPreview,\n  ThemePreviewUrlCard,\n  TweakPreviewUrlCard,\n  youtubeUrl,\n} from './url-preview';\nimport { isHttpsFullSableCssUrl } from '../theme/previewUrls';\nimport { isSableCssAttachmentFileName } from '../theme/processThemeImport';\nimport { Image, MediaControl, PersistedVolumeVideo } from './media';\nimport { ImageViewer } from './image-viewer';\nimport { PdfViewer } from './Pdf-viewer';\nimport { TextViewer } from './text-viewer';\nimport { ClientSideHoverFreeze } from './ClientSideHoverFreeze';\nimport { CuteEventType, MCuteEvent } from './message/MCuteEvent';\nimport { PollEvent } from './message/PollEvent';\nimport { M_POLL_START, M_TEXT } from 'matrix-js-sdk';\nimport type { IImageInfo, IGalleryContent } from '$types/matrix/common';\nimport { GALLERY_MSGTYPE } from '$types/matrix/common';\nimport { parseExternalGif } from '$utils/externalGif';\nimport { parseLegacyKlipyGif } from '$utils/klipy';\nimport {\n  MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME,\n  MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME,\n} from '$unstable/prefixes';\nimport {\n  convertBeeperFormatToOurPerMessageProfile,\n  type PerMessageProfileBeeperFormat,\n  stripPerMessageProfileFormattedBody,\n  stripPerMessageProfilePlainBody,\n} from '$hooks/usePerMessageProfile';\n\ntype RenderMessageContentProps = {\n  displayName: string;\n  msgType: string;\n  ts: number;\n  edited?: boolean;\n  getContent: () => unknown;\n  mediaAutoLoad?: boolean;\n  bundledPreview?: boolean;\n  urlPreview?: boolean;\n  clientUrlPreview?: boolean;\n  isGallery?: boolean;\n  showMaps?: boolean;\n  highlightRegex?: RegExp;\n  htmlReactParserOptions: HTMLReactParserOptions;\n  linkifyOpts: Opts;\n  outlineAttachment?: boolean;\n  hideCaption?: boolean;\n  mEvent?: MatrixEvent;\n  mx?: MatrixClient;\n  room?: Room;\n  onOpenMedia?: (mEvent: MatrixEvent) => boolean;\n};\n\nconst getMediaType = (url: string) => {\n  const cleanUrl = url.toLowerCase();\n  if (cleanUrl.match(/\\.(mp4|webm|ogg)$/i)) return 'video';\n  if (cleanUrl.match(/\\.(png|jpg|jpeg|gif|webp)$/i) || cleanUrl.match(/@(jpeg|webp|png|jpg)$/i))\n    return 'image';\n  return null;\n};\n\nconst isSableChatEmbedCandidate = (url: string): boolean =>\n  /^https:\\/\\//i.test(url) &&\n  (/\\.preview\\.sable\\.css(\\?|#|$)/i.test(url) || isHttpsFullSableCssUrl(url));\n\nconst CAPTION_STYLE: CSSProperties = { marginTop: config.space.S200, maxWidth: '100%' };\nconst TEXT_STYLE: CSSProperties = { maxWidth: '100%' };\nconst EXTERNAL_GIF_MAX_SIZE = 400;\n\nfunction RenderMessageContentInternal({\n  displayName,\n  msgType,\n  ts,\n  edited,\n  getContent,\n  mediaAutoLoad,\n  isGallery,\n  bundledPreview,\n  urlPreview,\n  clientUrlPreview,\n  showMaps,\n  highlightRegex,\n  htmlReactParserOptions,\n  linkifyOpts,\n  outlineAttachment,\n  hideCaption,\n  mEvent,\n  mx,\n  room,\n  onOpenMedia,\n}: RenderMessageContentProps) {\n  const content = useMemo(() => getContent() as Record<string, unknown>, [getContent]);\n\n  const [autoplayGifs] = useSetting(settingsAtom, 'autoplayGifs');\n  const [captionPosition] = useSetting(settingsAtom, 'captionPosition');\n  const [themeChatSableWidgets] = useSetting(settingsAtom, 'themeChatSableWidgetsEnabled');\n  const [multiplePreviews] = useSetting(settingsAtom, 'multiplePreviews');\n  const [externalGifAutoLoadEncrypted] = useSetting(settingsAtom, 'externalGifAutoLoadEncrypted');\n  const externalGif = useMemo(\n    () =>\n      msgType === (MsgType.Text as string)\n        ? parseExternalGif(content)\n        : msgType === (MsgType.Image as string)\n          ? parseLegacyKlipyGif(content)\n          : undefined,\n    [content, msgType]\n  );\n  const roomEncryptionKnown =\n    room !== undefined && typeof room.hasEncryptionStateEvent === 'function';\n  const isEncryptedRoom = roomEncryptionKnown ? room.hasEncryptionStateEvent() : false;\n  const externalGifAutoLoad =\n    roomEncryptionKnown &&\n    (!isEncryptedRoom || externalGifAutoLoadEncrypted) &&\n    (mediaAutoLoad ?? true);\n  const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n  const captionPositionMap = {\n    [CaptionPosition.Above]: 'column-reverse',\n    [CaptionPosition.Below]: 'column',\n    [CaptionPosition.Inline]: 'row',\n    [CaptionPosition.Hidden]: 'row',\n  } satisfies Record<CaptionPosition, React.CSSProperties['flexDirection']>;\n  const attachmentDirection = captionPositionMap[captionPosition];\n\n  const renderBody = useCallback(\n    (props: Record<string, unknown>) => (\n      <RenderBody\n        {...props}\n        body={props.body as string}\n        highlightRegex={highlightRegex}\n        htmlReactParserOptions={htmlReactParserOptions}\n        linkifyOpts={linkifyOpts}\n      />\n    ),\n    [highlightRegex, htmlReactParserOptions, linkifyOpts]\n  );\n\n  const renderUrlsPreview = useCallback(\n    (urls: string[]) => {\n      const filteredUrls = urls.filter(\n        (url) =>\n          !testMatrixTo(url) && !testMatrixUri(url) && !parseSettingsLink(settingsLinkBaseUrl, url)\n      );\n      if (filteredUrls.length === 0) return undefined;\n\n      const themePreviewUrls = themeChatSableWidgets\n        ? filteredUrls.filter(\n            (u) => /^https:\\/\\//i.test(u) && /\\.preview\\.sable\\.css(\\?|#|$)/i.test(u)\n          )\n        : [];\n      const themeToRender = themePreviewUrls.filter((u) => /^https:\\/\\//i.test(u));\n\n      const tweakCandidateUrls = themeChatSableWidgets\n        ? filteredUrls.filter((u) => isHttpsFullSableCssUrl(u))\n        : [];\n\n      const analyzed = filteredUrls.map((url) => ({\n        url,\n        type: getMediaType(url),\n      }));\n      const mediaLinks = analyzed.filter((item) => item.type !== null);\n      const previewCandidates = mediaLinks.length > 0 ? mediaLinks : analyzed;\n      const toRender = multiplePreviews ? previewCandidates : [previewCandidates[0]!];\n      return (\n        <UrlPreviewHolder>\n          {themeToRender.map((url) => (\n            <ThemePreviewUrlCard key={`theme:${url}`} url={url} />\n          ))}\n          {tweakCandidateUrls.map((url) => (\n            <TweakPreviewUrlCard key={`tweak:${url}`} url={url} />\n          ))}\n          {toRender.map((item) => {\n            const { url } = item;\n            if (themeToRender.includes(url)) return null;\n            if (tweakCandidateUrls.includes(url)) return null;\n\n            if (!themeChatSableWidgets && isSableChatEmbedCandidate(url)) return null;\n            if (clientUrlPreview && youtubeUrl(url)) {\n              return <ClientPreview key={url} url={url} />;\n            }\n            if (urlPreview) {\n              return <UrlPreviewCard urlPreview key={url} url={url} ts={ts} />;\n            }\n            return null;\n          })}\n        </UrlPreviewHolder>\n      );\n    },\n    [multiplePreviews, themeChatSableWidgets, settingsLinkBaseUrl, clientUrlPreview, urlPreview, ts]\n  );\n  const renderBundledPreviews = useCallback(\n    (bundles: IPreviewUrlResponse[]) => (\n      <UrlPreviewHolder>\n        {bundles.map((bundle) => (\n          <UrlPreviewCard\n            urlPreview={urlPreview === true}\n            key={bundle['og:url']}\n            url={bundle['og:url']}\n            bundle={bundle}\n          />\n        ))}\n      </UrlPreviewHolder>\n    ),\n    [urlPreview]\n  );\n  const hasExternalGifMetadata = !!externalGif;\n  const messageUrlsPreview =\n    !hasExternalGifMetadata && (urlPreview || themeChatSableWidgets)\n      ? renderUrlsPreview\n      : undefined;\n  const messageBundlePreview =\n    !hasExternalGifMetadata && bundledPreview ? renderBundledPreviews : undefined;\n\n  const renderCaption = () => {\n    const hasCaption = content.body && (content.body as string).trim().length > 0;\n    if (captionPosition === CaptionPosition.Hidden || hideCaption) return null;\n    if (\n      hasCaption &&\n      (((content as { filename?: string }).filename &&\n        (content as { filename?: string }).filename !== content.body) ||\n        msgType === GALLERY_MSGTYPE)\n    ) {\n      if (captionPosition !== CaptionPosition.Inline)\n        return (\n          <MText\n            style={CAPTION_STYLE}\n            edited={edited}\n            content={content}\n            renderBody={renderBody}\n            renderUrlsPreview={messageUrlsPreview}\n            renderBundledPreviews={messageBundlePreview}\n          />\n        );\n      return (\n        <Box\n          style={{\n            padding: config.space.S200,\n            paddingRight: config.space.S0,\n            wordBreak: 'break-word',\n            maxWidth: '100%',\n            display: 'flex',\n            flexDirection: 'column',\n            justifyContent: 'center',\n            flexShrink: 1,\n          }}\n        >\n          <MText\n            edited={edited}\n            content={content}\n            renderBody={renderBody}\n            renderUrlsPreview={messageUrlsPreview}\n            renderBundledPreviews={messageBundlePreview}\n            style={TEXT_STYLE}\n          />\n        </Box>\n      );\n    }\n    return null;\n  };\n\n  if (externalGif) {\n    const markedAsSpoiler = content[MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME] === true;\n    const externalGifWidth =\n      externalGif.h >= externalGif.w\n        ? `${(EXTERNAL_GIF_MAX_SIZE * externalGif.w) / externalGif.h}px`\n        : undefined;\n    return (\n      <Box direction=\"Column\" style={{ maxWidth: '100%' }}>\n        {msgType === (MsgType.Text as string) && typeof content.body === 'string' && (\n          <Box\n            style={{\n              marginBottom: config.space.S200,\n              maxWidth: '100%',\n              wordBreak: 'break-word',\n            }}\n          >\n            <MText edited={edited} content={content} renderBody={renderBody} style={TEXT_STYLE} />\n          </Box>\n        )}\n        <ImageContent\n          url={externalGif.media_url}\n          body={externalGif.title}\n          info={{\n            w: externalGif.w,\n            h: externalGif.h,\n            mimetype: externalGif.mimetype,\n            size: externalGif.size,\n            [MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]: externalGif.blurhash,\n          }}\n          autoPlay={externalGifAutoLoad && !markedAsSpoiler}\n          markedAsSpoiler={markedAsSpoiler}\n          favoriteShareUrl={\n            msgType === (MsgType.Text as string) && typeof content.body === 'string'\n              ? content.body\n              : externalGif.media_url\n          }\n          loadLabel=\"Load GIF\"\n          loadDescription={`External GIF from ${externalGif.provider.toUpperCase()}`}\n          deferMediaLoad\n          style={{\n            borderRadius: config.radii.R300,\n            overflow: 'hidden',\n            width: externalGifWidth,\n            maxWidth: `min(100%, ${EXTERNAL_GIF_MAX_SIZE}px)`,\n            maxHeight: `${EXTERNAL_GIF_MAX_SIZE}px`,\n          }}\n          onOpenViewer={mEvent ? () => onOpenMedia?.(mEvent) ?? false : undefined}\n          renderImage={(p) => {\n            if (!autoplayGifs && p.src) {\n              return (\n                <ClientSideHoverFreeze src={p.src}>\n                  <Image info={p.info} {...p} loading=\"lazy\" />\n                </ClientSideHoverFreeze>\n              );\n            }\n            return <Image info={p.info} {...p} loading=\"lazy\" />;\n          }}\n          renderViewer={(p) => <ImageViewer {...p} />}\n        />\n      </Box>\n    );\n  }\n\n  function renderCaptionedAttachment(attachment: JSX.Element, isInGallery?: boolean): JSX.Element {\n    return (\n      <div\n        style={{\n          display: 'flex',\n          flexDirection: attachmentDirection,\n          height: '100%',\n          width: '100%',\n          position: 'relative',\n        }}\n      >\n        {attachment}\n        {!isInGallery && renderCaption()}\n      </div>\n    );\n  }\n\n  const renderFile = () =>\n    renderCaptionedAttachment(\n      <MFile\n        content={content as Record<string, never> & { msgtype: MsgType.File }}\n        renderFileContent={({ fileName, mimeType, info, encInfo, url }) => (\n          <FileContent\n            body={fileName}\n            mimeType={mimeType}\n            renderAsPdfFile={() => (\n              <ReadPdfFile\n                body={fileName}\n                mimeType={mimeType}\n                url={url}\n                encInfo={encInfo}\n                renderViewer={(p) => <PdfViewer {...p} />}\n              />\n            )}\n            renderAsTextFile={() => (\n              <ReadTextFile\n                body={fileName}\n                mimeType={mimeType}\n                url={url}\n                encInfo={encInfo}\n                renderViewer={(p) => <TextViewer {...p} />}\n              />\n            )}\n          >\n            {themeChatSableWidgets && isSableCssAttachmentFileName(fileName) && (\n              <UploadedSableCssContent\n                body={fileName}\n                mimeType={mimeType}\n                url={url}\n                encInfo={encInfo}\n                size={info.size}\n              />\n            )}\n            <DownloadFile\n              body={fileName}\n              mimeType={mimeType}\n              url={url}\n              encInfo={encInfo}\n              info={info}\n            />\n          </FileContent>\n        )}\n        outlined={outlineAttachment}\n      />\n    );\n\n  if (msgType === (MsgType.Text as string)) {\n    return (\n      <MText\n        edited={edited}\n        content={content}\n        renderBody={renderBody}\n        renderUrlsPreview={messageUrlsPreview}\n        renderBundledPreviews={messageBundlePreview}\n        style={TEXT_STYLE}\n      />\n    );\n  }\n\n  if (msgType === (MsgType.Emote as string)) {\n    const beeperProfile = content['com.beeper.per_message_profile'] as\n      | PerMessageProfileBeeperFormat\n      | undefined;\n    const pmp = beeperProfile\n      ? convertBeeperFormatToOurPerMessageProfile(beeperProfile)\n      : undefined;\n\n    const strippedContent = pmp\n      ? {\n          ...content,\n          formatted_body: stripPerMessageProfileFormattedBody(content['formatted_body'] as string),\n          body: stripPerMessageProfilePlainBody(content['body'] as string),\n        }\n      : content;\n\n    if ((content as { 'fyi.cisnt.headpat'?: boolean })['fyi.cisnt.headpat']) {\n      return (\n        <MCuteEvent\n          content={(content as { body?: string }).body}\n          type={CuteEventType.Headpat}\n          mentionedUserIds={\n            (content as { 'm.mentions'?: { user_ids?: string[] } })['m.mentions']?.user_ids\n          }\n        />\n      );\n    }\n    return (\n      <MEmote\n        displayName={pmp?.displayname ?? displayName}\n        edited={edited}\n        content={strippedContent}\n        renderBody={renderBody}\n        renderUrlsPreview={messageUrlsPreview}\n        renderBundledPreviews={messageBundlePreview}\n      />\n    );\n  }\n\n  if (msgType === (MsgType.Notice as string)) {\n    return (\n      <MNotice\n        edited={edited}\n        content={content}\n        renderBody={renderBody}\n        renderUrlsPreview={messageUrlsPreview}\n        renderBundledPreviews={messageBundlePreview}\n      />\n    );\n  }\n\n  if (msgType === (MsgType.Image as string)) {\n    const { info } = content as { info?: IImageInfo };\n    const isGif =\n      info?.mimetype === 'image/gif' ||\n      info?.mimetype === 'image/apng' ||\n      info?.mimetype === 'image/webp' ||\n      (content.body as string)?.toLowerCase().endsWith('.gif') ||\n      (content.body as string)?.toLowerCase().endsWith('.apng') ||\n      (content.body as string)?.toLowerCase().endsWith('.webp') ||\n      (typeof (content as { url?: string }).url === 'string' &&\n        ((content as { url?: string }).url?.toLowerCase().endsWith('.gif') ||\n          (content as { url?: string }).url?.toLowerCase().endsWith('.apng') ||\n          (content as { url?: string }).url?.toLowerCase().endsWith('.webp')));\n\n    return renderCaptionedAttachment(\n      <MImage\n        content={content as Record<string, never> & { msgtype: MsgType.Image }}\n        fitParent={isGallery}\n        renderImageContent={(imageProps) => (\n          <ImageContent\n            {...imageProps}\n            onOpenViewer={mEvent ? () => onOpenMedia?.(mEvent) ?? false : undefined}\n            autoPlay={mediaAutoLoad}\n            renderImage={(p) => {\n              if (isGif && !autoplayGifs && p.src) {\n                return (\n                  <ClientSideHoverFreeze src={p.src}>\n                    <Image info={info} {...p} loading=\"lazy\" />\n                  </ClientSideHoverFreeze>\n                );\n              }\n              return <Image info={info} {...p} loading=\"lazy\" />;\n            }}\n            renderViewer={(p) => <ImageViewer {...p} />}\n          />\n        )}\n        outlined={outlineAttachment}\n      />,\n      isGallery\n    );\n  }\n\n  if (msgType === (MsgType.Video as string)) {\n    return renderCaptionedAttachment(\n      <MVideo\n        content={content as Record<string, never> & { msgtype: MsgType.Video }}\n        renderAsFile={renderFile}\n        renderVideoContent={({ body, info, ...videoProps }) => (\n          <VideoContent\n            body={body}\n            info={info}\n            {...videoProps}\n            renderThumbnail={\n              mediaAutoLoad\n                ? () => (\n                    <ThumbnailContent\n                      info={info}\n                      renderImage={(src) => (\n                        <Image alt={body} title={body} src={src} loading=\"lazy\" />\n                      )}\n                    />\n                  )\n                : undefined\n            }\n            renderVideo={(p) => <PersistedVolumeVideo {...p} />}\n          />\n        )}\n        outlined={outlineAttachment}\n      />,\n      isGallery\n    );\n  }\n\n  if (msgType === (MsgType.Audio as string)) {\n    return renderCaptionedAttachment(\n      <MAudio\n        content={content as Record<string, never> & { msgtype: MsgType.Audio }}\n        renderAsFile={renderFile}\n        renderAudioContent={(audioProps) => (\n          <AudioContent {...audioProps} renderMediaControl={(p) => <MediaControl {...p} />} />\n        )}\n        outlined={outlineAttachment}\n        fitParent={isGallery}\n      />\n    );\n  }\n\n  if (msgType === (MsgType.File as string)) return renderFile();\n  if (msgType === (MsgType.Location as string))\n    return <MLocation showMaps={showMaps} content={content} />;\n\n  if (msgType === GALLERY_MSGTYPE) {\n    return renderCaptionedAttachment(\n      <MGallery\n        content={content as IGalleryContent}\n        renderItem={(itemContent) => (\n          <RenderMessageContentInternal\n            displayName={displayName}\n            msgType={itemContent.msgtype as string}\n            ts={ts}\n            getContent={() => itemContent}\n            mediaAutoLoad={mediaAutoLoad}\n            urlPreview={urlPreview}\n            highlightRegex={highlightRegex}\n            htmlReactParserOptions={htmlReactParserOptions}\n            linkifyOpts={linkifyOpts}\n            outlineAttachment={outlineAttachment}\n            isGallery={true}\n          />\n        )}\n      />\n    );\n  }\n\n  if (msgType === 'm.bad.encrypted') return <MBadEncrypted />;\n\n  // cute events\n  if (msgType === 'im.fluffychat.cute_event')\n    return (\n      <MCuteEvent\n        content={(content as { body?: string }).body}\n        type={(content as { cute_type: CuteEventType }).cute_type ?? CuteEventType.Hug}\n        mentionedUserIds={\n          (content as { 'm.mentions'?: { user_ids?: string[] } })['m.mentions']?.user_ids\n        }\n      />\n    );\n  // as fallback to render older events where msgtype was set instead of m.emote with a custom property\n  if (msgType === 'fyi.cisnt.headpat')\n    return (\n      <MCuteEvent\n        content={(content as { body?: string }).body}\n        type={CuteEventType.Headpat}\n        mentionedUserIds={\n          (content as { 'm.mentions'?: { user_ids?: string[] } })['m.mentions']?.user_ids\n        }\n      />\n    );\n  if (content[M_POLL_START.name]) {\n    if (mEvent && mx && room)\n      return <PollEvent content={content} mEvent={mEvent} mx={mx} room={room} />;\n    else return <UnsupportedContent />;\n  }\n  return (\n    <UnsupportedContent\n      body={\n        (content as { body?: string }).body ??\n        (content as { [M_TEXT.name]?: string })[M_TEXT.name] ??\n        (content as { [M_TEXT.name]?: { body: string } })[M_TEXT.name]?.body ??\n        ''\n      }\n    />\n  );\n}\n\nexport const RenderMessageContent = memo(RenderMessageContentInternal);\n","import { as } from 'folds';\nimport classNames from 'classnames';\nimport * as css from './style.css';\n\ntype PowerColorBadgeProps = {\n  color?: string;\n};\nexport const PowerColorBadge = as<'span', PowerColorBadgeProps>(\n  ({ as: AsPowerColorBadge = 'span', color, className, style, ...props }, ref) => (\n    <AsPowerColorBadge\n      className={classNames(css.PowerColorBadge, { [css.PowerColorBadgeNone]: !color }, className)}\n      style={{\n        backgroundColor: color,\n        ...style,\n      }}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n","import { isJumboEmojiText } from '$utils/emojiDetection';\nimport { Image as MediaImage } from '$components/media';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport * as css from './style.css';\n\nconst SAFE_PROTOCOLS = new Set(['http:', 'https:', 'sable-media:', 'blob:']);\n\ntype PowerIconProps = css.PowerIconVariants & {\n  iconSrc: string;\n  name?: string;\n};\n\nexport function PowerIcon({ size, iconSrc, name }: PowerIconProps) {\n  const resolvedSrc = useRenderableMediaUrl(iconSrc);\n\n  if (isJumboEmojiText(iconSrc, 1)) {\n    return <span className={css.PowerIcon({ size })}>{iconSrc}</span>;\n  }\n\n  if (!resolvedSrc) return null;\n\n  let safeUrl: string | undefined;\n  try {\n    const parsed = new URL(resolvedSrc);\n    safeUrl = SAFE_PROTOCOLS.has(parsed.protocol) ? parsed.href : undefined;\n  } catch {\n    safeUrl = undefined;\n  }\n  if (!safeUrl) return null;\n\n  return <MediaImage className={css.PowerIcon({ size })} src={safeUrl} alt={name} />;\n}\n","import type { RectCords } from 'folds';\nimport type { PopOut } from '$components/overlay-stack';\nimport { Box, Button, config, Menu, MenuItem, Scroll, Spinner, Text, toRem } from 'folds';\nimport { CaretDown, sizedIcon } from '$components/icons/phosphor';\nimport {\n  type ComponentPropsWithoutRef,\n  type CSSProperties,\n  type MouseEventHandler,\n  type ReactNode,\n  useState,\n} from 'react';\n\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\n\nexport type SettingMenuOption<T extends string | number> = {\n  value: T;\n  label: string;\n  description?: string;\n  icon?: ReactNode;\n  disabled?: boolean;\n};\n\ntype MenuPosition = ComponentPropsWithoutRef<typeof PopOut>['position'];\ntype MenuAlign = ComponentPropsWithoutRef<typeof PopOut>['align'];\n\nexport type SettingMenuRenderTriggerArgs<T extends string | number> = {\n  value: T;\n  selectedOption: SettingMenuOption<T>;\n  opened: boolean;\n  loading: boolean;\n  disabled: boolean;\n  openMenu: MouseEventHandler<HTMLButtonElement>;\n};\n\nexport type SettingMenuRenderOptionArgs<T extends string | number> = {\n  option: SettingMenuOption<T>;\n  selected: boolean;\n  select: () => void;\n};\n\nexport type SettingMenuSelectorProps<T extends string | number> = {\n  value: T;\n  options: SettingMenuOption<T>[];\n  onSelect: (value: T) => void;\n  disabled?: boolean;\n  loading?: boolean;\n  position?: MenuPosition;\n  align?: MenuAlign;\n  offset?: number;\n  scrollable?: boolean;\n  optionStyle?: CSSProperties;\n  renderTrigger?: (args: SettingMenuRenderTriggerArgs<T>) => ReactNode;\n  renderOption?: (args: SettingMenuRenderOptionArgs<T>) => ReactNode;\n};\n\nexport function SettingMenuSelector<T extends string | number>({\n  value,\n  options,\n  onSelect,\n  disabled = false,\n  loading = false,\n  position = 'Bottom',\n  align = 'End',\n  offset = 5,\n  scrollable = false,\n  optionStyle,\n  renderTrigger,\n  renderOption,\n}: SettingMenuSelectorProps<T>) {\n  const [menuCords, setMenuCords] = useState<RectCords>();\n  const selectedOption = options.find((option) => option.value === value) ?? options[0];\n  const selectedLabel = selectedOption?.label ?? String(value);\n  const isDisabled = disabled || loading;\n\n  const handleOpenMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    if (isDisabled) return;\n    setMenuCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const handleCloseMenu = () => {\n    setMenuCords(undefined);\n  };\n\n  const handleSelect = (nextValue: T) => {\n    handleCloseMenu();\n    onSelect(nextValue);\n  };\n\n  const optionItems = options.map((option) => {\n    const selected = option.value === value;\n    const select = () => {\n      if (option.disabled) return;\n      handleSelect(option.value);\n    };\n\n    if (renderOption) {\n      return (\n        <MenuItem\n          key={option.value}\n          size=\"300\"\n          variant=\"Surface\"\n          radii=\"300\"\n          aria-selected={selected}\n          disabled={option.disabled || isDisabled}\n          onClick={select}\n          style={optionStyle}\n        >\n          {renderOption({ option, selected, select })}\n        </MenuItem>\n      );\n    }\n\n    return (\n      <MenuItem\n        key={option.value}\n        size=\"300\"\n        variant=\"Surface\"\n        aria-selected={selected}\n        radii=\"300\"\n        disabled={option.disabled || isDisabled}\n        onClick={select}\n        before={option.icon}\n        style={optionStyle}\n      >\n        <Box grow=\"Yes\">\n          <Box direction=\"Column\" gap=\"100\">\n            <Text size=\"T300\">{option.label}</Text>\n            {option.description && (\n              <Text size=\"T200\" priority=\"300\">\n                {option.description}\n              </Text>\n            )}\n          </Box>\n        </Box>\n      </MenuItem>\n    );\n  });\n\n  const optionsContent = scrollable ? (\n    <Box grow=\"Yes\">\n      <Scroll size=\"0\" hideTrack visibility=\"Hover\">\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n          {optionItems}\n        </Box>\n      </Scroll>\n    </Box>\n  ) : (\n    <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n      {optionItems}\n    </Box>\n  );\n\n  const trigger = renderTrigger ? (\n    renderTrigger({\n      value,\n      selectedOption: selectedOption ?? { value, label: selectedLabel },\n      opened: !!menuCords,\n      loading,\n      disabled: isDisabled,\n      openMenu: handleOpenMenu,\n    })\n  ) : (\n    <Button\n      size=\"300\"\n      variant=\"Secondary\"\n      outlined\n      fill=\"Soft\"\n      radii=\"300\"\n      after={loading ? <Spinner variant=\"Secondary\" size=\"300\" /> : sizedIcon(CaretDown, '300')}\n      onClick={handleOpenMenu}\n      disabled={isDisabled}\n    >\n      <Text size=\"T300\">{selectedLabel}</Text>\n    </Button>\n  );\n\n  return (\n    <>\n      {trigger}\n      <ResponsiveMenu\n        anchor={menuCords}\n        requestClose={handleCloseMenu}\n        offset={offset}\n        position={position}\n        align={align}\n        returnFocusOnDeactivate\n        arrowNavigation=\"both\"\n        mobile=\"dialog\"\n        menu={\n          <Menu\n            style={\n              scrollable ? { maxHeight: '75dvh', maxWidth: toRem(300), display: 'flex' } : undefined\n            }\n          >\n            {optionsContent}\n          </Menu>\n        }\n      />\n    </>\n  );\n}\n","import type { MouseEventHandler, ReactNode } from 'react';\nimport { Box, Text } from 'folds';\nimport type { PowerLevelTags } from '$hooks/usePowerLevelTags';\nimport { getPowers } from '$hooks/usePowerLevelTags';\nimport { PowerColorBadge } from './PowerColorBadge';\nimport {\n  SettingMenuSelector,\n  type SettingMenuOption,\n} from '$components/setting-menu-selector/SettingMenuSelector';\n\ntype PowerSwitcherProps = {\n  powerLevelTags: PowerLevelTags;\n  value: number;\n  onChange: (value: number) => void;\n  children: (handleOpen: MouseEventHandler<HTMLButtonElement>, opened: boolean) => ReactNode;\n};\nexport function PowerSwitcher({ powerLevelTags, value, onChange, children }: PowerSwitcherProps) {\n  const options: SettingMenuOption<number>[] = getPowers(powerLevelTags).map((power) => ({\n    value: power,\n    label: powerLevelTags[power]!.name,\n  }));\n\n  return (\n    <SettingMenuSelector\n      value={value}\n      options={options}\n      onSelect={onChange}\n      scrollable\n      renderTrigger={({ openMenu, opened }) => children(openMenu, opened)}\n      renderOption={({ option }) => {\n        const tag = powerLevelTags[option.value]!;\n        return (\n          <Box alignItems=\"Center\" gap=\"200\" grow=\"Yes\">\n            <PowerColorBadge color={tag.color} />\n            <Text style={{ flexGrow: 1 }} size=\"B400\" truncate>\n              {tag.name}\n            </Text>\n            <Text size=\"L400\">{option.value}</Text>\n          </Box>\n        );\n      }}\n    />\n  );\n}\n","import { useMemo } from 'react';\n\nimport { EmojiGroupId } from '$plugins/emoji';\nimport type { PhosphorIcon } from '$components/icons/phosphor';\nimport {\n  Basketball,\n  Coffee,\n  Flag,\n  Image,\n  Leaf,\n  Lightbulb,\n  Peace,\n  Smiley,\n} from '$components/icons/phosphor';\n\nexport type IEmojiGroupIcons = Record<EmojiGroupId, PhosphorIcon>;\n\nexport const useEmojiGroupIcons = (): IEmojiGroupIcons =>\n  useMemo(\n    () => ({\n      [EmojiGroupId.People]: Smiley,\n      [EmojiGroupId.Nature]: Leaf,\n      [EmojiGroupId.Food]: Coffee,\n      [EmojiGroupId.Activity]: Basketball,\n      [EmojiGroupId.Travel]: Image,\n      [EmojiGroupId.Object]: Lightbulb,\n      [EmojiGroupId.Symbol]: Peace,\n      [EmojiGroupId.Flag]: Flag,\n    }),\n    []\n  );\n","import { useMemo } from 'react';\nimport { EmojiGroupId } from '$plugins/emoji';\n\nexport type IEmojiGroupLabels = Record<EmojiGroupId, string>;\n\nexport const useEmojiGroupLabels = (): IEmojiGroupLabels =>\n  useMemo(\n    () => ({\n      [EmojiGroupId.People]: 'Smileys & People',\n      [EmojiGroupId.Nature]: 'Animals & Nature',\n      [EmojiGroupId.Food]: 'Food & Drinks',\n      [EmojiGroupId.Activity]: 'Activity',\n      [EmojiGroupId.Travel]: 'Travel & Places',\n      [EmojiGroupId.Object]: 'Objects',\n      [EmojiGroupId.Symbol]: 'Symbols',\n      [EmojiGroupId.Flag]: 'Flags',\n    }),\n    []\n  );\n","import type { GifData } from '$components/emoji-board/types';\n\nexport const GIF_PROVIDER_IDS = ['klipy', 'tenor', 'giphy'] as const;\n\nexport type GifProviderId = (typeof GIF_PROVIDER_IDS)[number];\n\nexport type GifsConfig = {\n  provider?: GifProviderId;\n  proxyUrl?: string;\n  klipyApiKey?: string;\n  tenorApiKey?: string;\n  giphyApiKey?: string;\n};\n\nexport type GifProvider = {\n  id: GifProviderId;\n  label: string;\n  searchHost: string;\n  getApiKey: (config: GifsConfig) => string | undefined;\n  buildSearchUrl: (apiKey: string, query: string) => string;\n  parseResults: (payload: unknown) => GifData[];\n  isMediaUrlAllowed: (url: URL) => boolean;\n  getProxyPayload: (url: URL, gif: GifData) => string | undefined;\n  proxyMimetype: string;\n};\n\nconst RESULT_LIMIT = 50; // TODO: infinite scroll?\n\nconst SIZE_LIMIT = 3 * 1024 * 1024;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n  !!value && typeof value === 'object' && !Array.isArray(value);\n\nconst toPositiveInt = (value: unknown): number | undefined => {\n  const parsed = typeof value === 'string' ? Number(value) : value;\n  return typeof parsed === 'number' && Number.isSafeInteger(parsed) && parsed > 0\n    ? parsed\n    : undefined;\n};\n\nconst idBeforeFilename = (url: URL): string | undefined =>\n  url.pathname.split('/').filter(Boolean).at(-2);\n\nconst isPlainHttpsUrl = (url: URL): boolean =>\n  url.protocol === 'https:' && url.port === '' && url.username === '' && url.password === '';\n\ntype GifFile = {\n  url: string;\n  width?: number;\n  height?: number;\n  size?: number;\n};\n\nconst toGifFile = (\n  url: unknown,\n  width: unknown,\n  height: unknown,\n  size: unknown\n): GifFile | undefined =>\n  typeof url === 'string' && url\n    ? {\n        url,\n        width: toPositiveInt(width),\n        height: toPositiveInt(height),\n        size: toPositiveInt(size),\n      }\n    : undefined;\n\n/** Full resolution, dropped to a smaller rendition when it would be too large to send. */\nconst pickFullRes = (candidates: (GifFile | undefined)[]): GifFile | undefined => {\n  const available = candidates.filter((file): file is GifFile => !!file);\n  return (\n    available.find((file) => !file.size || file.size <= SIZE_LIMIT) ??\n    available[available.length - 1]\n  );\n};\n\nconst toGifData = (\n  id: string,\n  title: string,\n  shareUrl: string,\n  fullRes: GifFile | undefined,\n  preview: GifFile | undefined\n): GifData => ({\n  id,\n  title: title || 'GIF',\n  shareUrl: shareUrl || fullRes?.url || '',\n  mediaUrl: fullRes?.url ?? '',\n  preview_url: preview?.url ?? fullRes?.url ?? '',\n  width: fullRes?.width ?? preview?.width ?? 0,\n  height: fullRes?.height ?? preview?.height ?? 0,\n  size: fullRes?.size ?? preview?.size ?? 0,\n  mimetype: 'image/gif',\n});\n\n/** Klipy serves each size as a bag of encodings; we only ever want the gif. */\nconst parseKlipyFormat = (format: unknown): GifFile | undefined => {\n  if (!isRecord(format) || !isRecord(format.gif)) return undefined;\n  const { gif } = format;\n  return toGifFile(gif.url, gif.width, gif.height, gif.size);\n};\n\nconst parseKlipyResults = (payload: unknown): GifData[] => {\n  const outer = isRecord(payload) ? payload.data : undefined;\n  const results = isRecord(outer) ? outer.data : undefined;\n  if (!Array.isArray(results)) return [];\n\n  return results.filter(isRecord).map((result) => {\n    const formats = isRecord(result.file) ? result.file : {};\n    const preview =\n      parseKlipyFormat(formats.xs) ?? parseKlipyFormat(formats.sm) ?? parseKlipyFormat(formats.md);\n    const fullRes = pickFullRes([\n      parseKlipyFormat(formats.hd),\n      parseKlipyFormat(formats.md),\n      preview,\n    ]);\n    const id =\n      typeof result.id === 'string' || typeof result.id === 'number' ? String(result.id) : '';\n    const shareUrl =\n      typeof result.slug === 'string' && result.slug\n        ? `https://klipy.com/gifs/${encodeURIComponent(result.slug)}`\n        : '';\n\n    return toGifData(\n      id,\n      typeof result.title === 'string' ? result.title : '',\n      shareUrl,\n      fullRes,\n      preview\n    );\n  });\n};\n\nconst parseTenorFormat = (formats: Record<string, unknown>, key: string): GifFile | undefined => {\n  const format = formats[key];\n  if (!isRecord(format)) return undefined;\n  const dims = Array.isArray(format.dims) ? format.dims : [];\n  return toGifFile(format.url, dims[0], dims[1], format.size);\n};\n\nconst parseTenorResults = (payload: unknown): GifData[] => {\n  const results = isRecord(payload) ? payload.results : undefined;\n  if (!Array.isArray(results)) return [];\n\n  return results.filter(isRecord).map((result) => {\n    const formats = isRecord(result.media_formats) ? result.media_formats : {};\n    const preview = parseTenorFormat(formats, 'tinygif') ?? parseTenorFormat(formats, 'nanogif');\n    const fullRes = pickFullRes([\n      parseTenorFormat(formats, 'gif'),\n      parseTenorFormat(formats, 'mediumgif'),\n      preview,\n    ]);\n    const title =\n      (typeof result.content_description === 'string' && result.content_description) ||\n      (typeof result.title === 'string' ? result.title : '');\n\n    return toGifData(\n      typeof result.id === 'string' ? result.id : '',\n      title,\n      typeof result.itemurl === 'string' ? result.itemurl : '',\n      fullRes,\n      preview\n    );\n  });\n};\n\nconst parseGiphyRendition = (images: Record<string, unknown>, key: string): GifFile | undefined => {\n  const rendition = images[key];\n  if (!isRecord(rendition)) return undefined;\n  return toGifFile(rendition.url, rendition.width, rendition.height, rendition.size);\n};\n\nconst parseGiphyResults = (payload: unknown): GifData[] => {\n  const results = isRecord(payload) ? payload.data : undefined;\n  if (!Array.isArray(results)) return [];\n\n  return results.filter(isRecord).map((result) => {\n    const images = isRecord(result.images) ? result.images : {};\n    const preview =\n      parseGiphyRendition(images, 'fixed_width') ?? parseGiphyRendition(images, 'preview_gif');\n    const fullRes =\n      parseGiphyRendition(images, 'original') ??\n      parseGiphyRendition(images, 'downsized') ??\n      preview;\n\n    return toGifData(\n      typeof result.id === 'string' ? result.id : '',\n      typeof result.title === 'string' ? result.title : '',\n      typeof result.url === 'string' ? result.url : '',\n      fullRes,\n      preview\n    );\n  });\n};\n\nexport const GIF_PROVIDERS: Record<GifProviderId, GifProvider> = {\n  klipy: {\n    id: 'klipy',\n    label: 'Klipy',\n    searchHost: 'klipy.com',\n    getApiKey: (config) => config.klipyApiKey,\n    buildSearchUrl: (apiKey, query) => {\n      const url = new URL(`https://api.klipy.com/api/v1/${encodeURIComponent(apiKey)}/gifs/search`);\n      url.searchParams.set('q', query);\n      url.searchParams.set('per_page', String(RESULT_LIMIT));\n      return url.toString();\n    },\n    parseResults: parseKlipyResults,\n    isMediaUrlAllowed: (url) =>\n      isPlainHttpsUrl(url) && url.hostname === 'static.klipy.com' && /^\\/ii\\/.+/.test(url.pathname),\n    getProxyPayload: (url) => url.pathname.slice('/ii/'.length) || undefined,\n    proxyMimetype: 'image/gif',\n  },\n  tenor: {\n    id: 'tenor',\n    label: 'Tenor',\n    searchHost: 'tenor.googleapis.com',\n    getApiKey: (config) => config.tenorApiKey,\n    buildSearchUrl: (apiKey, query) => {\n      const url = new URL('https://tenor.googleapis.com/v2/search');\n      url.searchParams.set('key', apiKey);\n      url.searchParams.set('client_key', 'tenor_web');\n      url.searchParams.set('q', query);\n      url.searchParams.set('limit', String(RESULT_LIMIT));\n      url.searchParams.set('media_filter', 'gif,mediumgif,tinygif,nanogif');\n      return url.toString();\n    },\n    parseResults: parseTenorResults,\n    isMediaUrlAllowed: (url) =>\n      isPlainHttpsUrl(url) && /^(?:c|media\\d*)\\.tenor\\.com$/.test(url.hostname),\n    getProxyPayload: (url) => idBeforeFilename(url),\n    proxyMimetype: 'image/gif',\n  },\n  giphy: {\n    id: 'giphy',\n    label: 'Giphy',\n    searchHost: 'giphy.com',\n    getApiKey: (config) => config.giphyApiKey,\n    buildSearchUrl: (apiKey, query) => {\n      const url = new URL('https://api.giphy.com/v1/gifs/search');\n      url.searchParams.set('api_key', apiKey);\n      url.searchParams.set('q', query);\n      url.searchParams.set('limit', String(RESULT_LIMIT));\n      return url.toString();\n    },\n    parseResults: parseGiphyResults,\n    isMediaUrlAllowed: (url) =>\n      isPlainHttpsUrl(url) && /^(?:i|media\\d*)\\.giphy\\.com$/.test(url.hostname),\n    getProxyPayload: (url, gif) => gif.id || idBeforeFilename(url),\n    proxyMimetype: 'image/webp',\n  },\n};\n\nexport const DEFAULT_GIF_PROVIDER_ID: GifProviderId = 'tenor';\n\nexport type GifProviderSetting = GifProviderId | 'default';\n\nconst configuredProvider = (config: GifsConfig | undefined): GifProvider => {\n  const id = config?.provider;\n  return (id && GIF_PROVIDERS[id]) || GIF_PROVIDERS[DEFAULT_GIF_PROVIDER_ID];\n};\n\nexport const getGifProvider = (\n  config: GifsConfig | undefined,\n  override: GifProviderSetting = 'default'\n): GifProvider => {\n  const picked = override === 'default' ? undefined : GIF_PROVIDERS[override];\n  // A provider without a key cannot search, so keep the configured one.\n  return picked?.getApiKey(config ?? {}) ? picked : configuredProvider(config);\n};\n\nexport const getGifProviderOptions = (\n  config: GifsConfig | undefined\n): { value: GifProviderSetting; label: string; disabled?: boolean }[] => [\n  { value: 'default', label: `Client Default (${configuredProvider(config).label})` },\n  ...GIF_PROVIDER_IDS.map((id) => ({\n    value: id,\n    label: GIF_PROVIDERS[id].getApiKey(config ?? {})\n      ? GIF_PROVIDERS[id].label\n      : `${GIF_PROVIDERS[id].label} (no API key)`,\n    disabled: !GIF_PROVIDERS[id].getApiKey(config ?? {}),\n  })),\n];\n\nconst toBase64Url = (value: string): string => {\n  const bytes = new TextEncoder().encode(value);\n  let binary = '';\n  for (const byte of bytes) binary += String.fromCodePoint(byte);\n  return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replaceAll(/=+$/g, '');\n};\n\nexport type ProxiedGif = { mxcUrl: string; mimetype: string };\n\nexport const getProxiedGif = (gif: GifData, proxyUrl?: string): ProxiedGif | undefined => {\n  if (!proxyUrl?.trim()) return undefined;\n\n  let url: URL;\n  try {\n    url = new URL(gif.mediaUrl);\n  } catch {\n    return undefined;\n  }\n\n  const provider = Object.values(GIF_PROVIDERS).find((candidate) =>\n    candidate.isMediaUrlAllowed(url)\n  );\n  const payload = provider?.getProxyPayload(url, gif);\n  if (!provider || !payload) return undefined;\n\n  return {\n    mxcUrl: `mxc://${proxyUrl.trim()}/${provider.id}_${toBase64Url(payload)}`,\n    mimetype: provider.proxyMimetype,\n  };\n};\n\nexport const isAllowedGifMediaUrl = (value: string | URL): boolean => {\n  try {\n    const url = typeof value === 'string' ? new URL(value) : value;\n    return Object.values(GIF_PROVIDERS).some((provider) => provider.isMediaUrlAllowed(url));\n  } catch {\n    return false;\n  }\n};\n","export enum EmojiBoardTab {\n  Emoji = 'Emoji',\n  Sticker = 'Sticker',\n  Gif = 'Gif',\n}\n\nexport enum EmojiType {\n  Emoji = 'emoji',\n  CustomEmoji = 'customEmoji',\n  Sticker = 'sticker',\n  Gif = 'gif',\n}\n\nexport type EmojiItemInfo = {\n  type: EmojiType;\n  data: string;\n  shortcode: string;\n  label: string;\n};\n\nexport type GifData = {\n  id: string;\n  title: string;\n  shareUrl: string;\n  mediaUrl: string;\n  preview_url?: string;\n  width?: number;\n  height?: number;\n  size?: number;\n  mimetype?: string;\n  blurhash?: string;\n};\n","import type { ChangeEventHandler } from 'react';\nimport { useRef } from 'react';\nimport { Input, Chip, Text } from 'folds';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { ArrowRight, sizedIcon, MagnifyingGlass } from '$components/icons/phosphor';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { getGifProvider } from '$utils/gifProviders';\nimport { EmojiBoardTab } from '../types';\n\ntype SearchInputProps = {\n  query?: string;\n  defaultValue?: string;\n  onChange: ChangeEventHandler<HTMLInputElement>;\n  allowTextCustomEmoji?: boolean;\n  onTextCustomEmojiSelect?: (text: string) => void;\n  tab?: EmojiBoardTab;\n};\nexport function SearchInput({\n  query,\n  defaultValue,\n  onChange,\n  allowTextCustomEmoji,\n  onTextCustomEmojiSelect,\n  tab,\n}: SearchInputProps) {\n  const inputRef = useRef<HTMLInputElement>(null);\n  const clientConfig = useClientConfig();\n  const [gifProviderSetting] = useSetting(settingsAtom, 'gifProvider');\n  const gifProvider = getGifProvider(clientConfig.gifs, gifProviderSetting);\n\n  const handleReact = () => {\n    const textEmoji = inputRef.current?.value.trim();\n    if (!textEmoji) return;\n    onTextCustomEmojiSelect?.(textEmoji);\n  };\n\n  return (\n    <Input\n      ref={inputRef}\n      variant=\"SurfaceVariant\"\n      size=\"400\"\n      placeholder={\n        tab === EmojiBoardTab.Gif\n          ? `Search ${gifProvider.label}`\n          : allowTextCustomEmoji\n            ? 'Search or Text Reaction '\n            : 'Search'\n      }\n      maxLength={50}\n      defaultValue={defaultValue}\n      after={\n        allowTextCustomEmoji && query && tab !== EmojiBoardTab.Gif ? (\n          <Chip\n            variant=\"Primary\"\n            radii=\"Pill\"\n            after={sizedIcon(ArrowRight, '50')}\n            outlined\n            onClick={handleReact}\n          >\n            <Text size=\"L400\">React</Text>\n          </Chip>\n        ) : (\n          sizedIcon(MagnifyingGlass, '50')\n        )\n      }\n      onChange={onChange}\n      autoFocus={!isMobileOrTablet()}\n    />\n  );\n}\n","import type { CSSProperties } from 'react';\nimport { Badge, Box, Text } from 'folds';\nimport { EmojiBoardTab } from '$components/emoji-board/types';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\n\nconst styles: CSSProperties = {\n  cursor: 'pointer',\n};\n\nexport function EmojiBoardTabs({\n  tab,\n  onTabChange,\n}: {\n  tab: EmojiBoardTab;\n  onTabChange: (tab: EmojiBoardTab) => void;\n}) {\n  const [showGifPicker] = useSetting(settingsAtom, 'enableGifPicker');\n  return (\n    <Box gap=\"100\">\n      {showGifPicker && (\n        <Badge\n          style={styles}\n          as=\"button\"\n          variant=\"Secondary\"\n          fill={tab === EmojiBoardTab.Gif ? 'Solid' : 'None'}\n          size=\"500\"\n          onClick={() => onTabChange(EmojiBoardTab.Gif)}\n        >\n          <Text as=\"span\" size=\"L400\">\n            GIF\n          </Text>\n        </Badge>\n      )}\n      <Badge\n        style={styles}\n        as=\"button\"\n        variant=\"Secondary\"\n        fill={tab === EmojiBoardTab.Sticker ? 'Solid' : 'None'}\n        size=\"500\"\n        onClick={() => onTabChange(EmojiBoardTab.Sticker)}\n      >\n        <Text as=\"span\" size=\"L400\">\n          Sticker\n        </Text>\n      </Badge>\n      <Badge\n        style={styles}\n        as=\"button\"\n        variant=\"Secondary\"\n        fill={tab === EmojiBoardTab.Emoji ? 'Solid' : 'None'}\n        size=\"500\"\n        onClick={() => onTabChange(EmojiBoardTab.Emoji)}\n      >\n        <Text as=\"span\" size=\"L400\">\n          Emoji\n        </Text>\n      </Badge>\n    </Box>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Box, Scroll, Line, as, Tooltip, Text, IconButton } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport classNames from 'classnames';\nimport { Image as MediaImage } from '$components/media';\nimport { sizedIcon, Image as ImageIcon, type PhosphorIcon } from '$components/icons/phosphor';\nimport * as css from './styles.css';\n\nexport function Sidebar({ children }: { children: ReactNode }) {\n  return (\n    <Box className={css.Sidebar} shrink=\"No\">\n      <Scroll size=\"0\">\n        <Box className={css.SidebarContent} direction=\"Column\" alignItems=\"Center\" gap=\"100\">\n          {children}\n        </Box>\n      </Scroll>\n    </Box>\n  );\n}\n\nexport const SidebarStack = as<'div'>(({ className, children, ...props }, ref) => (\n  <Box\n    className={classNames(css.SidebarStack, className)}\n    direction=\"Column\"\n    alignItems=\"Center\"\n    gap=\"100\"\n    {...props}\n    ref={ref}\n  >\n    {children}\n  </Box>\n));\nexport function SidebarDivider() {\n  return <Line className={css.SidebarDivider} size=\"300\" variant=\"Surface\" />;\n}\n\nfunction SidebarBtn<T extends string>({\n  active,\n  label,\n  id,\n  onClick,\n  children,\n}: {\n  active?: boolean;\n  label: string;\n  id: T;\n  onClick: (id: T) => void;\n  children: ReactNode;\n}) {\n  return (\n    <TooltipProvider\n      delay={500}\n      position=\"Left\"\n      tooltip={\n        <Tooltip id={`SidebarStackItem-${id}-label`}>\n          <Text size=\"T300\">{label}</Text>\n        </Tooltip>\n      }\n    >\n      {(ref) => (\n        <IconButton\n          aria-pressed={active}\n          aria-labelledby={`SidebarStackItem-${id}-label`}\n          ref={ref}\n          onClick={() => onClick(id)}\n          size=\"400\"\n          radii=\"300\"\n          variant=\"Surface\"\n        >\n          {children}\n        </IconButton>\n      )}\n    </TooltipProvider>\n  );\n}\n\ntype GroupIconProps<T extends string> = {\n  active: boolean;\n  id: T;\n  label: string;\n  icon: PhosphorIcon;\n  onClick: (id: T) => void;\n};\nexport function GroupIcon<T extends string>({\n  active,\n  id,\n  label,\n  icon,\n  onClick,\n}: GroupIconProps<T>) {\n  return (\n    <SidebarBtn active={active} id={id} label={label} onClick={onClick}>\n      {sizedIcon(icon, '200', { filled: active })}\n    </SidebarBtn>\n  );\n}\n\ntype ImageGroupIconProps<T extends string> = {\n  active: boolean;\n  id: T;\n  label: string;\n  url?: string;\n  onClick: (id: T) => void;\n};\nexport function ImageGroupIcon<T extends string>({\n  active,\n  id,\n  label,\n  url,\n  onClick,\n}: ImageGroupIconProps<T>) {\n  return (\n    <SidebarBtn active={active} id={id} label={label} onClick={onClick}>\n      {url ? (\n        <MediaImage className={css.SidebarBtnImg} src={url} alt={label} />\n      ) : (\n        sizedIcon(ImageIcon, '200', { filled: active })\n      )}\n    </SidebarBtn>\n  );\n}\n","import { Box, config, Text, toRem } from 'folds';\nimport { dropzoneIcon, Sticker } from '$components/icons/phosphor';\nimport { useOpenRoomSettings } from '$state/hooks/roomSettings.ts';\nimport { useRoomOptionally } from '$hooks/useRoom.ts';\nimport { useSpaceOptionally } from '$hooks/useSpace.ts';\nimport * as css from './styles.css';\nimport { RoomSettingsPage } from '$state/roomSettings.ts';\n\nfunction OptionallyLinkedText(props: { text: string; isLink: boolean; onClick: () => void }) {\n  return props.isLink ? (\n    <Text as=\"span\" className={css.TextLink} onClick={props.onClick} size=\"Inherit\">\n      {props.text}\n    </Text>\n  ) : (\n    <>{props.text}</>\n  );\n}\n\nexport function NoStickerPacks() {\n  const openRoomSettings = useOpenRoomSettings();\n\n  const room = useRoomOptionally();\n  const space = useSpaceOptionally();\n\n  return (\n    <Box\n      style={{ padding: `${toRem(60)} ${config.space.S500}` }}\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      direction=\"Column\"\n      gap=\"300\"\n    >\n      {dropzoneIcon(Sticker)}\n      <Box direction=\"Inherit\">\n        <Text align=\"Center\">No Sticker Packs!</Text>\n        <Text priority=\"300\" align=\"Center\" size=\"T200\">\n          Add stickers from user,{' '}\n          <OptionallyLinkedText\n            text=\"room\"\n            isLink={room !== null}\n            onClick={() =>\n              openRoomSettings(\n                room?.roomId as string,\n                space?.roomId,\n                RoomSettingsPage.EmojisStickersPage\n              )\n            }\n          />\n          {', '}or{' '}\n          <OptionallyLinkedText\n            text=\"space\"\n            isLink={room !== null && space !== null}\n            onClick={() =>\n              openRoomSettings(\n                space?.roomId as string,\n                space?.roomId,\n                RoomSettingsPage.EmojisStickersPage\n              )\n            }\n          />{' '}\n          settings.\n        </Text>\n      </Box>\n    </Box>\n  );\n}\n","import { SmileySadIcon } from '@phosphor-icons/react';\nimport { Box, toRem, config, Text } from 'folds';\n\nfunction GifSearching() {\n  return (\n    <Box\n      style={{ padding: `${toRem(60)} ${config.space.S500}` }}\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      direction=\"Column\"\n      gap=\"300\"\n    >\n      <Text>Loading GIFs...</Text>\n    </Box>\n  );\n}\n\nfunction GifSearchError({ error }: { error: string }) {\n  return (\n    <Box\n      style={{ padding: `${toRem(60)} ${config.space.S500}` }}\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      direction=\"Column\"\n      gap=\"300\"\n    >\n      <Text>Error: {error}</Text>\n    </Box>\n  );\n}\n\nfunction NoGifResults() {\n  return (\n    <Box\n      style={{ padding: `${toRem(60)} ${config.space.S500}` }}\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      direction=\"Column\"\n      gap=\"300\"\n    >\n      <SmileySadIcon size=\"48\" />\n      <Box direction=\"Inherit\">\n        <Text align=\"Center\">No GIFs found!</Text>\n        <Text priority=\"300\" align=\"Center\" size=\"T200\">\n          Try searching for something else or favoriting some gifs.\n        </Text>\n      </Box>\n    </Box>\n  );\n}\n\ntype GifStatusProps = {\n  loading: boolean;\n  error: string | null;\n  isEmpty: boolean;\n};\n\nexport function GifStatus({ loading, error, isEmpty }: Readonly<GifStatusProps>) {\n  if (loading) return <GifSearching />;\n  if (error) return <GifSearchError error={error} />;\n  if (isEmpty) return <NoGifResults />;\n  return null;\n}\n","import { Box, Text } from 'folds';\nimport type { Atom } from 'jotai';\nimport { atom, useAtomValue } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { Image as MediaImage } from '$components/media';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport * as css from './styles.css';\n\nexport type PreviewData = {\n  key: string;\n  shortcode: string;\n};\n\nexport const createPreviewDataAtom = (initial?: PreviewData) =>\n  atom<PreviewData | undefined>(initial);\n\ntype PreviewProps = {\n  previewAtom: Atom<PreviewData | undefined>;\n};\nexport function Preview({ previewAtom }: PreviewProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const { key, shortcode } = useAtomValue(previewAtom) ?? {};\n\n  if (!shortcode) return null;\n\n  return (\n    <Box shrink=\"No\" className={css.Preview} gap=\"300\" alignItems=\"Center\">\n      {key && (\n        <Box\n          display=\"InlineFlex\"\n          className={css.PreviewEmoji}\n          alignItems=\"Center\"\n          justifyContent=\"Center\"\n        >\n          {key.startsWith('mxc://') ? (\n            <MediaImage\n              className={css.PreviewImg}\n              src={mxcUrlToHttp(mx, key, useAuthentication) ?? undefined}\n              alt={shortcode}\n            />\n          ) : (\n            key\n          )}\n        </Box>\n      )}\n      <Text size=\"H5\" truncate>\n        :{shortcode}:\n      </Text>\n    </Box>\n  );\n}\n","import { Box, color, config, Menu, MenuItem } from 'folds';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport type { PackImageReader } from '$plugins/custom-emoji';\nimport type { IEmoji } from '$plugins/emoji';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { Image as MediaImage } from '$components/media';\nimport type { EmojiItemInfo, GifData } from '$components/emoji-board/types';\nimport { EmojiType } from '$components/emoji-board/types';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\nimport * as css from './styles.css';\nimport { useFavoriteGifs } from '$hooks/useFavoriteGifs';\nimport { Star, Eye, EyeSlash, menuIcon } from '$components/icons/phosphor';\nimport { MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS } from '$unstable/prefixes';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\n\nconst ANIMATED_MIME_TYPES = new Set(['image/gif', 'image/apng']);\n\nconst isAnimatedPackImage = (image: PackImageReader): boolean => {\n  const mimetype = image.info?.mimetype?.toLowerCase();\n  if (mimetype && ANIMATED_MIME_TYPES.has(mimetype)) return true;\n\n  const body = image.body?.toLowerCase();\n  return !!body && (body.endsWith('.gif') || body.endsWith('.webp') || body.endsWith('.apng'));\n};\n\nconst getPackImageSrc = (\n  mx: MatrixClient,\n  image: PackImageReader,\n  useAuthentication: boolean | undefined,\n  saveStickerEmojiBandwidth: boolean,\n  width: number,\n  height: number\n): string => {\n  const preserveAnimation = isAnimatedPackImage(image);\n\n  return preserveAnimation || !saveStickerEmojiBandwidth\n    ? (mxcUrlToHttp(mx, image.url, useAuthentication) ?? '')\n    : (mxcUrlToHttp(mx, image.url, useAuthentication, width, height) ?? '');\n};\n\nexport const getEmojiItemInfo = (element: Element): EmojiItemInfo | undefined => {\n  const label = element.getAttribute('title');\n  const type = element.getAttribute('data-emoji-type') as EmojiType | undefined;\n  const data = element.getAttribute('data-emoji-data');\n  const shortcode = element.getAttribute('data-emoji-shortcode');\n\n  if (type && data && shortcode && label)\n    return {\n      type,\n      data,\n      shortcode,\n      label,\n    };\n  return undefined;\n};\n\ntype EmojiItemProps = {\n  emoji: IEmoji;\n};\nexport function EmojiItem({ emoji }: EmojiItemProps) {\n  return (\n    <Box\n      as=\"button\"\n      type=\"button\"\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      className={css.EmojiItem}\n      title={emoji.label}\n      aria-label={`${emoji.label} emoji`}\n      data-emoji-type={EmojiType.Emoji}\n      data-emoji-data={emoji.unicode}\n      data-emoji-shortcode={emoji.shortcode}\n    >\n      {emoji.unicode}\n    </Box>\n  );\n}\n\ntype CustomEmojiItemProps = {\n  mx: MatrixClient;\n  useAuthentication?: boolean;\n  image: PackImageReader;\n  saveStickerEmojiBandwidth: boolean;\n};\nexport function CustomEmojiItem({\n  mx,\n  useAuthentication,\n  image,\n  saveStickerEmojiBandwidth,\n}: CustomEmojiItemProps) {\n  return (\n    <Box\n      as=\"button\"\n      type=\"button\"\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      className={css.EmojiItem}\n      title={image.body || image.shortcode}\n      aria-label={`${image.body || image.shortcode} emoji`}\n      data-emoji-type={EmojiType.CustomEmoji}\n      data-emoji-data={image.url}\n      data-emoji-shortcode={image.shortcode}\n    >\n      <MediaImage\n        loading=\"lazy\"\n        className={css.CustomEmojiImg}\n        alt={image.body || image.shortcode}\n        info={image.info}\n        mimeType={image.info?.mimetype}\n        src={getPackImageSrc(mx, image, useAuthentication, saveStickerEmojiBandwidth, 32, 32)}\n      />\n    </Box>\n  );\n}\n\ntype StickerItemProps = {\n  mx: MatrixClient;\n  useAuthentication?: boolean;\n  image: PackImageReader;\n  saveStickerEmojiBandwidth: boolean;\n};\n\nexport function StickerItem({\n  mx,\n  useAuthentication,\n  image,\n  saveStickerEmojiBandwidth,\n}: StickerItemProps) {\n  return (\n    <Box\n      as=\"button\"\n      type=\"button\"\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      className={css.StickerItem}\n      title={image.body || image.shortcode}\n      aria-label={`${image.body || image.shortcode} emoji`}\n      data-emoji-type={EmojiType.Sticker}\n      data-emoji-data={image.url}\n      data-emoji-shortcode={image.shortcode}\n    >\n      <MediaImage\n        loading=\"lazy\"\n        className={css.StickerImg}\n        alt={image.body || image.shortcode}\n        info={image.info}\n        mimeType={image.info?.mimetype}\n        src={getPackImageSrc(mx, image, useAuthentication, saveStickerEmojiBandwidth, 125, 125)}\n      />\n    </Box>\n  );\n}\n\nexport function GifItem({\n  label,\n  type,\n  data,\n  shortcode,\n  gif,\n  style,\n  children,\n}: {\n  label: string;\n  type: EmojiType;\n  data: string;\n  shortcode: string;\n  gif: GifData;\n  style?: CSSProperties;\n  children: ReactNode;\n}) {\n  const [isHovered, setIsHovered] = useState(false);\n  const favoritedContent = useFavoriteGifs();\n\n  const mediaUrl = gif.mediaUrl;\n\n  const [favorited, setFavorited] = useState(\n    favoritedContent.gifs.some((v) => v.mediaUrl === mediaUrl && mediaUrl !== '')\n  );\n  const [isSpoiler, setIsSpoiler] = useState(false);\n  const mx = useMatrixClient();\n\n  useEffect(() => {\n    setFavorited(favoritedContent.gifs.some((v) => v.mediaUrl === mediaUrl && mediaUrl !== ''));\n  }, [favoritedContent, mediaUrl]);\n\n  return (\n    <Box\n      as=\"button\"\n      className={css.GifItem}\n      type=\"button\"\n      style={style}\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      title={label}\n      aria-label={`${label} gif`}\n      data-emoji-type={type}\n      data-emoji-data={data}\n      data-emoji-shortcode={shortcode}\n      data-gif-data={gif ? JSON.stringify(gif) : undefined}\n      data-gif-spoiler={isSpoiler ? 'true' : 'false'}\n      onPointerEnter={() => setIsHovered(true)}\n      onPointerLeave={() => setIsHovered(false)}\n    >\n      {children}\n      {isHovered && (\n        <Box style={{ padding: config.space.S200, right: 0, top: 0, position: 'absolute' }}>\n          <Menu style={{ padding: config.space.S0 }}>\n            <Box>\n              <MenuItem\n                size=\"300\"\n                radii=\"0\"\n                fill=\"Soft\"\n                variant=\"Secondary\"\n                title={favorited ? 'Unfavorite gif' : 'Favorite gif'}\n                onClick={async (e) => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  if (!favorited) {\n                    setFavorited(true);\n                    await mx\n                      .setAccountData(MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS, {\n                        gifs: [\n                          ...favoritedContent.gifs,\n                          {\n                            shareUrl: gif.shareUrl,\n                            mediaUrl,\n                            title: gif.title,\n                            width: gif.width,\n                            height: gif.height,\n                            size: gif.size,\n                            mimetype: gif.mimetype,\n                          },\n                        ],\n                      })\n                      .catch(() => setFavorited(false));\n                  } else {\n                    setFavorited(false);\n                    await mx\n                      .setAccountData(MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS, {\n                        gifs: favoritedContent.gifs.filter((v) => v.mediaUrl !== mediaUrl),\n                      })\n                      .catch(() => setFavorited(true));\n                  }\n                }}\n              >\n                {menuIcon(Star, {\n                  weight: favorited ? 'fill' : 'regular',\n                  color: favorited ? color.Warning.MainHover : color.Secondary.OnContainer,\n                })}\n              </MenuItem>\n              <MenuItem\n                size=\"300\"\n                radii=\"0\"\n                fill=\"Soft\"\n                variant=\"Secondary\"\n                title={isSpoiler ? 'Remove spoiler' : 'Mark as spoiler'}\n                onClick={(e) => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  setIsSpoiler(!isSpoiler);\n                }}\n              >\n                {menuIcon(isSpoiler ? EyeSlash : Eye, {\n                  weight: isSpoiler ? 'fill' : 'regular',\n                  color: color.Surface.OnContainer,\n                })}\n              </MenuItem>\n            </Box>\n          </Menu>\n        </Box>\n      )}\n    </Box>\n  );\n}\n","import { as, Box, Text } from 'folds';\nimport type { ReactNode } from 'react';\nimport classNames from 'classnames';\nimport * as css from './styles.css';\n\nconst getDOMGroupId = (id: string): string => `EmojiBoardGroup-${id}`;\n\nexport const EmojiGroup = as<\n  'div',\n  {\n    id: string;\n    label: string;\n    isGifGroup?: boolean;\n    children: ReactNode;\n  }\n>(({ className, id, label, isGifGroup, children, ...props }, ref) => (\n  <Box\n    id={getDOMGroupId(id)}\n    data-group-id={id}\n    className={classNames(css.EmojiGroup, className)}\n    direction=\"Column\"\n    gap=\"200\"\n    {...props}\n    ref={ref}\n  >\n    <Text id={`EmojiGroup-${id}-label`} as=\"label\" className={css.EmojiGroupLabel} size=\"O400\">\n      {label}\n    </Text>\n    <div\n      aria-labelledby={`EmojiGroup-${id}-label`}\n      className={isGifGroup ? css.GifGroupContent : css.EmojiGroupContent}\n    >\n      {isGifGroup ? (\n        children\n      ) : (\n        <Box wrap=\"Wrap\" justifyContent=\"Center\">\n          {children}\n        </Box>\n      )}\n    </div>\n  </Box>\n));\n","import { as, Box, Line } from 'folds';\nimport type { ReactNode } from 'react';\nimport classNames from 'classnames';\nimport * as css from './styles.css';\n\nexport const EmojiBoardLayout = as<\n  'div',\n  {\n    header: ReactNode;\n    sidebar?: ReactNode;\n    children: ReactNode;\n    isFullWidth?: boolean;\n    sheet?: boolean;\n  }\n>(({ className, header, sidebar, children, isFullWidth, sheet, ...props }, ref) => (\n  <Box\n    display=\"InlineFlex\"\n    className={classNames(css.Base({ isFullWidth, sheet }), className)}\n    direction=\"Row\"\n    {...props}\n    ref={ref}\n  >\n    <Box direction=\"Column\" grow=\"Yes\" className={css.Main}>\n      <Box\n        className={classNames(css.Header, sheet && css.SheetHeader)}\n        direction=\"Column\"\n        shrink=\"No\"\n      >\n        {header}\n      </Box>\n      <Box className={css.Body}>{children}</Box>\n    </Box>\n    {sidebar && <Line size=\"300\" direction=\"Vertical\" />}\n    {sidebar}\n  </Box>\n));\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { AsyncSearchHandler } from '$utils/AsyncSearch';\nimport { fetch } from '$utils/fetch';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { getGifProvider } from '$utils/gifProviders';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport type { GifData } from './types';\n\nexport function useGifSearch(\n  favoriteGifs: GifData[],\n  showGifPicker: boolean,\n  gifSearch: AsyncSearchHandler\n) {\n  const [searchResults, setSearchResults] = useState<GifData[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const clientConfig = useClientConfig();\n  const [gifProvider] = useSetting(settingsAtom, 'gifProvider');\n  const provider = getGifProvider(clientConfig.gifs, gifProvider);\n  const apiKey = provider.getApiKey(clientConfig.gifs ?? {}) ?? '';\n  const requestGenerationRef = useRef(0);\n  const abortControllerRef = useRef<AbortController | undefined>(undefined);\n  const mountedRef = useRef(true);\n  const showGifPickerRef = useRef(showGifPicker);\n  showGifPickerRef.current = showGifPicker;\n\n  const cancelRequest = useCallback(() => {\n    requestGenerationRef.current += 1;\n    abortControllerRef.current?.abort();\n    abortControllerRef.current = undefined;\n  }, []);\n\n  const cancelSearch = useCallback(() => {\n    cancelRequest();\n    if (mountedRef.current) setLoading(false);\n  }, [cancelRequest]);\n\n  const searchGifs = useCallback(\n    async (query: string) => {\n      if (!mountedRef.current || !showGifPickerRef.current) {\n        return;\n      }\n\n      const trimmedQuery = query.trim();\n      cancelRequest();\n      const generation = requestGenerationRef.current;\n      const controller = new AbortController();\n      abortControllerRef.current = controller;\n\n      setLoading(true);\n      setError(null);\n\n      gifSearch(trimmedQuery);\n\n      try {\n        const url = provider.buildSearchUrl(apiKey, trimmedQuery);\n        const response = await fetch(url, { signal: controller.signal });\n\n        if (response.status === 200) {\n          const results = provider.parseResults(await response.json());\n\n          if (generation === requestGenerationRef.current && mountedRef.current) {\n            setSearchResults(results);\n          }\n        } else {\n          throw new Error(`HTTP ${response.status}`);\n        }\n      } catch {\n        if (generation === requestGenerationRef.current && mountedRef.current) {\n          setError('Failed to search GIFs');\n          setSearchResults([]);\n        }\n      } finally {\n        if (generation === requestGenerationRef.current && mountedRef.current) {\n          abortControllerRef.current = undefined;\n          setLoading(false);\n        }\n      }\n    },\n    [cancelRequest, provider, apiKey, gifSearch]\n  );\n\n  useEffect(() => {\n    mountedRef.current = true;\n\n    return () => {\n      mountedRef.current = false;\n      cancelRequest();\n    };\n  }, [cancelRequest]);\n\n  useEffect(() => {\n    if (!showGifPicker) cancelSearch();\n  }, [cancelSearch, showGifPicker]);\n\n  const gifs = useMemo(\n    () => ({ gifs: searchResults, favorites: favoriteGifs }),\n    [searchResults, favoriteGifs]\n  );\n\n  return { gifs, loading, error, searchGifs, cancelSearch };\n}\n","import type {\n  ChangeEvent,\n  FocusEventHandler,\n  MouseEventHandler,\n  ReactNode,\n  RefObject,\n} from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, config, Scroll } from 'folds';\nimport { ClockCounterClockwise } from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport { isKeyHotkey } from 'is-hotkey';\nimport type { Room } from '$types/matrix-sdk';\nimport type { PrimitiveAtom } from 'jotai';\nimport { atom, useAtom, useSetAtom } from 'jotai';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport type { IEmoji } from '$plugins/emoji';\nimport { emojiGroups, emojis } from '$plugins/emoji';\nimport { preventScrollWithArrowKey } from '$utils/keyboard';\nimport { useRelevantImagePacks } from '$hooks/useImagePacks';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRecentEmoji } from '$hooks/useRecentEmoji';\nimport { isUserId, mxcUrlToHttp } from '$utils/matrix';\nimport { editableActiveElement, targetFromEvent } from '$utils/dom';\nimport type { UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport { useDebounce } from '$hooks/useDebounce';\nimport { useThrottle } from '$hooks/useThrottle';\nimport { addRecentEmoji } from '$plugins/recent-emoji';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport type { ImagePack, PackImageReader } from '$plugins/custom-emoji';\nimport { ImageUsage } from '$plugins/custom-emoji';\nimport { getEmoticonSearchStr } from '$plugins/utils';\nimport { VirtualTile } from '$components/virtualizer';\nimport { useSetting } from '$state/hooks/settings';\nimport { Image as MediaImage } from '$components/media';\nimport { settingsAtom } from '$state/settings';\nimport { useEmojiGroupIcons } from './useEmojiGroupIcons';\nimport { useEmojiGroupLabels } from './useEmojiGroupLabels';\nimport type { PreviewData } from './components';\nimport {\n  SearchInput,\n  EmojiBoardTabs,\n  SidebarStack,\n  SidebarDivider,\n  Sidebar,\n  NoStickerPacks,\n  GifStatus,\n  createPreviewDataAtom,\n  Preview,\n  EmojiItem,\n  StickerItem,\n  GifItem,\n  CustomEmojiItem,\n  ImageGroupIcon,\n  GroupIcon,\n  getEmojiItemInfo,\n  EmojiGroup,\n  EmojiBoardLayout,\n} from './components';\nimport type { GifData } from './types';\nimport { EmojiBoardTab, EmojiType } from './types';\nimport { useGifSearch } from './useGifSearch';\nimport { useFavoriteGifs } from '$hooks/useFavoriteGifs';\nimport * as css from './components/styles.css';\nimport { useMobileSheetClose } from '$components/MobileSwipeDownModal';\nimport { isAllowedGifMediaUrl } from '$utils/gifProviders';\n\nconst RECENT_GROUP_ID = 'recent_group';\nconst SEARCH_GROUP_ID = 'search_group';\n\ntype EmojiGroupItem = {\n  id: string;\n  name: string;\n  items: Array<IEmoji | PackImageReader>;\n};\ntype StickerGroupItem = {\n  id: string;\n  name: string;\n  items: Array<PackImageReader>;\n};\ntype GifGroupItem = {\n  id: string;\n  name: string;\n  items: GifData[];\n};\n\nconst useGroups = (\n  tab: EmojiBoardTab,\n  imagePacks: ImagePack[],\n  data: {\n    gifs: GifData[];\n    favorites: GifData[];\n  }\n): [EmojiGroupItem[], StickerGroupItem[], GifGroupItem[]] => {\n  const mx = useMatrixClient();\n\n  const recentEmojis = useRecentEmoji(mx, 21);\n  const labels = useEmojiGroupLabels();\n\n  const emojiGroupItems = useMemo(() => {\n    const g: EmojiGroupItem[] = [];\n    if (tab !== EmojiBoardTab.Emoji) return g;\n\n    g.push({\n      id: RECENT_GROUP_ID,\n      name: 'Recent',\n      items: recentEmojis,\n    });\n\n    imagePacks.forEach((pack) => {\n      let label = pack.meta.name;\n      if (!label) label = isUserId(pack.id) ? 'Personal Pack' : mx.getRoom(pack.id)?.name;\n\n      g.push({\n        id: pack.id,\n        name: label ?? 'Unknown',\n        items: pack\n          .getImages(ImageUsage.Emoticon)\n          .toSorted((a, b) => a.shortcode.localeCompare(b.shortcode)),\n      });\n    });\n\n    emojiGroups.forEach((group) => {\n      g.push({\n        id: group.id,\n        name: labels[group.id],\n        items: group.emojis,\n      });\n    });\n\n    return g;\n  }, [mx, recentEmojis, labels, imagePacks, tab]);\n\n  const stickerGroupItems = useMemo(() => {\n    const g: StickerGroupItem[] = [];\n    if (tab !== EmojiBoardTab.Sticker) return g;\n\n    imagePacks.forEach((pack) => {\n      let label = pack.meta.name;\n      if (!label) label = isUserId(pack.id) ? 'Personal Pack' : mx.getRoom(pack.id)?.name;\n\n      g.push({\n        id: pack.id,\n        name: label ?? 'Unknown',\n        items: pack\n          .getImages(ImageUsage.Sticker)\n          .toSorted((a, b) => a.shortcode.localeCompare(b.shortcode)),\n      });\n    });\n\n    return g;\n  }, [mx, imagePacks, tab]);\n\n  const gifGroupItems = useMemo(() => {\n    if (tab !== EmojiBoardTab.Gif) return [];\n    return [\n      {\n        id: 'gif_group',\n        name: 'GIFs',\n        items: data.gifs,\n      },\n    ];\n  }, [tab, data]);\n\n  return [emojiGroupItems, stickerGroupItems, gifGroupItems];\n};\n\nconst useItemRenderer = (tab: EmojiBoardTab, saveStickerEmojiBandwidth: boolean) => {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const renderItem = (item: IEmoji | PackImageReader | GifData, index: number) => {\n    if (tab === EmojiBoardTab.Gif) {\n      const gif = item as GifData;\n\n      const previewUrl = gif.preview_url;\n      const gifUrl =\n        (previewUrl && isAllowedGifMediaUrl(previewUrl) ? previewUrl : undefined) ??\n        (isAllowedGifMediaUrl(gif.mediaUrl)\n          ? gif.mediaUrl\n          : gif.mediaUrl.startsWith('mxc://')\n            ? (mxcUrlToHttp(mx, gif.mediaUrl, useAuthentication) ?? '')\n            : '');\n      const aspectRatio =\n        gif.width && gif.height && gif.width > 0 && gif.height > 0\n          ? `${gif.width} / ${gif.height}`\n          : '1 / 1';\n\n      return (\n        <GifItem\n          key={gif.id + index}\n          label={gif.title}\n          type={EmojiType.Gif}\n          data={gif.mediaUrl}\n          shortcode={gif.title}\n          gif={gif}\n          style={{ aspectRatio }}\n        >\n          {gifUrl && (\n            <MediaImage\n              loading=\"lazy\"\n              alt=\"\"\n              aria-hidden\n              src={gifUrl}\n              style={{ display: 'block', width: '100%', height: '100%', objectFit: 'cover' }}\n            />\n          )}\n        </GifItem>\n      );\n    }\n\n    if ('unicode' in item) {\n      return <EmojiItem key={item.unicode + index} emoji={item} />;\n    }\n\n    const emoji = item as PackImageReader;\n\n    if (tab === EmojiBoardTab.Sticker) {\n      return (\n        <StickerItem\n          key={emoji.shortcode + index}\n          mx={mx}\n          useAuthentication={useAuthentication}\n          image={emoji}\n          saveStickerEmojiBandwidth={saveStickerEmojiBandwidth}\n        />\n      );\n    }\n    return (\n      <CustomEmojiItem\n        key={emoji.shortcode + index}\n        mx={mx}\n        useAuthentication={useAuthentication}\n        image={emoji}\n        saveStickerEmojiBandwidth={saveStickerEmojiBandwidth}\n      />\n    );\n  };\n\n  return renderItem;\n};\n\ntype EmojiSidebarProps = {\n  activeGroupAtom: PrimitiveAtom<string | undefined>;\n  packs: ImagePack[];\n  saveStickerEmojiBandwidth: boolean;\n  onScrollToGroup: (groupId: string) => void;\n};\nfunction EmojiSidebar({\n  activeGroupAtom,\n  packs,\n  saveStickerEmojiBandwidth,\n  onScrollToGroup,\n}: Readonly<EmojiSidebarProps>) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const [activeGroupId, setActiveGroupId] = useAtom(activeGroupAtom);\n  const usage = ImageUsage.Emoticon;\n  const labels = useEmojiGroupLabels();\n  const icons = useEmojiGroupIcons();\n\n  const handleScrollToGroup = (groupId: string) => {\n    setActiveGroupId(groupId);\n    onScrollToGroup(groupId);\n  };\n\n  return (\n    <Sidebar>\n      <SidebarStack>\n        <GroupIcon\n          active={activeGroupId === RECENT_GROUP_ID}\n          id={RECENT_GROUP_ID}\n          label=\"Recent\"\n          icon={ClockCounterClockwise}\n          onClick={handleScrollToGroup}\n        />\n      </SidebarStack>\n      {packs.length > 0 && (\n        <SidebarStack>\n          <SidebarDivider />\n          {packs.map((pack) => {\n            let label = pack.meta.name;\n            if (!label) label = isUserId(pack.id) ? 'Personal Pack' : mx.getRoom(pack.id)?.name;\n\n            // limit width and height to 36 to prevent very large icons from breaking the layout, since custom emoji pack icons can be of any size\n            // trying to get close to the render target size of the icons in the sidebar, which is around 24px\n            const url = saveStickerEmojiBandwidth\n              ? mxcUrlToHttp(mx, pack.getAvatarUrl(usage) ?? '', useAuthentication, 36, 36)\n              : mxcUrlToHttp(mx, pack.getAvatarUrl(usage) ?? '', useAuthentication);\n\n            return (\n              <ImageGroupIcon\n                key={pack.id}\n                active={activeGroupId === pack.id}\n                id={pack.id}\n                label={label ?? 'Unknown Pack'}\n                url={url ?? undefined}\n                onClick={handleScrollToGroup}\n              />\n            );\n          })}\n        </SidebarStack>\n      )}\n      <SidebarStack\n        style={{\n          position: 'sticky',\n          bottom: '-67%',\n          zIndex: 1,\n        }}\n      >\n        <SidebarDivider />\n        {emojiGroups.map((group) => (\n          <GroupIcon\n            key={group.id}\n            active={activeGroupId === group.id}\n            id={group.id}\n            label={labels[group.id]}\n            icon={icons[group.id]}\n            onClick={handleScrollToGroup}\n          />\n        ))}\n      </SidebarStack>\n    </Sidebar>\n  );\n}\n\ntype StickerSidebarProps = {\n  activeGroupAtom: PrimitiveAtom<string | undefined>;\n  packs: ImagePack[];\n  saveStickerEmojiBandwidth: boolean;\n  onScrollToGroup: (groupId: string) => void;\n};\nfunction StickerSidebar({\n  activeGroupAtom,\n  packs,\n  saveStickerEmojiBandwidth,\n  onScrollToGroup,\n}: Readonly<StickerSidebarProps>) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const [activeGroupId, setActiveGroupId] = useAtom(activeGroupAtom);\n  const usage = ImageUsage.Sticker;\n\n  const handleScrollToGroup = (groupId: string) => {\n    setActiveGroupId(groupId);\n    onScrollToGroup(groupId);\n  };\n\n  return (\n    <Sidebar>\n      <SidebarStack>\n        {packs.map((pack) => {\n          let label = pack.meta.name;\n          if (!label) label = isUserId(pack.id) ? 'Personal Pack' : mx.getRoom(pack.id)?.name;\n\n          // limit width and height to 36 to prevent very large icons from breaking the layout, since custom emoji pack icons can be of any size\n          // trying to get close to the render target size of the icons in the sidebar, which is around 24px\n          const url = saveStickerEmojiBandwidth\n            ? mxcUrlToHttp(mx, pack.getAvatarUrl(usage) ?? '', useAuthentication, 36, 36)\n            : mxcUrlToHttp(mx, pack.getAvatarUrl(usage) ?? '', useAuthentication);\n\n          return (\n            <ImageGroupIcon\n              key={pack.id}\n              active={activeGroupId === pack.id}\n              id={pack.id}\n              label={label ?? 'Unknown Pack'}\n              url={url ?? undefined}\n              onClick={handleScrollToGroup}\n            />\n          );\n        })}\n      </SidebarStack>\n    </Sidebar>\n  );\n}\n\ntype EmojiGroupHolderProps = {\n  contentScrollRef: RefObject<HTMLDivElement | null>;\n  previewAtom: PrimitiveAtom<PreviewData | undefined>;\n  children?: ReactNode;\n  onGroupItemClick: MouseEventHandler;\n};\nfunction EmojiGroupHolder({\n  contentScrollRef,\n  previewAtom,\n  onGroupItemClick,\n  children,\n}: Readonly<EmojiGroupHolderProps>) {\n  const setPreviewData = useSetAtom(previewAtom);\n\n  const handleEmojiPreview = useCallback(\n    (element: HTMLButtonElement) => {\n      const emojiInfo = getEmojiItemInfo(element);\n      if (!emojiInfo) return;\n\n      setPreviewData({\n        key: emojiInfo.data,\n        shortcode: emojiInfo.shortcode,\n      });\n    },\n    [setPreviewData]\n  );\n\n  const throttleEmojiHover = useThrottle(handleEmojiPreview, {\n    wait: 200,\n    immediate: true,\n  });\n\n  const handleEmojiHover: MouseEventHandler = (evt) => {\n    const targetEl = targetFromEvent(evt.nativeEvent, 'button') as HTMLButtonElement | undefined;\n    if (!targetEl) return;\n    throttleEmojiHover(targetEl);\n  };\n\n  const handleEmojiFocus: FocusEventHandler = (evt) => {\n    const targetEl = evt.target as HTMLButtonElement;\n    handleEmojiPreview(targetEl);\n  };\n\n  return (\n    <Scroll\n      ref={contentScrollRef}\n      size=\"400\"\n      onKeyDown={preventScrollWithArrowKey}\n      hideTrack\n      className={css.ContentScroll}\n    >\n      <Box\n        onClick={onGroupItemClick}\n        onMouseMove={handleEmojiHover}\n        onFocus={handleEmojiFocus}\n        direction=\"Column\"\n      >\n        {children}\n      </Box>\n    </Scroll>\n  );\n}\n\nconst DefaultEmojiPreview: PreviewData = { key: '🙂', shortcode: 'slight_smile' };\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  limit: 1000,\n  matchOptions: {\n    contain: true,\n  },\n};\n\nconst VIRTUAL_OVER_SCAN = 10;\n\ntype EmojiBoardProps = {\n  tab?: EmojiBoardTab;\n  onTabChange?: (tab: EmojiBoardTab) => void;\n  imagePackRooms: Room[];\n  requestClose: () => void;\n  returnFocusOnDeactivate?: boolean;\n  onEmojiSelect?: (unicode: string, shortcode: string) => void;\n  onCustomEmojiSelect?: (mxc: string, shortcode: string) => void;\n  onStickerSelect?: (mxc: string, shortcode: string, label: string) => void;\n  onGifSelect?: (gif: GifData, spoiler?: boolean) => void;\n  initialGifSearch?: string;\n  allowTextCustomEmoji?: boolean;\n  addToRecentEmoji?: boolean;\n  isFullWidth?: boolean;\n  /** Rendered in a bottom sheet, which owns the chrome, height, focus and dismissal. */\n  sheet?: boolean;\n};\n\nconst getGifName = (v: GifData) => v.title;\n\nexport function EmojiBoard({\n  tab = EmojiBoardTab.Emoji,\n  onTabChange,\n  imagePackRooms,\n  requestClose,\n  returnFocusOnDeactivate,\n  onEmojiSelect,\n  onCustomEmojiSelect,\n  onStickerSelect,\n  onGifSelect,\n  initialGifSearch,\n  allowTextCustomEmoji,\n  addToRecentEmoji = true,\n  isFullWidth,\n  sheet = false,\n}: Readonly<EmojiBoardProps>) {\n  const mobileSheetClose = useMobileSheetClose();\n  const close = mobileSheetClose ?? requestClose;\n  const mx = useMatrixClient();\n  const [saveStickerEmojiBandwidth] = useSetting(settingsAtom, 'saveStickerEmojiBandwidth');\n  const [showGifPicker] = useSetting(settingsAtom, 'enableGifPicker');\n\n  const emojiTab = tab === EmojiBoardTab.Emoji;\n  const gifTab = tab === EmojiBoardTab.Gif;\n  const usage = emojiTab ? ImageUsage.Emoticon : ImageUsage.Sticker;\n\n  const previewAtom = useMemo(\n    () => createPreviewDataAtom(tab === EmojiBoardTab.Emoji ? DefaultEmojiPreview : undefined),\n    [tab]\n  );\n  const activeGroupIdAtom = useMemo(() => atom<string | undefined>(undefined), []);\n  const setActiveGroupId = useSetAtom(activeGroupIdAtom);\n  const imagePacks = useRelevantImagePacks(usage, imagePackRooms);\n  const favoriteGifs = useFavoriteGifs().gifs as GifData[];\n\n  const searchList = useMemo(() => {\n    let list: Array<PackImageReader | IEmoji> = [];\n    list = list.concat(imagePacks.flatMap((pack) => pack.getImages(usage)));\n    if (emojiTab) list = list.concat(emojis);\n    return list;\n  }, [emojiTab, usage, imagePacks]);\n\n  const [emojiResult, emojiSearch, resetEmojiSearch] = useAsyncSearch(\n    searchList,\n    getEmoticonSearchStr,\n    SEARCH_OPTIONS\n  );\n\n  const [gifResult, gifSearch, resetGifSearch] = useAsyncSearch(\n    favoriteGifs,\n    getGifName,\n    SEARCH_OPTIONS\n  );\n\n  const searchedItems = emojiResult?.items.slice(0, 100);\n  const searchedGifItems = gifResult?.items.slice(0, 100) ?? favoriteGifs.toReversed();\n\n  const {\n    gifs,\n    loading: gifsLoading,\n    error: gifsError,\n    searchGifs,\n    cancelSearch: cancelGifSearch,\n  } = useGifSearch(favoriteGifs, showGifPicker && gifTab, gifSearch);\n  const [emojiGroupItems, stickerGroupItems, gifGroupItems] = useGroups(tab, imagePacks, gifs);\n  const [showFavoritesOnly, setShowFavoritesOnly] = useState(true);\n  const groupsByTab = {\n    [EmojiBoardTab.Emoji]: emojiGroupItems,\n    [EmojiBoardTab.Sticker]: stickerGroupItems,\n    [EmojiBoardTab.Gif]:\n      showFavoritesOnly && gifs.favorites.length > 0\n        ? [\n            {\n              id: 'favorites_group',\n              name: 'Favorites',\n              items: searchedGifItems,\n            },\n          ]\n        : searchedGifItems.length > 0\n          ? [\n              {\n                id: 'favorites_group',\n                name: 'Favorites',\n                items: searchedGifItems,\n              },\n            ].concat(gifGroupItems)\n          : gifGroupItems,\n  };\n  const groups = groupsByTab[tab];\n  const renderItem = useItemRenderer(tab, saveStickerEmojiBandwidth);\n\n  const handleOnChange = useDebounce(\n    useCallback(\n      (evt: ChangeEvent<HTMLInputElement>) => {\n        const term = evt.target.value;\n        if (tab === EmojiBoardTab.Gif) {\n          if (term) {\n            setShowFavoritesOnly(false);\n            searchGifs(term);\n          } else {\n            setShowFavoritesOnly(true);\n            cancelGifSearch();\n            resetGifSearch();\n          }\n        } else if (term) {\n          emojiSearch(term);\n        } else {\n          resetEmojiSearch();\n        }\n      },\n      [cancelGifSearch, emojiSearch, resetEmojiSearch, searchGifs, resetGifSearch, tab]\n    ),\n    { wait: 200 }\n  );\n\n  useEffect(() => {\n    if (!gifTab || initialGifSearch === undefined) return;\n    setShowFavoritesOnly(initialGifSearch.length === 0);\n    if (initialGifSearch) searchGifs(initialGifSearch);\n    else resetGifSearch();\n  }, [gifTab, initialGifSearch, searchGifs, resetGifSearch]);\n\n  useEffect(() => {\n    if (!showGifPicker || !gifTab) {\n      handleOnChange.cancel();\n      cancelGifSearch();\n    }\n  }, [cancelGifSearch, gifTab, handleOnChange, showGifPicker]);\n\n  const contentScrollRef = useRef<HTMLDivElement>(null);\n  const virtualBaseRef = useRef<HTMLDivElement>(null);\n  const virtualizer = useVirtualizer({\n    count: groups.length,\n    getScrollElement: () => contentScrollRef.current,\n    estimateSize: (index: number) => {\n      const group = groups[index];\n      if (!group) return emojiTab ? 320 : 420;\n\n      /**\n       * estimate tile size: stickers are generally larger than emojis, and custom emojis can vary in size but are often larger than standard emojis, so we use a larger estimate for them.\n       * This is a rough estimate to help the virtualizer calculate the total height and which items are in view.\n       * The actual rendered size may vary, but this should provide a reasonable approximation for most cases.\n       */\n      const tile = emojiTab ? 48 : 112;\n      /**\n       * estimate number of columns that can fit in the view, with a min of 1 to avoid division by zero\n       */\n      const cols = Math.max(1, Math.floor(280 / tile));\n      /**\n       * estimate number of rows based on the number of items and columns\n       */\n      const rows = Math.ceil(group.items.length / cols);\n\n      // calculate total height based on rows, with some padding and a safety margin\n      return Math.ceil((28 + 24 + rows * tile) * 1.05); // small safety margin\n    },\n    overscan: VIRTUAL_OVER_SCAN,\n  });\n  const vItems = virtualizer.getVirtualItems();\n\n  const handleGroupItemClick: MouseEventHandler = (evt) => {\n    const targetEl = targetFromEvent(evt.nativeEvent, 'button');\n    const emojiInfo = targetEl && getEmojiItemInfo(targetEl);\n    if (!emojiInfo) return;\n\n    if (emojiInfo.type === EmojiType.Emoji) {\n      onEmojiSelect?.(emojiInfo.data, emojiInfo.shortcode);\n      if (!evt.altKey && !evt.shiftKey && addToRecentEmoji) {\n        addRecentEmoji(mx, emojiInfo.data);\n      }\n    }\n    if (emojiInfo.type === EmojiType.CustomEmoji) {\n      onCustomEmojiSelect?.(emojiInfo.data, emojiInfo.shortcode);\n    }\n    if (emojiInfo.type === EmojiType.Sticker) {\n      onStickerSelect?.(emojiInfo.data, emojiInfo.shortcode, emojiInfo.label);\n    }\n    if (emojiInfo.type === EmojiType.Gif) {\n      const gifDataStr = targetEl.getAttribute('data-gif-data');\n      const gifData = gifDataStr ? JSON.parse(gifDataStr) : null;\n      const isSpoiler = targetEl.getAttribute('data-gif-spoiler') === 'true';\n      onGifSelect?.(gifData, isSpoiler);\n    }\n    if (!evt.altKey && !evt.shiftKey) close();\n  };\n\n  const handleTextCustomEmojiSelect = (textEmoji: string) => {\n    onCustomEmojiSelect?.(textEmoji, textEmoji);\n    close();\n  };\n\n  const handleScrollToGroup = (groupId: string) => {\n    const groupIndex = groups.findIndex((group) => group.id === groupId);\n    virtualizer.scrollToIndex(groupIndex, { align: 'start' });\n  };\n\n  // sync active sidebar tab with scroll\n  useEffect(() => {\n    const scrollElement = contentScrollRef.current;\n    if (scrollElement) {\n      const scrollTop = scrollElement.offsetTop + scrollElement.scrollTop;\n      const offsetTop = virtualBaseRef.current?.offsetTop ?? 0;\n      const inViewVItem = vItems.find((vItem) => scrollTop < offsetTop + vItem.end);\n\n      const group = inViewVItem ? groups[inViewVItem?.index] : undefined;\n      setActiveGroupId(group?.id);\n    }\n  }, [vItems, groups, setActiveGroupId, emojiResult?.query, gifResult?.query]);\n\n  // reset scroll position on search\n  useEffect(() => {\n    const scrollElement = contentScrollRef.current;\n    if (scrollElement) {\n      scrollElement.scrollTo({ top: 0 });\n    }\n  }, [emojiResult?.query, gifResult?.query]);\n\n  // reset scroll position on tab change\n  useEffect(() => {\n    if (groups.length > 0) {\n      virtualizer.scrollToIndex(0, { align: 'start' });\n    }\n  }, [tab, virtualizer, groups.length]);\n\n  const layout = (\n    <EmojiBoardLayout\n      header={\n        <Box direction=\"Column\" gap=\"200\">\n          {onTabChange && <EmojiBoardTabs tab={tab} onTabChange={onTabChange} />}\n          <SearchInput\n            key={gifTab ? `${tab}-${initialGifSearch ?? ''}` : tab}\n            query={emojiResult?.query}\n            onChange={handleOnChange}\n            tab={tab}\n            defaultValue={gifTab ? initialGifSearch : undefined}\n            allowTextCustomEmoji={allowTextCustomEmoji}\n            onTextCustomEmojiSelect={handleTextCustomEmojiSelect}\n          />\n        </Box>\n      }\n      sidebar={\n        emojiTab ? (\n          <EmojiSidebar\n            activeGroupAtom={activeGroupIdAtom}\n            packs={imagePacks}\n            saveStickerEmojiBandwidth={saveStickerEmojiBandwidth}\n            onScrollToGroup={handleScrollToGroup}\n          />\n        ) : (\n          !gifTab && (\n            <StickerSidebar\n              activeGroupAtom={activeGroupIdAtom}\n              packs={imagePacks}\n              saveStickerEmojiBandwidth={saveStickerEmojiBandwidth}\n              onScrollToGroup={handleScrollToGroup}\n            />\n          )\n        )\n      }\n      isFullWidth={isFullWidth}\n      sheet={sheet}\n    >\n      <Box className={css.Body}>\n        <EmojiGroupHolder\n          key={tab}\n          contentScrollRef={contentScrollRef}\n          previewAtom={previewAtom}\n          onGroupItemClick={handleGroupItemClick}\n        >\n          {tab !== EmojiBoardTab.Gif && searchedItems && (\n            <EmojiGroup\n              id={SEARCH_GROUP_ID}\n              label={searchedItems.length ? 'Search Results' : 'No Results found'}\n            >\n              {searchedItems.map((element, index) => renderItem(element, index))}\n            </EmojiGroup>\n          )}\n          <div\n            ref={virtualBaseRef}\n            style={{\n              position: 'relative',\n              height: virtualizer.getTotalSize(),\n            }}\n          >\n            {vItems.map((vItem) => {\n              const group = groups[vItem.index]!;\n\n              return (\n                <VirtualTile\n                  virtualItem={vItem}\n                  style={{ paddingTop: config.space.S200 }}\n                  ref={virtualizer.measureElement}\n                  key={vItem.index}\n                >\n                  <EmojiGroup key={group.id} id={group.id} label={group.name} isGifGroup={gifTab}>\n                    {group.items.map(renderItem)}\n                  </EmojiGroup>\n                </VirtualTile>\n              );\n            })}\n          </div>\n          {tab === EmojiBoardTab.Sticker && groups.length === 0 && <NoStickerPacks />}\n          {gifTab && (\n            <GifStatus\n              loading={gifsLoading}\n              error={gifsError}\n              isEmpty={groups.flatMap((v) => v.items.map(() => 'gif')).length === 0}\n            />\n          )}\n        </EmojiGroupHolder>\n      </Box>\n      {!gifTab && !isFullWidth && <Preview previewAtom={previewAtom} />}\n    </EmojiBoardLayout>\n  );\n\n  if (sheet) return layout;\n\n  return (\n    <FocusTrap\n      focusTrapOptions={{\n        returnFocusOnDeactivate,\n        initialFocus: false,\n        onDeactivate: close,\n        clickOutsideDeactivates: true,\n        allowOutsideClick: () => true,\n        isKeyForward: (evt: KeyboardEvent) =>\n          !editableActiveElement() && isKeyHotkey(['arrowdown', 'arrowright'], evt),\n        isKeyBackward: (evt: KeyboardEvent) =>\n          !editableActiveElement() && isKeyHotkey(['arrowup', 'arrowleft'], evt),\n        escapeDeactivates: true,\n      }}\n    >\n      {layout}\n    </FocusTrap>\n  );\n}\n","import { useEffect, useState } from 'react';\nimport { RelationsEvent, type Relations } from '$types/matrix-sdk';\n\nexport const useRelations = <T>(\n  relations: Relations,\n  getRelations: (relations: Relations) => T\n) => {\n  const [data, setData] = useState(() => getRelations(relations));\n\n  useEffect(() => {\n    const handleUpdate = () => {\n      setData(getRelations(relations));\n    };\n    relations.on(RelationsEvent.Add, handleUpdate);\n    relations.on(RelationsEvent.Redaction, handleUpdate);\n    relations.on(RelationsEvent.Remove, handleUpdate);\n    return () => {\n      relations.removeListener(RelationsEvent.Add, handleUpdate);\n      relations.removeListener(RelationsEvent.Redaction, handleUpdate);\n      relations.removeListener(RelationsEvent.Remove, handleUpdate);\n    };\n  }, [relations, getRelations]);\n\n  return data;\n};\n","import { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport { Avatar, Box, Header, IconButton, Line, MenuItem, Scroll, Text, as, config } from 'folds';\nimport type { MatrixEvent, Room, RoomMember, Relations } from '$types/matrix-sdk';\nimport { getAvatarUrl, getMemberDisplayName } from '$utils/room/display';\nimport { eventWithShortcode, getMxIdLocalPart } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRelations } from '$hooks/useRelations';\nimport { Reaction } from '$components/message';\nimport { getHexcodeForEmoji, getShortcodeFor } from '$plugins/emoji';\nimport { useAtomValue } from 'jotai';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { UserAvatar } from '$components/user-avatar';\nimport { composerIcon, userFallbackIcon, X } from '$components/icons/phosphor';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { getMouseEventCords } from '$utils/dom';\nimport * as css from './ReactionViewer.css';\n\ntype ReactionViewerProps = {\n  room: Room;\n  initialKey?: string;\n  relations: Relations;\n  requestClose: () => void;\n};\nexport const ReactionViewer = as<'div', ReactionViewerProps>(\n  ({ className, room, initialKey, relations, requestClose, ...props }, ref) => {\n    const mx = useMatrixClient();\n    const useAuthentication = useMediaAuthentication();\n    const reactions = useRelations(\n      relations,\n      useCallback((rel) => [...(rel.getSortedAnnotationsByKey() ?? [])], [])\n    );\n    const space = useSpaceOptionally();\n    const openProfile = useOpenUserRoomProfile();\n    const nicknames = useAtomValue(nicknamesAtom);\n\n    const [selectedKey, setSelectedKey] = useState<string>(() => {\n      if (initialKey) return initialKey;\n      const defaultReaction = reactions.find((reaction) => typeof reaction[0] === 'string');\n      return defaultReaction ? defaultReaction[0] : '';\n    });\n\n    const getName = (member: RoomMember) =>\n      getMemberDisplayName(room, member.userId, nicknames) ??\n      getMxIdLocalPart(member.userId) ??\n      member.userId;\n\n    const getReactionsForKey = (key: string): MatrixEvent[] => {\n      const reactSet = reactions.find(([k]) => k === key)?.[1];\n      if (!reactSet) return [];\n      return Array.from(reactSet);\n    };\n\n    const selectedReactions = getReactionsForKey(selectedKey);\n    const selectedShortcode =\n      selectedReactions.find(eventWithShortcode)?.getContent().shortcode ??\n      getShortcodeFor(getHexcodeForEmoji(selectedKey)) ??\n      selectedKey;\n\n    return (\n      <Box\n        className={classNames(css.ReactionViewer, className)}\n        direction=\"Row\"\n        {...props}\n        ref={ref}\n      >\n        <Box shrink=\"No\" className={css.Sidebar}>\n          <Scroll visibility=\"Hover\" hideTrack size=\"300\">\n            <Box className={css.SidebarContent} direction=\"Column\" gap=\"200\">\n              {reactions.map(([key, evts]) => (\n                <Reaction\n                  key={key}\n                  mx={mx}\n                  reaction={key}\n                  count={evts.size}\n                  aria-selected={key === selectedKey}\n                  onClick={() => setSelectedKey(key)}\n                  useAuthentication={useAuthentication}\n                />\n              ))}\n            </Box>\n          </Scroll>\n        </Box>\n        <Line variant=\"Surface\" direction=\"Vertical\" size=\"300\" />\n        <Box grow=\"Yes\" direction=\"Column\">\n          <Header className={css.Header} variant=\"Surface\" size=\"600\">\n            <Box grow=\"Yes\">\n              <Text size=\"H3\" truncate>{`Reacted with :${selectedShortcode}:`}</Text>\n            </Box>\n            <IconButton size=\"300\" onClick={requestClose}>\n              {composerIcon(X)}\n            </IconButton>\n          </Header>\n\n          <Box grow=\"Yes\">\n            <Scroll visibility=\"Hover\" hideTrack size=\"300\">\n              <Box className={css.Content} direction=\"Column\">\n                {selectedReactions.map((mEvent) => {\n                  const senderId = mEvent.getSender();\n                  if (!senderId) return null;\n                  const member = room.getMember(senderId);\n                  const name = (member ? getName(member) : getMxIdLocalPart(senderId)) ?? senderId;\n\n                  const avatarMxcUrl = member?.getMxcAvatarUrl();\n                  const avatarUrl = getAvatarUrl(mx, avatarMxcUrl, 100, useAuthentication);\n\n                  return (\n                    <MenuItem\n                      key={senderId}\n                      style={{ padding: `0 ${config.space.S200}` }}\n                      radii=\"400\"\n                      onClick={(event) => {\n                        openProfile(\n                          room.roomId,\n                          space?.roomId,\n                          senderId,\n                          undefined,\n                          getMouseEventCords(event.nativeEvent),\n                          'Bottom'\n                        );\n                      }}\n                      before={\n                        <Avatar size=\"200\">\n                          <UserAvatar\n                            userId={senderId}\n                            src={avatarUrl ?? undefined}\n                            alt={name}\n                            renderFallback={() => userFallbackIcon('sm')}\n                          />\n                        </Avatar>\n                      }\n                    >\n                      <Box grow=\"Yes\">\n                        <Text size=\"T400\" truncate>\n                          {name}\n                        </Text>\n                      </Box>\n                    </MenuItem>\n                  );\n                })}\n              </Box>\n            </Scroll>\n          </Box>\n        </Box>\n      </Box>\n    );\n  }\n);\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useRef, useState } from 'react';\nimport {\n  Box,\n  Modal,\n  OverlayBackdrop,\n  OverlayCenter,\n  Text,\n  Tooltip,\n  as,\n  toRem,\n  type RectCords,\n} from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { Overlay, PopOut } from '$components/overlay-stack';\nimport classNames from 'classnames';\nimport type { Room } from '$types/matrix-sdk';\nimport { type Relations } from '$types/matrix-sdk';\nimport FocusTrap from 'focus-trap-react';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { factoryEventSentBy } from '$utils/matrix';\nimport { Reaction, ReactionTooltipMsg } from '$components/message';\nimport { EmojiBoard } from '$components/emoji-board';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { sizedIcon, Smiley } from '$components/icons/phosphor';\nimport { useRelations } from '$hooks/useRelations';\nimport { stopPropagation } from '$utils/keyboard';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useDismissOnBack } from '$utils/androidBack';\nimport { useMobileLongPress } from '$hooks/useMobileLongPress';\nimport { ReactionViewer } from '$features/room/reaction-viewer';\nimport * as css from './styles.css';\n\nexport type ReactionsProps = {\n  room: Room;\n  mEventId: string;\n  canSendReaction: boolean;\n  canDeleteOwn: boolean;\n  relations: Relations;\n  imagePackRooms?: Room[];\n  onReactionToggle: (targetEventId: string, key: string, shortcode?: string) => void;\n};\nexport const Reactions = as<'div', ReactionsProps>(\n  (\n    {\n      className,\n      room,\n      relations,\n      mEventId,\n      canSendReaction,\n      canDeleteOwn,\n      onReactionToggle,\n      imagePackRooms,\n      ...props\n    },\n    ref\n  ) => {\n    const mx = useMatrixClient();\n    const useAuthentication = useMediaAuthentication();\n    const [viewer, setViewer] = useState<boolean | string>(false);\n    const [emojiBoardAnchor, setEmojiBoardAnchor] = useState<RectCords>();\n    const pressedReactionKey = useRef<string | undefined>(undefined);\n    const reactionLongPress = useMobileLongPress(() => {\n      if (pressedReactionKey.current) setViewer(pressedReactionKey.current);\n    });\n    // Android back closes the mobile emoji board instead of navigating away.\n    useDismissOnBack(() => setEmojiBoardAnchor(undefined), emojiBoardAnchor !== undefined);\n    const myUserId = mx.getUserId();\n    const reactions = useRelations(\n      relations,\n      useCallback((rel) => [...(rel.getSortedAnnotationsByKey() ?? [])], [])\n    );\n\n    const handleViewReaction: MouseEventHandler<HTMLButtonElement> = (evt) => {\n      evt.stopPropagation();\n      evt.preventDefault();\n      const key = evt.currentTarget.getAttribute('data-reaction-key');\n      if (!key) setViewer(true);\n      else setViewer(key);\n    };\n\n    const handleOpenEmojiBoard: MouseEventHandler<HTMLButtonElement> = (evt) => {\n      evt.stopPropagation();\n      evt.preventDefault();\n      setEmojiBoardAnchor(evt.currentTarget.getBoundingClientRect());\n    };\n\n    return (\n      <Box\n        className={classNames(css.ReactionsContainer, className)}\n        gap=\"200\"\n        wrap=\"Wrap\"\n        {...props}\n        ref={ref}\n      >\n        {reactions.map(([key, events]) => {\n          const rEvents = Array.from(events);\n          if (rEvents.length === 0 || typeof key !== 'string') return null;\n          const myREvent = myUserId ? rEvents.find(factoryEventSentBy(myUserId)) : undefined;\n          const isPressed = !!myREvent?.getRelation();\n          const canToggle = isPressed ? canDeleteOwn : canSendReaction;\n\n          return (\n            <TooltipProvider\n              key={key}\n              position=\"Top\"\n              tooltip={\n                <Tooltip style={{ maxWidth: toRem(200) }}>\n                  <Text className={css.ReactionsTooltipText} size=\"T300\">\n                    <ReactionTooltipMsg room={room} reaction={key} events={rEvents} />\n                  </Text>\n                </Tooltip>\n              }\n            >\n              {(targetRef) => (\n                <Reaction\n                  ref={targetRef}\n                  data-reaction-key={key}\n                  aria-pressed={isPressed}\n                  key={key}\n                  mx={mx}\n                  reaction={key}\n                  count={events.size}\n                  onClick={\n                    canToggle\n                      ? () => {\n                          if (reactionLongPress.firedRef.current) {\n                            reactionLongPress.firedRef.current = false;\n                            return;\n                          }\n                          onReactionToggle(mEventId, key);\n                        }\n                      : undefined\n                  }\n                  onContextMenu={handleViewReaction}\n                  onTouchStart={(evt) => {\n                    evt.stopPropagation();\n                    pressedReactionKey.current = key;\n                    reactionLongPress.onTouchStart(evt);\n                  }}\n                  onTouchEnd={reactionLongPress.onTouchEnd}\n                  onTouchMove={reactionLongPress.onTouchMove}\n                  onTouchCancel={reactionLongPress.onTouchCancel}\n                  aria-disabled={!canToggle}\n                  useAuthentication={useAuthentication}\n                />\n              )}\n            </TooltipProvider>\n          );\n        })}\n        {canSendReaction &&\n          reactions.length > 0 &&\n          (() => {\n            const emojiBoard = (\n              <EmojiBoard\n                imagePackRooms={imagePackRooms ?? []}\n                returnFocusOnDeactivate={false}\n                allowTextCustomEmoji\n                isFullWidth={isMobileOrTablet()}\n                onEmojiSelect={(key) => {\n                  onReactionToggle(mEventId, key);\n                  setEmojiBoardAnchor(undefined);\n                }}\n                onCustomEmojiSelect={(mxc, shortcode) => {\n                  onReactionToggle(mEventId, mxc, shortcode);\n                  setEmojiBoardAnchor(undefined);\n                }}\n                requestClose={() => setEmojiBoardAnchor(undefined)}\n              />\n            );\n            const trigger = (\n              <TooltipProvider\n                position=\"Top\"\n                tooltip={\n                  <Tooltip>\n                    <Text size=\"T300\">Add Reaction</Text>\n                  </Tooltip>\n                }\n              >\n                {(targetRef) => (\n                  <Box\n                    as=\"button\"\n                    ref={targetRef}\n                    type=\"button\"\n                    className={css.ReactionAdd}\n                    aria-label=\"Add Reaction\"\n                    aria-pressed={!!emojiBoardAnchor}\n                    onClick={handleOpenEmojiBoard}\n                  >\n                    {sizedIcon(Smiley, '100', { filled: !!emojiBoardAnchor })}\n                  </Box>\n                )}\n              </TooltipProvider>\n            );\n            if (isMobileOrTablet()) {\n              return (\n                <>\n                  {trigger}\n                  <Overlay open={emojiBoardAnchor !== undefined} backdrop={<OverlayBackdrop />}>\n                    <div\n                      style={{\n                        position: 'fixed',\n                        left: 0,\n                        right: 0,\n                        bottom: 0,\n                        display: 'flex',\n                        justifyContent: 'center',\n                      }}\n                    >\n                      {emojiBoard}\n                    </div>\n                  </Overlay>\n                </>\n              );\n            }\n            return (\n              <PopOut\n                position=\"Top\"\n                align=\"Start\"\n                offset={4}\n                anchor={emojiBoardAnchor}\n                content={emojiBoard}\n              >\n                {trigger}\n              </PopOut>\n            );\n          })()}\n        {reactions.length > 0 && (\n          <Overlay\n            onContextMenu={(evt: React.MouseEvent) => {\n              evt.stopPropagation();\n            }}\n            open={!!viewer}\n            backdrop={<OverlayBackdrop />}\n          >\n            <OverlayCenter>\n              <FocusTrap\n                focusTrapOptions={{\n                  initialFocus: false,\n                  returnFocusOnDeactivate: false,\n                  onDeactivate: () => setViewer(false),\n                  clickOutsideDeactivates: true,\n                  escapeDeactivates: stopPropagation,\n                }}\n              >\n                <Modal variant=\"Surface\" size=\"300\">\n                  <ReactionViewer\n                    room={room}\n                    initialKey={typeof viewer === 'string' ? viewer : undefined}\n                    relations={relations}\n                    requestClose={() => setViewer(false)}\n                  />\n                </Modal>\n              </FocusTrap>\n            </OverlayCenter>\n          </Overlay>\n        )}\n      </Box>\n    );\n  }\n);\n","const $d447af545b77c9f1$export$b204af158042fbac = (el)=>{\n    return el?.ownerDocument ?? document;\n};\nconst $d447af545b77c9f1$export$f21a1ffae260145a = (el)=>{\n    if (el && 'window' in el && el.window === el) return el;\n    const doc = $d447af545b77c9f1$export$b204af158042fbac(el);\n    return doc.defaultView || window;\n};\n/**\n * Type guard that checks if a value is a Node. Verifies the presence and type of the nodeType\n * property.\n */ function $d447af545b77c9f1$var$isNode(value) {\n    return value !== null && typeof value === 'object' && 'nodeType' in value && typeof value.nodeType === 'number';\n}\nfunction $d447af545b77c9f1$export$af51f0f06c0f328a(node) {\n    return $d447af545b77c9f1$var$isNode(node) && node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && 'host' in node;\n}\n\n\nexport {$d447af545b77c9f1$export$b204af158042fbac as getOwnerDocument, $d447af545b77c9f1$export$f21a1ffae260145a as getOwnerWindow, $d447af545b77c9f1$export$af51f0f06c0f328a as isShadowRoot};\n//# sourceMappingURL=domHelpers.mjs.map\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ let $6a20a7989e6c817a$var$_tableNestedRows = false;\nlet $6a20a7989e6c817a$var$_shadowDOM = false;\nfunction $6a20a7989e6c817a$export$d9d8a0f82de49530() {\n    $6a20a7989e6c817a$var$_tableNestedRows = true;\n}\nfunction $6a20a7989e6c817a$export$1b00cb14a96194e6() {\n    return $6a20a7989e6c817a$var$_tableNestedRows;\n}\nfunction $6a20a7989e6c817a$export$12b151d9882e9985() {\n    $6a20a7989e6c817a$var$_shadowDOM = true;\n}\nfunction $6a20a7989e6c817a$export$98658e8c59125e6a() {\n    return $6a20a7989e6c817a$var$_shadowDOM;\n}\n\n\nexport {$6a20a7989e6c817a$export$d9d8a0f82de49530 as enableTableNestedRows, $6a20a7989e6c817a$export$1b00cb14a96194e6 as tableNestedRows, $6a20a7989e6c817a$export$12b151d9882e9985 as enableShadowDOM, $6a20a7989e6c817a$export$98658e8c59125e6a as shadowDOM};\n//# sourceMappingURL=flags.mjs.map\n","import {getOwnerWindow as $d447af545b77c9f1$export$f21a1ffae260145a, isShadowRoot as $d447af545b77c9f1$export$af51f0f06c0f328a} from \"../domHelpers.mjs\";\nimport {shadowDOM as $eXv8n$shadowDOM} from \"react-stately/private/flags/flags\";\n\n// Source: https://github.com/microsoft/tabster/blob/a89fc5d7e332d48f68d03b1ca6e344489d1c3898/src/Shadowdomize/DOMFunctions.ts#L16\n/* eslint-disable rsp-rules/no-non-shadow-contains, rsp-rules/safe-event-target */ \n\nfunction $23f2114a1b82827e$export$4282f70798064fe0(node, otherNode) {\n    if (!(0, $eXv8n$shadowDOM)()) return otherNode && node ? node.contains(otherNode) : false;\n    if (!node || !otherNode) return false;\n    let currentNode = otherNode;\n    while(currentNode !== null){\n        if (currentNode === node) return true;\n        if (currentNode.tagName === 'SLOT' && currentNode.assignedSlot) // Element is slotted\n        currentNode = currentNode.assignedSlot.parentNode;\n        else if ((0, $d447af545b77c9f1$export$af51f0f06c0f328a)(currentNode)) // Element is in shadow root\n        currentNode = currentNode.host;\n        else currentNode = currentNode.parentNode;\n    }\n    return false;\n}\nconst $23f2114a1b82827e$export$cd4e5573fbe2b576 = (doc = document)=>{\n    if (!(0, $eXv8n$shadowDOM)()) return doc.activeElement;\n    let activeElement = doc.activeElement;\n    while(activeElement && 'shadowRoot' in activeElement && activeElement.shadowRoot?.activeElement)activeElement = activeElement.shadowRoot.activeElement;\n    return activeElement;\n};\nfunction $23f2114a1b82827e$export$e58f029f0fbfdb29(event) {\n    if ((0, $eXv8n$shadowDOM)() && event.target instanceof Element && event.target.shadowRoot) {\n        if ('composedPath' in event) return event.composedPath()[0] ?? null;\n        else if ('composedPath' in event.nativeEvent) return event.nativeEvent.composedPath()[0] ?? null;\n    }\n    return event.target;\n}\nfunction $23f2114a1b82827e$export$b4f377a2b6254582(node) {\n    if (!node) return false;\n    // Get the active element within the node's parent shadow root (or the document). Can return null.\n    let root = node.getRootNode();\n    let ownerWindow = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(node);\n    if (!(root instanceof ownerWindow.Document || root instanceof ownerWindow.ShadowRoot)) return false;\n    let activeElement = root.activeElement;\n    // Check if the active element is within this node. These nodes are within the same shadow root.\n    return activeElement != null && node.contains(activeElement);\n}\n\n\nexport {$23f2114a1b82827e$export$4282f70798064fe0 as nodeContains, $23f2114a1b82827e$export$cd4e5573fbe2b576 as getActiveElement, $23f2114a1b82827e$export$e58f029f0fbfdb29 as getEventTarget, $23f2114a1b82827e$export$b4f377a2b6254582 as isFocusWithin};\n//# sourceMappingURL=DOMFunctions.mjs.map\n","import $3ARPR$react from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nconst $c4867b2f328c2698$export$e5c5a5f917a5871c = typeof document !== 'undefined' ? (0, $3ARPR$react).useLayoutEffect : ()=>{};\n\n\nexport {$c4867b2f328c2698$export$e5c5a5f917a5871c as useLayoutEffect};\n//# sourceMappingURL=useLayoutEffect.mjs.map\n","import {focusWithoutScrolling as $1969ac565cfec8d0$export$de79e2c695e052f3} from \"../utils/focusWithoutScrolling.mjs\";\nimport {getActiveElement as $23f2114a1b82827e$export$cd4e5573fbe2b576, getEventTarget as $23f2114a1b82827e$export$e58f029f0fbfdb29} from \"../utils/shadowdom/DOMFunctions.mjs\";\nimport {getOwnerWindow as $d447af545b77c9f1$export$f21a1ffae260145a} from \"../utils/domHelpers.mjs\";\nimport {isFocusable as $3b8b240c1bf84ab9$export$4c063cf1350e6fed} from \"../utils/isFocusable.mjs\";\nimport {useLayoutEffect as $c4867b2f328c2698$export$e5c5a5f917a5871c} from \"../utils/useLayoutEffect.mjs\";\nimport {useRef as $lIB5W$useRef, useCallback as $lIB5W$useCallback} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\n\n\n\nfunction $a92dc41f639950be$export$525bc4921d56d4a(nativeEvent) {\n    let event = nativeEvent;\n    event.nativeEvent = nativeEvent;\n    event.isDefaultPrevented = ()=>event.defaultPrevented;\n    // cancelBubble is technically deprecated in the spec, but still supported in all browsers.\n    event.isPropagationStopped = ()=>event.cancelBubble;\n    event.persist = ()=>{};\n    return event;\n}\nfunction $a92dc41f639950be$export$c2b7abe5d61ec696(event, target) {\n    Object.defineProperty(event, 'target', {\n        value: target\n    });\n    Object.defineProperty(event, 'currentTarget', {\n        value: target\n    });\n}\nfunction $a92dc41f639950be$export$715c682d09d639cc(onBlur) {\n    let stateRef = (0, $lIB5W$useRef)({\n        isFocused: false,\n        observer: null\n    });\n    // Clean up MutationObserver on unmount. See below.\n    (0, $c4867b2f328c2698$export$e5c5a5f917a5871c)(()=>{\n        const state = stateRef.current;\n        return ()=>{\n            if (state.observer) {\n                state.observer.disconnect();\n                state.observer = null;\n            }\n        };\n    }, []);\n    // This function is called during a React onFocus event.\n    return (0, $lIB5W$useCallback)((e)=>{\n        // React does not fire onBlur when an element is disabled. https://github.com/facebook/react/issues/9142\n        // Most browsers fire a native focusout event in this case, except for Firefox. In that case, we use a\n        // MutationObserver to watch for the disabled attribute, and dispatch these events ourselves.\n        // For browsers that do, focusout fires before the MutationObserver, so onBlur should not fire twice.\n        let eventTarget = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n        if (eventTarget instanceof HTMLButtonElement || eventTarget instanceof HTMLInputElement || eventTarget instanceof HTMLTextAreaElement || eventTarget instanceof HTMLSelectElement) {\n            stateRef.current.isFocused = true;\n            let target = eventTarget;\n            let onBlurHandler = (e)=>{\n                stateRef.current.isFocused = false;\n                if (target.disabled) {\n                    // For backward compatibility, dispatch a (fake) React synthetic event.\n                    let event = $a92dc41f639950be$export$525bc4921d56d4a(e);\n                    onBlur?.(event);\n                }\n                // We no longer need the MutationObserver once the target is blurred.\n                if (stateRef.current.observer) {\n                    stateRef.current.observer.disconnect();\n                    stateRef.current.observer = null;\n                }\n            };\n            target.addEventListener('focusout', onBlurHandler, {\n                once: true\n            });\n            stateRef.current.observer = new MutationObserver(()=>{\n                if (stateRef.current.isFocused && target.disabled) {\n                    stateRef.current.observer?.disconnect();\n                    let relatedTargetEl = target === (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)() ? null : (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)();\n                    target.dispatchEvent(new FocusEvent('blur', {\n                        relatedTarget: relatedTargetEl\n                    }));\n                    target.dispatchEvent(new FocusEvent('focusout', {\n                        bubbles: true,\n                        relatedTarget: relatedTargetEl\n                    }));\n                }\n            });\n            stateRef.current.observer.observe(target, {\n                attributes: true,\n                attributeFilter: [\n                    'disabled'\n                ]\n            });\n        }\n    }, [\n        onBlur\n    ]);\n}\nlet $a92dc41f639950be$export$fda7da73ab5d4c48 = false;\nfunction $a92dc41f639950be$export$cabe61c495ee3649(target) {\n    // The browser will focus the nearest focusable ancestor of our target.\n    while(target && !(0, $3b8b240c1bf84ab9$export$4c063cf1350e6fed)(target, {\n        skipVisibilityCheck: true\n    }))target = target.parentElement;\n    let window = (0, $d447af545b77c9f1$export$f21a1ffae260145a)(target);\n    let activeElement = window.document.activeElement;\n    if (!activeElement || activeElement === target) return;\n    $a92dc41f639950be$export$fda7da73ab5d4c48 = true;\n    let isRefocusing = false;\n    let onBlur = (e)=>{\n        if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === activeElement || isRefocusing) e.stopImmediatePropagation();\n    };\n    let onFocusOut = (e)=>{\n        if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === activeElement || isRefocusing) {\n            e.stopImmediatePropagation();\n            // If there was no focusable ancestor, we don't expect a focus event.\n            // Re-focus the original active element here.\n            if (!target && !isRefocusing) {\n                isRefocusing = true;\n                (0, $1969ac565cfec8d0$export$de79e2c695e052f3)(activeElement);\n                cleanup();\n            }\n        }\n    };\n    let onFocus = (e)=>{\n        if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === target || isRefocusing) e.stopImmediatePropagation();\n    };\n    let onFocusIn = (e)=>{\n        if ((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e) === target || isRefocusing) {\n            e.stopImmediatePropagation();\n            if (!isRefocusing) {\n                isRefocusing = true;\n                (0, $1969ac565cfec8d0$export$de79e2c695e052f3)(activeElement);\n                cleanup();\n            }\n        }\n    };\n    window.addEventListener('blur', onBlur, true);\n    window.addEventListener('focusout', onFocusOut, true);\n    window.addEventListener('focusin', onFocusIn, true);\n    window.addEventListener('focus', onFocus, true);\n    let cleanup = ()=>{\n        cancelAnimationFrame(raf);\n        window.removeEventListener('blur', onBlur, true);\n        window.removeEventListener('focusout', onFocusOut, true);\n        window.removeEventListener('focusin', onFocusIn, true);\n        window.removeEventListener('focus', onFocus, true);\n        $a92dc41f639950be$export$fda7da73ab5d4c48 = false;\n        isRefocusing = false;\n    };\n    let raf = requestAnimationFrame(cleanup);\n    return cleanup;\n}\n\n\nexport {$a92dc41f639950be$export$525bc4921d56d4a as createSyntheticEvent, $a92dc41f639950be$export$c2b7abe5d61ec696 as setEventTarget, $a92dc41f639950be$export$715c682d09d639cc as useSyntheticBlurEvent, $a92dc41f639950be$export$fda7da73ab5d4c48 as ignoreFocusEvent, $a92dc41f639950be$export$cabe61c495ee3649 as preventFocus};\n//# sourceMappingURL=utils.mjs.map\n","import {useRef as $awe0O$useRef, useCallback as $awe0O$useCallback, useEffect as $awe0O$useEffect} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $48a7d519b337145d$export$4eaf04e54aa8eed6() {\n    let globalListeners = (0, $awe0O$useRef)(new Map());\n    let addGlobalListener = (0, $awe0O$useCallback)((eventTarget, type, listener, options)=>{\n        // Make sure we remove the listener after it is called with the `once` option.\n        let fn = options?.once ? (...args)=>{\n            globalListeners.current.delete(listener);\n            listener(...args);\n        } : listener;\n        globalListeners.current.set(listener, {\n            type: type,\n            eventTarget: eventTarget,\n            fn: fn,\n            options: options\n        });\n        eventTarget.addEventListener(type, fn, options);\n    }, []);\n    let removeGlobalListener = (0, $awe0O$useCallback)((eventTarget, type, listener, options)=>{\n        let fn = globalListeners.current.get(listener)?.fn || listener;\n        eventTarget.removeEventListener(type, fn, options);\n        globalListeners.current.delete(listener);\n    }, []);\n    let removeAllGlobalListeners = (0, $awe0O$useCallback)(()=>{\n        globalListeners.current.forEach((value, key)=>{\n            removeGlobalListener(value.eventTarget, value.type, key, value.options);\n        });\n    }, [\n        removeGlobalListener\n    ]);\n    (0, $awe0O$useEffect)(()=>{\n        return removeAllGlobalListeners;\n    }, [\n        removeAllGlobalListeners\n    ]);\n    return {\n        addGlobalListener: addGlobalListener,\n        removeGlobalListener: removeGlobalListener,\n        removeAllGlobalListeners: removeAllGlobalListeners\n    };\n}\n\n\nexport {$48a7d519b337145d$export$4eaf04e54aa8eed6 as useGlobalListeners};\n//# sourceMappingURL=useGlobalListeners.mjs.map\n","import {createSyntheticEvent as $a92dc41f639950be$export$525bc4921d56d4a, setEventTarget as $a92dc41f639950be$export$c2b7abe5d61ec696, useSyntheticBlurEvent as $a92dc41f639950be$export$715c682d09d639cc} from \"./utils.mjs\";\nimport {getActiveElement as $23f2114a1b82827e$export$cd4e5573fbe2b576, getEventTarget as $23f2114a1b82827e$export$e58f029f0fbfdb29, nodeContains as $23f2114a1b82827e$export$4282f70798064fe0} from \"../utils/shadowdom/DOMFunctions.mjs\";\nimport {getOwnerDocument as $d447af545b77c9f1$export$b204af158042fbac} from \"../utils/domHelpers.mjs\";\nimport {useGlobalListeners as $48a7d519b337145d$export$4eaf04e54aa8eed6} from \"../utils/useGlobalListeners.mjs\";\nimport {useRef as $5319z$useRef, useCallback as $5319z$useCallback} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n\n\n\n\nfunction $2c9edc598a03d523$export$420e68273165f4ec(props) {\n    let { isDisabled: isDisabled, onBlurWithin: onBlurWithin, onFocusWithin: onFocusWithin, onFocusWithinChange: onFocusWithinChange } = props;\n    let state = (0, $5319z$useRef)({\n        isFocusWithin: false\n    });\n    let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners } = (0, $48a7d519b337145d$export$4eaf04e54aa8eed6)();\n    let onBlur = (0, $5319z$useCallback)((e)=>{\n        // Ignore events bubbling through portals.\n        if (!(0, $23f2114a1b82827e$export$4282f70798064fe0)(e.currentTarget, (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e))) return;\n        // We don't want to trigger onBlurWithin and then immediately onFocusWithin again\n        // when moving focus inside the element. Only trigger if the currentTarget doesn't\n        // include the relatedTarget (where focus is moving).\n        if (state.current.isFocusWithin && !(0, $23f2114a1b82827e$export$4282f70798064fe0)(e.currentTarget, e.relatedTarget)) {\n            state.current.isFocusWithin = false;\n            removeAllGlobalListeners();\n            if (onBlurWithin) onBlurWithin(e);\n            if (onFocusWithinChange) onFocusWithinChange(false);\n        }\n    }, [\n        onBlurWithin,\n        onFocusWithinChange,\n        state,\n        removeAllGlobalListeners\n    ]);\n    let onSyntheticFocus = (0, $a92dc41f639950be$export$715c682d09d639cc)(onBlur);\n    let onFocus = (0, $5319z$useCallback)((e)=>{\n        // Ignore events bubbling through portals.\n        if (!(0, $23f2114a1b82827e$export$4282f70798064fe0)(e.currentTarget, (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e))) return;\n        // Double check that document.activeElement actually matches e.target in case a previously chained\n        // focus handler already moved focus somewhere else.\n        let eventTarget = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n        const ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(eventTarget);\n        const activeElement = (0, $23f2114a1b82827e$export$cd4e5573fbe2b576)(ownerDocument);\n        if (!state.current.isFocusWithin && activeElement === eventTarget) {\n            if (onFocusWithin) onFocusWithin(e);\n            if (onFocusWithinChange) onFocusWithinChange(true);\n            state.current.isFocusWithin = true;\n            onSyntheticFocus(e);\n            // Browsers don't fire blur events when elements are removed from the DOM.\n            // However, if a focus event occurs outside the element we're tracking, we\n            // can manually fire onBlur.\n            let currentTarget = e.currentTarget;\n            addGlobalListener(ownerDocument, 'focus', (e)=>{\n                let eventTarget = (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e);\n                if (state.current.isFocusWithin && !(0, $23f2114a1b82827e$export$4282f70798064fe0)(currentTarget, eventTarget)) {\n                    let nativeEvent = new ownerDocument.defaultView.FocusEvent('blur', {\n                        relatedTarget: eventTarget\n                    });\n                    (0, $a92dc41f639950be$export$c2b7abe5d61ec696)(nativeEvent, currentTarget);\n                    let event = (0, $a92dc41f639950be$export$525bc4921d56d4a)(nativeEvent);\n                    onBlur(event);\n                }\n            }, {\n                capture: true\n            });\n        }\n    }, [\n        onFocusWithin,\n        onFocusWithinChange,\n        onSyntheticFocus,\n        addGlobalListener,\n        onBlur\n    ]);\n    if (isDisabled) return {\n        focusWithinProps: {\n            // These cannot be null, that would conflict in mergeProps\n            onFocus: undefined,\n            onBlur: undefined\n        }\n    };\n    return {\n        focusWithinProps: {\n            onFocus: onFocus,\n            onBlur: onBlur\n        }\n    };\n}\n\n\nexport {$2c9edc598a03d523$export$420e68273165f4ec as useFocusWithin};\n//# sourceMappingURL=useFocusWithin.mjs.map\n","import {getEventTarget as $23f2114a1b82827e$export$e58f029f0fbfdb29, nodeContains as $23f2114a1b82827e$export$4282f70798064fe0} from \"../utils/shadowdom/DOMFunctions.mjs\";\nimport {getOwnerDocument as $d447af545b77c9f1$export$b204af158042fbac} from \"../utils/domHelpers.mjs\";\nimport {useGlobalListeners as $48a7d519b337145d$export$4eaf04e54aa8eed6} from \"../utils/useGlobalListeners.mjs\";\nimport {useState as $hZqKM$useState, useRef as $hZqKM$useRef, useEffect as $hZqKM$useEffect, useMemo as $hZqKM$useMemo} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n\n\n\n// iOS fires onPointerEnter twice: once with pointerType=\"touch\" and again with pointerType=\"mouse\".\n// We want to ignore these emulated events so they do not trigger hover behavior.\n// See https://bugs.webkit.org/show_bug.cgi?id=214609.\nlet $e969f22b6713ca4a$var$globalIgnoreEmulatedMouseEvents = false;\nlet $e969f22b6713ca4a$var$hoverCount = 0;\nfunction $e969f22b6713ca4a$var$setGlobalIgnoreEmulatedMouseEvents() {\n    $e969f22b6713ca4a$var$globalIgnoreEmulatedMouseEvents = true;\n    // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter\n    // with pointerType=\"mouse\" immediately after onPointerUp and before onFocus. On other\n    // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in\n    // the distant future because a user previously touched the element.\n    setTimeout(()=>{\n        $e969f22b6713ca4a$var$globalIgnoreEmulatedMouseEvents = false;\n    }, 500);\n}\nfunction $e969f22b6713ca4a$var$handleGlobalPointerEvent(e) {\n    if (e.pointerType === 'touch') $e969f22b6713ca4a$var$setGlobalIgnoreEmulatedMouseEvents();\n}\nfunction $e969f22b6713ca4a$var$setupGlobalTouchEvents() {\n    let ownerDocument = (0, $d447af545b77c9f1$export$b204af158042fbac)(null);\n    if (typeof ownerDocument === 'undefined') return;\n    if ($e969f22b6713ca4a$var$hoverCount === 0) {\n        if (typeof PointerEvent !== 'undefined') ownerDocument.addEventListener('pointerup', $e969f22b6713ca4a$var$handleGlobalPointerEvent);\n        else if (process.env.NODE_ENV === 'test') ownerDocument.addEventListener('touchend', $e969f22b6713ca4a$var$setGlobalIgnoreEmulatedMouseEvents);\n    }\n    $e969f22b6713ca4a$var$hoverCount++;\n    return ()=>{\n        $e969f22b6713ca4a$var$hoverCount--;\n        if ($e969f22b6713ca4a$var$hoverCount > 0) return;\n        if (typeof PointerEvent !== 'undefined') ownerDocument.removeEventListener('pointerup', $e969f22b6713ca4a$var$handleGlobalPointerEvent);\n        else if (process.env.NODE_ENV === 'test') ownerDocument.removeEventListener('touchend', $e969f22b6713ca4a$var$setGlobalIgnoreEmulatedMouseEvents);\n    };\n}\nfunction $e969f22b6713ca4a$export$ae780daf29e6d456(props) {\n    let { onHoverStart: onHoverStart, onHoverChange: onHoverChange, onHoverEnd: onHoverEnd, isDisabled: isDisabled } = props;\n    let [isHovered, setHovered] = (0, $hZqKM$useState)(false);\n    let state = (0, $hZqKM$useRef)({\n        isHovered: false,\n        ignoreEmulatedMouseEvents: false,\n        pointerType: '',\n        target: null\n    }).current;\n    (0, $hZqKM$useEffect)($e969f22b6713ca4a$var$setupGlobalTouchEvents, []);\n    let { addGlobalListener: addGlobalListener, removeAllGlobalListeners: removeAllGlobalListeners } = (0, $48a7d519b337145d$export$4eaf04e54aa8eed6)();\n    let { hoverProps: hoverProps, triggerHoverEnd: triggerHoverEnd } = (0, $hZqKM$useMemo)(()=>{\n        let triggerHoverStart = (event, pointerType)=>{\n            state.pointerType = pointerType;\n            if (isDisabled || pointerType === 'touch' || state.isHovered || !(0, $23f2114a1b82827e$export$4282f70798064fe0)(event.currentTarget, (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(event))) return;\n            state.isHovered = true;\n            let target = event.currentTarget;\n            state.target = target;\n            // When an element that is hovered over is removed, no pointerleave event is fired by the browser,\n            // even though the originally hovered target may have shrunk in size so it is no longer hovered.\n            // However, a pointerover event will be fired on the new target the mouse is over.\n            // In Chrome this happens immediately. In Safari and Firefox, it happens upon moving the mouse one pixel.\n            addGlobalListener((0, $d447af545b77c9f1$export$b204af158042fbac)((0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(event)), 'pointerover', (e)=>{\n                if (state.isHovered && state.target && !(0, $23f2114a1b82827e$export$4282f70798064fe0)(state.target, (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e))) triggerHoverEnd(e, e.pointerType);\n            }, {\n                capture: true\n            });\n            if (onHoverStart) onHoverStart({\n                type: 'hoverstart',\n                target: target,\n                pointerType: pointerType\n            });\n            if (onHoverChange) onHoverChange(true);\n            setHovered(true);\n        };\n        let triggerHoverEnd = (event, pointerType)=>{\n            let target = state.target;\n            state.pointerType = '';\n            state.target = null;\n            if (pointerType === 'touch' || !state.isHovered || !target) return;\n            state.isHovered = false;\n            removeAllGlobalListeners();\n            if (onHoverEnd) onHoverEnd({\n                type: 'hoverend',\n                target: target,\n                pointerType: pointerType\n            });\n            if (onHoverChange) onHoverChange(false);\n            setHovered(false);\n        };\n        let hoverProps = {};\n        if (typeof PointerEvent !== 'undefined') {\n            hoverProps.onPointerEnter = (e)=>{\n                if ($e969f22b6713ca4a$var$globalIgnoreEmulatedMouseEvents && e.pointerType === 'mouse') return;\n                triggerHoverStart(e, e.pointerType);\n            };\n            hoverProps.onPointerLeave = (e)=>{\n                if (!isDisabled && (0, $23f2114a1b82827e$export$4282f70798064fe0)(e.currentTarget, (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e))) triggerHoverEnd(e, e.pointerType);\n            };\n        } else if (process.env.NODE_ENV === 'test') {\n            hoverProps.onTouchStart = ()=>{\n                state.ignoreEmulatedMouseEvents = true;\n            };\n            hoverProps.onMouseEnter = (e)=>{\n                if (!state.ignoreEmulatedMouseEvents && !$e969f22b6713ca4a$var$globalIgnoreEmulatedMouseEvents) triggerHoverStart(e, 'mouse');\n                state.ignoreEmulatedMouseEvents = false;\n            };\n            hoverProps.onMouseLeave = (e)=>{\n                if (!isDisabled && (0, $23f2114a1b82827e$export$4282f70798064fe0)(e.currentTarget, (0, $23f2114a1b82827e$export$e58f029f0fbfdb29)(e))) triggerHoverEnd(e, 'mouse');\n            };\n        }\n        return {\n            hoverProps: hoverProps,\n            triggerHoverEnd: triggerHoverEnd\n        };\n    }, [\n        onHoverStart,\n        onHoverChange,\n        onHoverEnd,\n        isDisabled,\n        state,\n        addGlobalListener,\n        removeAllGlobalListeners\n    ]);\n    (0, $hZqKM$useEffect)(()=>{\n        // Call the triggerHoverEnd as soon as isDisabled changes to true\n        // Safe to call triggerHoverEnd, it will early return if we aren't currently hovering\n        if (isDisabled) triggerHoverEnd({\n            currentTarget: state.target\n        }, state.pointerType);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [\n        isDisabled\n    ]);\n    return {\n        hoverProps: hoverProps,\n        isHovered: isHovered\n    };\n}\n\n\nexport {$e969f22b6713ca4a$export$ae780daf29e6d456 as useHover};\n//# sourceMappingURL=useHover.mjs.map\n","import { invoke, isTauri } from '@tauri-apps/api/core';\nimport { type as osType } from '@tauri-apps/plugin-os';\n\nexport type HapticKind = 'light' | 'medium' | 'heavy' | 'selection';\n\nconst ANDROID_MS: Record<HapticKind, number> = {\n  light: 8,\n  medium: 12,\n  heavy: 18,\n  selection: 5,\n};\n\nexport function haptic(kind: HapticKind = 'light'): void {\n  if (!isTauri()) return;\n  const os = osType();\n  if (os === 'android') {\n    navigator.vibrate?.(ANDROID_MS[kind]);\n  } else if (os === 'ios') {\n    invoke('haptic_feedback', { style: kind }).catch(() => {});\n  }\n}\n","import { createContext, useContext } from 'react';\n\nexport type MobileSwipeEnd = {\n  distanceX: number;\n  velocityX: number;\n};\n\nexport type MobileSwipeTarget = {\n  move: (distanceX: number) => void;\n  end: (gesture: MobileSwipeEnd) => void;\n  cancel: () => void;\n};\n\nexport type MobileNavDrawerControls = {\n  openContent: (path: string) => void;\n  registerChatSwipe: (element: HTMLElement, target: MobileSwipeTarget) => () => void;\n  registerMessageSwipe: (element: HTMLElement, target: MobileSwipeTarget) => () => void;\n};\n\nexport const MobileNavDrawerContext = createContext<MobileNavDrawerControls | undefined>(undefined);\n\nexport function useMobileNavDrawer(): MobileNavDrawerControls | undefined {\n  return useContext(MobileNavDrawerContext);\n}\n\nexport function useOpenMobileDrawerContent(): ((path: string) => void) | undefined {\n  return useMobileNavDrawer()?.openContent;\n}\n","const GESTURE_LOCK_THRESHOLD = 8;\nconst DRAWER_COMMIT_FRACTION = 0.22;\nconst DRAWER_VELOCITY_THRESHOLD = 0.45;\n\nexport type MobileGestureMode = 'pending' | 'vertical' | 'drawer' | 'message' | 'chat' | 'blocked';\n\nexport function classifyMobileGesture({\n  distanceX,\n  distanceY,\n  startPosition,\n  width,\n  canOpenRoom,\n  hasMessage,\n  hasChat,\n}: {\n  distanceX: number;\n  distanceY: number;\n  startPosition: number;\n  width: number;\n  canOpenRoom: boolean;\n  hasMessage: boolean;\n  hasChat: boolean;\n}): MobileGestureMode {\n  if (Math.max(Math.abs(distanceX), Math.abs(distanceY)) < GESTURE_LOCK_THRESHOLD) {\n    return 'pending';\n  }\n  if (Math.abs(distanceY) >= Math.abs(distanceX)) return 'vertical';\n  if (\n    (distanceX > 0 && startPosition < 0) ||\n    (distanceX < 0 && startPosition > -width && canOpenRoom)\n  ) {\n    return 'drawer';\n  }\n  if (distanceX < 0 && hasMessage) return 'message';\n  if (distanceX < 0 && hasChat) return 'chat';\n  return 'blocked';\n}\n\nexport function getDrawerSettlePosition({\n  startPosition,\n  distanceX,\n  velocityX,\n  width,\n  cancelled,\n}: {\n  startPosition: number;\n  distanceX: number;\n  velocityX: number;\n  width: number;\n  cancelled: boolean;\n}): number {\n  const startedInRoom = startPosition <= -width / 2;\n  if (cancelled) return startedInRoom ? -width : 0;\n\n  const passedDistance = Math.abs(distanceX) >= width * DRAWER_COMMIT_FRACTION;\n  const passedVelocity = Math.abs(velocityX) >= DRAWER_VELOCITY_THRESHOLD;\n  if (startedInRoom && distanceX > 0 && (passedDistance || passedVelocity)) return 0;\n  if (!startedInRoom && distanceX < 0 && (passedDistance || passedVelocity)) return -width;\n  return startedInRoom ? -width : 0;\n}\n","export const NATIVE_EASE_OUT = 'cubic-bezier(0.22, 1, 0.36, 1)';\n\nexport function getTranslateX(element: HTMLElement, fallback = 0) {\n  const transform = window.getComputedStyle(element).transform;\n  if (!transform || transform === 'none') return fallback;\n\n  const values = transform.slice(transform.indexOf('(') + 1, -1).split(',');\n  const index = transform.startsWith('matrix3d') ? 12 : 4;\n  const value = Number.parseFloat(values[index] ?? '');\n  return Number.isFinite(value) ? value : fallback;\n}\n\nexport function setTranslateX(element: HTMLElement, value: number) {\n  element.style.transform = `translate3d(${value}px, 0, 0)`;\n}\n\n/** Applies a CSS transition and returns a handle that cancels its completion callback. */\nexport function transitionTo(\n  element: HTMLElement,\n  transition: string,\n  apply: () => void,\n  durationMs: number,\n  onComplete?: () => void\n) {\n  let cancelled = false;\n  let timer: number | undefined;\n\n  const finish = () => {\n    if (cancelled) return;\n    cancelled = true;\n    if (timer !== undefined) window.clearTimeout(timer);\n    onComplete?.();\n  };\n\n  if (durationMs <= 0) {\n    element.style.transition = 'none';\n    apply();\n    finish();\n    return { cancel: () => undefined };\n  }\n\n  element.style.transition = transition;\n  apply();\n  timer = window.setTimeout(finish, durationMs);\n\n  return {\n    cancel: () => {\n      cancelled = true;\n      if (timer !== undefined) window.clearTimeout(timer);\n    },\n  };\n}\n","import type { ReactNode } from 'react';\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { ArrowBendUpLeftIcon, PencilSimple, getPhosphorIconSize } from '$components/icons/phosphor';\nimport { haptic } from '$utils/haptics';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { RightSwipeAction, settingsAtom } from '$state/settings';\nimport { useMobileNavDrawer } from '$components/page/MobileNavDrawerContext';\nimport {\n  classifyMobileGesture,\n  type MobileGestureMode,\n} from '$components/page/mobileSwipeCoordinator';\nimport {\n  getTranslateX,\n  NATIVE_EASE_OUT,\n  setTranslateX,\n  transitionTo,\n} from '$utils/nativeAnimation';\n\nexport type SwipeActionMode = 'none' | 'reply' | 'edit';\n\nfunction ActiveSwipeWrapper({\n  children,\n  onReply,\n  onEdit,\n  onActionModeChange,\n}: {\n  children: ReactNode;\n  onReply: () => void;\n  onEdit?: () => void;\n  onActionModeChange?: (mode: SwipeActionMode) => void;\n}) {\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const messageRef = useRef<HTMLDivElement | null>(null);\n  const actionRef = useRef<HTMLDivElement | null>(null);\n  const xRef = useRef(0);\n  const [actionMode, setActionMode] = useState<SwipeActionMode>('none');\n  const actionModeRef = useRef<SwipeActionMode>('none');\n  const gestureActiveRef = useRef(false);\n  const settleRef = useRef<{ cancel: () => void } | undefined>(undefined);\n  const drawer = useMobileNavDrawer();\n\n  const setOffset = useCallback((value: number) => {\n    xRef.current = value;\n    if (messageRef.current) setTranslateX(messageRef.current, value);\n    if (actionRef.current) {\n      actionRef.current.style.width = `${Math.abs(Math.min(0, value))}px`;\n      actionRef.current.style.opacity = `${Math.min(1, Math.max(0, -value / 24))}`;\n    }\n  }, []);\n\n  const cancelSettle = useCallback(() => {\n    const message = messageRef.current;\n    const liveOffset = message ? getTranslateX(message, xRef.current) : xRef.current;\n    settleRef.current?.cancel();\n    settleRef.current = undefined;\n    if (message) message.style.transition = 'none';\n    if (actionRef.current) actionRef.current.style.transition = 'none';\n    setOffset(liveOffset);\n  }, [setOffset]);\n\n  const settleToRest = useCallback(() => {\n    const message = messageRef.current;\n    const action = actionRef.current;\n    if (!message || !action) return;\n\n    cancelSettle();\n    const transition = `transform 220ms ${NATIVE_EASE_OUT}`;\n    const actionTransition = `width 220ms ${NATIVE_EASE_OUT}, opacity 220ms ${NATIVE_EASE_OUT}`;\n    action.style.transition = actionTransition;\n    settleRef.current = transitionTo(\n      message,\n      transition,\n      () => setOffset(0),\n      220,\n      () => {\n        settleRef.current = undefined;\n      }\n    );\n  }, [cancelSettle, setOffset]);\n\n  const move = useCallback(\n    (distanceX: number) => {\n      if (!gestureActiveRef.current) {\n        gestureActiveRef.current = true;\n        cancelSettle();\n      }\n\n      const width = containerRef.current?.clientWidth || 360;\n      const replyThreshold = -Math.min(50, width * 0.2);\n      const linearLimit = onEdit ? Math.min(100, width * 0.32) : Math.min(60, width * 0.18);\n      // Enter edit only deep into the resistant tail, when the message is\n      // visually close to its maximum travel.\n      const editThreshold = -(linearLimit + 90);\n\n      const dragDist = Math.abs(Math.min(0, distanceX));\n      let smoothedDist = dragDist;\n\n      if (dragDist > linearLimit) {\n        const excess = dragDist - linearLimit;\n        const maxExcess = 45;\n        smoothedDist = linearLimit + maxExcess * (1 - Math.exp(-excess / 40));\n      }\n      setOffset(-smoothedDist);\n\n      let nextMode: SwipeActionMode = 'none';\n      if (onEdit && distanceX < editThreshold) {\n        nextMode = 'edit';\n      } else if (distanceX < replyThreshold) {\n        nextMode = 'reply';\n      }\n\n      if (nextMode !== actionModeRef.current) {\n        actionModeRef.current = nextMode;\n        setActionMode(nextMode);\n        onActionModeChange?.(nextMode);\n        if (nextMode !== 'none') {\n          haptic(nextMode === 'edit' ? 'medium' : 'selection');\n        }\n      }\n    },\n    [cancelSettle, onActionModeChange, onEdit, setOffset]\n  );\n\n  const finish = useCallback(\n    (commit: boolean) => {\n      if (commit) {\n        const currentMode = actionModeRef.current;\n        if (currentMode === 'edit' && onEdit) {\n          onEdit();\n        } else if (currentMode === 'reply') {\n          onReply();\n        }\n      }\n\n      gestureActiveRef.current = false;\n      settleToRest();\n      actionModeRef.current = 'none';\n      setActionMode('none');\n      onActionModeChange?.('none');\n    },\n    [onActionModeChange, onEdit, onReply, settleToRest]\n  );\n\n  useLayoutEffect(() => {\n    const element = containerRef.current;\n    if (!drawer || !element) return undefined;\n\n    return drawer.registerMessageSwipe(element, {\n      move,\n      end: () => finish(true),\n      cancel: () => finish(false),\n    });\n  }, [drawer, finish, move]);\n\n  // Above the mobile breakpoint there is no nav drawer to coordinate the touch,\n  // so track it on the message itself. Tablets and touch desktops reach this;\n  // iPadOS in fullscreen is the case that has no drawer but is still a touch device.\n  useLayoutEffect(() => {\n    const element = containerRef.current;\n    if (drawer || !element) return undefined;\n\n    let gesture: { startX: number; startY: number; mode: MobileGestureMode } | undefined;\n    const release = (commit: boolean) => {\n      const active = gesture?.mode === 'message';\n      gesture = undefined;\n      if (active) finish(commit);\n    };\n\n    const onTouchStart = (event: TouchEvent) => {\n      const touch = event.touches[0];\n      if (!touch || event.touches.length !== 1) {\n        release(false);\n        return;\n      }\n      gesture = { startX: touch.clientX, startY: touch.clientY, mode: 'pending' };\n    };\n\n    const onTouchMove = (event: TouchEvent) => {\n      const touch = event.touches[0];\n      if (!gesture || !touch) return;\n      if (gesture.mode === 'blocked' || gesture.mode === 'vertical') return;\n\n      const distanceX = touch.clientX - gesture.startX;\n      if (gesture.mode === 'pending') {\n        // width 0 and canOpenRoom false leave `drawer` unreachable, so this only\n        // ever resolves to vertical, message, or blocked.\n        gesture.mode = classifyMobileGesture({\n          distanceX,\n          distanceY: touch.clientY - gesture.startY,\n          startPosition: 0,\n          width: 0,\n          canOpenRoom: false,\n          hasMessage: true,\n          hasChat: false,\n        });\n      }\n      if (gesture.mode === 'message') move(distanceX);\n    };\n\n    const onTouchEnd = () => release(true);\n    const onTouchCancel = () => release(false);\n\n    element.addEventListener('touchstart', onTouchStart, { passive: true });\n    element.addEventListener('touchmove', onTouchMove, { passive: true });\n    element.addEventListener('touchend', onTouchEnd, { passive: true });\n    element.addEventListener('touchcancel', onTouchCancel, { passive: true });\n\n    return () => {\n      element.removeEventListener('touchstart', onTouchStart);\n      element.removeEventListener('touchmove', onTouchMove);\n      element.removeEventListener('touchend', onTouchEnd);\n      element.removeEventListener('touchcancel', onTouchCancel);\n      release(false);\n    };\n  }, [drawer, finish, move]);\n\n  const IconComponent = actionMode === 'edit' ? PencilSimple : ArrowBendUpLeftIcon;\n  const iconColor =\n    actionMode === 'edit'\n      ? 'var(--sable-primary-color, #6e56cf)'\n      : actionMode === 'reply'\n        ? 'var(--sable-surface-on-container, #ffffff)'\n        : 'rgba(255, 255, 255, 0.6)';\n\n  return (\n    <div\n      data-gestures=\"ignore\"\n      data-message-swipe\n      ref={containerRef}\n      style={{\n        position: 'relative',\n        touchAction: 'pan-y',\n      }}\n    >\n      {/* Keep the action centered in the portion of the message background being revealed. */}\n      <div\n        ref={actionRef}\n        style={{\n          position: 'absolute',\n          top: 0,\n          bottom: 0,\n          right: 0,\n          width: 0,\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          zIndex: 1,\n          pointerEvents: 'none',\n          overflow: 'hidden',\n          opacity: 0,\n        }}\n      >\n        <IconComponent\n          size={getPhosphorIconSize('toolbar')}\n          style={{\n            flexShrink: 0,\n            color: iconColor,\n            transition: 'color 0.2s, transform 0.2s',\n            transform: actionMode === 'edit' ? 'scale(1.2)' : 'scale(1)',\n          }}\n        />\n      </div>\n\n      <div\n        ref={messageRef}\n        style={{\n          transform: 'translate3d(0, 0, 0)',\n          position: 'relative',\n          zIndex: 2,\n          willChange: 'transform',\n        }}\n      >\n        {children}\n      </div>\n    </div>\n  );\n}\n\nexport function SwipeableMessageWrapper({\n  children,\n  onReply,\n  onEdit,\n  onActionModeChange,\n}: {\n  children: ReactNode;\n  onReply?: () => void;\n  onEdit?: () => void;\n  onActionModeChange?: (mode: SwipeActionMode) => void;\n}) {\n  const settings = useAtomValue(settingsAtom);\n\n  const isSwipeToReplyEnabled = useMemo(\n    () => isMobileOrTablet() && settings.rightSwipeAction !== RightSwipeAction.Members,\n    [settings.rightSwipeAction]\n  );\n\n  if (!isSwipeToReplyEnabled || !onReply) {\n    return children;\n  }\n\n  return (\n    <ActiveSwipeWrapper onReply={onReply} onEdit={onEdit} onActionModeChange={onActionModeChange}>\n      {children}\n    </ActiveSwipeWrapper>\n  );\n}\n","import type { IContent, IMentions } from '$types/matrix-sdk';\nimport { MsgType, RelationType } from '$types/matrix-sdk';\nimport { customHtmlEqualsPlainText } from '$components/editor';\nimport { sanitizeText } from '$utils/sanitize';\nimport type { PerMessageProfileMsc4461 } from '$hooks/usePerMessageProfile';\nimport {\n  convertPerMessageProfileToBeeperFormat,\n  stripPerMessageProfileFormattedBody,\n} from '$hooks/usePerMessageProfile';\nimport { MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME } from '$unstable/prefixes';\n\n/**\n * Unified from RoomInput and MessageEditor, which had drifted: this keeps\n * RoomInput's `delete content.format` branch that MessageEditor lacked.\n */\nexport function buildReplacementContent(\n  oldContent: IContent,\n  plainText: string,\n  customHtml: string,\n  eventId: string,\n  mMentions: IMentions,\n  linkPreviews: { matched_url: string }[],\n  perMessageProfile: unknown,\n  pmpNoFallback: boolean\n): IContent {\n  const pmpDisplayname =\n    perMessageProfile !== null &&\n    typeof perMessageProfile === 'object' &&\n    'displayname' in perMessageProfile &&\n    typeof perMessageProfile.displayname === 'string' &&\n    perMessageProfile.displayname.length > 0\n      ? perMessageProfile.displayname\n      : undefined;\n\n  let adjustedPlainText = plainText;\n  let adjustedCustomHtml = customHtml;\n\n  if (!pmpNoFallback && pmpDisplayname) {\n    const bodyPrefix = `${pmpDisplayname}: `;\n    if (!adjustedPlainText.startsWith(bodyPrefix))\n      adjustedPlainText = bodyPrefix + adjustedPlainText;\n\n    const htmlPrefix = `<strong data-mx-profile-fallback>${sanitizeText(pmpDisplayname)}: </strong>`;\n    if (!adjustedCustomHtml.startsWith(htmlPrefix))\n      adjustedCustomHtml = htmlPrefix + adjustedCustomHtml;\n  }\n\n  const msgtype = oldContent.msgtype ?? MsgType.Text;\n\n  const newContent: IContent = {\n    msgtype,\n    body: adjustedPlainText,\n    'm.mentions': mMentions,\n  };\n\n  if (pmpDisplayname) {\n    newContent['com.beeper.per_message_profile'] = perMessageProfile;\n  }\n\n  const content: IContent = {\n    ...oldContent,\n    'm.relates_to': {\n      event_id: eventId,\n      rel_type: RelationType.Replace,\n    },\n    body: `* ${adjustedPlainText}`,\n    'm.mentions': mMentions,\n    'm.new_content': newContent,\n  };\n  delete content['pet.plz.gif'];\n\n  if (!customHtmlEqualsPlainText(adjustedCustomHtml, adjustedPlainText)) {\n    newContent.format = 'org.matrix.custom.html';\n    newContent.formatted_body = adjustedCustomHtml;\n    content.format = 'org.matrix.custom.html';\n    content.formatted_body = `* ${adjustedCustomHtml}`;\n  } else {\n    delete content.format;\n    delete content.formatted_body;\n  }\n\n  if (oldContent.info !== undefined && oldContent.msgtype !== MsgType.Text) {\n    const filename = 'filename' in oldContent ? (oldContent.filename as string) : oldContent.body;\n    content.filename = filename;\n    newContent.filename = filename;\n    content.info = oldContent.info;\n    newContent.info = oldContent.info;\n    if (oldContent.file !== undefined) newContent.file = oldContent.file;\n    if (oldContent.url !== undefined) newContent.url = oldContent.url;\n\n    const spoilerKey = 'page.codeberg.everypizza.msc4193.spoiler';\n    if (oldContent[spoilerKey] !== undefined) {\n      content[spoilerKey] = oldContent[spoilerKey];\n      newContent[spoilerKey] = oldContent[spoilerKey];\n    }\n  }\n\n  content['com.beeper.linkpreviews'] = linkPreviews;\n  newContent['com.beeper.linkpreviews'] = linkPreviews;\n\n  return content;\n}\n\n// Replacing only the PMP in a content. No, you can't use the above function. I tried.\nexport function buildReplacementPmpContent(\n  oldContent: IContent,\n  eventId: string,\n  newProfile: PerMessageProfileMsc4461 | undefined\n) {\n  const profileBeeperFormat =\n    newProfile && convertPerMessageProfileToBeeperFormat(newProfile, true);\n\n  // handle fallbacks\n  if (oldContent[MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME]) {\n    const plainBody = oldContent.body;\n    let newPlainBody = plainBody?.replace(/^.*?: /, '');\n\n    const formattedBody = oldContent.formatted_body;\n    let newFormattedBody = formattedBody\n      ? stripPerMessageProfileFormattedBody(formattedBody)\n      : undefined;\n\n    oldContent.formatted_body = newFormattedBody;\n    oldContent.body = newPlainBody;\n  }\n\n  if (newProfile) {\n    const escapedName = sanitizeText(newProfile.displayname);\n    const htmlPrefix = `<strong data-mx-profile-fallback>${escapedName}: </strong>`;\n\n    if (oldContent.formatted_body) {\n      oldContent.formatted_body = htmlPrefix + oldContent.formatted_body;\n    } else {\n      // we don't have a formatted body, but we need one\n      oldContent.format = 'org.matrix.custom.html';\n      const escapedBody = sanitizeText(oldContent.body).replaceAll('\\n', '<br/>');\n      oldContent.formatted_body = `${htmlPrefix}${escapedBody}`;\n    }\n\n    const pmpPrefix = `${newProfile.displayname}: `;\n    oldContent.body = pmpPrefix + oldContent.body;\n  }\n\n  const newContent = {\n    ...oldContent,\n    [MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME]: profileBeeperFormat,\n  };\n  const content: IContent = {\n    ...newContent,\n    'm.new_content': newContent,\n    'm.relates_to': { event_id: eventId, rel_type: RelationType.Replace },\n  };\n\n  return content;\n}\n","import type { ReactEventHandler } from 'react';\nimport { useCallback } from 'react';\n\nexport const useSpoilerClickHandler = (): ReactEventHandler<HTMLElement> => {\n  const handleClick: ReactEventHandler<HTMLElement> = useCallback((evt) => {\n    const target = evt.currentTarget;\n    if (target.getAttribute('aria-pressed') === 'true') {\n      evt.stopPropagation();\n      target.setAttribute('aria-pressed', 'false');\n      target.style.cursor = 'initial';\n    }\n  }, []);\n\n  return handleClick;\n};\n","import type { BundleContent } from '$components/message';\nimport { testMatrixTo } from '$plugins/matrix-to';\n\nconst LINK_URL = `(https?:\\\\/\\\\/.[A-Za-z0-9-._~:/?#[\\\\()@!$&'*+,;%=]+)`;\nconst LINKINPUTREGEX = new RegExp(`\\\\(?(${LINK_URL})\\\\)?`, 'g');\n\n/**\n * `htmlToMarkdown()` escapes `<` and `>` into `\\<` and `\\>` in text nodes.\n *\n * We deliberately inject angle brackets around URLs to suppress link previews. Those backslashes\n * are correct internally for markdown escaping, but should not be shown to the user when editing.\n *\n * This helper removes *only* the backslashes that wrap our `<url>` suppressor pattern.\n */\nexport function stripMarkdownEscapesForHiddenPreviews(markdown: string): string {\n  // Handle: \\<https://example.com\\>\n  // Also handle common surrounding parens: (\\<url\\>), (\\<url), \\<url\\>)\n  const WRAPPED = new RegExp(String.raw`\\\\<(${LINK_URL})\\\\>`, 'g');\n  const OPEN_ONLY = new RegExp(String.raw`\\\\<(${LINK_URL})`, 'g');\n  const CLOSE_ONLY = new RegExp(String.raw`(${LINK_URL})\\\\>`, 'g');\n\n  let s = markdown.replace(WRAPPED, '<$1>').replace(OPEN_ONLY, '<$1').replace(CLOSE_ONLY, '$1>');\n\n  // Restore [label](<url>) after htmlToMarkdown escaped a surrounding \"\\<...\\>\".\n  const ESCAPED_SUPPRESSED_MD_LINK = new RegExp(\n    String.raw`\\\\<\\[([^\\]]*)\\]\\((<https?:\\/\\/[^>\\s]+>)\\)\\\\>`,\n    'g'\n  );\n  s = s.replace(ESCAPED_SUPPRESSED_MD_LINK, '[$1]($2)');\n\n  // Same for \"\\<[label](bare-url)>\" when angle brackets were lost on the destination.\n  const WRONG_OUTER_ESCAPED_AUTOLINK = /\\\\<\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)(?:>|\\\\>)/g;\n  s = s.replace(WRONG_OUTER_ESCAPED_AUTOLINK, '[$1](<$2>)');\n\n  return s;\n}\n\nexport function readdAngleBracketsForHiddenPreviews(\n  body: string,\n  linkPreviews: BundleContent[] | undefined\n): string {\n  if (!linkPreviews) return body;\n\n  const previewed = new Set(linkPreviews.map((b) => b.matched_url));\n\n  LINKINPUTREGEX.lastIndex = 0;\n  return body.replace(LINKINPUTREGEX, (...args: unknown[]) => {\n    const full = args[0] as string;\n    const url = args[args.length - 3] as string;\n    const offset = args[args.length - 2] as number;\n    if (!url || previewed.has(url)) return full;\n\n    // matrix.to permalinks are never preview-suppressed (mentions, event links, room links).\n    if (testMatrixTo(url)) return full;\n\n    const urlIndex = body.indexOf(url, offset);\n\n    // URL is the label of a markdown link [url](...) — do not insert \"<\" into the label.\n    const after = body.slice(offset + full.length, offset + full.length + 2);\n    if (after === '](') {\n      return full;\n    }\n\n    // Already a preview-suppressed destination ...](<https://...>)\n    if (offset >= 3 && body.slice(offset - 3, offset) === '](<') {\n      return full;\n    }\n\n    // If the URL is already wrapped as <url>, leave it alone.\n    if (urlIndex !== -1 && body.slice(urlIndex - 1, urlIndex + url.length + 1) === `<${url}>`) {\n      return full;\n    }\n\n    // Keep any surrounding parens emitted by LINKINPUTREGEX.\n    if (full.startsWith('(') && full.endsWith(')')) return `(<${url}>)`;\n    if (full.startsWith('(')) return `(<${url}`;\n    if (full.endsWith(')')) return `<${url}>)`;\n\n    return `<${url}>`;\n  });\n}\n","import type { KeyboardEventHandler, MouseEventHandler, ReactNode } from 'react';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useAtomValue } from 'jotai';\nimport type { RectCords } from 'folds';\nimport { Box, Chip, IconButton, OverlayBackdrop, Spinner, Text, as, config } from 'folds';\nimport { Overlay, PopOut } from '$components/overlay-stack';\nimport { composerIcon, Smiley } from '$components/icons/phosphor';\nimport type {\n  IContent,\n  IMentions,\n  MatrixEvent,\n  Room,\n  RoomMessageEventContent,\n  RoomMessageTextEventContent,\n} from '$types/matrix-sdk';\nimport { MsgType } from '$types/matrix-sdk';\nimport { isKeyHotkey } from 'is-hotkey';\nimport type { EditorDocument } from '$components/editor/model';\nimport {\n  AutocompletePrefix,\n  useAutocompleteQuery,\n  CustomEditor,\n  EmoticonAutocomplete,\n  MarkdownFormattingToolbarBottom,\n  MarkdownFormattingToolbarToggle,\n  RoomMentionAutocomplete,\n  UserMentionAutocomplete,\n  createEmoticonElement,\n  customHtmlEqualsPlainText,\n  plainToEditorInput,\n  toMatrixCustomHTML,\n  toPlainText,\n  trimCustomHtml,\n  useEditor,\n  getMentions,\n  ANYWHERE_AUTOCOMPLETE_PREFIXES,\n  getDocumentLinks,\n  LINKINPUTREGEX,\n} from '$components/editor';\nimport { htmlToMarkdown } from '$plugins/markdown';\nimport { useSetting } from '$state/hooks/settings';\nimport { CaptionPosition, settingsAtom } from '$state/settings';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { EmojiBoard } from '$components/emoji-board';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useDismissOnBack } from '$utils/androidBack';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { getEditedEvent, getMentionContent } from '$utils/room/relations';\nimport { trimReplyFromFormattedBody } from '$utils/room/display';\nimport { buildReplacementContent } from '../buildReplacementContent';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { useComposingCheck } from '$hooks/useComposingCheck';\nimport { floatingEditor } from '$styles/overrides/Composer.css';\nimport { RenderMessageContent } from '$components/RenderMessageContent';\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport { getReactCustomHtmlParser, LINKIFY_OPTS } from '$plugins/react-custom-html-parser';\nimport { testMatrixTo } from '$plugins/matrix-to';\nimport { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport type { Opts as LinkifyOpts } from 'linkifyjs';\nimport type { GetContentCallback } from '$types/matrix/room';\nimport type { BundleContent } from '$components/message';\nimport {\n  readdAngleBracketsForHiddenPreviews,\n  stripMarkdownEscapesForHiddenPreviews,\n} from './hiddenLinkPreviews';\nimport { stripPerMessageProfileFormattedBody } from '$hooks/usePerMessageProfile';\n\n// Wraps the mobile emoji-board overlay so the Android back action closes it\n// instead of navigating away. Hooks can't run inside the UseStateProvider\n// render-prop below, so this component holds the back handler.\nfunction MobileEmojiOverlay({\n  open,\n  onClose,\n  children,\n}: {\n  open: boolean;\n  onClose: () => void;\n  children: ReactNode;\n}) {\n  useDismissOnBack(onClose, open);\n  return (\n    <Overlay open={open} backdrop={<OverlayBackdrop />}>\n      <div\n        style={{\n          position: 'fixed',\n          left: 0,\n          right: 0,\n          bottom: 0,\n          display: 'flex',\n          justifyContent: 'center',\n        }}\n      >\n        {children}\n      </div>\n    </Overlay>\n  );\n}\n\ntype MessageEditorProps = {\n  roomId: string;\n  room: Room;\n  mEvent: MatrixEvent;\n  imagePackRooms?: Room[];\n  onCancel: () => void;\n};\nexport const MessageEditor = as<'div', MessageEditorProps>(\n  ({ room, roomId, mEvent, imagePackRooms, onCancel, ...props }, ref) => {\n    const mx = useMatrixClient();\n    const nicknames = useAtomValue(nicknamesAtom);\n    const editor = useEditor();\n    const [enterForNewline] = useSetting(settingsAtom, 'enterForNewline');\n    const [pmpNoFallback] = useSetting(settingsAtom, 'pmpNoFallback');\n    const isComposing = useComposingCheck();\n\n    const [autocompleteQuery, setAutocompleteQuery, handleCloseAutocomplete] =\n      useAutocompleteQuery(editor);\n\n    const getPrevBodyAndFormattedBody = useCallback((): [\n      string | undefined,\n      string | undefined,\n      IMentions | undefined,\n    ] => {\n      const evtId = mEvent.getId();\n      if (!evtId) return [undefined, undefined, undefined];\n      const evtTimeline = room.getTimelineForEvent(evtId);\n      const editedEvent =\n        evtTimeline && getEditedEvent(evtId, mEvent, evtTimeline.getTimelineSet());\n\n      const content: IContent = editedEvent?.getContent()['m.new_content'] ?? mEvent.getContent();\n      let { body, formatted_body: customHtml }: Record<string, unknown> = content;\n      const mMentions: IMentions | undefined = content['m.mentions'];\n\n      const rawPmp = content['com.beeper.per_message_profile'];\n      const pmpDisplayname =\n        rawPmp !== null &&\n        typeof rawPmp === 'object' &&\n        'displayname' in rawPmp &&\n        typeof rawPmp.displayname === 'string' &&\n        rawPmp.displayname.length > 0\n          ? (rawPmp.displayname as string)\n          : undefined;\n\n      if (pmpDisplayname && typeof body === 'string') {\n        const bodyPrefix = `${pmpDisplayname}: `;\n        if (body.startsWith(bodyPrefix)) {\n          body = body.slice(bodyPrefix.length);\n        }\n      }\n\n      if (pmpDisplayname && typeof customHtml === 'string') {\n        customHtml = stripPerMessageProfileFormattedBody(customHtml);\n      }\n\n      const bundleContent =\n        (content['com.beeper.linkpreviews'] as BundleContent[] | undefined) ?? [];\n      const markHiddenLinks = (original: string, isHTML?: boolean) => {\n        if (!isHTML) {\n          return readdAngleBracketsForHiddenPreviews(original, bundleContent);\n        }\n        /* Split according to the following fule:\n              - if its not HTML just break it by spaces, newLines, and parans\n              - if it is HTML \n                - break it before before any potential opening tag\n                - break it whenever a <a> tag starts\n                - break it after a closing </a> tag\n                - then for every non <a> portion find regular links as though it is plaintext\n                  * this is not recursive but needs flattening              \n         */\n        const splitBody = original.split(/(?=^.+<)|(?=<a.+)|(?<=\\/a>)|(?=<code.+)|(?<=\\/code>)/gi);\n        let newBody = '';\n        splitBody\n          .map((item) => (item.startsWith('<a') ? [item] : item.split(/(?=[ \\n()])/g)))\n          .reduce((acc, current) => acc.concat(current), [])\n          .map((s) => {\n            // the length is from the fact that a link is necessarily longer than 6\n            if (s.length < 6 || s.startsWith('<code') || s.endsWith('code>')) {\n              newBody += s;\n              return;\n            }\n            // since the way that the match works the key is at the start of the string,\n            // it needs to be separated such that it can be reintroduced before the < in case of regular text\n            // or after it in case that it is matching a <a> tag\n            const strippedS = s.substring(1);\n            const matrixToAnchorHref =\n              isHTML && s.toLowerCase().startsWith('<a')\n                ? s.match(/href\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1]\n                : undefined;\n            const urlFromChunk = strippedS.match(/https?:\\/\\/[^\\s)]+/)?.[0];\n            const isMatrixToPermalink = testMatrixTo(matrixToAnchorHref ?? urlFromChunk ?? '');\n            const isHidden =\n              !isMatrixToPermalink &&\n              (bundleContent?.length === 0 ||\n                bundleContent.filter((b) => s.includes(b.matched_url)).length === 0) &&\n              strippedS.match(LINKINPUTREGEX) !== null;\n\n            // Wrap whole <a>…</a> as &lt;…&gt; once; duplicating the leading \"<\" breaks htmlToMarkdown's [<][a][>] detection.\n            if (isHidden && isHTML && s.toLowerCase().startsWith('<a')) {\n              newBody += `&lt;${s}&gt;`;\n              return;\n            }\n\n            newBody += `${isHidden ? (isHTML && `${s[0]}&lt;`) || `${s[0]}<` : s[0]}${strippedS}${isHidden ? (isHTML && '&gt;') || '>' : ''}`;\n          });\n        return newBody;\n      };\n\n      return [\n        typeof body === 'string' ? markHiddenLinks(body) : undefined,\n        typeof customHtml === 'string' ? markHiddenLinks(customHtml, true) : undefined,\n        mMentions,\n      ];\n    }, [room, mEvent]);\n\n    const [saveState, save] = useAsyncCallback(\n      useCallback(async () => {\n        const oldContent = mEvent.getContent();\n        const msgtype = mEvent.getContent().msgtype as RoomMessageTextEventContent['msgtype'];\n        let plainText = toPlainText(editor.children as EditorDocument).trim();\n        let customHtml = trimCustomHtml(\n          toMatrixCustomHTML(editor.children as EditorDocument, {\n            forEmote: msgtype === MsgType.Emote,\n            room,\n          })\n        );\n\n        const [prevBody, prevCustomHtml, prevMentions] = getPrevBodyAndFormattedBody();\n\n        if (plainText === '') return undefined;\n        const eventId = mEvent.getId();\n        if (!eventId) return undefined;\n\n        if (prevBody) {\n          if (prevCustomHtml && trimReplyFromFormattedBody(prevCustomHtml) === customHtml) {\n            return undefined;\n          }\n          if (\n            !prevCustomHtml &&\n            prevBody === plainText &&\n            customHtmlEqualsPlainText(customHtml, plainText)\n          ) {\n            return undefined;\n          }\n        }\n\n        const evtId = mEvent.getId();\n        const evtTimeline = evtId ? room.getTimelineForEvent(evtId) : undefined;\n        const editedEvent =\n          evtTimeline && evtId\n            ? getEditedEvent(evtId, mEvent, evtTimeline.getTimelineSet())\n            : undefined;\n\n        const rawPmp =\n          editedEvent?.getContent()?.['m.new_content']?.['com.beeper.per_message_profile'] ??\n          mEvent.getContent()?.['com.beeper.per_message_profile'];\n\n        const mentionData = getMentions(mx, roomId, {\n          children: editor.children as EditorDocument,\n        });\n\n        prevMentions?.user_ids?.forEach((prevMentionId) => {\n          mentionData.users.add(prevMentionId);\n        });\n\n        const mMentions = getMentionContent(Array.from(mentionData.users), mentionData.room);\n\n        const linkPreviews =\n          getDocumentLinks(editor.children as EditorDocument)?.map((matchedUrl) => ({\n            matched_url: matchedUrl,\n          })) ?? [];\n\n        const content = buildReplacementContent(\n          oldContent,\n          plainText,\n          customHtml,\n          eventId,\n          mMentions,\n          linkPreviews,\n          rawPmp,\n          pmpNoFallback\n        );\n\n        return mx.sendMessage(roomId, content as RoomMessageEventContent);\n      }, [mx, editor, roomId, mEvent, getPrevBodyAndFormattedBody, room, pmpNoFallback])\n    );\n\n    const handleSave = useCallback(() => {\n      if (saveState.status !== AsyncStatus.Loading) {\n        save();\n      }\n    }, [saveState, save]);\n\n    const suppressBlurRefocusRef = useRef(false);\n    const suppressEditorRefocus = useCallback(() => {\n      suppressBlurRefocusRef.current = true;\n      requestAnimationFrame(() => {\n        suppressBlurRefocusRef.current = false;\n      });\n    }, []);\n\n    const handleKeyDown: KeyboardEventHandler = useCallback(\n      (evt) => {\n        if (\n          (isKeyHotkey('mod+enter', evt) || (!enterForNewline && isKeyHotkey('enter', evt))) &&\n          !isComposing(evt)\n        ) {\n          if (editor.getAutocompleteQuery(ANYWHERE_AUTOCOMPLETE_PREFIXES)) return;\n\n          evt.preventDefault();\n          handleSave();\n        }\n        if (isKeyHotkey('escape', evt)) {\n          evt.preventDefault();\n          onCancel();\n        }\n      },\n      [enterForNewline, isComposing, editor, handleSave, onCancel]\n    );\n\n    const detectAutocomplete = useCallback(() => {\n      setAutocompleteQuery(editor.getAutocompleteQuery(ANYWHERE_AUTOCOMPLETE_PREFIXES));\n    }, [editor, setAutocompleteQuery]);\n\n    const handleKeyUp: KeyboardEventHandler = useCallback(\n      (evt) => {\n        if (isKeyHotkey('escape', evt)) {\n          evt.preventDefault();\n          return;\n        }\n\n        detectAutocomplete();\n      },\n      [detectAutocomplete]\n    );\n\n    const handleEmoticonSelect = (key: string, shortcode: string) => {\n      editor.insertInline(createEmoticonElement(key, shortcode));\n      editor.insertText(' ');\n    };\n\n    useEffect(() => {\n      const [body, customHtml] = getPrevBodyAndFormattedBody();\n\n      const mentionOptions = {\n        room,\n        nicknames,\n        mxUserId: mx.getUserId() ?? undefined,\n      };\n      const initialValue = plainToEditorInput(\n        customHtml\n          ? stripMarkdownEscapesForHiddenPreviews(htmlToMarkdown(customHtml))\n          : typeof body === 'string'\n            ? stripMarkdownEscapesForHiddenPreviews(body)\n            : '',\n        mentionOptions\n      );\n\n      editor.setDocument(initialValue);\n      if (!isMobileOrTablet()) editor.focus();\n    }, [editor, getPrevBodyAndFormattedBody, room, nicknames, mx]);\n\n    useEffect(() => {\n      if (saveState.status === AsyncStatus.Success) {\n        onCancel();\n      }\n    }, [saveState, onCancel]);\n\n    const useAuthentication = useMediaAuthentication();\n    const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n    const linkifyOpts = useMemo<LinkifyOpts>(() => ({ ...LINKIFY_OPTS }), []);\n    const spoilerClickHandler = useSpoilerClickHandler();\n    const [incomingInlineImagesDefaultHeight] = useSetting(\n      settingsAtom,\n      'incomingInlineImagesDefaultHeight'\n    );\n    const [incomingInlineImagesMaxHeight] = useSetting(\n      settingsAtom,\n      'incomingInlineImagesMaxHeight'\n    );\n    const htmlReactParserOptions = useMemo<HTMLReactParserOptions>(\n      () =>\n        getReactCustomHtmlParser(mx, mEvent.getRoomId(), {\n          settingsLinkBaseUrl,\n          linkifyOpts,\n          useAuthentication,\n          handleSpoilerClick: spoilerClickHandler,\n          incomingInlineImagesDefaultHeight,\n          incomingInlineImagesMaxHeight,\n        }),\n      [\n        linkifyOpts,\n        mEvent,\n        mx,\n        settingsLinkBaseUrl,\n        spoilerClickHandler,\n        useAuthentication,\n        incomingInlineImagesDefaultHeight,\n        incomingInlineImagesMaxHeight,\n      ]\n    );\n    const getContent = (() => mEvent.getContent()) as GetContentCallback;\n    const msgType = mEvent.getContent().msgtype;\n    const [captionPosition] = useSetting(settingsAtom, 'captionPosition');\n    const captionPositionMap = {\n      [CaptionPosition.Above]: 'column-reverse',\n      [CaptionPosition.Below]: 'column',\n      [CaptionPosition.Inline]: 'row',\n      [CaptionPosition.Hidden]: 'row',\n    } satisfies Record<CaptionPosition, React.CSSProperties['flexDirection']>;\n    return (\n      <div {...props} ref={ref} className={`${props.className || ''} ${floatingEditor}`.trim()}>\n        {autocompleteQuery?.prefix === AutocompletePrefix.RoomMention && (\n          <RoomMentionAutocomplete\n            roomId={roomId}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n          />\n        )}\n        {autocompleteQuery?.prefix === AutocompletePrefix.UserMention && (\n          <UserMentionAutocomplete\n            room={room}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n          />\n        )}\n        {autocompleteQuery?.prefix === AutocompletePrefix.Emoticon && (\n          <EmoticonAutocomplete\n            imagePackRooms={imagePackRooms || []}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n          />\n        )}\n        <Box\n          style={{\n            display: 'flex',\n            flexDirection: captionPositionMap[captionPosition],\n          }}\n        >\n          {(msgType === MsgType.Image ||\n            msgType === MsgType.Video ||\n            msgType === MsgType.Audio ||\n            msgType === MsgType.File) && (\n            <RenderMessageContent\n              displayName={mEvent.sender?.name ?? ''}\n              msgType={mEvent.getContent().msgtype ?? ''}\n              ts={mEvent.getTs()}\n              getContent={getContent}\n              htmlReactParserOptions={htmlReactParserOptions}\n              hideCaption\n              linkifyOpts={linkifyOpts}\n              room={room}\n            />\n          )}\n          <Box\n            style={\n              captionPosition !== CaptionPosition.Inline\n                ? {\n                    marginTop:\n                      msgType === MsgType.Image ||\n                      msgType === MsgType.Video ||\n                      msgType === MsgType.Audio ||\n                      msgType === MsgType.File\n                        ? config.space.S400\n                        : undefined,\n                    width: '100%',\n                  }\n                : {\n                    padding: config.space.S200,\n                    wordBreak: 'break-word',\n                    maxWidth: '100%',\n                    width: '100%',\n                    display: 'flex',\n                    flexDirection: 'column',\n                    justifyContent: 'center',\n                    flexShrink: 1,\n                  }\n            }\n          >\n            <CustomEditor\n              editor={editor}\n              placeholder=\"Edit message...\"\n              suppressBlurRefocusRef={suppressBlurRefocusRef}\n              onKeyDown={handleKeyDown}\n              onKeyUp={handleKeyUp}\n              bottom={\n                <>\n                  <MarkdownFormattingToolbarBottom controller={editor} />\n                  <Box\n                    style={{ padding: config.space.S200, paddingTop: 0 }}\n                    alignItems=\"End\"\n                    justifyContent=\"SpaceBetween\"\n                    gap=\"100\"\n                  >\n                    <Box gap=\"Inherit\">\n                      <Chip\n                        onClick={handleSave}\n                        onPointerDown={suppressEditorRefocus}\n                        variant=\"Primary\"\n                        radii=\"Pill\"\n                        disabled={saveState.status === AsyncStatus.Loading}\n                        outlined\n                        before={\n                          saveState.status === AsyncStatus.Loading ? (\n                            <Spinner variant=\"Primary\" fill=\"Soft\" size=\"100\" />\n                          ) : undefined\n                        }\n                      >\n                        <Text size=\"B300\">Save</Text>\n                      </Chip>\n                      <Chip\n                        onClick={onCancel}\n                        onPointerDown={suppressEditorRefocus}\n                        variant=\"SurfaceVariant\"\n                        radii=\"Pill\"\n                      >\n                        <Text size=\"B300\">Cancel</Text>\n                      </Chip>\n                    </Box>\n                    <Box gap=\"Inherit\">\n                      <MarkdownFormattingToolbarToggle variant=\"SurfaceVariant\" />\n                      <UseStateProvider initial={undefined}>\n                        {(anchor: RectCords | undefined, setAnchor) => {\n                          const emojiBoard = (\n                            <EmojiBoard\n                              imagePackRooms={imagePackRooms ?? []}\n                              returnFocusOnDeactivate={false}\n                              isFullWidth={isMobileOrTablet()}\n                              onEmojiSelect={handleEmoticonSelect}\n                              onCustomEmojiSelect={handleEmoticonSelect}\n                              requestClose={() => {\n                                setAnchor((v) => {\n                                  if (v) {\n                                    if (!isMobileOrTablet()) editor.focus();\n                                    return undefined;\n                                  }\n                                  return v;\n                                });\n                              }}\n                            />\n                          );\n                          const trigger = (\n                            <IconButton\n                              aria-pressed={anchor !== undefined}\n                              onClick={\n                                ((evt) =>\n                                  setAnchor(\n                                    evt.currentTarget.getBoundingClientRect()\n                                  )) as MouseEventHandler<HTMLButtonElement>\n                              }\n                              onPointerDown={suppressEditorRefocus}\n                              variant=\"SurfaceVariant\"\n                              size=\"300\"\n                              radii=\"300\"\n                            >\n                              {composerIcon(Smiley, {\n                                weight: anchor !== undefined ? 'fill' : 'regular',\n                              })}\n                            </IconButton>\n                          );\n                          if (isMobileOrTablet()) {\n                            return (\n                              <>\n                                {trigger}\n                                <MobileEmojiOverlay\n                                  open={anchor !== undefined}\n                                  onClose={() => setAnchor(undefined)}\n                                >\n                                  {emojiBoard}\n                                </MobileEmojiOverlay>\n                              </>\n                            );\n                          }\n                          return (\n                            <PopOut\n                              anchor={anchor}\n                              alignOffset={-8}\n                              position=\"Top\"\n                              align=\"End\"\n                              content={emojiBoard}\n                            >\n                              {trigger}\n                            </PopOut>\n                          );\n                        }}\n                      </UseStateProvider>\n                    </Box>\n                  </Box>\n                </>\n              }\n            />\n          </Box>\n        </Box>\n      </div>\n    );\n  }\n);\n","import type { FormEventHandler, MouseEvent } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport type { Room, MatrixEvent } from '$types/matrix-sdk';\nimport { useSetAtom } from 'jotai';\nimport {\n  Box,\n  Dialog,\n  Header,\n  IconButton,\n  Text,\n  Input,\n  Button,\n  Spinner,\n  MenuItem,\n  config,\n  color,\n} from 'folds';\nimport { menuIcon, Warning, X } from '$components/icons/phosphor';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport * as css from '$features/room/message/styles.css';\nimport { modalAtom, ModalType } from '$state/modal';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport * as Sentry from '@sentry/react';\n\nconst debugLog = createDebugLogger('MessageReport');\n\nexport function MessageReportItem({\n  room,\n  mEvent,\n  closeMenu,\n}: {\n  room: Room;\n  mEvent: MatrixEvent;\n  closeMenu?: () => void;\n}) {\n  const setModal = useSetAtom(modalAtom);\n\n  return (\n    <MenuItem\n      size=\"300\"\n      variant=\"Critical\"\n      fill=\"None\"\n      after={menuIcon(Warning)}\n      radii=\"300\"\n      onClick={(e: MouseEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n        setModal({\n          type: ModalType.Report,\n          room,\n          mEvent,\n        });\n        closeMenu?.();\n      }}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        Report\n      </Text>\n    </MenuItem>\n  );\n}\n\ntype MessageReportInternalProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  onClose: () => void;\n};\n\nexport function MessageReportInternal({ room, mEvent, onClose }: MessageReportInternalProps) {\n  const mx = useMatrixClient();\n\n  const [reportState, reportMessage] = useAsyncCallback(\n    useCallback(\n      (eventId: string, score: number, reason: string) =>\n        mx.reportEvent(room.roomId, eventId, score, reason),\n      [mx, room]\n    )\n  );\n\n  useEffect(() => {\n    if (reportState.status === AsyncStatus.Success) {\n      debugLog.info('ui', 'Message reported successfully', { roomId: room.roomId });\n      Sentry.metrics.count('sable.message.report.success', 1);\n    }\n    if (reportState.status === AsyncStatus.Error) {\n      debugLog.error('ui', 'Message report failed', { roomId: room.roomId });\n      Sentry.metrics.count('sable.message.report.error', 1);\n    }\n  }, [reportState.status, room.roomId]);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    const eventId = mEvent.getId();\n    if (\n      !eventId ||\n      reportState.status === AsyncStatus.Loading ||\n      reportState.status === AsyncStatus.Success\n    )\n      return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const reasonInput = target?.reasonInput as HTMLInputElement | undefined;\n    const reason = reasonInput && reasonInput.value.trim();\n\n    debugLog.info('ui', 'Reporting message', { eventId, hasReason: !!reason });\n    Sentry.metrics.count('sable.message.report.attempt', 1);\n    reportMessage(eventId, reason ? -100 : -50, reason || 'No reason provided');\n  };\n\n  return (\n    <Dialog variant=\"Surface\">\n      <Header\n        style={{\n          padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n          borderBottomWidth: config.borderWidth.B300,\n        }}\n        variant=\"Surface\"\n        size=\"500\"\n      >\n        <Box grow=\"Yes\">\n          <Text size=\"H4\">Report Message</Text>\n        </Box>\n        <IconButton size=\"300\" onClick={onClose} radii=\"300\">\n          {menuIcon(X)}\n        </IconButton>\n      </Header>\n      <Box\n        as=\"form\"\n        onSubmit={handleSubmit}\n        style={{ padding: config.space.S400 }}\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <Text priority=\"400\">\n          Report this message to the server, which may then notify the appropriate people to take\n          action.\n        </Text>\n        <Box direction=\"Column\" gap=\"100\">\n          <Text size=\"L400\">Reason</Text>\n          <Input name=\"reasonInput\" variant=\"Background\" required />\n\n          {reportState.status === AsyncStatus.Error && (\n            <Text style={{ color: color.Critical.Main }} size=\"T300\">\n              Failed to report message! Please try again.\n            </Text>\n          )}\n          {reportState.status === AsyncStatus.Success && (\n            <Text style={{ color: color.Success.Main }} size=\"T300\">\n              Message has been reported to server.\n            </Text>\n          )}\n        </Box>\n        <Button\n          type=\"submit\"\n          variant=\"Critical\"\n          before={\n            reportState.status === AsyncStatus.Loading ? (\n              <Spinner variant=\"Secondary\" size=\"200\" style={{ backgroundColor: 'transparent' }} />\n            ) : undefined\n          }\n          aria-disabled={\n            reportState.status === AsyncStatus.Loading || reportState.status === AsyncStatus.Success\n          }\n        >\n          <Text size=\"B400\">\n            {reportState.status === AsyncStatus.Loading ? 'Reporting...' : 'Report'}\n          </Text>\n        </Button>\n      </Box>\n    </Dialog>\n  );\n}\n","import type { MouseEvent } from 'react';\nimport type { Room, Relations } from '$types/matrix-sdk';\nimport { useSetAtom } from 'jotai';\nimport { Text, MenuItem } from 'folds';\nimport { menuIcon, Smiley } from '$components/icons/phosphor';\nimport { modalAtom, ModalType } from '$state/modal';\nimport * as css from '$features/room/message/styles.css';\nimport { ReactionViewer } from '$features/room/reaction-viewer';\n\nexport function MessageAllReactionItem({\n  room,\n  relations,\n  closeMenu,\n}: {\n  room: Room;\n  relations: Relations;\n  closeMenu: () => void;\n}) {\n  const setModal = useSetAtom(modalAtom);\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(Smiley)}\n      radii=\"300\"\n      onClick={(e: MouseEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n        closeMenu();\n        setModal({\n          type: ModalType.Reactions,\n          room,\n          relations,\n        });\n      }}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        View Reactions\n      </Text>\n    </MenuItem>\n  );\n}\n\ntype MessageAllReactionInternalProps = {\n  room: Room;\n  relations: Relations;\n  onClose: () => void;\n};\n\nexport function MessageAllReactionInternal({\n  room,\n  relations,\n  onClose,\n}: MessageAllReactionInternalProps) {\n  return <ReactionViewer room={room} relations={relations} requestClose={onClose} />;\n}\n","import type { Room, RoomEventHandlerMap } from '$types/matrix-sdk';\nimport { RoomEvent } from '$types/matrix-sdk';\nimport { useEffect, useState } from 'react';\n\nconst getEventReaders = (room: Room, evtId?: string) => {\n  if (!evtId) return [];\n\n  // if eventId is locally generated\n  // we don't have read receipt for it yet\n  if (!evtId.startsWith('$')) return [];\n\n  const liveEvents = room.getLiveTimeline().getEvents();\n  const userIds: string[] = [];\n\n  for (let i = liveEvents.length - 1; i >= 0; i -= 1) {\n    const evt = liveEvents[i];\n    if (!evt) continue;\n    userIds.splice(userIds.length, 0, ...room.getUsersReadUpTo(evt));\n    if (evt.getId() === evtId) break;\n  }\n\n  return [...new Set(userIds)];\n};\n\nexport const useRoomEventReaders = (room: Room, eventId?: string): string[] => {\n  const [readers, setReaders] = useState<string[]>(() => getEventReaders(room, eventId));\n  useEffect(() => {\n    setReaders(getEventReaders(room, eventId));\n\n    const handleReceipt: RoomEventHandlerMap[RoomEvent.Receipt] = (event, r) => {\n      if (r.roomId !== room.roomId) return;\n      setReaders(getEventReaders(room, eventId));\n    };\n\n    const handleLocalEcho: RoomEventHandlerMap[RoomEvent.LocalEchoUpdated] = (\n      event,\n      r,\n      oldEventId\n    ) => {\n      // update members on local event id replaced\n      // with server generated id\n      if (r.roomId !== room.roomId || !oldEventId) return;\n      if (oldEventId.startsWith('$')) return;\n      if (oldEventId !== eventId) return;\n\n      setReaders(getEventReaders(room, event.getId()));\n    };\n\n    room.on(RoomEvent.Receipt, handleReceipt);\n    room.on(RoomEvent.LocalEchoUpdated, handleLocalEcho);\n\n    return () => {\n      room.removeListener(RoomEvent.Receipt, handleReceipt);\n      room.removeListener(RoomEvent.LocalEchoUpdated, handleLocalEcho);\n    };\n  }, [room, eventId]);\n\n  return readers;\n};\n","import classNames from 'classnames';\nimport { useEffect, useState } from 'react';\nimport { Avatar, Box, Header, IconButton, MenuItem, Scroll, Text, as, config } from 'folds';\nimport type { Room } from '$types/matrix-sdk';\nimport { useRoomEventReaders } from '$hooks/useRoomEventReaders';\nimport { getAvatarUrl, getMemberDisplayName } from '$utils/room/display';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { getMouseEventCords } from '$utils/dom';\nimport { useAtomValue } from 'jotai';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport { hydrateRoomMembers } from '$client/roomMemberHydration';\nimport { UserAvatar } from '$components/user-avatar';\nimport { composerIcon, userFallbackIcon, X } from '$components/icons/phosphor';\nimport * as css from './EventReaders.css';\n\ntype EventReadersProps = {\n  room: Room;\n  eventId: string;\n  requestClose: () => void;\n};\nexport const EventReaders = as<'div', EventReadersProps>(\n  ({ className, room, eventId, requestClose, ...props }, ref) => {\n    const mx = useMatrixClient();\n    const useAuthentication = useMediaAuthentication();\n    const latestEventReaders = useRoomEventReaders(room, eventId);\n    const openProfile = useOpenUserRoomProfile();\n    const space = useSpaceOptionally();\n    const nicknames = useAtomValue(nicknamesAtom);\n    const cachedProfiles = useAtomValue(profilesCacheAtom);\n    const [, forceUpdate] = useState(0);\n\n    useEffect(() => {\n      let disposed = false;\n      const unknownUserIds = latestEventReaders.filter(\n        (readerId) => readerId && !room.getMember(readerId)\n      );\n      if (unknownUserIds.length > 0) {\n        hydrateRoomMembers(mx, room.roomId, unknownUserIds).then(() => {\n          if (!disposed) forceUpdate((n) => n + 1);\n        });\n      }\n      return () => {\n        disposed = true;\n      };\n    }, [mx, room, latestEventReaders]);\n\n    const getName = (userId: string) =>\n      getMemberDisplayName(room, userId, nicknames) ??\n      cachedProfiles[userId]?.displayName ??\n      getMxIdLocalPart(userId) ??\n      userId;\n\n    return (\n      <Box\n        className={classNames(css.EventReaders, className)}\n        direction=\"Column\"\n        {...props}\n        ref={ref}\n      >\n        <Header className={css.Header} variant=\"Surface\" size=\"600\">\n          <Box grow=\"Yes\">\n            <Text size=\"H3\">Seen by</Text>\n          </Box>\n          <IconButton size=\"300\" onClick={requestClose}>\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        <Box grow=\"Yes\" style={{ width: '100%', minWidth: 0 }}>\n          <Box\n            grow=\"Yes\"\n            className={css.Content}\n            direction=\"Column\"\n            style={{ width: '100%', minWidth: 0 }}\n          >\n            <Scroll visibility=\"Hover\" hideTrack size=\"300\" style={{ width: '100%' }}>\n              {latestEventReaders.map((readerId) => {\n                const name = getName(readerId);\n                const avatarMxcUrl = room.getMember(readerId)?.getMxcAvatarUrl();\n                const avatarUrl = getAvatarUrl(mx, avatarMxcUrl, 100, useAuthentication);\n\n                return (\n                  <MenuItem\n                    key={readerId}\n                    style={{ padding: `0 ${config.space.S200}`, width: '100%' }}\n                    radii=\"400\"\n                    onClick={(event) => {\n                      openProfile(\n                        room.roomId,\n                        space?.roomId,\n                        readerId,\n                        undefined,\n                        getMouseEventCords(event.nativeEvent),\n                        'Bottom'\n                      );\n                    }}\n                    before={\n                      <Avatar size=\"200\">\n                        <UserAvatar\n                          userId={readerId}\n                          src={avatarUrl ?? undefined}\n                          alt={name}\n                          renderFallback={() => userFallbackIcon('sm')}\n                        />\n                      </Avatar>\n                    }\n                  >\n                    <Text size=\"T400\" truncate>\n                      {name}\n                    </Text>\n                  </MenuItem>\n                );\n              })}\n            </Scroll>\n          </Box>\n        </Box>\n      </Box>\n    );\n  }\n);\n","import type { MouseEvent } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport { useSetAtom } from 'jotai';\nimport { MenuItem, Text } from 'folds';\nimport { Checks, menuIcon } from '$components/icons/phosphor';\nimport { modalAtom, ModalType } from '$state/modal';\nimport { EventReaders } from '$components/event-readers';\nimport * as css from '$features/room/message/styles.css';\n\nexport function MessageReadReceiptItem({\n  room,\n  eventId,\n  closeMenu,\n}: {\n  room: Room;\n  eventId: string;\n  closeMenu?: () => void;\n}) {\n  const setModal = useSetAtom(modalAtom);\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(Checks)}\n      radii=\"300\"\n      onClick={(e: MouseEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n        setModal({\n          type: ModalType.ReadReceipts,\n          room,\n          eventId,\n        });\n        closeMenu?.();\n      }}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        Read Receipts\n      </Text>\n    </MenuItem>\n  );\n}\n\ntype MessageReadReceiptInternalProps = {\n  room: Room;\n  eventId: string;\n  onClose: () => void;\n};\n\nexport function MessageReadReceiptInternal({\n  room,\n  eventId,\n  onClose,\n}: MessageReadReceiptInternalProps) {\n  return <EventReaders room={room} eventId={eventId} requestClose={onClose} />;\n}\n","import type { PackContent } from '$plugins/custom-emoji';\nimport { ImageUsage } from '$plugins/custom-emoji';\n\nimport type { IImageInfo } from '$types/matrix/common';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\n\n// Utility function to add a sticker to the default sticker pack\n// For now this only works for unencrypted stickers\nexport async function addStickerToDefaultPack(\n  mx: MatrixClient,\n  shortcode: string,\n  mxc: string,\n  body?: string,\n  info?: IImageInfo\n) {\n  // current content of the default sticker pack, which is stored in account data under the key 'PoniesUserEmotes'\n  const current =\n    mx.getAccountData(CustomAccountDataEvent.PoniesUserEmotes)?.getContent<PackContent>() ?? {};\n\n  // modified content with the new sticker added.\n  // We add the new sticker under the \"images\" key, using the shortcode as the key for the sticker.\n  // The sticker content includes the mxc URL, body, info, and usage (which we set to \"sticker\").\n  const next: PackContent = {\n    ...current,\n    images: {\n      ...current.images,\n      [shortcode]: {\n        ...current.images?.[shortcode],\n        url: mxc,\n        body,\n        info,\n        usage: [ImageUsage.Sticker],\n      },\n    },\n  };\n\n  // update the account data with the modified content, which effectively adds the new sticker to the default sticker pack.\n  await mx.setAccountData(CustomAccountDataEvent.PoniesUserEmotes, next);\n}\n\n// check if a sticker exists in the account sticker pack\nexport function doesStickerExistInDefaultPack(mx: MatrixClient, mxc: string) {\n  const imgs = mx\n    .getAccountData(CustomAccountDataEvent.PoniesUserEmotes)\n    ?.getContent<PackContent>().images;\n  if (imgs === undefined) return false;\n  return Object.values(imgs).some((image) => image.url === mxc) ?? false;\n}\n","import { atom, useAtom } from 'jotai';\nimport { atomFamily } from 'jotai/utils';\nimport type { MatrixClient, UploadResponse, UploadProgress, MatrixError } from '$types/matrix-sdk';\nimport { useCallback } from 'react';\nimport { useThrottle } from '$hooks/useThrottle';\nimport type { TUploadContent } from '$utils/matrix';\nimport { cancelUploadContent, uploadContent } from '$utils/matrix';\n\nexport enum UploadStatus {\n  Idle = 'idle',\n  Loading = 'loading',\n  Success = 'success',\n  Error = 'error',\n}\n\nexport type UploadIdle = {\n  file: TUploadContent;\n  status: UploadStatus.Idle;\n};\n\nexport type UploadLoading = {\n  file: TUploadContent;\n  status: UploadStatus.Loading;\n  promise: Promise<UploadResponse>;\n  progress: UploadProgress;\n};\n\nexport type UploadSuccess = {\n  file: TUploadContent;\n  status: UploadStatus.Success;\n  mxc: string;\n};\n\nexport type UploadError = {\n  file: TUploadContent;\n  status: UploadStatus.Error;\n  error: MatrixError;\n};\n\nexport type Upload = UploadIdle | UploadLoading | UploadSuccess | UploadError;\n\ntype UploadAtomAction =\n  | {\n      promise: Promise<UploadResponse>;\n    }\n  | {\n      progress: UploadProgress;\n    }\n  | {\n      mxc: string;\n    }\n  | {\n      error: MatrixError;\n    };\n\nexport const createUploadAtom = (file: TUploadContent) => {\n  const baseUploadAtom = atom<Upload>({\n    file,\n    status: UploadStatus.Idle,\n  });\n  return atom<Upload, [UploadAtomAction], undefined>(\n    (get) => get(baseUploadAtom),\n    (get, set, update) => {\n      const uploadState = get(baseUploadAtom);\n      if ('promise' in update) {\n        set(baseUploadAtom, {\n          status: UploadStatus.Loading,\n          file,\n          promise: update.promise,\n          progress: { loaded: 0, total: file.size },\n        });\n        return;\n      }\n      if ('progress' in update && uploadState.status === UploadStatus.Loading) {\n        set(baseUploadAtom, {\n          ...uploadState,\n          progress: update.progress,\n        });\n        return;\n      }\n      if ('mxc' in update) {\n        set(baseUploadAtom, {\n          status: UploadStatus.Success,\n          file,\n          mxc: update.mxc,\n        });\n        return;\n      }\n      if ('error' in update) {\n        set(baseUploadAtom, {\n          status: UploadStatus.Error,\n          file,\n          error: update.error,\n        });\n      }\n    }\n  );\n};\nexport type TUploadAtom = ReturnType<typeof createUploadAtom>;\n\nexport const useBindUploadAtom = (\n  mx: MatrixClient,\n  uploadAtom: TUploadAtom,\n  hideFilename?: boolean\n) => {\n  const [upload, setUpload] = useAtom(uploadAtom);\n  const { file } = upload;\n\n  const handleProgress = useThrottle(\n    useCallback((progress: UploadProgress) => setUpload({ progress }), [setUpload]),\n    { immediate: true, wait: 200 }\n  );\n\n  const startUpload = useCallback(\n    () =>\n      uploadContent(mx, file, {\n        hideFilename,\n        onPromise: (promise: Promise<UploadResponse>) => setUpload({ promise }),\n        onProgress: handleProgress,\n        onSuccess: (mxc) => setUpload({ mxc }),\n        onError: (error) => setUpload({ error }),\n      }),\n    [mx, file, hideFilename, setUpload, handleProgress]\n  );\n\n  const cancelUpload = useCallback(() => {\n    if (upload.status === UploadStatus.Loading) {\n      cancelUploadContent(mx, upload.promise);\n    }\n  }, [mx, upload]);\n\n  return {\n    upload,\n    startUpload,\n    cancelUpload,\n  };\n};\n\nexport const createUploadAtomFamily = () =>\n  atomFamily<TUploadContent, TUploadAtom>(createUploadAtom);\nexport type TUploadAtomFamily = ReturnType<typeof createUploadAtomFamily>;\n\nexport const createUploadFamilyObserverAtom = (\n  uploadFamily: TUploadAtomFamily,\n  uploads: TUploadContent[]\n) => atom<Upload[]>((get) => uploads.map((upload) => get(uploadFamily(upload))));\nexport type TUploadFamilyObserverAtom = ReturnType<typeof createUploadFamilyObserverAtom>;\n","import { atom } from 'jotai';\nimport { atomFamily } from 'jotai/utils';\nimport type { EditorDocument } from '$components/editor/model';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport type { IEventRelation } from '$types/matrix-sdk';\nimport type { TUploadContent } from '$utils/matrix';\nimport { createUploadAtomFamily } from '$state/upload';\nimport { createListAtom } from '$state/list';\n\nexport type TUploadMetadata = {\n  markedAsSpoiler: boolean;\n  waveform?: number[];\n  audioDuration?: number;\n};\n\nexport type TUploadItem = {\n  file: TUploadContent;\n  originalFile: TUploadContent;\n  metadata: TUploadMetadata;\n  encInfo: EncryptedAttachmentInfo | undefined;\n  encrypting?: boolean;\n  body?: string;\n  format?: string;\n  formatted_body?: string;\n};\n\ntype TUploadListAtom = ReturnType<typeof createListAtom<TUploadItem>>;\n\nexport const roomIdToUploadItemsAtomFamily = atomFamily<string, TUploadListAtom>(createListAtom);\n\nexport const roomUploadAtomFamily = createUploadAtomFamily();\n\n// Room drafts are Sable documents, not a rendering-engine data structure.\nconst createMsgDraftAtom = () => atom<EditorDocument>([]);\ntype TMsgDraftAtom = ReturnType<typeof createMsgDraftAtom>;\nexport const roomIdToMsgDraftAtomFamily = atomFamily<string, TMsgDraftAtom>(() =>\n  createMsgDraftAtom()\n);\n\nexport type IReplyDraft = {\n  userId: string;\n  eventId: string;\n  body: string;\n  formattedBody?: string | undefined;\n  relation?: IEventRelation | undefined;\n};\nconst createReplyDraftAtom = () => atom<IReplyDraft | undefined>(undefined);\ntype TReplyDraftAtom = ReturnType<typeof createReplyDraftAtom>;\nexport const roomIdToReplyDraftAtomFamily = atomFamily<string, TReplyDraftAtom>(() =>\n  createReplyDraftAtom()\n);\n","import { atom } from 'jotai';\n\ntype ListAction<T> =\n  | {\n      type: 'PUT';\n      item: T | T[];\n    }\n  | {\n      type: 'REPLACE';\n      item: T;\n      replacement: T;\n    }\n  | {\n      type: 'DELETE';\n      item: T | T[];\n    };\n\nexport const createListAtom = <T>() => {\n  const baseListAtom = atom<T[]>([]);\n  return atom<T[], [ListAction<T>], undefined>(\n    (get) => get(baseListAtom),\n    (get, set, action) => {\n      const items = get(baseListAtom);\n      const newItems = Array.isArray(action.item) ? action.item : [action.item];\n      if (action.type === 'DELETE') {\n        set(\n          baseListAtom,\n          items.filter((item) => !newItems.includes(item))\n        );\n        return;\n      }\n      if (action.type === 'PUT') {\n        set(baseListAtom, [...items, ...newItems]);\n        return;\n      }\n      if (action.type === 'REPLACE') {\n        set(\n          baseListAtom,\n          items.map((item) => (item === action.item ? action.replacement : item))\n        );\n      }\n    }\n  );\n};\n","import classNames from 'classnames';\nimport {\n  Avatar,\n  Box,\n  Header,\n  IconButton,\n  Menu,\n  MenuItem,\n  Scroll,\n  Text,\n  as,\n  color,\n  config,\n} from 'folds';\nimport type { IContent, MatrixEvent, Room } from '$types/matrix-sdk';\nimport { getAvatarUrl, getMemberDisplayName } from '$utils/room/display';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { getMouseEventCords } from '$utils/dom';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { UserAvatar } from '$components/user-avatar';\nimport {\n  userFallbackIcon,\n  ArrowBendUpLeftIcon,\n  ChatTeardropDots,\n  composerIcon,\n  menuIcon,\n  Trash,\n  X,\n} from '$components/icons/phosphor';\nimport { RenderBody, Time } from '$components/message';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useCallback, useMemo, useState } from 'react';\nimport { getReactCustomHtmlParser, LINKIFY_OPTS } from '$plugins/react-custom-html-parser';\nimport type { Opts as LinkifyOpts } from 'linkifyjs';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler';\nimport { modalAtom, ModalType } from '$state/modal';\nimport { roomIdToReplyDraftAtomFamily } from '$state/room/roomInputDrafts';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { usePowerLevelsContext } from '$hooks/usePowerLevels';\n\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport * as css from './EventHistory.css';\nimport { EventType, RelationType } from '$types/matrix-sdk';\n\ntype EventHistoryProps = {\n  room: Room;\n  mEvents: MatrixEvent[];\n  requestClose: () => void;\n};\nexport const EventHistory = as<'div', EventHistoryProps>(\n  ({ className, room, mEvents, requestClose, ...props }, ref) => {\n    const mx = useMatrixClient();\n    const useAuthentication = useMediaAuthentication();\n    const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n    const openProfile = useOpenUserRoomProfile();\n    const space = useSpaceOptionally();\n    const nicknames = useAtomValue(nicknamesAtom);\n\n    const getName = (userId: string) =>\n      getMemberDisplayName(room, userId, nicknames) ?? getMxIdLocalPart(userId) ?? userId;\n\n    const readerId = mEvents[0]?.event.sender ?? '';\n    const name = getName(readerId ?? '');\n    const avatarMxcUrl = room.getMember(readerId ?? '')?.getMxcAvatarUrl();\n    const avatarUrl = getAvatarUrl(mx, avatarMxcUrl, 100, useAuthentication);\n\n    const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n    const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n\n    const linkifyOpts = useMemo<LinkifyOpts>(() => ({ ...LINKIFY_OPTS }), []);\n    const spoilerClickHandler = useSpoilerClickHandler();\n    const htmlReactParserOptions = useMemo<HTMLReactParserOptions>(\n      () =>\n        getReactCustomHtmlParser(mx, mEvents[0]!.getRoomId(), {\n          settingsLinkBaseUrl,\n          linkifyOpts,\n          useAuthentication,\n          handleSpoilerClick: spoilerClickHandler,\n        }),\n      [linkifyOpts, mEvents, mx, settingsLinkBaseUrl, spoilerClickHandler, useAuthentication]\n    );\n    const powerLevels = usePowerLevelsContext();\n    const creators = useRoomCreators(room);\n    const permissions = useRoomPermissions(creators, powerLevels);\n    const canRedact = permissions.action('redact', mx.getSafeUserId());\n    const canDeleteOwn = permissions.event(EventType.RoomRedaction, mx.getSafeUserId());\n    const canDelete = canRedact || (canDeleteOwn && mEvents[0]?.getSender() === mx.getUserId());\n\n    const setReplyDraft = useSetAtom(roomIdToReplyDraftAtomFamily(room.roomId));\n    const triggerReply = useCallback(\n      (replyId: string, startThread = false) => {\n        const replyEvt = room.findEventById(replyId);\n        if (!replyEvt) return;\n        const content: IContent = replyEvt.getOriginalContent();\n        const body = content?.['m.new_content']?.body ?? content?.body ?? '';\n        const formattedBody =\n          content?.['m.new_content']?.formatted_body ?? content?.formatted_body ?? '';\n        const { 'm.relates_to': relation } = startThread\n          ? { 'm.relates_to': { rel_type: RelationType.Thread, event_id: replyId } }\n          : replyEvt.getWireContent();\n        const senderId = replyEvt.getSender();\n        if (senderId) {\n          if (typeof body === 'string') {\n            setReplyDraft({\n              userId: senderId,\n              eventId: replyId,\n              body,\n              formattedBody,\n              relation,\n            });\n          } else {\n            setReplyDraft({\n              userId: senderId,\n              eventId: replyId,\n              body: '',\n              formattedBody: '',\n              relation,\n            });\n          }\n        }\n      },\n      [room, setReplyDraft]\n    );\n\n    function MenuOptions({ mEvent }: Readonly<{ mEvent: MatrixEvent }>) {\n      const setModal = useSetAtom(modalAtom);\n      return (\n        <Menu className={css.MenuOptions}>\n          <MenuItem\n            size=\"300\"\n            after={menuIcon(ArrowBendUpLeftIcon)}\n            radii=\"300\"\n            fill=\"None\"\n            variant=\"Secondary\"\n            onClick={(e) => {\n              e.preventDefault();\n              e.stopPropagation();\n              if (mEvent.event.event_id) {\n                triggerReply(mEvent.event.event_id, false);\n                requestClose();\n              }\n            }}\n          />\n          <MenuItem\n            size=\"300\"\n            after={menuIcon(ChatTeardropDots)}\n            radii=\"300\"\n            fill=\"None\"\n            variant=\"Secondary\"\n            onClick={(e) => {\n              e.preventDefault();\n              e.stopPropagation();\n              if (mEvent.event.event_id) {\n                triggerReply(mEvent.event.event_id, true);\n                requestClose();\n              }\n            }}\n          />\n          {canDelete && (\n            <MenuItem\n              size=\"300\"\n              after={menuIcon(Trash)}\n              radii=\"300\"\n              fill=\"None\"\n              variant=\"Critical\"\n              onClick={(e) => {\n                e.preventDefault();\n                e.stopPropagation();\n                setModal({\n                  type: ModalType.Delete,\n                  room,\n                  mEvent,\n                });\n              }}\n            />\n          )}\n        </Menu>\n      );\n    }\n\n    function EventItem({\n      mEvent,\n      EventContent,\n    }: Readonly<{ mEvent: MatrixEvent; EventContent: IContent }>) {\n      const [isHovered, setIsHovered] = useState(false);\n      return (\n        <Box\n          style={{ position: 'relative', width: '100%' }}\n          onMouseEnter={() => setIsHovered(true)}\n          onMouseLeave={() => setIsHovered(false)}\n          onClick={() => setIsHovered(!isHovered)}\n        >\n          <Box className={css.EventItem}>\n            <Time\n              ts={mEvent.getTs()}\n              hour24Clock={hour24Clock}\n              dateFormatString={dateFormatString}\n            />\n\n            <Text size=\"T400\" style={{ paddingLeft: '10px', wordBreak: 'break-word' }}>\n              <RenderBody\n                body={EventContent?.['m.new_content']?.body ?? EventContent?.body ?? ''}\n                customBody={\n                  EventContent?.['m.new_content']?.formatted_body ??\n                  EventContent?.formatted_body ??\n                  ''\n                }\n                htmlReactParserOptions={htmlReactParserOptions}\n                linkifyOpts={linkifyOpts}\n              />\n            </Text>\n          </Box>\n          {isHovered && <MenuOptions mEvent={mEvent} />}\n        </Box>\n      );\n    }\n\n    return (\n      <Box\n        className={classNames(css.EventHistory, className)}\n        direction=\"Column\"\n        {...props}\n        ref={ref}\n      >\n        <Header className={css.Header} variant=\"Surface\" size=\"600\">\n          <Box grow=\"Yes\">\n            <Text size=\"H3\">Message version history</Text>\n          </Box>\n          <IconButton size=\"300\" onClick={requestClose}>\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        <Header>\n          <MenuItem\n            key={readerId}\n            style={{\n              display: 'flex',\n              justifyContent: 'center',\n              padding: `${config.space.S200} ${config.space.S200}`,\n              height: 'unset',\n            }}\n            radii=\"400\"\n            onClick={(event) => {\n              openProfile(\n                room.roomId,\n                space?.roomId,\n                readerId,\n                undefined,\n                getMouseEventCords(event.nativeEvent),\n                'Bottom'\n              );\n            }}\n            before={\n              <Avatar size=\"300\">\n                <UserAvatar\n                  userId={readerId ?? ''}\n                  src={avatarUrl ?? undefined}\n                  alt={name}\n                  renderFallback={() => userFallbackIcon('sm')}\n                />\n              </Avatar>\n            }\n          >\n            <Text size=\"T400\">{name}</Text>\n          </MenuItem>\n        </Header>\n        <Box grow=\"Yes\" style={{ overflow: 'scroll' }}>\n          <Scroll visibility=\"Hover\">\n            <Box className={css.Content} direction=\"Column\">\n              {mEvents.map((mEvent) => {\n                if (!mEvent.event.sender) return <div key={mEvent.event.event_id} />;\n                const EventContent = mEvent.getOriginalContent();\n                return (\n                  <>\n                    <hr\n                      style={{\n                        width: '100%',\n                        color: color.Surface.ContainerLine,\n                      }}\n                    />\n                    <EventItem mEvent={mEvent} EventContent={EventContent} />\n                  </>\n                );\n              })}\n            </Box>\n          </Scroll>\n        </Box>\n      </Box>\n    );\n  }\n);\n","import type { MouseEvent } from 'react';\nimport type { Room, MatrixEvent } from '$types/matrix-sdk';\nimport { useSetAtom } from 'jotai';\nimport { MenuItem, Text } from 'folds';\nimport { Clock, menuIcon } from '$components/icons/phosphor';\nimport { getEventEdits } from '$utils/room/relations';\nimport { modalAtom, ModalType } from '$state/modal';\nimport * as css from '$features/room/message/styles.css';\nimport { EventHistory } from '$components/event-history';\n\nexport function MessageEditHistoryItem({\n  room,\n  mEvent,\n  closeMenu,\n}: {\n  room: Room;\n  mEvent: MatrixEvent;\n  closeMenu: () => void;\n}) {\n  const setModal = useSetAtom(modalAtom);\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(Clock)}\n      radii=\"300\"\n      onClick={(e: MouseEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n        closeMenu();\n        setModal({\n          type: ModalType.EditHistory,\n          room,\n          mEvent,\n        });\n      }}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        Version History\n      </Text>\n    </MenuItem>\n  );\n}\n\ntype MessageEditHistoryInternalProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  onClose: () => void;\n};\n\nexport function MessageEditHistoryInternal({\n  room,\n  mEvent,\n  onClose,\n}: MessageEditHistoryInternalProps) {\n  const getEvents = (): MatrixEvent[] => {\n    const evtId = mEvent.getId()!;\n    const evtTimeline = room.getTimelineForEvent(evtId);\n    const edits =\n      evtTimeline &&\n      getEventEdits(evtTimeline.getTimelineSet(), evtId, mEvent.getType())?.getRelations();\n    if (!edits) return [mEvent];\n    edits.sort((a, b) => a.getTs() - b.getTs());\n    return [mEvent, ...edits];\n  };\n\n  return <EventHistory room={room} mEvents={getEvents()} requestClose={onClose} />;\n}\n","import type { MouseEvent } from 'react';\nimport type { Room, MatrixEvent } from '$types/matrix-sdk';\nimport { useSetAtom } from 'jotai';\nimport { MenuItem, Text } from 'folds';\nimport { CodeBlock, menuIcon } from '$components/icons/phosphor';\nimport { TextViewer } from '$components/text-viewer';\nimport { getEventEdits } from '$utils/room/relations';\nimport { modalAtom, ModalType } from '$state/modal';\nimport * as css from '$features/room/message/styles.css';\n\nexport function MessageSourceCodeItem({\n  room,\n  mEvent,\n  closeMenu,\n}: {\n  room: Room;\n  mEvent: MatrixEvent;\n  closeMenu: () => void;\n}) {\n  const setModal = useSetAtom(modalAtom);\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(CodeBlock)}\n      radii=\"300\"\n      onClick={(e: MouseEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n        setModal({\n          type: ModalType.Source,\n          room,\n          mEvent,\n        });\n        closeMenu();\n      }}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        View Source\n      </Text>\n    </MenuItem>\n  );\n}\n\ntype MessageSourceInternalProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  onClose: () => void;\n};\n\nconst getContent = (evt: MatrixEvent) =>\n  evt.isEncrypted()\n    ? {\n        [`<== DECRYPTED_EVENT ==>`]: evt.getEffectiveEvent(),\n        [`<== ORIGINAL_EVENT ==>`]: evt.event,\n      }\n    : evt.event;\n\nexport function MessageSourceInternal({ room, mEvent, onClose }: MessageSourceInternalProps) {\n  const getText = (): string => {\n    const evtId = mEvent.getId()!;\n    const evtTimeline = room.getTimelineForEvent(evtId);\n    const edits =\n      evtTimeline &&\n      getEventEdits(evtTimeline.getTimelineSet(), evtId, mEvent.getType())?.getRelations();\n\n    if (!edits) return JSON.stringify(getContent(mEvent), null, 2);\n\n    const content: Record<string, unknown> = {\n      '<== MAIN_EVENT ==>': getContent(mEvent),\n    };\n\n    edits.forEach((editEvt, index) => {\n      content[`<== REPLACEMENT_EVENT_${index + 1} ==>`] = getContent(editEvt);\n    });\n\n    return JSON.stringify(content, null, 2);\n  };\n\n  return <TextViewer name=\"Source Code\" langName=\"json\" text={getText()} requestClose={onClose} />;\n}\n","import type { FormEventHandler, MouseEvent } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport type { Room, MatrixEvent } from '$types/matrix-sdk';\nimport { useSetAtom } from 'jotai';\nimport {\n  Box,\n  Dialog,\n  Header,\n  IconButton,\n  Text,\n  Input,\n  Button,\n  Spinner,\n  MenuItem,\n  config,\n  color,\n} from 'folds';\nimport { menuIcon, Trash, X } from '$components/icons/phosphor';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { modalAtom, ModalType } from '$state/modal';\nimport * as css from '$features/room/message/styles.css';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport * as Sentry from '@sentry/react';\n\nconst debugLog = createDebugLogger('MessageDelete');\n\nexport function MessageDeleteItem({\n  room,\n  mEvent,\n  closeMenu,\n}: {\n  room: Room;\n  mEvent: MatrixEvent;\n  closeMenu?: () => void;\n}) {\n  const setModal = useSetAtom(modalAtom);\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(Trash)}\n      radii=\"300\"\n      fill=\"None\"\n      variant=\"Critical\"\n      onClick={(e: MouseEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n        setModal({\n          type: ModalType.Delete,\n          room,\n          mEvent,\n        });\n        closeMenu?.();\n      }}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        Delete\n      </Text>\n    </MenuItem>\n  );\n}\n\ntype MessageDeleteInternalProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  onClose: () => void;\n};\n\nexport function MessageDeleteInternal({ room, mEvent, onClose }: MessageDeleteInternalProps) {\n  const mx = useMatrixClient();\n\n  const [deleteState, deleteMessage] = useAsyncCallback(\n    useCallback(\n      (eventId: string, reason?: string) =>\n        mx.redactEvent(room.roomId, eventId, undefined, reason ? { reason } : undefined),\n      [mx, room]\n    )\n  );\n\n  useEffect(() => {\n    if (deleteState.status === AsyncStatus.Success) {\n      debugLog.info('ui', 'Message deleted successfully', { roomId: room.roomId });\n      Sentry.metrics.count('sable.message.delete.success', 1);\n      onClose();\n    }\n    if (deleteState.status === AsyncStatus.Error) {\n      debugLog.error('ui', 'Message delete failed', { roomId: room.roomId });\n      Sentry.metrics.count('sable.message.delete.error', 1);\n    }\n  }, [deleteState.status, room.roomId, onClose]);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    const eventId = mEvent.getId();\n    if (\n      !eventId ||\n      deleteState.status === AsyncStatus.Loading ||\n      deleteState.status === AsyncStatus.Success\n    )\n      return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const reasonInput = target?.reasonInput as HTMLInputElement | undefined;\n    const reason = reasonInput && reasonInput.value.trim();\n\n    debugLog.info('ui', 'Deleting message', { eventId, hasReason: !!reason });\n    Sentry.metrics.count('sable.message.delete.attempt', 1);\n    deleteMessage(eventId, reason);\n  };\n\n  return (\n    <Dialog variant=\"Surface\">\n      <Header\n        style={{\n          padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n          borderBottomWidth: config.borderWidth.B300,\n        }}\n        variant=\"Surface\"\n        size=\"500\"\n      >\n        <Box grow=\"Yes\">\n          <Text size=\"H4\">Delete Message</Text>\n        </Box>\n        <IconButton size=\"300\" onClick={onClose} radii=\"300\">\n          {menuIcon(X)}\n        </IconButton>\n      </Header>\n      <Box\n        as=\"form\"\n        onSubmit={handleSubmit}\n        style={{ padding: config.space.S400 }}\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <Text priority=\"400\">\n          This action is irreversible! Are you sure that you want to delete this message?\n        </Text>\n        <Box direction=\"Column\" gap=\"100\">\n          <Text size=\"L400\">\n            Reason{' '}\n            <Text as=\"span\" size=\"T200\">\n              (optional)\n            </Text>\n          </Text>\n          <Input name=\"reasonInput\" variant=\"Background\" />\n          {deleteState.status === AsyncStatus.Error && (\n            <Text style={{ color: color.Critical.Main }} size=\"T300\">\n              Failed to delete message! Please try again.\n            </Text>\n          )}\n        </Box>\n        <Button\n          type=\"submit\"\n          variant=\"Critical\"\n          before={\n            deleteState.status === AsyncStatus.Loading ? (\n              <Spinner variant=\"Secondary\" size=\"200\" style={{ backgroundColor: 'transparent' }} />\n            ) : undefined\n          }\n          aria-disabled={deleteState.status === AsyncStatus.Loading}\n        >\n          <Text size=\"B400\">\n            {deleteState.status === AsyncStatus.Loading ? 'Deleting...' : 'Delete'}\n          </Text>\n        </Button>\n      </Box>\n    </Dialog>\n  );\n}\n","import { MATRIX_SABLE_UNSTABLE_BOOKMARK_ITEM_EVENT_PREFIX } from '$unstable/prefixes';\nimport type { MatrixEvent, Room } from 'matrix-js-sdk';\nimport type { BookmarkIndexContent, BookmarkItemContent } from '$types/matrix-sdk-events';\n\nexport function computeBookmarkId(roomId: string, eventId: string): string {\n  const input = `${roomId}|${eventId}`;\n  let hash = 0;\n  for (let i = 0; i < input.length; i++) {\n    const ch = input.charCodeAt(i);\n    hash = ((hash << 5) - hash + ch) | 0;\n  }\n  const hex = (hash >>> 0).toString(16).padStart(8, '0');\n  return `bmk_${hex}`;\n}\n\nexport function bookmarkItemEventType(bookmarkId: string): string {\n  return `${MATRIX_SABLE_UNSTABLE_BOOKMARK_ITEM_EVENT_PREFIX}${bookmarkId}`;\n}\n\nfunction buildMatrixURI(roomId: string, eventId: string): string {\n  return `matrix:roomid/${encodeURIComponent(roomId)}/e/${encodeURIComponent(eventId)}`;\n}\n\nfunction extractBodyPreview(mEvent: MatrixEvent, maxLength = 120): string {\n  const content = mEvent.getContent();\n  const body = content?.body;\n  if (typeof body !== 'string' || body.length === 0) return '';\n  if (body.length <= maxLength) return body;\n  return `${body.slice(0, maxLength)}…`;\n}\n\nexport function createBookmarkItem(\n  room: Room,\n  mEvent: MatrixEvent\n): BookmarkItemContent | undefined {\n  const eventId = mEvent.getId();\n  const { roomId } = room;\n  if (!eventId) return undefined;\n\n  const bookmarkId = computeBookmarkId(roomId, eventId);\n\n  return {\n    version: 1,\n    bookmark_id: bookmarkId,\n    uri: buildMatrixURI(roomId, eventId),\n    room_id: roomId,\n    event_id: eventId,\n    event_ts: mEvent.getTs(),\n    bookmarked_ts: Date.now(),\n    sender: mEvent.getSender(),\n    room_name: room.name,\n    body_preview: mEvent.isEncrypted() ? undefined : extractBodyPreview(mEvent),\n    msgtype: mEvent.getContent()?.msgtype,\n  };\n}\n\nexport function isValidIndexContent(content: unknown): content is BookmarkIndexContent {\n  if (typeof content !== 'object' || content === null) return false;\n  const c = content as Record<string, unknown>;\n  return (\n    c.version === 1 &&\n    typeof c.revision === 'number' &&\n    typeof c.updated_ts === 'number' &&\n    Array.isArray(c.bookmark_ids) &&\n    c.bookmark_ids.every((id: unknown) => typeof id === 'string')\n  );\n}\n\nexport function isValidBookmarkItem(content: unknown): content is BookmarkItemContent {\n  if (typeof content !== 'object' || content === null) return false;\n  const c = content as Record<string, unknown>;\n  return (\n    c.version === 1 &&\n    typeof c.bookmark_id === 'string' &&\n    typeof c.uri === 'string' &&\n    typeof c.room_id === 'string' &&\n    typeof c.event_id === 'string' &&\n    typeof c.event_ts === 'number' &&\n    typeof c.bookmarked_ts === 'number'\n  );\n}\n\nexport function emptyIndex(): BookmarkIndexContent {\n  return {\n    version: 1,\n    revision: 0,\n    updated_ts: Date.now(),\n    bookmark_ids: [],\n  };\n}\n","import type { AccountDataEvents, MatrixClient } from 'matrix-js-sdk';\nimport {\n  bookmarkItemEventType,\n  emptyIndex,\n  isValidBookmarkItem,\n  isValidIndexContent,\n} from './bookmarkDomain';\nimport type { BookmarkIndexContent, BookmarkItemContent } from '$types/matrix-sdk-events';\nimport { MATRIX_SABLE_UNSTABLE_BOOKMARKS_INDEX_EVENT } from '$unstable/prefixes';\n\nfunction readIndex(mx: MatrixClient): BookmarkIndexContent {\n  const evt = mx.getAccountData(MATRIX_SABLE_UNSTABLE_BOOKMARKS_INDEX_EVENT);\n  const content = evt?.getContent();\n  if (isValidIndexContent(content)) return content;\n  return emptyIndex();\n}\n\nasync function readIndexFromServer(mx: MatrixClient): Promise<BookmarkIndexContent> {\n  const content = await mx.getAccountDataFromServer(MATRIX_SABLE_UNSTABLE_BOOKMARKS_INDEX_EVENT);\n  if (isValidIndexContent(content)) return content;\n  return emptyIndex();\n}\n\nasync function readItemFromServer(\n  mx: MatrixClient,\n  bookmarkId: string\n): Promise<BookmarkItemContent | undefined> {\n  const content = await mx.getAccountDataFromServer(\n    bookmarkItemEventType(bookmarkId) as keyof AccountDataEvents\n  );\n  if (isValidBookmarkItem(content) && !content.deleted) return content;\n  return undefined;\n}\n\nasync function writeIndex(mx: MatrixClient, index: BookmarkIndexContent): Promise<void> {\n  await mx.setAccountData(MATRIX_SABLE_UNSTABLE_BOOKMARKS_INDEX_EVENT, index);\n}\n\nasync function writeItem(mx: MatrixClient, item: BookmarkItemContent): Promise<void> {\n  await mx.setAccountData(bookmarkItemEventType(item.bookmark_id) as keyof AccountDataEvents, item);\n}\n\ntype IndexMutator = (index: BookmarkIndexContent) => BookmarkIndexContent;\n\nasync function mutateIndex(mx: MatrixClient, mutate: IndexMutator): Promise<void> {\n  const currentIndex = await readIndexFromServer(mx);\n  const nextIndex = mutate(currentIndex);\n  await writeIndex(mx, nextIndex);\n}\n\nexport async function addBookmark(mx: MatrixClient, item: BookmarkItemContent): Promise<void> {\n  await writeItem(mx, item);\n\n  await mutateIndex(mx, (index) => {\n    const ids = index.bookmark_ids.includes(item.bookmark_id)\n      ? index.bookmark_ids\n      : [item.bookmark_id, ...index.bookmark_ids];\n\n    return {\n      ...index,\n      bookmark_ids: ids,\n      revision: index.revision + 1,\n      updated_ts: Date.now(),\n    };\n  });\n}\n\nexport async function removeBookmark(mx: MatrixClient, bookmarkId: string): Promise<void> {\n  await mutateIndex(mx, (index) => ({\n    ...index,\n    bookmark_ids: index.bookmark_ids.filter((id) => id !== bookmarkId),\n    revision: index.revision + 1,\n    updated_ts: Date.now(),\n  }));\n\n  const existing = await readItemFromServer(mx, bookmarkId);\n  if (existing) {\n    await writeItem(mx, { ...existing, deleted: true });\n  }\n}\n\nexport async function listBookmarks(mx: MatrixClient): Promise<BookmarkItemContent[]> {\n  const index = await readIndexFromServer(mx);\n  const items = await Promise.all(index.bookmark_ids.map((id) => readItemFromServer(mx, id)));\n  return items.filter((item): item is BookmarkItemContent => item != null);\n}\n\nexport function isBookmarked(mx: MatrixClient, bookmarkId: string): boolean {\n  const index = readIndex(mx);\n  return index.bookmark_ids.includes(bookmarkId);\n}\n","import { atom, useSetAtom } from 'jotai';\nimport type { MatrixClient, MatrixEvent } from 'matrix-js-sdk';\nimport { ClientEvent } from 'matrix-js-sdk';\nimport { useCallback, useEffect } from 'react';\nimport type { BookmarkItemContent } from '$types/matrix-sdk-events';\nimport { listBookmarks } from '$features/bookmarks/bookmarkRepository';\nimport { MATRIX_SABLE_UNSTABLE_BOOKMARKS_INDEX_EVENT } from '$unstable/prefixes';\nimport { useMatrixEvent } from '$hooks/useMatrixEvent';\n\nexport const bookmarkListAtom = atom<BookmarkItemContent[]>([]);\nexport const bookmarkLoadingAtom = atom<boolean>(false);\nexport const bookmarkRefreshErrorAtom = atom<Error | undefined>(undefined);\n\nexport const bookmarksAtom = {\n  list: bookmarkListAtom,\n  loading: bookmarkLoadingAtom,\n  refreshError: bookmarkRefreshErrorAtom,\n};\n\nexport const bookmarkIdSetAtom = atom<Set<string>>((get) => {\n  const list = get(bookmarkListAtom);\n  return new Set(list.map((b) => b.bookmark_id));\n});\n\nexport const useBindBookmarksAtom = (mx: MatrixClient, bookmarks: typeof bookmarksAtom) => {\n  const setList = useSetAtom(bookmarks.list);\n  const setLoading = useSetAtom(bookmarks.loading);\n  const setRefreshError = useSetAtom(bookmarks.refreshError);\n\n  const refresh = useCallback(async () => {\n    setLoading(true);\n    try {\n      const items = await listBookmarks(mx);\n      setList(items);\n      setRefreshError(undefined);\n    } catch (error) {\n      setRefreshError(error as Error);\n    } finally {\n      setLoading(false);\n    }\n  }, [mx, setList, setLoading, setRefreshError]);\n\n  useEffect(() => {\n    refresh();\n  }, [refresh]);\n\n  const handleAccountData = useCallback(\n    (event: MatrixEvent) => {\n      if (event.getType() === MATRIX_SABLE_UNSTABLE_BOOKMARKS_INDEX_EVENT) {\n        refresh();\n      }\n    },\n    [refresh]\n  );\n\n  useMatrixEvent(mx, ClientEvent.AccountData, handleAccountData);\n};\n","import { useAtomValue, useSetAtom } from 'jotai';\nimport { useCallback } from 'react';\nimport { computeBookmarkId } from '$features/bookmarks/bookmarkDomain';\nimport {\n  addBookmark as repoAdd,\n  removeBookmark as repoRemove,\n  listBookmarks,\n  isBookmarked as repoIsBookmarked,\n} from '$features/bookmarks/bookmarkRepository';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport {\n  bookmarkIdSetAtom,\n  bookmarkListAtom,\n  bookmarkLoadingAtom,\n  bookmarkRefreshErrorAtom,\n} from '$state/bookmarks';\nimport type { BookmarkItemContent } from '$types/matrix-sdk-events';\n\nexport function useBookmarkList(): BookmarkItemContent[] {\n  return useAtomValue(bookmarkListAtom);\n}\n\nexport function useBookmarkLoading(): boolean {\n  return useAtomValue(bookmarkLoadingAtom);\n}\n\nexport function useIsBookmarked(roomId: string, eventId: string): boolean {\n  const idSet = useAtomValue(bookmarkIdSetAtom);\n  return idSet.has(computeBookmarkId(roomId, eventId));\n}\n\nexport function useBookmarkActions() {\n  const mx = useMatrixClient();\n  const setList = useSetAtom(bookmarkListAtom);\n  const setLoading = useSetAtom(bookmarkLoadingAtom);\n  const setRefreshError = useSetAtom(bookmarkRefreshErrorAtom);\n\n  const refresh = useCallback(async () => {\n    setLoading(true);\n    try {\n      const items = await listBookmarks(mx);\n      setList(items);\n      setRefreshError(undefined);\n    } catch (error) {\n      setRefreshError(error as Error);\n    } finally {\n      setLoading(false);\n    }\n  }, [mx, setList, setLoading, setRefreshError]);\n\n  const add = useCallback(\n    async (item: BookmarkItemContent) => {\n      setList((prev) => {\n        if (prev.some((b) => b.bookmark_id === item.bookmark_id)) return prev;\n        return [item, ...prev];\n      });\n      await repoAdd(mx, item);\n    },\n    [mx, setList]\n  );\n\n  const remove = useCallback(\n    async (bookmarkId: string) => {\n      setList((prev) => prev.filter((b) => b.bookmark_id !== bookmarkId));\n      await repoRemove(mx, bookmarkId);\n    },\n    [mx, setList]\n  );\n\n  const checkIsBookmarked = useCallback(\n    (roomId: string, eventId: string): boolean =>\n      repoIsBookmarked(mx, computeBookmarkId(roomId, eventId)),\n    [mx]\n  );\n\n  return { refresh, add, remove, checkIsBookmarked };\n}\n","import type { GifData } from '$components/emoji-board/types';\nimport type { IImageInfo } from '$types/matrix/common';\nimport { MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME } from '$unstable/prefixes';\nimport { parseExternalGif } from './externalGif';\nimport { parseLegacyKlipyGif } from './klipy';\n\nconst getIncomingMediaMxcUrl = (url: unknown): string | undefined =>\n  typeof url === 'string' && url.startsWith('mxc://') ? url : undefined;\n\nexport const getFavoriteGifFromMessageContent = (\n  content: Record<string, unknown>\n): Omit<GifData, 'id'> | undefined => {\n  const externalGif = parseExternalGif(content);\n  const legacyGif = externalGif ? undefined : parseLegacyKlipyGif(content);\n  const gif = externalGif ?? legacyGif;\n  if (gif) {\n    return {\n      title: gif.title ?? '',\n      shareUrl: externalGif && typeof content.body === 'string' ? content.body : gif.media_url,\n      mediaUrl: gif.media_url,\n      width: gif.w,\n      height: gif.h,\n      ...(gif.size !== undefined ? { size: gif.size } : {}),\n      ...(gif.mimetype ? { mimetype: gif.mimetype } : {}),\n      ...(gif.blurhash ? { blurhash: gif.blurhash } : {}),\n    };\n  }\n\n  const file = content.file;\n  const fileUrl =\n    file && typeof file === 'object' && !Array.isArray(file)\n      ? (file as { url?: unknown }).url\n      : undefined;\n  const url = getIncomingMediaMxcUrl(fileUrl ?? content.url);\n  if (!url) return undefined;\n  const info = content.info as IImageInfo | undefined;\n  return {\n    title: typeof content.body === 'string' ? content.body : '',\n    shareUrl: url,\n    mediaUrl: url,\n    ...(info?.w !== undefined ? { width: info.w } : {}),\n    ...(info?.h !== undefined ? { height: info.h } : {}),\n    ...(info?.size !== undefined ? { size: info.size } : {}),\n    ...(info?.mimetype ? { mimetype: info.mimetype } : {}),\n    ...(info?.[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]\n      ? { blurhash: info[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME] }\n      : {}),\n  };\n};\n","import {\n  composerIcon,\n  MagnifyingGlass,\n  menuIcon,\n  User as UserIcon,\n} from '$components/icons/phosphor';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { UserAvatar } from '$components/user-avatar/UserAvatar.tsx';\nimport type { PerMessageProfileMsc4461, Persona } from '$app/persona';\nimport { isPersonaAccountDataEvent, ProfileCatalog } from '$app/persona/catalog';\nimport { useAccountDataCallback } from '$hooks/useAccountDataCallback';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { nameInitials } from '$utils/common';\nimport {\n  Avatar,\n  Box,\n  config,\n  IconButton,\n  Input,\n  Menu,\n  MenuItem,\n  type RectCords,\n  Scroll,\n  Text,\n  toRem,\n  Badge,\n  color,\n} from 'folds';\nimport type { MatrixClient } from 'matrix-js-sdk';\nimport {\n  type RefObject,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n  type FormEvent,\n  type MutableRefObject,\n} from 'react';\nimport * as css from './PersonaPicker.css.ts';\nimport { InfoCard } from '$components/info-card/InfoCard.tsx';\nimport { InfoIcon } from '@phosphor-icons/react';\nimport { usePersonaCosmetics } from '$hooks/usePerMessageProfile.ts';\n\nconst pillStyles = {\n  cursor: 'pointer',\n} as const;\n\nexport enum PersonaPickerTab {\n  Global = 'Global',\n  PerRoom = 'PerRoom',\n}\n\nexport enum PersonaPickerPresentation {\n  TemporarySelectorMenu = 'TemporarySelectorMenu',\n  PersistentPicker = 'PersistentPicker',\n}\n\ntype PersonaPickerProps = {\n  tab?: PersonaPickerTab;\n  mx: MatrixClient;\n  roomId?: string;\n  suppressEditorRefocus?: () => void;\n  onTabChange?: (tab: PersonaPickerTab) => void;\n  latchedPersona?: PerMessageProfileMsc4461;\n  onPersonaSelect?: (persona: PerMessageProfileMsc4461 | undefined) => void | Promise<void>;\n  requestClose?: () => void;\n  showNoneOption?: boolean;\n  hideButton?: boolean;\n  hideTabs?: boolean;\n  anchor?: RectCords;\n};\ntype TemporaryPersonaPickerProps = {\n  mx: MatrixClient;\n  suppressEditorRefocus?: () => void;\n  onPersonaSelect: (persona: PerMessageProfileMsc4461 | undefined) => void | Promise<void>;\n  requestClose: () => void;\n  anchor?: RectCords;\n  open?: boolean;\n};\n\nexport function useProfiles(\n  mx: MatrixClient,\n  mountedRef: MutableRefObject<boolean>,\n  profileFetchGenerationRef: MutableRefObject<number>\n) {\n  const [profiles, setProfiles] = useState<PerMessageProfileMsc4461[] | undefined>(undefined);\n\n  const fetchProfiles = useCallback(async () => {\n    const fetchGeneration = ++profileFetchGenerationRef.current;\n    try {\n      const fetchedProfiles = await new ProfileCatalog(mx).list();\n      if (!mountedRef.current || fetchGeneration !== profileFetchGenerationRef.current) {\n        return;\n      }\n      setProfiles(fetchedProfiles);\n    } catch {\n      // Profile loading is best effort; keep the existing list when it fails.\n    }\n  }, [mountedRef, mx, profileFetchGenerationRef]);\n\n  useEffect(() => {\n    void fetchProfiles();\n    return () => {\n      profileFetchGenerationRef.current += 1;\n    };\n  }, [fetchProfiles, profileFetchGenerationRef]);\n\n  useAccountDataCallback(\n    mx,\n    useCallback(\n      (event) => {\n        if (isPersonaAccountDataEvent(event.getType())) void fetchProfiles();\n      },\n      [fetchProfiles]\n    )\n  );\n\n  return { profiles, fetchProfiles };\n}\n\nfunction useFilteredProfiles(\n  profiles: Persona[] | undefined,\n  mountedRef: MutableRefObject<boolean>,\n  searchInputRef: RefObject<HTMLInputElement | null>,\n  profileFetchGenerationRef: MutableRefObject<number>\n) {\n  const [filteredProfiles, setFilteredProfiles] = useState<PerMessageProfileMsc4461[] | undefined>(\n    profiles\n  );\n  //\n  useEffect(() => {\n    mountedRef.current = true;\n    return () => {\n      mountedRef.current = false;\n      profileFetchGenerationRef.current += 1;\n    };\n  }, [mountedRef, profileFetchGenerationRef]);\n\n  const clearFilter = () => {\n    if (searchInputRef.current) {\n      searchInputRef.current.value = '';\n    }\n    setFilteredProfiles(profiles);\n  };\n\n  const filter = useCallback(\n    (e: FormEvent) => {\n      const term = (e.target as HTMLInputElement).value.toLocaleLowerCase();\n\n      const filtered = term\n        ? profiles?.filter((profile) =>\n            searchInputRef.current\n              ? profile.displayname.toLocaleLowerCase().includes(searchInputRef.current?.value) ||\n                profile.id.toLocaleLowerCase().includes(searchInputRef.current?.value)\n              : true\n          )\n        : profiles;\n\n      setFilteredProfiles(filtered);\n    },\n    [profiles, searchInputRef]\n  );\n\n  useEffect(() => {\n    setFilteredProfiles(profiles);\n  }, [profiles]);\n\n  return { filteredProfiles, filter, clearFilter };\n}\n\nfunction useSelectedProfiles(\n  mx: MatrixClient,\n  roomId: string,\n  latchedPersona: Persona | undefined,\n  mountedRef: MutableRefObject<boolean>\n) {\n  const [selectedGlobalPersona, setSelectedGlobalPersona] =\n    useState<PerMessageProfileMsc4461 | null>(null);\n  const [selectedRoomPersona, setSelectedRoomPersona] = useState<PerMessageProfileMsc4461 | null>(\n    latchedPersona ?? null\n  );\n\n  // Bumped on each click so an in-flight sync cannot undo a fresher choice. Global and\n  // per-room selections are independent, so one must not invalidate the other's rollback.\n  const globalSelectionRef = useRef(0);\n  const roomSelectionRef = useRef(0);\n  const [accountDataGeneration, setAccountDataGeneration] = useState(0);\n\n  useAccountDataCallback(\n    mx,\n    useCallback((event) => {\n      if (isPersonaAccountDataEvent(event.getType()))\n        setAccountDataGeneration((generation) => generation + 1);\n    }, [])\n  );\n\n  const toggle = async (profile: Persona, isGlobal: boolean) => {\n    const previousPersona = isGlobal ? selectedGlobalPersona : selectedRoomPersona;\n    const disabling = profile.id === previousPersona?.id;\n\n    const setPersona = isGlobal ? setSelectedGlobalPersona : setSelectedRoomPersona;\n    const generationRef = isGlobal ? globalSelectionRef : roomSelectionRef;\n    const selectionGeneration = ++generationRef.current;\n\n    setPersona(disabling ? null : profile);\n\n    try {\n      await new ProfileCatalog(mx).setSelection(\n        isGlobal ? 'account' : { roomId: roomId! },\n        disabling ? undefined : profile.id,\n        undefined,\n        disabling\n      );\n    } catch {\n      if (mountedRef.current && selectionGeneration === generationRef.current) {\n        setPersona(previousPersona);\n      }\n    }\n  };\n\n  const setGlobal = async (profile: Persona) => toggle(profile, true);\n  const setRoom = async (profile: Persona) => toggle(profile, false);\n\n  useEffect(() => {\n    let cancelled = false;\n\n    const syncProfile = async (\n      generationRef: MutableRefObject<number>,\n      load: () => Promise<PerMessageProfileMsc4461 | undefined>,\n      apply: (profile: PerMessageProfileMsc4461 | null) => void\n    ) => {\n      const generation = generationRef.current;\n      try {\n        const synced = await load();\n        if (!cancelled && generation === generationRef.current) apply(synced ?? null);\n      } catch {\n        // Profile synchronization is best effort; retain the current selection on failure.\n      }\n    };\n\n    void syncProfile(\n      roomSelectionRef,\n      () =>\n        roomId\n          ? new ProfileCatalog(mx).getSelection({ roomId }).then((selection) => selection?.persona)\n          : Promise.resolve(undefined),\n      // A latched persona already reflects the user's intent, so don't overwrite it.\n      (profile) => {\n        if (!selectedRoomPersona) setSelectedRoomPersona(profile);\n      }\n    );\n    void syncProfile(\n      globalSelectionRef,\n      () => new ProfileCatalog(mx).getSelection('account').then((selection) => selection?.persona),\n      setSelectedGlobalPersona\n    );\n\n    return () => {\n      cancelled = true;\n    };\n  }, [mx, roomId, latchedPersona, selectedRoomPersona, accountDataGeneration]);\n\n  return {\n    room: selectedRoomPersona,\n    global: selectedGlobalPersona,\n    setRoom,\n    setGlobal,\n  };\n}\n\nexport function PersonaPicker({\n  tab: tabProp = PersonaPickerTab.Global,\n  mx,\n  roomId,\n  suppressEditorRefocus,\n  onTabChange,\n  latchedPersona,\n  anchor,\n}: PersonaPickerProps) {\n  const [tab, setTab] = useState(tabProp);\n  const [AddPersonaMenuAnchor, setAddPersonaMenuAnchor] = useState<RectCords | undefined>(anchor);\n  const mountedRef = useRef(false);\n  const profileFetchGenerationRef = useRef(0);\n\n  const { profiles } = useProfiles(mx, mountedRef, profileFetchGenerationRef);\n\n  const searchInputRef = useRef<HTMLInputElement>(null);\n  const { filteredProfiles, filter, clearFilter } = useFilteredProfiles(\n    profiles,\n    mountedRef,\n    searchInputRef,\n    profileFetchGenerationRef\n  );\n\n  const {\n    room: selectedRoomPersona,\n    global: selectedGlobalPersona,\n    setRoom,\n    setGlobal,\n  } = useSelectedProfiles(mx, roomId ?? '', latchedPersona, mountedRef);\n\n  const isPickerMenuItemSelected = (persona: PerMessageProfileMsc4461) => {\n    const selectedPersona =\n      tab === PersonaPickerTab.Global ? selectedGlobalPersona : selectedRoomPersona;\n    return persona.id === selectedPersona?.id ? true : undefined;\n  };\n\n  const { nameColor, avatarUrl } = usePersonaCosmetics(mx);\n\n  const defactoPersona = () => selectedRoomPersona ?? selectedGlobalPersona;\n\n  const scrollRef = useRef<HTMLDivElement>(null);\n\n  return (\n    <ResponsiveMenu\n      anchor={AddPersonaMenuAnchor}\n      position=\"Top\"\n      align=\"Start\"\n      offset={16}\n      alignOffset={-44}\n      requestClose={() => {\n        setAddPersonaMenuAnchor(undefined);\n        clearFilter();\n      }}\n      menu={\n        <Menu>\n          <Box\n            direction=\"Column\"\n            gap=\"100\"\n            style={{ padding: config.space.S200, minWidth: '18rem' }}\n          >\n            <Box gap=\"100\">\n              <Badge\n                style={pillStyles}\n                as=\"button\"\n                variant=\"Secondary\"\n                fill={tab == PersonaPickerTab.Global ? 'Solid' : 'None'}\n                size=\"500\"\n                onClick={() => {\n                  setTab(PersonaPickerTab.Global);\n                  onTabChange?.(PersonaPickerTab.Global);\n                }}\n              >\n                <Text as=\"span\" size=\"L400\">\n                  Global\n                </Text>\n              </Badge>\n              <Badge\n                style={pillStyles}\n                as=\"button\"\n                variant=\"Secondary\"\n                fill={tab == PersonaPickerTab.PerRoom ? 'Solid' : 'None'}\n                size=\"500\"\n                onClick={() => {\n                  setTab(PersonaPickerTab.PerRoom);\n                  onTabChange?.(PersonaPickerTab.PerRoom);\n                }}\n              >\n                <Text as=\"span\" size=\"L400\">\n                  Per-room\n                </Text>\n              </Badge>\n            </Box>\n            <Input\n              ref={searchInputRef}\n              variant=\"SurfaceVariant\"\n              size=\"400\"\n              placeholder=\"Search\"\n              maxLength={50}\n              autoFocus={!isMobileOrTablet()}\n              onChange={filter}\n              before={menuIcon(MagnifyingGlass)}\n            />\n\n            <Scroll hideTrack ref={scrollRef} size=\"400\" style={{ maxHeight: '10rem' }}>\n              {filteredProfiles?.map((profile) => (\n                <MenuItem\n                  key={profile.id}\n                  size=\"400\"\n                  radii=\"300\"\n                  className={css.PersonaPickerMenuItem}\n                  aria-selected={isPickerMenuItemSelected(profile)}\n                  onClick={async () => {\n                    const setPersona = tab === PersonaPickerTab.Global ? setGlobal : setRoom;\n                    setPersona(profile);\n                  }}\n                  before={\n                    <Avatar\n                      size=\"300\"\n                      radii=\"400\"\n                      style={{\n                        width: 28,\n                        height: 28,\n                        marginLeft: -6,\n                      }}\n                      aria-label=\"Profile avatar\"\n                    >\n                      <UserAvatar\n                        userId={profile.id}\n                        src={avatarUrl?.(profile)}\n                        fallbackColor={profile['eu.she-a.color']?.on_light ?? undefined}\n                        renderFallback={() => (\n                          <Text as=\"span\" size=\"H4\" aria-label=\"Avatar fallback\">\n                            {nameInitials(profile.displayname)}\n                          </Text>\n                        )}\n                        alt={`Avatar for profile ${profile.id}`}\n                      />\n                    </Avatar>\n                  }\n                >\n                  <Box direction=\"Column\">\n                    <Text\n                      truncate\n                      style={{ color: nameColor?.(profile) ?? undefined, maxWidth: toRem(150) }}\n                    >\n                      {profile.displayname}\n                    </Text>\n                    <Text\n                      truncate\n                      size=\"T200\"\n                      style={{\n                        color: `color-mix(${color.Surface.OnContainer}, transparent 20%)`,\n                        maxWidth: toRem(150),\n                      }}\n                    >\n                      {profile.id}\n                    </Text>\n                  </Box>\n                </MenuItem>\n              ))}\n            </Scroll>\n            <InfoCard\n              before={menuIcon(InfoIcon, { weight: 'fill' })}\n              variant=\"Primary\"\n              description={\n                selectedRoomPersona ? (\n                  <>\n                    Message will use your <em>per-room</em> persona.\n                  </>\n                ) : selectedGlobalPersona ? (\n                  <>\n                    Message will use your <em>global</em> persona.\n                  </>\n                ) : (\n                  <>No persona chosen.</>\n                )\n              }\n            />\n          </Box>\n        </Menu>\n      }\n    >\n      <IconButton\n        aria-pressed={!!AddPersonaMenuAnchor}\n        onClick={(evt) => {\n          if (isMobileOrTablet()) {\n            const activeElement = document.activeElement;\n            if (activeElement instanceof HTMLElement) activeElement.blur();\n          }\n          setAddPersonaMenuAnchor(evt.currentTarget.getBoundingClientRect());\n        }}\n        onPointerDown={suppressEditorRefocus}\n        variant=\"SurfaceVariant\"\n        size=\"300\"\n        style={{ backgroundColor: 'transparent' }}\n        title=\"Switch persona\"\n        aria-label=\"Switch persona\"\n      >\n        {(selectedRoomPersona ?? selectedGlobalPersona) ? (\n          <Avatar\n            size=\"200\"\n            radii=\"300\"\n            className={\n              AddPersonaMenuAnchor\n                ? css.SelectedPersonaPickerButtonAvatar\n                : css.PersonaPickerButtonAvatar\n            }\n            aria-label=\"Profile avatar\"\n          >\n            <UserAvatar\n              className={css.PersonaPickerButtonAvatarImage}\n              userId={defactoPersona()!.id}\n              src={avatarUrl?.(defactoPersona()!)}\n              renderFallback={() => (\n                <Text as=\"span\" size=\"H6\" aria-label=\"Avatar fallback\">\n                  {nameInitials(defactoPersona()!.displayname)}\n                </Text>\n              )}\n              alt={`Avatar for profile ${defactoPersona()!.id}`}\n            />\n          </Avatar>\n        ) : (\n          composerIcon(UserIcon, { weight: AddPersonaMenuAnchor ? 'fill' : 'regular' })\n        )}\n      </IconButton>\n    </ResponsiveMenu>\n  );\n}\n\nexport function TemporaryPersonaPicker({\n  mx,\n  onPersonaSelect,\n  anchor,\n  open,\n  requestClose,\n}: TemporaryPersonaPickerProps) {\n  const [AddPersonaMenuAnchor, setAddPersonaMenuAnchor] = useState<RectCords | undefined>(anchor);\n  // const [selectedGlobalPersona, setSelectedGlobalPersona] =\n  //   useState<PerMessageProfileMsc4461 | null>(null);\n  // const [selectedRoomPersona, setSelectedRoomPersona] = useState<PerMessageProfileMsc4461 | null>(\n  //   latchedPersona ?? null\n  // );\n  const mountedRef = useRef(false);\n  const profileFetchGenerationRef = useRef(0);\n\n  const { profiles } = useProfiles(mx, mountedRef, profileFetchGenerationRef);\n\n  const searchInputRef = useRef<HTMLInputElement>(null);\n  const { filteredProfiles, filter, clearFilter } = useFilteredProfiles(\n    profiles,\n    mountedRef,\n    searchInputRef,\n    profileFetchGenerationRef\n  );\n\n  const { nameColor, avatarUrl } = usePersonaCosmetics(mx);\n\n  const scrollRef = useRef<HTMLDivElement>(null);\n\n  return (\n    <ResponsiveMenu\n      anchor={AddPersonaMenuAnchor}\n      open={open}\n      position={'Left'}\n      align=\"Start\"\n      offset={16}\n      alignOffset={-44}\n      requestClose={() => {\n        setAddPersonaMenuAnchor(undefined);\n        clearFilter();\n        requestClose();\n      }}\n      menu={\n        <Menu>\n          <Box\n            direction=\"Column\"\n            gap=\"100\"\n            style={{ padding: config.space.S200, minWidth: '18rem' }}\n          >\n            <Input\n              ref={searchInputRef}\n              variant=\"SurfaceVariant\"\n              size=\"400\"\n              placeholder=\"Search\"\n              maxLength={50}\n              autoFocus={!isMobileOrTablet()}\n              onChange={filter}\n              before={menuIcon(MagnifyingGlass)}\n            />\n\n            <Scroll hideTrack ref={scrollRef} size=\"400\" style={{ maxHeight: '10rem' }}>\n              {filteredProfiles?.map((profile) => (\n                <MenuItem\n                  key={profile.id}\n                  size=\"400\"\n                  radii=\"300\"\n                  className={css.PersonaPickerMenuItem}\n                  onClick={async () => {\n                    await onPersonaSelect(profile);\n                    requestClose();\n                    return;\n                  }}\n                  before={\n                    <Avatar\n                      size=\"300\"\n                      radii=\"400\"\n                      style={{\n                        width: 28,\n                        height: 28,\n                        marginLeft: -6,\n                      }}\n                      aria-label=\"Profile avatar\"\n                    >\n                      <UserAvatar\n                        userId={profile.id}\n                        src={avatarUrl?.(profile)}\n                        fallbackColor={profile['eu.she-a.color']?.on_light ?? undefined}\n                        renderFallback={() => (\n                          <Text as=\"span\" size=\"H4\" aria-label=\"Avatar fallback\">\n                            {nameInitials(profile.displayname)}\n                          </Text>\n                        )}\n                        alt={`Avatar for profile ${profile.id}`}\n                      />\n                    </Avatar>\n                  }\n                >\n                  <Box direction=\"Column\">\n                    <Text\n                      truncate\n                      style={{ color: nameColor?.(profile) ?? undefined, maxWidth: toRem(150) }}\n                    >\n                      {profile.displayname}\n                    </Text>\n                    <Text\n                      truncate\n                      size=\"T200\"\n                      style={{\n                        color: `color-mix(${color.Surface.OnContainer}, transparent 20%)`,\n                        maxWidth: toRem(150),\n                      }}\n                    >\n                      {profile.id}\n                    </Text>\n                  </Box>\n                </MenuItem>\n              ))}\n            </Scroll>\n          </Box>\n        </Menu>\n      }\n    ></ResponsiveMenu>\n  );\n}\n","import type {\n  MatrixClient,\n  RoomMessageEventContent,\n  RoomPinnedEventsEventContent,\n  StateEvents,\n} from '$types/matrix-sdk';\nimport { type Room, type MatrixEvent, type Relations, EventType } from '$types/matrix-sdk';\nimport {\n  canEditEvent,\n  canForwardEvent,\n  getEventEdits,\n  isThreadRelationEvent,\n} from '$utils/room/relations';\nimport { MessageReportItem } from './MessageReport';\nimport type { RectCords } from 'folds';\nimport { as, Box, config, IconButton, Line, Menu, MenuItem, Text } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport {\n  ArrowBendUpLeftIcon,\n  ChatCircleDots,\n  DotsThreeOutlineVerticalIcon,\n  Link,\n  menuIcon,\n  PencilSimple,\n  PushPin,\n  PushPinSlash,\n  Smiley,\n  Star,\n} from '$components/icons/phosphor';\nimport { MessageAllReactionItem } from './MessageReactions';\nimport { MessageReadReceiptItem } from './MessageReadRecipts';\nimport {\n  addStickerToDefaultPack,\n  doesStickerExistInDefaultPack,\n} from '$utils/addStickerToDefaultStickerPack';\nimport { MessageEditHistoryItem } from './MessageEditHistory';\nimport { MessageSourceCodeItem } from './MessageSource';\nimport { MessageForwardItem } from './MessageForward';\nimport { MobileSwipeDownModal, useMobileSheetClose } from '$components/MobileSwipeDownModal';\n\nimport * as css from '$features/room/message/styles.css';\nimport { useAtom, useSetAtom, useStore } from 'jotai';\nimport type { Dispatch, MouseEventHandler, ReactNode, SetStateAction } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useState } from 'react';\nimport { MessageDeleteItem } from './MessageDelete';\nimport FocusTrap from 'focus-trap-react';\nimport { stopPropagation } from '$utils/keyboard';\nimport { modalAtom, ModalType, pushModalAtom } from '$state/modal';\nimport { copyToClipboard } from '$utils/dom';\nimport { getMatrixToRoomEvent } from '$plugins/matrix-to';\nimport { getViaServers } from '$plugins/via-servers';\nimport { useRoomPinnedEvents } from '$hooks/useRoomPinnedEvents';\nimport { EmojiBoard } from '$components/emoji-board';\nimport { MemoizedBody, type ReactionHandler } from '$features/room/message';\nimport { useRecentEmoji } from '$hooks/useRecentEmoji';\nimport { BookmarkIcon, UserIcon } from '@phosphor-icons/react';\nimport {\n  computeBookmarkId,\n  createBookmarkItem,\n  useBookmarkActions,\n  useIsBookmarked,\n} from '$features/bookmarks';\nimport { CopyIcon } from '@phosphor-icons/react';\nimport * as OptionsCss from './Options.css';\nimport {\n  MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS,\n  MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME,\n} from '$unstable/prefixes';\nimport { useFavoriteGifs } from '$hooks/useFavoriteGifs';\nimport { getFavoriteGifFromMessageContent } from '$utils/favoriteGif';\nimport { TemporaryPersonaPicker } from '$features/room/persona-picker/PersonaPicker';\nimport { type PerMessageProfileMsc4461 } from '$hooks/usePerMessageProfile';\nimport { buildReplacementPmpContent } from '$features/room/buildReplacementContent';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\n\nfunction WrappedMessage({\n  isModal,\n  ActualMessage,\n}: {\n  isModal?: boolean;\n  ActualMessage?: ReactNode;\n}) {\n  return (\n    <Box\n      className={isModal ? css.MessageOptionsWrappedMessage : ''}\n      onPointerMove={(e) => e.preventDefault()}\n      shrink=\"Yes\"\n      grow=\"No\"\n    >\n      <MemoizedBody>{ActualMessage}</MemoizedBody>\n    </Box>\n  );\n}\n\ntype MessageQuickReactionsProps = {\n  onReaction: ReactionHandler;\n  count: number;\n};\nconst MessageQuickReactions = as<'div', MessageQuickReactionsProps>(\n  ({ onReaction, count, ...props }, ref) => {\n    const mx = useMatrixClient();\n    const recentEmojis = useRecentEmoji(mx, count);\n\n    if (recentEmojis.length === 0) return <span />;\n    return (\n      <>\n        <Box\n          style={{ padding: config.space.S200 }}\n          alignItems=\"Center\"\n          justifyContent=\"Center\"\n          gap=\"200\"\n          {...props}\n          ref={ref}\n        >\n          {recentEmojis.map((emoji) => (\n            <IconButton\n              key={emoji.unicode}\n              className={css.MessageQuickReaction}\n              size=\"300\"\n              variant=\"SurfaceVariant\"\n              radii=\"Pill\"\n              title={emoji.shortcode}\n              aria-label={emoji.shortcode}\n              onClick={() => onReaction(emoji.unicode, emoji.shortcode)}\n            >\n              <Text size=\"T500\">{emoji.unicode}</Text>\n            </IconButton>\n          ))}\n        </Box>\n        <Line size=\"300\" />\n      </>\n    );\n  }\n);\nconst MessageCopyLinkItem = as<\n  'button',\n  {\n    room: Room;\n    mEvent: MatrixEvent;\n    onClose: () => void;\n  }\n>(({ room, mEvent, onClose, ...props }, ref) => {\n  const handleCopy = () => {\n    const eventId = mEvent.getId();\n    if (!eventId) return;\n    copyToClipboard(getMatrixToRoomEvent(room.roomId, eventId, getViaServers(room)));\n    onClose();\n  };\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(Link)}\n      radii=\"300\"\n      onClick={handleCopy}\n      {...props}\n      ref={ref}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        Copy Link\n      </Text>\n    </MenuItem>\n  );\n});\n\nconst MessageCopyTextItem = as<\n  'button',\n  {\n    room: Room;\n    mEvent: MatrixEvent;\n    onClose: () => void;\n  }\n>(({ room, mEvent, onClose, ...props }, ref) => {\n  const handleCopy = () => {\n    const content = mEvent.getContent();\n    const pmp = content[MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME];\n    const body = pmp ? content?.body?.replace(`${pmp.displayname}: `, '') : content?.body;\n\n    if (body) copyToClipboard(body);\n    onClose();\n  };\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(CopyIcon)}\n      radii=\"300\"\n      onClick={handleCopy}\n      {...props}\n      ref={ref}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        Copy Message\n      </Text>\n    </MenuItem>\n  );\n});\n\nconst MessagePinItem = as<\n  'button',\n  {\n    room: Room;\n    mEvent: MatrixEvent;\n    onClose?: () => void;\n  }\n>(({ room, mEvent, onClose, ...props }, ref) => {\n  const mx = useMatrixClient();\n  const pinnedEvents = useRoomPinnedEvents(room);\n  const isPinned = pinnedEvents.includes(mEvent.getId() ?? '');\n\n  const handlePin = () => {\n    const eventId = mEvent.getId();\n    const pinContent: RoomPinnedEventsEventContent = {\n      pinned: Array.from(pinnedEvents).filter((id) => id !== eventId),\n    };\n    if (!isPinned && eventId) {\n      pinContent.pinned.push(eventId);\n    }\n    mx.sendStateEvent(room.roomId, EventType.RoomPinnedEvents as keyof StateEvents, pinContent);\n    onClose?.();\n  };\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(isPinned ? PushPinSlash : PushPin)}\n      radii=\"300\"\n      onClick={handlePin}\n      {...props}\n      ref={ref}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        {isPinned ? 'Unpin Message' : 'Pin Message'}\n      </Text>\n    </MenuItem>\n  );\n});\n\nconst MessageBookmarkItem = as<\n  'button',\n  {\n    room: Room;\n    mEvent: MatrixEvent;\n    onClose?: () => void;\n  }\n>(({ room, mEvent, onClose, ...props }, ref) => {\n  const eventId = mEvent.getId() ?? '';\n  const bookmarked = useIsBookmarked(room.roomId, eventId);\n  const { add, remove } = useBookmarkActions();\n\n  const handleClick = async () => {\n    onClose?.();\n    if (bookmarked) {\n      await remove(computeBookmarkId(room.roomId, eventId));\n    } else {\n      const item = createBookmarkItem(room, mEvent);\n      if (item) await add(item);\n    }\n  };\n\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(BookmarkIcon, {\n        weight: bookmarked ? 'fill' : 'regular',\n      })}\n      radii=\"300\"\n      onClick={handleClick}\n      {...props}\n      ref={ref}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        {bookmarked ? 'Remove Bookmark' : 'Bookmark Message'}\n      </Text>\n    </MenuItem>\n  );\n});\n\nconst MessageFavoriteGifItem = as<\n  'button',\n  {\n    room: Room;\n    mEvent: MatrixEvent;\n    onClose?: () => void;\n  }\n>(({ room, mEvent, onClose, ...props }, ref) => {\n  const mx = useMatrixClient();\n  const content = mEvent.getContent();\n  const favoriteGif = getFavoriteGifFromMessageContent(content);\n  const url = favoriteGif?.mediaUrl ?? '';\n  const favoritedContent = useFavoriteGifs();\n  const [favorited, setFavorited] = useState(\n    favoritedContent.gifs.find((v) => v.mediaUrl == url) != undefined\n  );\n  const handleClick = async () => {\n    if (!favoriteGif) {\n      onClose?.();\n      return;\n    }\n    if (!favorited) {\n      setFavorited(true);\n      await mx\n        .setAccountData(MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS, {\n          gifs: [...favoritedContent.gifs, favoriteGif],\n        })\n        .catch(() => setFavorited(false));\n    } else {\n      setFavorited(false);\n      await mx\n        .setAccountData(MATRIX_SABLE_UNSTABLE_FAVORITE_GIFS, {\n          gifs: favoritedContent.gifs.filter((v) => v.mediaUrl != url),\n        })\n        .catch(() => setFavorited(true));\n    }\n\n    onClose?.();\n  };\n  return (\n    <MenuItem\n      size=\"300\"\n      after={menuIcon(Star, {\n        weight: favorited ? 'fill' : 'regular',\n      })}\n      radii=\"300\"\n      onClick={handleClick}\n      {...props}\n      ref={ref}\n    >\n      <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n        {favorited ? 'Unfavorite Gif' : 'Favorite Gif'}\n      </Text>\n    </MenuItem>\n  );\n});\n\ntype OptionEmojiMenuProps = {\n  mEvent: MatrixEvent;\n  closeMenu: () => void;\n  onReactionToggle?: (targetEventId: string, key: string, shortcode?: string) => void;\n  setEmojiBoardAnchor?: Dispatch<SetStateAction<RectCords | undefined>>;\n  emojiBoardAnchor?: RectCords;\n  imagePackRooms?: Room[];\n  isQuickOptions?: boolean;\n};\nfunction OptionsEmojiBoard({\n  mEvent,\n  onReactionToggle,\n  closeMenu,\n  setEmojiBoardAnchor,\n  emojiBoardAnchor,\n  imagePackRooms,\n  isQuickOptions,\n}: OptionEmojiMenuProps) {\n  const position =\n    (!isQuickOptions && 'Left') ||\n    ((emojiBoardAnchor?.y ?? 0) > window.innerHeight / 2 && 'Top') ||\n    'Bottom';\n  return (\n    <PopOut\n      position={position}\n      align={isQuickOptions ? 'End' : 'Start'}\n      offset={undefined}\n      anchor={emojiBoardAnchor}\n      content={\n        <Menu>\n          <EmojiBoard\n            imagePackRooms={imagePackRooms ?? []}\n            returnFocusOnDeactivate={false}\n            allowTextCustomEmoji\n            onEmojiSelect={(key) => {\n              onReactionToggle?.(mEvent.getId() ?? '', key);\n              setEmojiBoardAnchor?.(undefined);\n              closeMenu();\n            }}\n            onCustomEmojiSelect={(mxc, shortcode) => {\n              onReactionToggle?.(mEvent.getId() ?? '', mxc, shortcode);\n              setEmojiBoardAnchor?.(undefined);\n              closeMenu();\n            }}\n            requestClose={() => {\n              setEmojiBoardAnchor?.(undefined);\n              closeMenu();\n            }}\n          />\n        </Menu>\n      }\n    ></PopOut>\n  );\n}\n\ntype OptionsReproxyPersonaPickerProps = {\n  mx: MatrixClient;\n  mEvent: MatrixEvent;\n  roomId: string;\n  closeMenu: () => void;\n  anchor: RectCords;\n};\nfunction OptionsReproxyPersonaPicker({\n  mx,\n  mEvent,\n  roomId,\n  closeMenu,\n  anchor,\n}: OptionsReproxyPersonaPickerProps) {\n  const reproxyMessage = async (profile: PerMessageProfileMsc4461 | undefined) => {\n    const content = buildReplacementPmpContent(mEvent.getContent(), mEvent.getId()!, profile);\n    await mx.sendMessage(roomId, content as RoomMessageEventContent);\n\n    closeMenu();\n  };\n\n  return (\n    <>\n      <TemporaryPersonaPicker\n        mx={mx}\n        onPersonaSelect={reproxyMessage}\n        requestClose={closeMenu}\n        anchor={anchor}\n      />\n    </>\n  );\n}\n\nexport function OptionQuickMenu({\n  mEvent,\n  room,\n  closeMenu,\n  onReactionToggle,\n  canSendReaction,\n  relations,\n  onReplyClick,\n  onEditId,\n  onReproxyId,\n  hideReadReceipts,\n  showDeveloperTools,\n  canPinEvent,\n  canDelete,\n  handleOpenMenu,\n  menuAnchor,\n  imagePackRooms,\n  setIsEmoji,\n  isGif,\n}: OptionMenuProps) {\n  const mx = useMatrixClient();\n  const isThreadedMessage = isThreadRelationEvent(mEvent, mEvent.threadRootId);\n\n  const [emojiBoardAnchor, setEmojiBoardAnchor] = useState<RectCords>();\n\n  const handleOpenEmojiBoard: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    const target = evt.currentTarget.parentElement?.parentElement ?? evt.currentTarget;\n    setEmojiBoardAnchor?.(target.getBoundingClientRect());\n    setIsEmoji?.(true);\n  };\n\n  return (\n    <Menu className={css.MessageOptionsBar} variant=\"SurfaceVariant\">\n      <Box gap=\"100\">\n        {canSendReaction && setIsEmoji && (\n          <>\n            {emojiBoardAnchor && (\n              <OptionsEmojiBoard\n                mEvent={mEvent}\n                onReactionToggle={onReactionToggle}\n                closeMenu={closeMenu}\n                setEmojiBoardAnchor={setEmojiBoardAnchor}\n                emojiBoardAnchor={emojiBoardAnchor}\n                imagePackRooms={imagePackRooms}\n                isQuickOptions\n              />\n            )}\n\n            <IconButton\n              onClick={handleOpenEmojiBoard}\n              variant=\"SurfaceVariant\"\n              size=\"300\"\n              radii=\"300\"\n              aria-pressed={!!emojiBoardAnchor}\n              className={OptionsCss.UserQuickMenuButton}\n            >\n              {menuIcon(Smiley)}\n            </IconButton>\n          </>\n        )}\n        <IconButton\n          onClick={(ev) => {\n            onReplyClick(ev);\n            closeMenu();\n          }}\n          data-event-id={mEvent.getId()}\n          variant=\"SurfaceVariant\"\n          size=\"300\"\n          radii=\"300\"\n          className={OptionsCss.UserQuickMenuButton}\n        >\n          {menuIcon(ArrowBendUpLeftIcon)}\n        </IconButton>\n        {!isThreadedMessage && (\n          <IconButton\n            onClick={(ev) => {\n              onReplyClick(ev, true);\n              closeMenu();\n            }}\n            data-event-id={mEvent.getId()}\n            variant=\"SurfaceVariant\"\n            size=\"300\"\n            radii=\"300\"\n            className={OptionsCss.UserQuickMenuButton}\n          >\n            {menuIcon(ChatCircleDots)}\n          </IconButton>\n        )}\n        {canEditEvent(mx, mEvent) && onEditId && (\n          <IconButton\n            onClick={() => {\n              onEditId(mEvent.getId());\n              closeMenu();\n            }}\n            variant=\"SurfaceVariant\"\n            size=\"300\"\n            radii=\"300\"\n            className={OptionsCss.UserQuickMenuButton}\n          >\n            {menuIcon(PencilSimple)}\n          </IconButton>\n        )}\n        <PopOut\n          anchor={menuAnchor}\n          position=\"Bottom\"\n          align={menuAnchor?.width === 0 ? 'Start' : 'End'}\n          offset={menuAnchor?.width === 0 ? 0 : undefined}\n          content={\n            <OptionMenu\n              mEvent={mEvent}\n              room={room}\n              closeMenu={closeMenu}\n              onReactionToggle={onReactionToggle}\n              relations={relations}\n              onReplyClick={onReplyClick}\n              onEditId={onEditId}\n              onReproxyId={onReproxyId}\n              hideReadReceipts={hideReadReceipts}\n              showDeveloperTools={showDeveloperTools}\n              canPinEvent={canPinEvent}\n              canDelete={canDelete}\n              setIsEmoji={setIsEmoji}\n              emojiBoardAnchor={menuAnchor}\n              canSendReaction={canSendReaction}\n              isGif={isGif}\n            />\n          }\n        >\n          <IconButton\n            variant=\"SurfaceVariant\"\n            size=\"300\"\n            radii=\"300\"\n            onClick={handleOpenMenu}\n            aria-pressed={!!menuAnchor}\n            className={OptionsCss.UserQuickMenuButton}\n          >\n            {menuIcon(DotsThreeOutlineVerticalIcon, {\n              weight: menuAnchor ? 'fill' : 'regular',\n            })}\n          </IconButton>\n        </PopOut>\n      </Box>\n    </Menu>\n  );\n}\n\nconst triggerRect = (evt: Parameters<MouseEventHandler<HTMLButtonElement>>[0]): RectCords =>\n  evt.currentTarget.parentElement?.parentElement?.getBoundingClientRect() ?? {\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0,\n  };\n\nexport type OptionMenuProps = {\n  mEvent: MatrixEvent;\n  room: Room;\n  closeMenu: () => void;\n  onReactionToggle?: (targetEventId: string, key: string, shortcode?: string) => void;\n  relations?: Relations;\n  canSendReaction?: boolean;\n  onReplyClick: (\n    ev: Parameters<MouseEventHandler<HTMLButtonElement>>[0],\n    startThread?: boolean\n  ) => void;\n  onEditId?: (eventId?: string) => void;\n  onReproxyId?: (profileId?: string) => void;\n  hideReadReceipts?: boolean;\n  hideReplyButton?: boolean;\n  showDeveloperTools?: boolean;\n  canPinEvent?: boolean;\n  canDelete?: boolean;\n  handleOpenMenu?: MouseEventHandler<HTMLButtonElement>;\n  menuAnchor?: RectCords | undefined;\n  isGif?: boolean;\n\n  emojiBoardAnchor?: RectCords;\n  imagePackRooms?: Room[];\n  setIsEmoji?: Dispatch<SetStateAction<boolean>>;\n  ActualMessage?: ReactNode;\n  isModal?: boolean;\n  closeMessageMenu?: () => void;\n};\n\nfunction OptionMenu({\n  mEvent,\n  room,\n  closeMenu: requestClose,\n  onReactionToggle,\n  canSendReaction,\n  relations,\n  onReplyClick,\n  onEditId,\n  hideReadReceipts,\n  hideReplyButton,\n  showDeveloperTools,\n  canPinEvent,\n  canDelete,\n  imagePackRooms,\n  setIsEmoji,\n  ActualMessage,\n  isModal,\n  isGif,\n  closeMessageMenu,\n}: OptionMenuProps) {\n  const mobileSheetClose = useMobileSheetClose();\n  const closeMenu = mobileSheetClose ?? requestClose;\n  const setModal = useSetAtom(modalAtom);\n  const pushModal = useSetAtom(pushModalAtom);\n  const store = useStore();\n  const mx = useMatrixClient();\n  const isThreadedMessage = isThreadRelationEvent(mEvent, mEvent.threadRootId);\n  const isStickerMessage = mEvent.getType() === (EventType.Sticker as string);\n  const evtId = mEvent.getId()!;\n  const evtTimeline = room.getTimelineForEvent(evtId);\n  const edits =\n    evtTimeline &&\n    getEventEdits(evtTimeline.getTimelineSet(), evtId, mEvent.getType())?.getRelations();\n  const isEdited = !!edits?.length;\n  const [showPersonaSetting] = useSetting(settingsAtom, 'showPersonaSetting');\n\n  const closeAfterHandOff = closeMessageMenu ?? requestClose;\n\n  const onTotalClose = () => {\n    setModal(null);\n    closeMenu();\n  };\n\n  const handlePostDeactivate = useCallback(() => {\n    const modal = store.get(modalAtom);\n    if (modal?.type === ModalType.MobileOptions) setModal(null);\n  }, [store, setModal]);\n\n  const [emojiBoardAnchor, setEmojiBoardAnchor] = useState<RectCords>();\n\n  const [reproxyPickerAnchor, setReproxyPickerAnchor] = useState<RectCords>();\n\n  const handleOpenReproxyPicker: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    if (isModal) {\n      pushModal({\n        type: ModalType.ReproxyPicker,\n        room,\n        mEvent,\n        closeMenu: closeAfterHandOff,\n      });\n      return;\n    }\n    setReproxyPickerAnchor(triggerRect(evt));\n  };\n\n  const handleOpenEmojiBoard: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    if (isModal) {\n      pushModal({\n        type: ModalType.ReactionPicker,\n        mEvent,\n        imagePackRooms,\n        onReactionToggle,\n        closeMenu: closeAfterHandOff,\n      });\n      return;\n    }\n    setEmojiBoardAnchor?.(triggerRect(evt));\n    setIsEmoji?.(true);\n  };\n\n  return (\n    <>\n      {emojiBoardAnchor !== undefined && (\n        <OptionsEmojiBoard\n          mEvent={mEvent}\n          onReactionToggle={onReactionToggle}\n          closeMenu={onTotalClose}\n          setEmojiBoardAnchor={setEmojiBoardAnchor}\n          emojiBoardAnchor={emojiBoardAnchor}\n          imagePackRooms={imagePackRooms}\n        />\n      )}\n      {reproxyPickerAnchor !== undefined && (\n        <OptionsReproxyPersonaPicker\n          mx={mx}\n          roomId={room.roomId}\n          mEvent={mEvent}\n          closeMenu={onTotalClose}\n          anchor={reproxyPickerAnchor}\n        />\n      )}\n      <FocusTrap\n        focusTrapOptions={{\n          initialFocus: false,\n          onDeactivate: closeMenu,\n          onPostDeactivate: handlePostDeactivate,\n          allowOutsideClick: (e: MouseEvent | TouchEvent) => {\n            e.preventDefault();\n            closeMenu();\n            return false;\n          },\n          isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown',\n          isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp',\n          escapeDeactivates: stopPropagation,\n        }}\n      >\n        <Menu className={isModal ? css.MessageOptionsSheetMenu : ''}>\n          {ActualMessage && (\n            <>\n              <WrappedMessage isModal={isModal} ActualMessage={ActualMessage} />\n              <Line direction=\"Horizontal\" variant=\"SurfaceVariant\" />\n            </>\n          )}\n          <Box\n            className={css.PreventSelect}\n            direction=\"Column\"\n            grow=\"Yes\"\n            shrink=\"No\"\n            style={{ maxHeight: '75%' }}\n            onContextMenu={(e) => e.preventDefault()}\n          >\n            {canSendReaction && onReactionToggle && setIsEmoji && (\n              <MessageQuickReactions\n                onReaction={(key, shortcode) => {\n                  onReactionToggle(mEvent.getId() ?? '', key, shortcode);\n                  onTotalClose();\n                }}\n                count={isModal ? 8 : 4}\n              />\n            )}\n            <Box direction=\"Column\" gap=\"100\" className={css.MessageMenuGroup}>\n              {canSendReaction && onReactionToggle && handleOpenEmojiBoard && (\n                <MenuItem\n                  size=\"300\"\n                  after={menuIcon(Smiley)}\n                  radii=\"300\"\n                  onClick={handleOpenEmojiBoard}\n                >\n                  <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n                    Add Reaction\n                  </Text>\n                </MenuItem>\n              )}\n\n              {canEditEvent(mx, mEvent) && onEditId && isModal && (\n                <MenuItem\n                  size=\"300\"\n                  after={menuIcon(PencilSimple)}\n                  radii=\"300\"\n                  data-event-id={mEvent.getId()}\n                  onClick={() => {\n                    onEditId(mEvent.getId());\n                    onTotalClose();\n                  }}\n                >\n                  <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n                    Edit Message\n                  </Text>\n                </MenuItem>\n              )}\n              {/* Only show \"Add to User Sticker Pack\" if the sticker isn't already in the default pack and isn't encrypted */}\n              {isStickerMessage &&\n                mEvent.getContent().url &&\n                !doesStickerExistInDefaultPack(mx, mEvent.getContent().url) && (\n                  <MenuItem\n                    size=\"300\"\n                    after={menuIcon(Star)}\n                    radii=\"300\"\n                    onClick={() => {\n                      addStickerToDefaultPack(\n                        mx,\n                        `sticker-${mEvent.getId()}`,\n                        mEvent.getContent().url ?? mEvent.getContent().file?.url ?? '',\n                        mEvent.getContent().body,\n                        mEvent.getContent().info\n                      );\n                      onTotalClose();\n                    }}\n                  >\n                    <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n                      Steal Sticker\n                    </Text>\n                  </MenuItem>\n                )}\n              {relations && (\n                <MessageAllReactionItem room={room} relations={relations} closeMenu={closeMenu} />\n              )}\n              {isGif && isModal && (\n                <MessageFavoriteGifItem room={room} mEvent={mEvent} onClose={closeMenu} />\n              )}\n              {!hideReplyButton && (\n                <MenuItem\n                  size=\"300\"\n                  after={menuIcon(ArrowBendUpLeftIcon)}\n                  radii=\"300\"\n                  data-event-id={mEvent.getId()}\n                  onClick={(evt) => {\n                    onReplyClick(evt);\n                    onTotalClose();\n                  }}\n                >\n                  <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n                    Reply\n                  </Text>\n                </MenuItem>\n              )}\n              {!isThreadedMessage && (\n                <MenuItem\n                  size=\"300\"\n                  after={menuIcon(ChatCircleDots)}\n                  radii=\"300\"\n                  data-event-id={mEvent.getId()}\n                  onClick={(evt) => {\n                    onReplyClick(evt, true);\n                    onTotalClose();\n                  }}\n                >\n                  <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n                    Reply in Thread\n                  </Text>\n                </MenuItem>\n              )}\n              {canEditEvent(mx, mEvent) && onEditId && !isModal && (\n                <MenuItem\n                  size=\"300\"\n                  after={menuIcon(PencilSimple)}\n                  radii=\"300\"\n                  data-event-id={mEvent.getId()}\n                  onClick={() => {\n                    onEditId(mEvent.getId());\n                    onTotalClose();\n                  }}\n                >\n                  <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n                    Edit Message\n                  </Text>\n                </MenuItem>\n              )}\n              {canEditEvent(mx, mEvent) && showPersonaSetting && (\n                <MenuItem\n                  size=\"300\"\n                  after={menuIcon(UserIcon)}\n                  radii=\"300\"\n                  data-event-id={mEvent.getId()}\n                  onClick={handleOpenReproxyPicker}\n                >\n                  <Text className={css.MessageMenuItemText} as=\"span\" size=\"T300\" truncate>\n                    Change Persona\n                  </Text>\n                </MenuItem>\n              )}\n              {!hideReadReceipts && (\n                <MessageReadReceiptItem\n                  room={room}\n                  eventId={mEvent.getId() ?? ''}\n                  closeMenu={closeMenu}\n                />\n              )}\n              {isEdited && (\n                <MessageEditHistoryItem room={room} mEvent={mEvent} closeMenu={closeMenu} />\n              )}\n              {showDeveloperTools && (\n                <MessageSourceCodeItem room={room} mEvent={mEvent} closeMenu={closeMenu} />\n              )}\n              <MessageCopyLinkItem room={room} mEvent={mEvent} onClose={onTotalClose} />\n\n              <MessageCopyTextItem room={room} mEvent={mEvent} onClose={onTotalClose} />\n              {canForwardEvent(mEvent) && (\n                <MessageForwardItem room={room} mEvent={mEvent} onClose={closeMenu} />\n              )}\n              <MessageBookmarkItem room={room} mEvent={mEvent} onClose={closeMenu} />\n              {canPinEvent && <MessagePinItem room={room} mEvent={mEvent} onClose={onTotalClose} />}\n            </Box>\n            {((!mEvent.isRedacted() && canDelete) || mEvent.getSender() !== mx.getUserId()) && (\n              <>\n                <Line size=\"300\" />\n                <Box direction=\"Column\" gap=\"100\" className={css.MessageMenuGroup}>\n                  {!mEvent.isRedacted() && canDelete && (\n                    <MessageDeleteItem room={room} mEvent={mEvent} closeMenu={closeMenu} />\n                  )}\n                  {mEvent.getSender() !== mx.getUserId() && (\n                    <MessageReportItem room={room} mEvent={mEvent} closeMenu={closeMenu} />\n                  )}\n                </Box>\n              </>\n            )}\n          </Box>\n        </Menu>\n      </FocusTrap>\n    </>\n  );\n}\n\nexport function MobileOptionsInternal({ options }: { options: OptionMenuProps }) {\n  const [isActive, setIsActive] = useState(true);\n  const [modal, setModal] = useAtom(modalAtom);\n\n  // The composer keeps the mobile keyboard open until its focused element is blurred.\n  useLayoutEffect(() => {\n    const activeElement = document.activeElement;\n    if (activeElement instanceof HTMLElement) activeElement.blur();\n  }, []);\n\n  useEffect(() => {\n    if (modal?.type === ModalType.MobileOptions) setIsActive(true);\n    if (!isActive) setModal(null);\n  }, [modal, setIsActive, isActive, setModal]);\n\n  const requestClose = () => {\n    options.closeMenu();\n    setIsActive(false);\n  };\n\n  if (isActive)\n    return (\n      <MobileSwipeDownModal requestClose={requestClose}>\n        {() => (\n          <OptionMenu\n            mEvent={options.mEvent}\n            room={options.room}\n            closeMenu={requestClose}\n            onReactionToggle={options.onReactionToggle}\n            relations={options.relations}\n            onReplyClick={options.onReplyClick}\n            onEditId={options.onEditId}\n            hideReadReceipts={options.hideReadReceipts}\n            showDeveloperTools={options.showDeveloperTools}\n            canPinEvent={options.canPinEvent}\n            canDelete={options.canDelete}\n            setIsEmoji={options.setIsEmoji}\n            imagePackRooms={options.imagePackRooms}\n            closeMessageMenu={options.closeMenu}\n            ActualMessage={options.ActualMessage}\n            canSendReaction={options.canSendReaction}\n            isModal\n            isGif={options.isGif}\n          />\n        )}\n      </MobileSwipeDownModal>\n    );\n  return <></>;\n}\n","const IGNORED_MESSAGE_GESTURE_SELECTOR = '[data-gestures=\"ignore\"]:not([data-message-swipe])';\n\nexport function shouldIgnoreMessageLongPress(target: Element | null | undefined): boolean {\n  return target?.closest(IGNORED_MESSAGE_GESTURE_SELECTOR) !== null;\n}\n","// oxlint-disable no-console\nimport type { RectCords } from 'folds';\nimport { Avatar, Box, Chip, Text, Tooltip, as, config, toRem } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { PopOut } from '$components/overlay-stack';\nimport type { JSX, KeyboardEventHandler, MouseEventHandler, MouseEvent, ReactNode } from 'react';\nimport {\n  memo,\n  useCallback,\n  useRef,\n  useState,\n  useEffect,\n  useMemo,\n  useImperativeHandle,\n} from 'react';\nimport { useHover, useFocusWithin } from 'react-aria';\nimport type { MatrixEvent, Room, Relations } from '$types/matrix-sdk';\nimport { EventStatus, MatrixEventEvent, MsgType, RoomEvent } from '$types/matrix-sdk';\nimport classNames from 'classnames';\nimport { useSetAtom } from 'jotai';\nimport {\n  AvatarBase,\n  BubbleLayout,\n  checkIfGif,\n  CompactLayout,\n  MessageBase,\n  ModernLayout,\n  PronounPill,\n  Time,\n  Username,\n  UsernameBold,\n} from '$components/message';\nimport { canEditEvent, getEditedEvent } from '$utils/room/relations';\nimport { getMemberAvatarMxc } from '$utils/room/display';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport { parseExternalGif } from '$utils/externalGif';\nimport { parseLegacyKlipyGif } from '$utils/klipy';\nimport type { MessageSpacing } from '$state/settings';\nimport { getSettings, MessageLayout, settingsAtom } from '$state/settings';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { UserAvatar } from '$components/user-avatar';\nimport { getMatrixToRoomEvent } from '$plugins/matrix-to';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport type { MemberPowerTag } from '$types/matrix/room';\n\nimport { PowerIcon } from '$components/power';\nimport { Info, menuIcon, userFallbackIcon } from '$components/icons/phosphor';\nimport { getPowerTagIconSrc } from '$hooks/useMemberPowerTag';\nimport { useSableCosmetics } from '$hooks/useSableCosmetics';\nimport { SwipeableMessageWrapper, type SwipeActionMode } from '$components/SwipeableMessageWrapper';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { useUserProfile } from '$hooks/useUserProfile';\nimport { useRoomMemberHydration } from '$hooks/useRoomMemberHydration';\nimport { useSetting } from '$state/hooks/settings';\nimport { filterPronounsByLanguage, getParsedPronouns } from '$utils/pronouns';\nimport type { PronounSet } from '$utils/pronouns';\nimport { useMentionClickHandler } from '$hooks/useMentionClickHandler';\nimport type { PerMessageProfileBeeperFormat } from '$hooks/usePerMessageProfile';\nimport { convertBeeperFormatToOurPerMessageProfile } from '$hooks/usePerMessageProfile';\nimport { MessageEditor } from './MessageEditor';\nimport * as css from './styles.css';\nimport { modalAtom, ModalType } from '$state/modal';\nimport { OptionQuickMenu } from '$components/message/modals/Options';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\n\nexport type ReactionHandler = (keyOrMxc: string, shortcode: string) => void;\n\nexport const MemoizedBody = memo(({ children }: { children: ReactNode }) => children);\n\nexport type ForwardedMessageProps = {\n  originalTimestamp: number;\n  isForwarded: boolean;\n  originalRoomId: string;\n  originalEventId: string;\n  originalEventPrivate: boolean;\n};\n\nexport type MSC2723ForwardedMessageProps = {\n  event_id: string;\n  room_id: string;\n  sender: string | null;\n  origin_server_ts: number;\n};\n\nexport type MessageProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  collapse: boolean;\n  highlight: boolean;\n  notifyHighlight?: 'silent' | 'loud';\n  isMarked?: boolean;\n  edit?: boolean;\n  canDelete?: boolean;\n  canSendReaction?: boolean;\n  canPinEvent?: boolean;\n  imagePackRooms?: Room[];\n  relations?: Relations;\n  messageLayout?: MessageLayout;\n  messageSpacing: MessageSpacing;\n  onUserClick: MouseEventHandler<HTMLButtonElement>;\n  onUsernameClick: MouseEventHandler<HTMLButtonElement>;\n  onReplyClick: (\n    ev: Parameters<MouseEventHandler<HTMLButtonElement>>[0],\n    startThread?: boolean\n  ) => void;\n  onEditId?: (eventId?: string) => void;\n  onReproxyId?: (eventId?: string) => void;\n  onReactionToggle: (targetEventId: string, key: string, shortcode?: string) => void;\n  reply?: ReactNode;\n  reactions?: ReactNode;\n  hideReadReceipts?: boolean;\n  hideReplyButton?: boolean;\n  showDeveloperTools?: boolean;\n  memberPowerTag?: MemberPowerTag;\n  hour24Clock: boolean;\n  dateFormatString: string;\n  senderId: string;\n  senderDisplayName: string;\n  content?: string;\n  activeReplyId?: string | null;\n  sendStatus?: EventStatus | null;\n  onResend?: (event: MatrixEvent) => void;\n  onDeleteFailedSend?: (event: MatrixEvent) => void;\n  messageForwardedProps?: ForwardedMessageProps;\n  msc2723ForwardedMessageProps?: MSC2723ForwardedMessageProps;\n};\n\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { ThemeKind, useActiveTheme } from '$hooks/useTheme';\nimport { useAccessibleNameColor } from '$hooks/useAccessibleNameColor';\nimport { shouldIgnoreMessageLongPress } from './messageTouch';\n\nconst clamp = (str: string, len: number) => (str.length > len ? `${str.slice(0, len)}...` : str);\n\ntype MorePronounsPillProps = {\n  pronouns: PronounSet[];\n  tagColor: string;\n  maxPillLength: number;\n};\n\nfunction MorePronounsPill({ pronouns, tagColor, maxPillLength }: MorePronounsPillProps) {\n  const [anchor, setAnchor] = useState<RectCords | undefined>();\n\n  const toggleAnchor = (target: HTMLElement) => {\n    setAnchor((prev) => (prev ? undefined : target.getBoundingClientRect()));\n  };\n\n  const handleClick: MouseEventHandler<HTMLElement> = (e) => {\n    e.stopPropagation();\n    toggleAnchor(e.currentTarget);\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLElement> = (e) => {\n    if (e.key !== 'Enter' && e.key !== ' ') return;\n    e.preventDefault();\n    e.stopPropagation();\n    toggleAnchor(e.currentTarget);\n  };\n\n  // On mobile, tapping the pill pins the tooltip open.\n  // Tapping anywhere else dismisses it.\n  useEffect(() => {\n    if (!anchor) return undefined;\n    const dismiss = () => setAnchor(undefined);\n    document.addEventListener('click', dismiss, { once: true });\n    return () => document.removeEventListener('click', dismiss);\n  }, [anchor]);\n\n  const tooltipText = pronouns.map((p) => clamp(p.summary, maxPillLength)).join(', ');\n\n  const tooltipContent = (\n    <Tooltip style={{ maxWidth: toRem(250) }}>\n      <Text size=\"T200\">{tooltipText}</Text>\n    </Tooltip>\n  );\n\n  return (\n    <>\n      <TooltipProvider position=\"Top\" tooltip={tooltipContent}>\n        {(triggerRef) => (\n          <PronounPill\n            ref={triggerRef as React.Ref<HTMLSpanElement>}\n            style={{ color: tagColor, cursor: 'help' }}\n            onClick={handleClick}\n            onKeyDown={handleKeyDown}\n            role=\"button\"\n            tabIndex={0}\n          >\n            ...\n          </PronounPill>\n        )}\n      </TooltipProvider>\n      {anchor && (\n        <PopOut anchor={anchor} position=\"Top\" align=\"Center\" content={tooltipContent}>\n          {null}\n        </PopOut>\n      )}\n    </>\n  );\n}\n\n/**\n * Component to render pronouns in the chat timeline.\n * It also filters them.\n */\nexport const Pronouns = as<\n  'span',\n  {\n    pronouns?: PronounSet[];\n    tagColor: string;\n  }\n>(({ as: AsPronouns = 'span', pronouns, tagColor, ...props }, ref) => {\n  if (!pronouns || pronouns.length === 0) return null;\n\n  const languageFilterEnabled = getSettings().filterPronounsBasedOnLanguage ?? false;\n  // if no language is given use english\n  const selectedLanguages = (getSettings().filterPronounsLanguages ?? ['en'])\n    .map((lang: string) => lang.trim().toLowerCase())\n    .filter(Boolean);\n\n  /**\n   * filter the pronouns based on the user's language settings.\n   * If filtering is enabled, only show pronouns that match the selected languages.\n   * If filtering is disabled, show all pronouns but still apply the language filter to determine which pronouns to show if there are multiple sets of pronouns for different languages.\n   * If there are multiple sets of pronouns and filtering is enabled, only show the ones that match the selected languages.\n   * If there are no pronouns that match the selected languages, show all pronouns.\n   */\n  const visiblePronouns = filterPronounsByLanguage(\n    pronouns,\n    languageFilterEnabled,\n    selectedLanguages\n  );\n\n  const limit = getSettings().pronounPillMaxCount ?? (isMobileOrTablet() ? 1 : 3);\n  const maxPillLength = getSettings().pronounPillMaxLength ?? 16;\n\n  // if language specific pronouns can't be found matching the filter return unfiltered\n  if (visiblePronouns.length === 0) {\n    visiblePronouns.push(...pronouns);\n  }\n\n  return (\n    <AsPronouns {...props} ref={ref}>\n      {visiblePronouns.slice(0, limit).map((p) => (\n        <PronounPill key={p.summary} style={{ color: tagColor }}>\n          {clamp(p.summary, maxPillLength)}\n        </PronounPill>\n      ))}\n      {visiblePronouns.length > limit && (\n        <MorePronounsPill\n          pronouns={visiblePronouns.slice(limit)}\n          tagColor={tagColor}\n          maxPillLength={maxPillLength}\n        />\n      )}\n    </AsPronouns>\n  );\n});\ntype WrappedMessageProps = {\n  headerJSX: JSX.Element;\n  avatarJSX: JSX.Element;\n  msgContentJSX: JSX.Element;\n  messageLayout?: MessageLayout;\n  handleSwipeReply?: () => void;\n  handleSwipeEdit?: () => void;\n  handleSwipeActionChange?: (mode: SwipeActionMode) => void;\n  align?: 'left' | 'right';\n};\nfunction WrappedMessage({\n  headerJSX,\n  avatarJSX,\n  msgContentJSX,\n  messageLayout,\n  handleSwipeReply,\n  handleSwipeEdit,\n  handleSwipeActionChange,\n  align,\n}: WrappedMessageProps) {\n  if (messageLayout === undefined) return <>{msgContentJSX}</>;\n\n  if (messageLayout === MessageLayout.Compact)\n    return (\n      <SwipeableMessageWrapper\n        onReply={handleSwipeReply}\n        onEdit={handleSwipeEdit}\n        onActionModeChange={handleSwipeActionChange}\n      >\n        <CompactLayout before={headerJSX}>{msgContentJSX}</CompactLayout>\n      </SwipeableMessageWrapper>\n    );\n  if (messageLayout === MessageLayout.Bubble)\n    return (\n      <SwipeableMessageWrapper\n        onReply={handleSwipeReply}\n        onEdit={handleSwipeEdit}\n        onActionModeChange={handleSwipeActionChange}\n      >\n        <BubbleLayout before={avatarJSX} header={headerJSX} align={align}>\n          {msgContentJSX}\n        </BubbleLayout>\n      </SwipeableMessageWrapper>\n    );\n  return (\n    <SwipeableMessageWrapper\n      onReply={handleSwipeReply}\n      onEdit={handleSwipeEdit}\n      onActionModeChange={handleSwipeActionChange}\n    >\n      <ModernLayout before={avatarJSX}>\n        {headerJSX}\n        {msgContentJSX}\n      </ModernLayout>\n    </SwipeableMessageWrapper>\n  );\n}\n\nfunction MessageInternal(\n  {\n    className,\n    room,\n    mEvent,\n    collapse,\n    highlight,\n    notifyHighlight,\n    isMarked,\n    edit,\n    canDelete,\n    canSendReaction,\n    canPinEvent,\n    imagePackRooms,\n    relations,\n    messageLayout,\n    messageSpacing,\n    onUserClick,\n    onUsernameClick,\n    onReplyClick,\n    onReactionToggle,\n    onEditId,\n    onReproxyId,\n    reply,\n    reactions,\n    hideReadReceipts,\n    hideReplyButton,\n    showDeveloperTools,\n    memberPowerTag,\n    hour24Clock,\n    dateFormatString,\n    children,\n    senderId,\n    senderDisplayName,\n    activeReplyId,\n    sendStatus,\n    onResend,\n    onDeleteFailedSend,\n    messageForwardedProps,\n    msc2723ForwardedMessageProps,\n    ...props\n  }: MessageProps & { className?: string; children?: ReactNode },\n  ref:\n    | ((instance: HTMLDivElement | null) => void)\n    | React.RefObject<HTMLDivElement | null>\n    | null\n    | undefined\n) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const messageRef = useRef<HTMLDivElement>(null);\n  useImperativeHandle(ref, () => messageRef.current as HTMLDivElement);\n  const [isVisible, setIsVisible] = useState(() => typeof IntersectionObserver === 'undefined');\n  const activeTheme = useActiveTheme();\n  const [renderPersonaColors] = useSetting(settingsAtom, 'renderPersonaColors');\n\n  useEffect(() => {\n    const element = messageRef.current;\n    if (!element || typeof IntersectionObserver === 'undefined') {\n      setIsVisible(true);\n      return undefined;\n    }\n\n    const observer = new IntersectionObserver(([entry]) => {\n      setIsVisible(entry?.isIntersecting === true);\n    });\n    observer.observe(element);\n    return () => observer.disconnect();\n  }, []);\n\n  const [isEmoji, setIsEmoji] = useState(false);\n\n  const setModal = useSetAtom(modalAtom);\n  const [contentVersion, setContentVersion] = useState(0);\n\n  const isGif = useMemo(() => {\n    const content = mEvent.getContent();\n    if (content.msgtype === MsgType.Text) return !!parseExternalGif(content);\n    if (content.msgtype !== MsgType.Image) return false;\n    return (\n      !!parseLegacyKlipyGif(content) ||\n      checkIfGif(content?.info?.url ?? '', content?.info?.mimetype, content?.body)\n    );\n  }, [mEvent]);\n\n  useEffect(() => {\n    const triggerTimelineRegroup = () => {\n      // A Local Echo update seems to trigger a visual refresh without\n      // scrolling the viewport.\n      room.emit(RoomEvent.LocalEchoUpdated, mEvent, room);\n    };\n\n    const onUpdate = () => {\n      setContentVersion((v) => v + 1);\n      triggerTimelineRegroup();\n    };\n\n    if (mEvent.getClearContent()) {\n      setContentVersion((v) => (v === 0 ? 1 : v));\n      triggerTimelineRegroup();\n    }\n\n    mEvent.on(MatrixEventEvent.Decrypted, onUpdate);\n    mEvent.on(MatrixEventEvent.Replaced, onUpdate);\n    return () => {\n      mEvent.off(MatrixEventEvent.Decrypted, onUpdate);\n      mEvent.off(MatrixEventEvent.Replaced, onUpdate);\n    };\n  }, [mEvent, room]);\n\n  /**\n   * We read the per-message profile from the event content here.\n   * We have to do this in the message component because the per-message profile can be different for each message, and we need to read it for each message individually.\n   * We also want to avoid reading and parsing the per-message profile in a parent component like the timeline, because that would be inefficient and would cause unnecessary re-renders of the entire timeline whenever a per-message profile changes.\n   */\n  const pmp: PerMessageProfileBeeperFormat | undefined = useMemo(() => {\n    // `contentVersion` is a cache-busting key when the event updates in place.\n    void contentVersion;\n    const evtId = mEvent.getId();\n    const evtTimeline = evtId ? room.getTimelineForEvent(evtId) : undefined;\n    const editedEvent =\n      evtTimeline && evtId\n        ? getEditedEvent(evtId, mEvent, evtTimeline.getTimelineSet())\n        : undefined;\n\n    const resolvedContent = editedEvent\n      ? editedEvent.getContent()['m.new_content']\n      : mEvent.getContent();\n\n    return resolvedContent?.['com.beeper.per_message_profile'] as\n      | PerMessageProfileBeeperFormat\n      | undefined;\n  }, [mEvent, room, contentVersion]);\n\n  /**\n   * We convert the per-message profile from the Beeper format to our internal format here in the message component\n   */\n  const parsedPMPContent = useMemo(() => {\n    if (!pmp) return undefined;\n    return convertBeeperFormatToOurPerMessageProfile(pmp);\n  }, [pmp]);\n\n  const pmpNameColor = useMemo(() => {\n    if (!renderPersonaColors) return undefined;\n    const pmpNameColorLight = parsedPMPContent?.['eu.she-a.color']?.on_light;\n    const pmpNameColorDark = parsedPMPContent?.['eu.she-a.color']?.on_dark;\n\n    return activeTheme.kind === ThemeKind.Dark ? pmpNameColorDark : pmpNameColorLight;\n  }, [parsedPMPContent, activeTheme, renderPersonaColors]);\n\n  /**\n   * boolean to indicate wheather we should indicate to the user that it is a pmp\n   * We want to not show it, when the name is unset, or whitespace only\n   */\n  const showPmPInfo = parsedPMPContent?.displayname && parsedPMPContent.displayname?.trim() !== '';\n  // Profiles and Colors\n  const profile = useUserProfile(senderId, room, undefined, true, isVisible);\n  const { color: usernameColor, font: usernameFont } = useSableCosmetics(\n    senderId,\n    room,\n    false,\n    isVisible\n  );\n\n  const accessibleNameColor = useAccessibleNameColor(activeTheme.kind);\n\n  const senderFallbackName = getMxIdLocalPart(senderId) ?? senderId;\n  const resolvedSenderDisplayName =\n    senderDisplayName === senderFallbackName || senderDisplayName === senderId\n      ? (profile.displayName ?? senderDisplayName)\n      : senderDisplayName;\n\n  /**\n   * If there is a per-message profile, we want to use the per message pronouns,\n   * otherwise we fall back to the profile pronouns.\n   * This allows users to set pronouns on a per-message basis, while still falling back to their profile pronouns if they don't set any for a specific message.\n   */\n  const pronouns = parsedPMPContent?.['io.fsky.nyx.pronouns'] ?? profile.pronouns;\n\n  const [highlightMentions] = useSetting(settingsAtom, 'highlightMentions');\n\n  // Avatars\n  // Prefer the room-scoped member avatar (m.room.member) over the global profile\n  // avatar so per-room avatar overrides are respected in the timeline.\n  useRoomMemberHydration(room, senderId, mEvent.sender !== null, profile.displayName);\n  const memberAvatarMxc = mEvent.sender?.getMxcAvatarUrl() ?? getMemberAvatarMxc(room, senderId);\n  const avatarUrl = useMemo(() => {\n    const mxc = pmp?.avatar_url || memberAvatarMxc || profile.avatarUrl;\n    return mxc ? mxcUrlToHttp(mx, mxc, useAuthentication, 48, 48, 'crop') : undefined;\n  }, [pmp, memberAvatarMxc, profile.avatarUrl, mx, useAuthentication]);\n\n  const cachedAvatar = useRenderableMediaUrl(avatarUrl ?? undefined);\n\n  // UI State\n  const [isDesktopHover, setIsDesktopHover] = useState(false);\n  const { hoverProps } = useHover({\n    onHoverChange: (h) => {\n      if (!isMobileOrTablet()) setIsDesktopHover(h);\n    },\n  });\n  const { focusWithinProps } = useFocusWithin({\n    onFocusWithinChange: (f) => {\n      if (!isMobileOrTablet()) setIsDesktopHover(f);\n    },\n  });\n\n  // Touch opens the mobile sheet, not the desktop popout; the hook still owns\n  // the press-feedback timer so `isPressing` keeps working.\n  const menu = useMenuAnchor<HTMLDivElement>({\n    onLongPress: () => {\n      if (!edit) openMobileOptions();\n    },\n  });\n\n  const tagIconSrc = memberPowerTag?.icon\n    ? getPowerTagIconSrc(mx, useAuthentication, memberPowerTag.icon)\n    : undefined;\n\n  const optionsRef = useRef<HTMLDivElement>(null);\n\n  const [showPronouns] = useSetting(settingsAtom, 'showPronouns');\n  const [parsePronouns] = useSetting(settingsAtom, 'parsePronouns');\n\n  const [useRightBubbles] = useSetting(settingsAtom, 'useRightBubbles');\n  const { cleanedDisplayName, inlinePronoun } = useMemo(() => {\n    const rawName = pmp?.displayname || resolvedSenderDisplayName || '';\n    return getParsedPronouns(rawName, parsePronouns);\n  }, [pmp, resolvedSenderDisplayName, parsePronouns]);\n\n  const mergedPronouns = useMemo(() => {\n    const existing = pronouns ? [...pronouns] : [];\n\n    if (inlinePronoun) {\n      const isDupe = existing.some((p) => p.summary?.toLowerCase() === inlinePronoun);\n\n      if (!isDupe) {\n        existing.push({\n          summary: inlinePronoun,\n          language: 'en',\n        });\n      }\n    }\n\n    return existing;\n  }, [pronouns, inlinePronoun]);\n\n  const headerJSX = (collapsed?: boolean) => {\n    if (!collapsed)\n      return (\n        <Box\n          gap=\"300\"\n          direction={\n            messageLayout === MessageLayout.Compact ||\n            (messageLayout === MessageLayout.Bubble &&\n              useRightBubbles &&\n              senderId === mx.getUserId())\n              ? 'RowReverse'\n              : 'Row'\n          }\n          justifyContent=\"SpaceBetween\"\n          alignItems=\"Baseline\"\n          grow=\"Yes\"\n        >\n          <Box\n            alignItems=\"Center\"\n            gap=\"100\"\n            grow=\"Yes\"\n            style={{ minWidth: 0 }}\n            direction={\n              messageLayout === MessageLayout.Bubble &&\n              useRightBubbles &&\n              senderId === mx.getUserId()\n                ? 'RowReverse'\n                : undefined\n            }\n          >\n            <Username\n              as=\"button\"\n              style={{\n                color: accessibleNameColor(pmpNameColor) ?? usernameColor,\n                fontFamily: usernameFont,\n              }}\n              data-user-id={senderId}\n              onContextMenu={onUserClick}\n              onClick={onUsernameClick}\n            >\n              <Text\n                as=\"span\"\n                size={messageLayout === MessageLayout.Bubble ? 'T300' : 'T400'}\n                truncate\n              >\n                <UsernameBold>{cleanedDisplayName}</UsernameBold>\n              </Text>\n            </Username>\n            {showPronouns && (\n              <Pronouns\n                pronouns={mergedPronouns}\n                tagColor={accessibleNameColor(pmpNameColor) ?? usernameColor ?? 'currentColor'}\n              />\n            )}\n            {showPmPInfo && (\n              <Box>\n                <Text as=\"span\">\n                  <Text\n                    as=\"span\"\n                    style={{\n                      paddingLeft: 0,\n                      paddingRight: 5,\n                      fontWeight: 100,\n                      fontSize: 11,\n                    }}\n                  >\n                    via\n                  </Text>\n                  <Text\n                    as=\"span\"\n                    size={messageLayout === MessageLayout.Bubble ? 'T300' : 'T400'}\n                    style={{ fontSize: 11 }}\n                    truncate\n                  >\n                    <UsernameBold>{resolvedSenderDisplayName}</UsernameBold>\n                  </Text>\n                </Text>\n              </Box>\n            )}\n            {tagIconSrc && <PowerIcon size=\"100\" iconSrc={tagIconSrc} />}\n          </Box>\n          <Box shrink=\"No\" gap=\"100\">\n            {messageLayout === MessageLayout.Modern && isDesktopHover && (\n              <>\n                <Text as=\"span\" size=\"T200\" priority=\"300\">\n                  {senderId}\n                </Text>\n                <Text as=\"span\" size=\"T200\" priority=\"300\">\n                  |\n                </Text>\n              </>\n            )}\n            <Time\n              ts={mEvent.getTs()}\n              compact={messageLayout === MessageLayout.Compact}\n              hour24Clock={hour24Clock}\n              dateFormatString={dateFormatString}\n            />\n          </Box>\n        </Box>\n      );\n    return <></>;\n  };\n\n  const avatarJSX = (collapsed?: boolean) => {\n    if (!collapsed && messageLayout !== MessageLayout.Compact)\n      return (\n        <AvatarBase\n          className={messageLayout === MessageLayout.Bubble ? css.BubbleAvatarBase : undefined}\n        >\n          <Avatar\n            className={css.MessageAvatar}\n            as=\"button\"\n            size=\"300\"\n            data-user-id={senderId}\n            data-parent-message-id={mEvent.getId() ?? ':3'}\n            onClick={onUserClick}\n          >\n            <UserAvatar\n              userId={senderId}\n              src={cachedAvatar}\n              alt={cleanedDisplayName}\n              renderFallback={() => userFallbackIcon('md')}\n            />\n          </Avatar>\n        </AvatarBase>\n      );\n    return <></>;\n  };\n\n  const stableContent = useMemo(\n    () => mEvent.getContent().body || mEvent.getContent()['org.matrix.msc3381.poll.start'] || '',\n    [mEvent]\n  );\n  const isPendingSend =\n    sendStatus === EventStatus.ENCRYPTING ||\n    sendStatus === EventStatus.QUEUED ||\n    sendStatus === EventStatus.SENDING;\n  const isFailedSend = sendStatus === EventStatus.NOT_SENT;\n  const canResend = isFailedSend && senderId === mx.getUserId() && !!onResend;\n  const canDeleteFailedSend = isFailedSend && senderId === mx.getUserId() && !!onDeleteFailedSend;\n  // handle clicks on mentions in the message body (e.g. jump to original message from a forwarded message notice)\n  const mentionClickHandler = useMentionClickHandler(room.roomId);\n\n  const forwardedNotice = useMemo(() => {\n    const isSameRoomForward = (originalRoomId: string | undefined) =>\n      originalRoomId !== undefined && originalRoomId === room.roomId;\n\n    if (messageForwardedProps?.isForwarded) {\n      const originalRoomId = messageForwardedProps.originalRoomId;\n      return {\n        label: messageForwardedProps.originalEventPrivate\n          ? 'Forwarded private message'\n          : isSameRoomForward(originalRoomId)\n            ? 'Forwarded from earlier in this room'\n            : 'Forwarded from another room',\n        roomId: originalRoomId,\n        eventId: messageForwardedProps.originalEventId,\n        ts: messageForwardedProps.originalTimestamp ?? 0,\n        showLink: !messageForwardedProps.originalEventPrivate,\n      };\n    }\n\n    if (msc2723ForwardedMessageProps) {\n      const originalRoomId = msc2723ForwardedMessageProps.room_id;\n      return {\n        label: isSameRoomForward(originalRoomId)\n          ? 'Forwarded from earlier in this room'\n          : 'Forwarded from another room',\n        roomId: originalRoomId,\n        eventId: msc2723ForwardedMessageProps.event_id,\n        ts: msc2723ForwardedMessageProps.origin_server_ts ?? 0,\n        showLink: true,\n      };\n    }\n\n    return null;\n  }, [messageForwardedProps, msc2723ForwardedMessageProps, room.roomId]);\n\n  const handleResendClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      onResend?.(mEvent);\n    },\n    [mEvent, onResend]\n  );\n\n  const handleDeleteFailedSendClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      onDeleteFailedSend?.(mEvent);\n    },\n    [mEvent, onDeleteFailedSend]\n  );\n\n  const MSG_CONTENT_STYLE = { width: '100%' };\n  const isSableFeedback = mEvent.getId()?.startsWith('~sable-feedback-');\n\n  const msgContentJSX = (\n    <Box\n      direction=\"Column\"\n      alignSelf=\"Start\"\n      style={MSG_CONTENT_STYLE}\n      className={classNames({\n        [css.MessagePending]: isPendingSend,\n        [css.MessageFailed]: isFailedSend,\n      })}\n    >\n      {forwardedNotice && (\n        <Chip as=\"div\" variant=\"SurfaceVariant\" radii=\"Pill\">\n          <Text size=\"T200\" priority=\"300\">\n            {forwardedNotice.label}\n            {forwardedNotice.showLink && (\n              <>\n                {' '}\n                <a\n                  href={getMatrixToRoomEvent(forwardedNotice.roomId, forwardedNotice.eventId)}\n                  rel=\"noreferrer noopener\"\n                  data-mention-id={forwardedNotice.roomId}\n                  data-mention-event-id={forwardedNotice.eventId}\n                  onClick={mentionClickHandler}\n                >\n                  jump to original\n                </a>\n              </>\n            )}\n            <Time\n              ts={forwardedNotice.ts}\n              compact={messageLayout === MessageLayout.Compact}\n              hour24Clock={hour24Clock}\n              dateFormatString={dateFormatString}\n              style={{ marginLeft: config.space.S100, justifyContent: 'flex-end' }}\n            />\n          </Text>\n        </Chip>\n      )}\n      {reply}\n      {edit && onEditId && !isMobileOrTablet() ? (\n        <MessageEditor\n          style={{\n            maxWidth: '100%',\n            width: '100%',\n          }}\n          roomId={room.roomId}\n          room={room}\n          mEvent={mEvent}\n          imagePackRooms={imagePackRooms}\n          onCancel={() => onEditId()}\n        />\n      ) : (\n        <MemoizedBody key={stableContent}>{children}</MemoizedBody>\n      )}\n      {reactions}\n      {isFailedSend && (\n        <Box className={css.SendStatusRow}>\n          <Text size=\"T200\" priority=\"300\">\n            Failed to send.\n          </Text>\n          {canResend && (\n            <Chip type=\"button\" variant=\"Primary\" radii=\"Pill\" outlined onClick={handleResendClick}>\n              <Text size=\"B300\">Retry</Text>\n            </Chip>\n          )}\n          {canDeleteFailedSend && (\n            <Chip\n              type=\"button\"\n              variant=\"Critical\"\n              radii=\"Pill\"\n              onClick={handleDeleteFailedSendClick}\n            >\n              <Text size=\"B300\">Delete</Text>\n            </Chip>\n          )}\n        </Box>\n      )}\n      {isSableFeedback && (\n        <Box className={css.SendStatusRow} alignItems=\"Center\" gap=\"100\">\n          {menuIcon(Info)}\n          <Text size=\"T200\" priority=\"300\" as=\"span\">\n            Only you can see this.\n          </Text>\n          <Chip\n            type=\"button\"\n            variant=\"SurfaceVariant\"\n            radii=\"Pill\"\n            outlined\n            onClick={(evt: React.MouseEvent) => {\n              evt.preventDefault();\n              evt.stopPropagation();\n              const eventId = mEvent.getId();\n              if (eventId) {\n                room.removeEvent(eventId);\n                room.emit(RoomEvent.LocalEchoUpdated, mEvent, room);\n              }\n            }}\n          >\n            <Text size=\"B300\">Dismiss</Text>\n          </Chip>\n        </Box>\n      )}\n    </Box>\n  );\n\n  const closeMenu = () => {\n    menu.close();\n    setIsDesktopHover(false);\n    setIsEmoji(false);\n  };\n\n  const openMobileOptions = () => {\n    setModal({\n      type: ModalType.MobileOptions,\n      options: {\n        mEvent: mEvent,\n        room: room,\n        closeMenu: closeMenu,\n        onReactionToggle: onReactionToggle,\n        relations: relations,\n        onReplyClick: onReplyClick,\n        onEditId: onEditId,\n        hideReadReceipts: hideReadReceipts,\n        showDeveloperTools: showDeveloperTools,\n        canPinEvent: canPinEvent,\n        canDelete: canDelete,\n        setIsEmoji: setIsEmoji,\n        imagePackRooms: imagePackRooms,\n        ActualMessage: (\n          <div style={{ width: '100%' }}>\n            <WrappedMessage\n              headerJSX={headerJSX()}\n              avatarJSX={avatarJSX()}\n              msgContentJSX={msgContentJSX}\n              messageLayout={messageLayout}\n              align={useRightBubbles && senderId === mx.getUserId() ? 'right' : 'left'}\n            />\n          </div>\n        ),\n        canSendReaction: canSendReaction,\n        isGif: isGif,\n      },\n    });\n  };\n\n  const contextMenuHandler: MouseEventHandler<HTMLDivElement> = (evt) => {\n    if (evt.altKey || !window.getSelection()?.isCollapsed || edit) return;\n    const tag = (evt.target as HTMLElement).tagName;\n    if (typeof tag === 'string' && tag.toLowerCase() === 'a') return;\n    if (isMobileOrTablet()) {\n      evt.preventDefault();\n      // The long-press timer already opened the sheet; this is its synthetic follow-up.\n      if (menu.consumeLongPressFired()) return;\n      openMobileOptions();\n      return;\n    }\n    menu.triggerProps.onContextMenu(evt);\n  };\n\n  const handleOpenMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    const target = evt.currentTarget.parentElement?.parentElement ?? evt.currentTarget;\n    window.requestAnimationFrame(() => {\n      menu.openAt(target);\n    });\n  };\n\n  const handleSwipeReply = () => {\n    if (onEditId) {\n      onEditId(undefined);\n    }\n    const currentId = mEvent.getId();\n    const targetId = activeReplyId === currentId ? null : currentId;\n    const mockEvent = {\n      currentTarget: {\n        getAttribute: (attr: string) => (attr === 'data-event-id' ? targetId : null),\n      },\n    } as unknown as MouseEvent<HTMLButtonElement>;\n\n    onReplyClick(mockEvent);\n  };\n\n  const handleSwipeEdit = useMemo(\n    () =>\n      canEditEvent(mx, mEvent) && onEditId\n        ? () => {\n            const currentId = mEvent.getId();\n            if (edit) {\n              onEditId(undefined);\n            } else {\n              onEditId(currentId);\n            }\n          }\n        : undefined,\n    [mx, mEvent, onEditId, edit]\n  );\n  const [swipeActionMode, setSwipeActionMode] = useState<SwipeActionMode>('none');\n\n  return (\n    <MessageBase\n      className={classNames(css.MessageBase, className, {\n        [css.MessageBaseBubbleCollapsed]: messageLayout === MessageLayout.Bubble && collapse,\n        [css.MessageForceHover]: menu.isPressing || isEmoji || !!menu.anchor,\n        [css.MessageSwipeReply]: swipeActionMode === 'reply',\n        [css.MessageSwipeEdit]: swipeActionMode === 'edit',\n      })}\n      tabIndex={0}\n      space={messageSpacing}\n      collapse={collapse}\n      highlight={highlight}\n      notifyHighlight={highlightMentions ? notifyHighlight : undefined}\n      selected={!!menu.anchor || isEmoji || menu.isPressing}\n      data-hover={!!menu.anchor || isEmoji || menu.isPressing || undefined}\n      isMarked={isMarked}\n      mobile={isMobileOrTablet()}\n      {...props}\n      {...hoverProps}\n      {...focusWithinProps}\n      ref={messageRef}\n    >\n      {!edit && (isDesktopHover || !!menu.anchor || isEmoji) && (\n        <div className={css.MessageOptionsBase} ref={optionsRef}>\n          <OptionQuickMenu\n            mEvent={mEvent}\n            room={room}\n            closeMenu={closeMenu}\n            onReactionToggle={onReactionToggle}\n            relations={relations}\n            onReplyClick={onReplyClick}\n            onEditId={onEditId}\n            onReproxyId={onReproxyId}\n            hideReadReceipts={hideReadReceipts}\n            hideReplyButton={hideReplyButton}\n            showDeveloperTools={showDeveloperTools}\n            canPinEvent={canPinEvent}\n            canDelete={canDelete}\n            handleOpenMenu={handleOpenMenu}\n            menuAnchor={menu.anchor}\n            imagePackRooms={imagePackRooms}\n            setIsEmoji={setIsEmoji}\n            canSendReaction={canSendReaction}\n            isGif={isGif}\n          />\n        </div>\n      )}\n\n      <div\n        style={{\n          width: '100%',\n          WebkitTouchCallout: 'none',\n          WebkitTapHighlightColor: 'transparent',\n        }}\n        onContextMenu={contextMenuHandler}\n        onTouchStart={(evt) => {\n          const target = evt.target instanceof Element ? evt.target : undefined;\n          if (shouldIgnoreMessageLongPress(target)) {\n            menu.triggerProps.onTouchCancel();\n            return;\n          }\n          menu.triggerProps.onTouchStart(evt);\n        }}\n        onTouchEnd={menu.triggerProps.onTouchEnd}\n        onTouchMove={menu.triggerProps.onTouchMove}\n        onTouchCancel={menu.triggerProps.onTouchCancel}\n      >\n        <WrappedMessage\n          headerJSX={headerJSX(collapse)}\n          avatarJSX={avatarJSX(collapse)}\n          msgContentJSX={msgContentJSX}\n          messageLayout={messageLayout}\n          handleSwipeReply={handleSwipeReply}\n          handleSwipeEdit={handleSwipeEdit}\n          handleSwipeActionChange={setSwipeActionMode}\n          align={useRightBubbles && senderId === mx.getUserId() ? 'right' : 'left'}\n        />\n      </div>\n    </MessageBase>\n  );\n}\n\nconst MessageAs = as<'div', MessageProps>(MessageInternal);\nexport const Message = memo(MessageAs);\n","import type { MatrixClient, MatrixEvent } from '$types/matrix-sdk';\n\nconst FRAME_BUDGET_MS = 10;\n\nconst queue: Array<() => void> = [];\nconst channel = typeof MessageChannel !== 'undefined' ? new MessageChannel() : undefined;\nlet scheduled = false;\n\nconst drain = () => {\n  scheduled = false;\n  const deadline = performance.now() + FRAME_BUDGET_MS;\n  while (queue.length > 0 && performance.now() < deadline) {\n    queue.shift()?.();\n  }\n  if (queue.length > 0) schedule();\n};\n\nif (channel) {\n  channel.port1.addEventListener('message', drain);\n  channel.port1.start();\n}\n\nfunction schedule(): void {\n  if (scheduled) return;\n  scheduled = true;\n  if (channel) channel.port2.postMessage(null);\n  else setTimeout(drain, 0);\n}\n\nexport function scheduleDecrypt(task: () => void): void {\n  queue.push(task);\n  schedule();\n}\n\nexport function warmupRoomDecryption(mx: MatrixClient, roomId: string, count = 12): void {\n  const room = mx.getRoom(roomId);\n  if (!room) return;\n  const events: MatrixEvent[] = room.getLiveTimeline().getEvents().slice(-count);\n  events.forEach((event) => {\n    if (event.isEncrypted()) {\n      scheduleDecrypt(() => {\n        mx.decryptEventIfNeeded(event).catch(() => undefined);\n      });\n    }\n  });\n}\n","import type { MatrixEvent, MatrixEventHandlerMap } from '$types/matrix-sdk';\nimport { MatrixEventEvent, EventType } from '$types/matrix-sdk';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { scheduleDecrypt } from '$utils/decryptScheduler';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport * as Sentry from '@sentry/react';\n\nconst debugLog = createDebugLogger('EncryptedContent');\n\ntype EncryptedContentProps = {\n  mEvent: MatrixEvent;\n  children: () => ReactNode;\n};\n\nexport function EncryptedContent({ mEvent, children }: EncryptedContentProps) {\n  const mx = useMatrixClient();\n  const [, toggleEncrypted] = useState(\n    mEvent.getType() === (EventType.RoomMessageEncrypted as string)\n  );\n\n  useEffect(() => {\n    if (mEvent.getType() !== (EventType.RoomMessageEncrypted as string)) return;\n    scheduleDecrypt(() => {\n      // Sample 5% of events for per-event decryption latency profiling\n      if (Math.random() < 0.05) {\n        const start = performance.now();\n        Sentry.startSpan({ name: 'decrypt.event', op: 'matrix.crypto' }, () =>\n          mx.decryptEventIfNeeded(mEvent).then(() => {\n            Sentry.metrics.distribution('sable.decryption.event_ms', performance.now() - start);\n          })\n        ).catch(() => undefined);\n      } else {\n        mx.decryptEventIfNeeded(mEvent).catch(() => undefined);\n      }\n    });\n  }, [mx, mEvent]);\n\n  useEffect(() => {\n    toggleEncrypted(mEvent.getType() === (EventType.RoomMessageEncrypted as string));\n    const handleDecrypted: MatrixEventHandlerMap[MatrixEventEvent.Decrypted] = (event) => {\n      if (event.isDecryptionFailure()) {\n        debugLog.error('error', 'Failed to decrypt room event', {\n          eventId: event.getId(),\n          roomId: event.getRoomId(),\n          sender: event.getSender(),\n          reason: event.decryptionFailureReason ?? 'UNKNOWN_ERROR',\n        });\n        Sentry.metrics.count('sable.decryption.failure', 1, {\n          attributes: { reason: event.decryptionFailureReason ?? 'UNKNOWN_ERROR' },\n        });\n      }\n      toggleEncrypted(event.getType() === (EventType.RoomMessageEncrypted as string));\n    };\n    mEvent.on(MatrixEventEvent.Decrypted, handleDecrypted);\n    return () => {\n      mEvent.removeListener(MatrixEventEvent.Decrypted, handleDecrypted);\n    };\n  }, [mEvent]);\n\n  return <>{children()}</>;\n}\n","import { useCallback, useRef } from 'react';\nimport type { ReactNode } from 'react';\n\nexport type EventRenderer<T extends unknown[]> = (...args: T) => ReactNode;\n\nexport type EventRendererOpts<T extends unknown[]> = Record<string, EventRenderer<T>>;\n\nexport type RenderMatrixEvent<T extends unknown[]> = (\n  eventType: string,\n  isStateEvent: boolean,\n  ...args: T\n) => ReactNode;\n\nexport const useMatrixEventRenderer = <T extends unknown[]>(\n  typeToRenderer: EventRendererOpts<T>,\n  renderStateEvent?: EventRenderer<T>,\n  renderEvent?: EventRenderer<T>\n): RenderMatrixEvent<T> => {\n  const latestRef = useRef({ typeToRenderer, renderStateEvent, renderEvent });\n\n  latestRef.current = { typeToRenderer, renderStateEvent, renderEvent };\n\n  return useCallback((eventType: string, isStateEvent: boolean, ...args: T) => {\n    const renderer = latestRef.current.typeToRenderer[eventType];\n    if (renderer) return renderer(...args);\n\n    if (isStateEvent && latestRef.current.renderStateEvent) {\n      return latestRef.current.renderStateEvent(...args);\n    }\n\n    if (!isStateEvent && latestRef.current.renderEvent) {\n      return latestRef.current.renderEvent(...args);\n    }\n    return null;\n  }, []);\n};\n","import type { ComponentProps, MouseEventHandler, ReactNode } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport type { Opts as LinkifyOpts } from 'linkifyjs';\nimport { Avatar, Box, Text } from 'folds';\nimport type { IImageContent } from '$types/matrix/common';\nimport type { MatrixEvent, Room } from '$types/matrix-sdk';\nimport { EventType, MatrixEventEvent } from '$types/matrix-sdk';\nimport { M_POLL_START } from 'matrix-js-sdk';\nimport { useAtomValue } from 'jotai';\nimport {\n  AvatarBase,\n  ImageContent,\n  MessageNotDecryptedContent,\n  MessageUnsupportedContent,\n  ModernLayout,\n  MSticker,\n  RedactedContent,\n  Reply,\n  Time,\n  Username,\n  UsernameBold,\n  type RenderImageContentProps,\n} from '$components/message';\nimport { UserAvatar } from '$components/user-avatar';\nimport { Image as MediaImage } from '$components/media';\nimport { ImageViewer } from '$components/image-viewer';\nimport { RenderMessageContent } from '$components/RenderMessageContent';\nimport { PowerIcon } from '$components/power';\nimport { userFallbackIcon } from '$components/icons/phosphor';\nimport { EncryptedContent, Pronouns } from '$features/room/message';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMatrixEventRenderer } from '$hooks/useMatrixEventRenderer';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useSableCosmetics } from '$hooks/useSableCosmetics';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { usePowerLevels } from '$hooks/usePowerLevels';\nimport { useGetMemberPowerTag, getPowerTagIconSrc } from '$hooks/useMemberPowerTag';\nimport { useUserProfile, type UserProfile } from '$hooks/useUserProfile';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport type { PerMessageProfileBeeperFormat } from '$hooks/usePerMessageProfile';\nimport { convertBeeperFormatToOurPerMessageProfile } from '$hooks/usePerMessageProfile';\nimport { getParsedPronouns } from '$utils/pronouns';\nimport { useMentionClickHandler } from '$hooks/useMentionClickHandler';\nimport { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler';\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport {\n  factoryRenderLinkifyWithMention,\n  getReactCustomHtmlParser,\n  LINKIFY_OPTS,\n  makeMentionCustomProps,\n  renderMatrixMention,\n} from '$plugins/react-custom-html-parser';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport type { GetContentCallback } from '$types/matrix/room';\nimport { getMemberAvatarMxc, getMemberDisplayName } from '$utils/room/display';\nimport { getEditedEvent } from '$utils/room/relations';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport * as customHtmlCss from '$styles/CustomHtml.css';\n\ntype MessagePreviewRendererOptions = {\n  room: Room;\n  mediaAutoLoad?: boolean;\n  bundledPreview?: boolean;\n  urlPreview?: boolean;\n  htmlReactParserOptions: HTMLReactParserOptions;\n  linkifyOpts: LinkifyOpts;\n};\n\ntype MessagePreviewRendererContext = MessagePreviewRendererOptions & {\n  mx: ReturnType<typeof useMatrixClient>;\n};\n\nfunction LazyImage(props: ComponentProps<typeof MediaImage>) {\n  return <MediaImage {...props} disablePixelation loading=\"lazy\" />;\n}\n\nfunction resolvePreviewContent(\n  room: Room,\n  event: MatrixEvent,\n  fallbackGetContent: GetContentCallback\n) {\n  const eventId = event.getId();\n  const timeline = eventId ? room.getTimelineForEvent(eventId) : undefined;\n  const editedEvent =\n    eventId && timeline ? getEditedEvent(eventId, event, timeline.getTimelineSet()) : undefined;\n  const fallbackContent = fallbackGetContent() as Record<string, unknown>;\n  const editedContent = editedEvent?.getContent()?.['m.new_content'] as\n    | Record<string, unknown>\n    | undefined;\n\n  return {\n    content: editedContent ?? fallbackContent,\n    edited: !!editedEvent || event.getContent()['m.new_content'] !== undefined,\n  };\n}\n\nfunction renderStickerImageContent(\n  mediaAutoLoad: boolean | undefined,\n  props: RenderImageContentProps\n) {\n  return (\n    <ImageContent\n      {...props}\n      autoPlay={mediaAutoLoad}\n      renderImage={LazyImage}\n      renderViewer={(viewerProps) => <ImageViewer {...viewerProps} />}\n    />\n  );\n}\n\nfunction renderRoomMessage(\n  ctx: MessagePreviewRendererContext,\n  event: MatrixEvent,\n  displayName: string,\n  getContent: GetContentCallback\n) {\n  if (event.isRedacted()) {\n    return <RedactedContent reason={event.getUnsigned().redacted_because?.content.reason} />;\n  }\n\n  const resolved = resolvePreviewContent(ctx.room, event, getContent);\n  const content = resolved.content as { msgtype?: string };\n  const resolvedGetContent = (() => resolved.content) as GetContentCallback;\n  return (\n    <RenderMessageContent\n      displayName={displayName}\n      msgType={content.msgtype ?? ''}\n      ts={event.getTs()}\n      getContent={resolvedGetContent}\n      edited={resolved.edited}\n      mediaAutoLoad={ctx.mediaAutoLoad}\n      bundledPreview={ctx.bundledPreview}\n      urlPreview={ctx.urlPreview}\n      htmlReactParserOptions={ctx.htmlReactParserOptions}\n      linkifyOpts={ctx.linkifyOpts}\n      outlineAttachment\n      mEvent={event}\n      mx={ctx.mx}\n      room={ctx.room}\n    />\n  );\n}\n\nfunction renderEncryptedDecrypted(\n  ctx: MessagePreviewRendererContext,\n  event: MatrixEvent,\n  displayName: string,\n  decryptedEvent: MatrixEvent,\n  eventTimeline: ReturnType<Room['getTimelineForEvent']>\n) {\n  const eventId = event.getId()!;\n  if (decryptedEvent.isRedacted()) return <RedactedContent />;\n  const decryptedType = decryptedEvent.getType();\n  const stickerType: string = EventType.Sticker;\n  const messageType: string = EventType.RoomMessage;\n  const encryptedType: string = EventType.RoomMessageEncrypted;\n\n  if (decryptedType === stickerType) {\n    return (\n      <MSticker\n        content={decryptedEvent.getContent()}\n        renderImageContent={renderStickerImageContent.bind(null, ctx.mediaAutoLoad)}\n      />\n    );\n  }\n  if (decryptedType === messageType) {\n    const editedEvent = eventTimeline\n      ? getEditedEvent(eventId, decryptedEvent, eventTimeline.getTimelineSet())\n      : undefined;\n    const getContent = (() =>\n      editedEvent?.getContent()?.['m.new_content'] ??\n      decryptedEvent.getContent()) as GetContentCallback;\n\n    return renderRoomMessage(ctx, decryptedEvent, displayName, getContent);\n  }\n  if (decryptedType === encryptedType) {\n    return (\n      <Text>\n        <MessageNotDecryptedContent />\n      </Text>\n    );\n  }\n  return (\n    <Text>\n      <MessageUnsupportedContent />\n    </Text>\n  );\n}\n\nfunction renderEncrypted(\n  ctx: MessagePreviewRendererContext,\n  event: MatrixEvent,\n  displayName: string\n) {\n  const eventId = event.getId()!;\n  const eventTimeline = ctx.room.getTimelineForEvent(eventId);\n  // Previews are also rendered for events outside any loaded timeline (the\n  // notification inbox), so fall back to the event we were handed.\n  const decryptedEvent =\n    eventTimeline?.getEvents().find((item) => item.getId() === eventId) ?? event;\n\n  return (\n    <EncryptedContent mEvent={decryptedEvent}>\n      {renderEncryptedDecrypted.bind(null, ctx, event, displayName, decryptedEvent, eventTimeline)}\n    </EncryptedContent>\n  );\n}\n\nfunction renderSticker(\n  ctx: MessagePreviewRendererContext,\n  event: MatrixEvent,\n  _displayName: string,\n  getContent: GetContentCallback\n) {\n  if (event.isRedacted()) {\n    return <RedactedContent reason={event.getUnsigned().redacted_because?.content.reason} />;\n  }\n  return (\n    <MSticker\n      content={getContent() as IImageContent}\n      renderImageContent={renderStickerImageContent.bind(null, ctx.mediaAutoLoad)}\n    />\n  );\n}\n\nfunction renderFallback(_ctx: MessagePreviewRendererContext, event: MatrixEvent) {\n  if (event.isRedacted()) {\n    return <RedactedContent reason={event.getUnsigned().redacted_because?.content.reason} />;\n  }\n  return (\n    <Box grow=\"Yes\" direction=\"Column\">\n      <Text size=\"T400\" priority=\"300\">\n        <code className={customHtmlCss.Code}>{event.getType()}</code>\n        {' event'}\n      </Text>\n    </Box>\n  );\n}\n\nfunction renderTombstone(_ctx: MessagePreviewRendererContext, event: MatrixEvent) {\n  if (event.isRedacted()) {\n    return <RedactedContent reason={event.getUnsigned().redacted_because?.content.reason} />;\n  }\n\n  return <Text>{event.getContent().body ?? 'This room has been replaced.'}</Text>;\n}\n\nfunction useMessagePreviewRenderer(options: MessagePreviewRendererOptions) {\n  const mx = useMatrixClient();\n  const context = useMemo<MessagePreviewRendererContext>(() => ({ ...options, mx }), [mx, options]);\n  const handlers = useMemo(\n    () => ({\n      [EventType.RoomMessage]: renderRoomMessage.bind(null, context),\n      [EventType.RoomMessageEncrypted]: renderEncrypted.bind(null, context),\n      [EventType.Sticker]: renderSticker.bind(null, context),\n      [EventType.RoomTombstone]: renderTombstone.bind(null, context),\n      [M_POLL_START.name]: renderRoomMessage.bind(null, context),\n    }),\n    [context]\n  );\n\n  return useMatrixEventRenderer<[MatrixEvent, string, GetContentCallback]>(\n    handlers,\n    undefined,\n    renderFallback.bind(null, context)\n  );\n}\n\ntype RoomMessagePreviewRendererOptions = {\n  highlightRegex?: RegExp;\n  settingsLinkBaseUrl?: string;\n};\n\nexport function useRoomMessagePreviewRenderer(\n  room: Room,\n  options: RoomMessagePreviewRendererOptions = {}\n) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const nicknames = useAtomValue(nicknamesAtom);\n  const defaultSettingsLinkBaseUrl = useSettingsLinkBaseUrl();\n  const settingsLinkBaseUrl = options.settingsLinkBaseUrl ?? defaultSettingsLinkBaseUrl;\n  const mentionClickHandler = useMentionClickHandler(room.roomId);\n  const spoilerClickHandler = useSpoilerClickHandler();\n  const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad');\n  const [bundledPreview] = useSetting(settingsAtom, 'bundledPreview');\n  const [urlPreview] = useSetting(settingsAtom, 'urlPreview');\n  const [encUrlPreview] = useSetting(settingsAtom, 'encUrlPreview');\n  const [autoplayEmojis] = useSetting(settingsAtom, 'autoplayEmojis');\n  const [incomingInlineImagesDefaultHeight] = useSetting(\n    settingsAtom,\n    'incomingInlineImagesDefaultHeight'\n  );\n  const [incomingInlineImagesMaxHeight] = useSetting(settingsAtom, 'incomingInlineImagesMaxHeight');\n\n  const linkifyOpts = useMemo<LinkifyOpts>(\n    () => ({\n      ...LINKIFY_OPTS,\n      render: factoryRenderLinkifyWithMention(\n        settingsLinkBaseUrl,\n        (href) =>\n          renderMatrixMention(\n            mx,\n            room.roomId,\n            href,\n            makeMentionCustomProps(mentionClickHandler),\n            nicknames\n          ),\n        mentionClickHandler\n      ),\n    }),\n    [mx, room.roomId, mentionClickHandler, nicknames, settingsLinkBaseUrl]\n  );\n  const htmlReactParserOptions = useMemo<HTMLReactParserOptions>(\n    () =>\n      getReactCustomHtmlParser(mx, room.roomId, {\n        settingsLinkBaseUrl,\n        linkifyOpts,\n        highlightRegex: options.highlightRegex,\n        useAuthentication,\n        handleSpoilerClick: spoilerClickHandler,\n        handleMentionClick: mentionClickHandler,\n        nicknames,\n        autoplayEmojis,\n        incomingInlineImagesDefaultHeight,\n        incomingInlineImagesMaxHeight,\n      }),\n    [\n      mx,\n      room.roomId,\n      settingsLinkBaseUrl,\n      linkifyOpts,\n      options.highlightRegex,\n      useAuthentication,\n      spoilerClickHandler,\n      mentionClickHandler,\n      nicknames,\n      autoplayEmojis,\n      incomingInlineImagesDefaultHeight,\n      incomingInlineImagesMaxHeight,\n    ]\n  );\n  const rendererOptions = useMemo<MessagePreviewRendererOptions>(\n    () => ({\n      room,\n      mediaAutoLoad,\n      bundledPreview,\n      urlPreview: room.hasEncryptionStateEvent() ? encUrlPreview : urlPreview,\n      htmlReactParserOptions,\n      linkifyOpts,\n    }),\n    [\n      room,\n      mediaAutoLoad,\n      bundledPreview,\n      urlPreview,\n      encUrlPreview,\n      htmlReactParserOptions,\n      linkifyOpts,\n    ]\n  );\n\n  return useMessagePreviewRenderer(rendererOptions);\n}\n\nexport type MessagePreviewProps = {\n  room: Room;\n  event: MatrixEvent;\n  renderContent: ReturnType<typeof useMessagePreviewRenderer>;\n  profile?: Partial<UserProfile>;\n  actions?: ReactNode;\n  onOpen?: MouseEventHandler<HTMLButtonElement>;\n  hour24Clock: boolean;\n  dateFormatString: string;\n};\n\nexport function MessagePreview({\n  room,\n  event,\n  renderContent,\n  profile,\n  actions,\n  onOpen,\n  hour24Clock,\n  dateFormatString,\n}: MessagePreviewProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const nicknames = useAtomValue(nicknamesAtom);\n  const sender = event.getSender() ?? '';\n  const openUserRoomProfile = useOpenUserRoomProfile();\n  const [contentVersion, setContentVersion] = useState(0);\n\n  useEffect(() => {\n    const handleUpdate = () => setContentVersion((version) => version + 1);\n    event.on(MatrixEventEvent.Decrypted, handleUpdate);\n    event.on(MatrixEventEvent.Replaced, handleUpdate);\n    return () => {\n      event.off(MatrixEventEvent.Decrypted, handleUpdate);\n      event.off(MatrixEventEvent.Replaced, handleUpdate);\n    };\n  }, [event]);\n\n  const userProfile = useUserProfile(sender, room, profile, false, false);\n  const { color, font } = useSableCosmetics(sender, room, false, false);\n  const powerLevels = usePowerLevels(room);\n  const creators = useRoomCreators(room);\n  const getMemberPowerTag = useGetMemberPowerTag(room, creators, powerLevels);\n\n  const fallbackDisplayName =\n    getMemberDisplayName(room, sender, nicknames) ??\n    userProfile.displayName ??\n    profile?.displayName ??\n    getMxIdLocalPart(sender) ??\n    sender;\n  const perMessageProfile = useMemo(() => {\n    void contentVersion;\n    const { content } = resolvePreviewContent(\n      room,\n      event,\n      () => event.getContent()['m.new_content'] ?? event.getContent()\n    );\n    const beeperProfile = content['com.beeper.per_message_profile'] as\n      | PerMessageProfileBeeperFormat\n      | undefined;\n    return beeperProfile ? convertBeeperFormatToOurPerMessageProfile(beeperProfile) : undefined;\n  }, [room, event, contentVersion]);\n  const [showPronouns] = useSetting(settingsAtom, 'showPronouns');\n  const [parsePronouns] = useSetting(settingsAtom, 'parsePronouns');\n  const { cleanedDisplayName: displayName, inlinePronoun } = useMemo(\n    () => getParsedPronouns(perMessageProfile?.displayname || fallbackDisplayName, parsePronouns),\n    [perMessageProfile?.displayname, fallbackDisplayName, parsePronouns]\n  );\n  const pronouns = useMemo(() => {\n    const resolved = [\n      ...(perMessageProfile?.['io.fsky.nyx.pronouns'] ?? userProfile.pronouns ?? []),\n    ];\n    if (\n      inlinePronoun &&\n      !resolved.some((item) => item.summary?.toLowerCase() === inlinePronoun.toLowerCase())\n    ) {\n      resolved.push({ summary: inlinePronoun, language: 'en' });\n    }\n    return resolved;\n  }, [perMessageProfile, userProfile.pronouns, inlinePronoun]);\n  const avatarMxc =\n    perMessageProfile?.avatar_url ??\n    getMemberAvatarMxc(room, sender) ??\n    userProfile.avatarUrl ??\n    profile?.avatarUrl;\n  const memberPowerTag = getMemberPowerTag(sender);\n  const tagIconSrc = memberPowerTag?.icon\n    ? getPowerTagIconSrc(mx, useAuthentication, memberPowerTag.icon)\n    : undefined;\n  const getContent = useCallback(\n    () => event.getContent()['m.new_content'] ?? event.getContent(),\n    [event]\n  ) as GetContentCallback;\n  const handleUserClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      openUserRoomProfile(\n        room.roomId,\n        undefined,\n        sender,\n        perMessageProfile,\n        evt.currentTarget.getBoundingClientRect()\n      );\n    },\n    [openUserRoomProfile, room.roomId, perMessageProfile, sender]\n  );\n\n  return (\n    <ModernLayout\n      before={\n        <AvatarBase>\n          <Avatar as=\"button\" size=\"300\" data-user-id={sender} onClick={handleUserClick}>\n            <UserAvatar\n              userId={sender}\n              src={\n                avatarMxc\n                  ? (mxcUrlToHttp(mx, avatarMxc, useAuthentication, 48, 48, 'crop') ?? undefined)\n                  : undefined\n              }\n              alt={displayName}\n              renderFallback={() => userFallbackIcon('lg')}\n            />\n          </Avatar>\n        </AvatarBase>\n      }\n    >\n      <Box gap=\"300\" justifyContent=\"SpaceBetween\" alignItems=\"Center\" grow=\"Yes\">\n        <Box gap=\"200\" alignItems=\"Baseline\">\n          <Box alignItems=\"Center\" gap=\"200\">\n            <Username\n              as=\"button\"\n              data-user-id={sender}\n              onClick={handleUserClick}\n              onContextMenu={handleUserClick}\n              style={{ color, fontFamily: font }}\n            >\n              <Text as=\"span\" truncate>\n                <UsernameBold>{displayName}</UsernameBold>\n              </Text>\n            </Username>\n            {showPronouns && <Pronouns pronouns={pronouns} tagColor={color ?? 'currentColor'} />}\n            {tagIconSrc && <PowerIcon size=\"100\" iconSrc={tagIconSrc} />}\n          </Box>\n          <Time ts={event.getTs()} hour24Clock={hour24Clock} dateFormatString={dateFormatString} />\n        </Box>\n        {actions}\n      </Box>\n      {event.replyEventId && (\n        <Reply\n          room={room}\n          replyEventId={event.replyEventId}\n          threadRootId={event.threadRootId}\n          mentions={event.getContent()['m.mentions']}\n          onClick={onOpen}\n        />\n      )}\n      <Box direction=\"Column\" grow=\"Yes\" style={{ minWidth: 0 }}>\n        {renderContent(event.getType(), false, event, displayName, getContent)}\n      </Box>\n    </ModernLayout>\n  );\n}\n","import type { MouseEventHandler, ReactNode } from 'react';\nimport { forwardRef, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { MatrixEvent, Room, RoomPinnedEventsEventContent } from '$types/matrix-sdk';\nimport {\n  Box,\n  Chip,\n  color,\n  config,\n  Header,\n  IconButton,\n  Menu,\n  Scroll,\n  Spinner,\n  Text,\n  toRem,\n} from 'folds';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { createLogger } from '$utils/debug';\nimport { useRoomPinnedEvents } from '$hooks/useRoomPinnedEvents';\nimport { SequenceCard } from '$components/sequence-card';\nimport { useRoomEvent } from '$hooks/useRoomEvent';\nimport { DefaultPlaceholder } from '$components/message';\nimport { dropzoneIcon, menuIcon, composerIcon, PushPin, X } from '$components/icons/phosphor';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { getStateEvent } from '$utils/room/hierarchy';\nimport type { StateEvents } from '$types/matrix-sdk';\n\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { VirtualTile } from '$components/virtualizer';\nimport { usePowerLevelsContext } from '$hooks/usePowerLevels';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { MessagePreview, useRoomMessagePreviewRenderer } from '$components/message-preview';\nimport type { PinReadMarker } from '$features/room/RoomViewHeader';\nimport * as css from './RoomPinMenu.css';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\nimport { EventType } from '$types/matrix-sdk';\nimport { ScreenSize, useScreenSizeOptionally } from '$hooks/useScreenSize';\nimport { useMobileSheetClose } from '$components/MobileSwipeDownModal';\n\nconst log = createLogger('RoomPinMenu');\n\ntype PinnedMessageProps = {\n  room: Room;\n  eventId: string;\n  renderContent: ReturnType<typeof useRoomMessagePreviewRenderer>;\n  onOpen: (roomId: string, eventId: string) => void;\n  canPinEvent: boolean;\n  hour24Clock: boolean;\n  dateFormatString: string;\n  isNew: boolean;\n};\n\nfunction PinnedMessageActiveContent(\n  props: PinnedMessageProps & {\n    pinnedEvent: MatrixEvent;\n    renderOptions: () => ReactNode;\n    handleOpenClick: MouseEventHandler;\n  }\n) {\n  const {\n    pinnedEvent,\n    room,\n    renderContent,\n    hour24Clock,\n    dateFormatString,\n    renderOptions,\n    handleOpenClick,\n  } = props;\n\n  return (\n    <MessagePreview\n      room={room}\n      event={pinnedEvent}\n      renderContent={renderContent}\n      actions={renderOptions()}\n      onOpen={handleOpenClick}\n      hour24Clock={hour24Clock}\n      dateFormatString={dateFormatString}\n    />\n  );\n}\n\nfunction PinnedMessage(props: PinnedMessageProps) {\n  const { room, eventId, onOpen, canPinEvent } = props;\n  const pinnedEvent = useRoomEvent(room, eventId);\n  const mx = useMatrixClient();\n\n  const [unpinState, unpin] = useAsyncCallback(\n    useCallback(() => {\n      const pinEvent = getStateEvent(room, EventType.RoomPinnedEvents);\n      const content = pinEvent?.getContent<RoomPinnedEventsEventContent>() ?? { pinned: [] };\n      const newContent: RoomPinnedEventsEventContent = {\n        pinned: content.pinned.filter((id: string) => id !== eventId),\n      };\n\n      return mx.sendStateEvent(\n        room.roomId,\n        EventType.RoomPinnedEvents as keyof StateEvents,\n        newContent\n      );\n    }, [room, eventId, mx])\n  );\n\n  const handleOpenClick: MouseEventHandler = useCallback(\n    (evt) => {\n      evt.stopPropagation();\n      onOpen(room.roomId, eventId);\n    },\n    [onOpen, room.roomId, eventId]\n  );\n\n  const handleUnpinClick: MouseEventHandler = useCallback(\n    (evt) => {\n      evt.stopPropagation();\n      unpin().catch((err) => {\n        log.warn('Failed to unpin room event:', err);\n      });\n    },\n    [unpin]\n  );\n\n  const renderOptions = () => (\n    <Box shrink=\"No\" gap=\"200\" alignItems=\"Center\">\n      <Chip data-event-id={eventId} onClick={handleOpenClick} radii=\"Pill\">\n        <Text size=\"T200\">Jump</Text>\n      </Chip>\n      {canPinEvent && (\n        <IconButton\n          data-event-id={eventId}\n          size=\"300\"\n          radii=\"Pill\"\n          onClick={unpinState.status === AsyncStatus.Loading ? undefined : handleUnpinClick}\n          aria-disabled={unpinState.status === AsyncStatus.Loading}\n        >\n          {unpinState.status === AsyncStatus.Loading ? <Spinner size=\"100\" /> : menuIcon(X)}\n        </IconButton>\n      )}\n    </Box>\n  );\n\n  if (pinnedEvent === undefined) return <DefaultPlaceholder variant=\"Secondary\" />;\n\n  if (pinnedEvent === null) {\n    return (\n      <Box gap=\"300\" justifyContent=\"SpaceBetween\" alignItems=\"Center\">\n        <Box>\n          <Text style={{ color: color.Critical.Main }}>Failed to load message!</Text>\n        </Box>\n        {renderOptions()}\n      </Box>\n    );\n  }\n\n  return (\n    <PinnedMessageActiveContent\n      {...props}\n      pinnedEvent={pinnedEvent}\n      renderOptions={renderOptions}\n      handleOpenClick={handleOpenClick}\n    />\n  );\n}\n\ntype RoomPinMenuProps = {\n  room: Room;\n  requestClose: () => void;\n  currentHash: string;\n};\n\nexport const RoomPinMenu = forwardRef<HTMLDivElement, RoomPinMenuProps>(\n  ({ room, requestClose, currentHash }, ref) => {\n    const isMobile = useScreenSizeOptionally() === ScreenSize.Mobile;\n    const mobileSheetClose = useMobileSheetClose();\n    const mx = useMatrixClient();\n    const userId = mx.getUserId()!;\n    const powerLevels = usePowerLevelsContext();\n    const creators = useRoomCreators(room);\n\n    const permissions = useRoomPermissions(creators, powerLevels);\n    const canPinEvent = permissions.stateEvent(EventType.RoomPinnedEvents, userId);\n\n    const pinnedEvents = useRoomPinnedEvents(room);\n    const sortedPinnedEvent = useMemo(() => Array.from(pinnedEvents).reverse(), [pinnedEvents]);\n    const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n    const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n\n    const { navigateRoom } = useRoomNavigate();\n    const scrollRef = useRef<HTMLDivElement>(null);\n\n    const pinMarker = useMemo(\n      () =>\n        room.getAccountData(CustomAccountDataEvent.SablePinStatus)?.getContent() as PinReadMarker,\n      [room]\n    );\n\n    const lastSeenIndex = useMemo(() => {\n      if (!pinMarker?.last_seen_id) return -1;\n      return pinnedEvents.indexOf(pinMarker.last_seen_id);\n    }, [pinnedEvents, pinMarker]);\n\n    const virtualizer = useVirtualizer({\n      count: sortedPinnedEvent.length,\n      getScrollElement: () => scrollRef.current,\n      estimateSize: () => 75,\n      overscan: 4,\n    });\n\n    // Rows re-measure as dynamic content lands (decrypts, lazy media, replies),\n    // nudging the total size back and forth across the sheet's max height. The\n    // sheet sizes itself off this list, so latch the largest size seen for the\n    // current set of pins. Structural changes rebase the latch so removals do\n    // not leave stale empty space.\n    const totalSize = virtualizer.getTotalSize();\n    const pinListKey = JSON.stringify(sortedPinnedEvent);\n    const [latchedSize, setLatchedSize] = useState({ pinListKey, size: 0 });\n    useLayoutEffect(() => {\n      setLatchedSize((prev) => {\n        if (prev.pinListKey !== pinListKey) return { pinListKey, size: totalSize };\n        if (totalSize <= prev.size) return prev;\n        return { pinListKey, size: totalSize };\n      });\n    }, [pinListKey, totalSize]);\n    const currentLatchedSize = latchedSize.pinListKey === pinListKey ? latchedSize.size : totalSize;\n    const mobileMaxHeight = 'calc(85dvh - 4rem)';\n\n    const renderMatrixEvent = useRoomMessagePreviewRenderer(room);\n\n    const handleOpen = (roomId: string, eventId: string) => {\n      navigateRoom(roomId, eventId);\n      (mobileSheetClose ?? requestClose)();\n    };\n\n    return (\n      <Menu ref={ref} className={css.PinMenu}>\n        <Box grow=\"Yes\" direction=\"Column\">\n          <Header className={css.PinMenuHeader} size=\"500\">\n            <Box grow=\"Yes\">\n              <Text size=\"H5\">Pinned Messages</Text>\n            </Box>\n            <Box shrink=\"No\">\n              <IconButton size=\"300\" onClick={mobileSheetClose ?? requestClose} radii=\"300\">\n                {composerIcon(X)}\n              </IconButton>\n            </Box>\n          </Header>\n          <Box grow=\"Yes\">\n            <Scroll\n              ref={scrollRef}\n              size=\"300\"\n              hideTrack\n              visibility=\"Hover\"\n              style={{\n                minHeight: isMobile ? `min(${currentLatchedSize}px, ${mobileMaxHeight})` : 0,\n                flex: isMobile ? '0 1 auto' : 1,\n                maxHeight: isMobile ? mobileMaxHeight : undefined,\n                overflowY: 'auto',\n                touchAction: 'pan-y',\n              }}\n            >\n              <Box className={css.PinMenuContent} direction=\"Column\" gap=\"100\">\n                {sortedPinnedEvent.length > 0 ? (\n                  <div\n                    style={{\n                      position: 'relative',\n                      height: virtualizer.getTotalSize(),\n                    }}\n                  >\n                    {virtualizer.getVirtualItems().map((vItem) => {\n                      const eventId = sortedPinnedEvent[vItem.index];\n                      if (!eventId) return null;\n\n                      const originalIndex = pinnedEvents.indexOf(eventId);\n                      let isNew = false;\n                      if (pinMarker?.hash !== currentHash) {\n                        if (lastSeenIndex !== -1) {\n                          isNew = originalIndex > lastSeenIndex;\n                        } else {\n                          const oldCount = pinMarker?.count ?? 0;\n                          isNew = originalIndex >= oldCount - 1;\n                        }\n                      }\n\n                      return (\n                        <VirtualTile\n                          virtualItem={vItem}\n                          style={{ paddingBottom: config.space.S200 }}\n                          ref={virtualizer.measureElement}\n                          key={vItem.index}\n                        >\n                          <SequenceCard\n                            style={{\n                              padding: config.space.S400,\n                              borderRadius: config.radii.R300,\n                              border: isNew\n                                ? `${config.borderWidth.B700} solid ${color.Secondary.ContainerActive}`\n                                : undefined,\n                            }}\n                            variant=\"Background\"\n                            direction=\"Column\"\n                          >\n                            <PinnedMessage\n                              room={room}\n                              eventId={eventId}\n                              renderContent={renderMatrixEvent}\n                              onOpen={handleOpen}\n                              canPinEvent={canPinEvent}\n                              hour24Clock={hour24Clock}\n                              isNew={isNew}\n                              dateFormatString={dateFormatString}\n                            />\n                          </SequenceCard>\n                        </VirtualTile>\n                      );\n                    })}\n                  </div>\n                ) : (\n                  <Box\n                    className={ContainerColor({ variant: 'SurfaceVariant' })}\n                    style={{\n                      marginBottom: config.space.S200,\n                      padding: `${config.space.S700} ${config.space.S400} ${toRem(60)}`,\n                      borderRadius: config.radii.R300,\n                    }}\n                    grow=\"Yes\"\n                    direction=\"Column\"\n                    gap=\"400\"\n                    justifyContent=\"Center\"\n                    alignItems=\"Center\"\n                  >\n                    {dropzoneIcon(PushPin)}\n                    <Box\n                      style={{ maxWidth: toRem(300) }}\n                      direction=\"Column\"\n                      gap=\"200\"\n                      alignItems=\"Center\"\n                    >\n                      <Text size=\"H4\" align=\"Center\">\n                        No Pinned Messages\n                      </Text>\n                      <Text size=\"T400\" align=\"Center\">\n                        Users with sufficient power level can pin messages from the context menu.\n                      </Text>\n                    </Box>\n                  </Box>\n                )}\n              </Box>\n            </Scroll>\n          </Box>\n        </Box>\n      </Menu>\n    );\n  }\n);\n\nRoomPinMenu.displayName = 'RoomPinMenu';\n","import { IconButton, Tooltip, Text } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { composerIcon, Phone, VideoCamera } from '$components/icons/phosphor';\nimport { useAtomValue } from 'jotai';\nimport type { Room } from '$types/matrix-sdk';\nimport { useCallStart, useCallJoined } from '$hooks/useCallEmbed';\nimport type { CallPreferences } from '$state/callPreferences';\nimport { callEmbedAtom } from '$state/callEmbed';\n\ninterface RoomCallButtonProps {\n  room: Room;\n  direct: boolean;\n  defaultPreferences: CallPreferences;\n  kind: 'voice' | 'video';\n  allowVideoStart?: boolean;\n}\n\nexport function RoomCallButton({\n  room,\n  direct,\n  defaultPreferences,\n  kind,\n  allowVideoStart = true,\n}: RoomCallButtonProps) {\n  const startCall = useCallStart(direct);\n  const callEmbed = useAtomValue(callEmbedAtom);\n  const joined = useCallJoined(callEmbed);\n\n  const isJoinedInThisRoom = joined && callEmbed?.roomId === room.roomId;\n  const callStartingInThisRoom = !!callEmbed && callEmbed.roomId === room.roomId && !joined;\n  const inAnotherCall = !!callEmbed && callEmbed.roomId !== room.roomId;\n  const startDisabled = inAnotherCall || callStartingInThisRoom;\n  const startingVideoCall = kind === 'video';\n\n  if (kind === 'video' && !allowVideoStart) return null;\n  if (isJoinedInThisRoom) return null;\n\n  const startSelectedCall = () => {\n    startCall(room, {\n      microphone: defaultPreferences.microphone,\n      video: startingVideoCall,\n      sound: defaultPreferences.sound,\n    });\n  };\n\n  const readyCopy = startingVideoCall ? 'Start Video Call' : 'Start Voice Call';\n  const ariaLabel = startingVideoCall ? 'Start Video Call' : 'Start Voice Call';\n  const icon = startingVideoCall ? VideoCamera : Phone;\n\n  return (\n    <TooltipProvider\n      position=\"Bottom\"\n      offset={4}\n      tooltip={\n        <Tooltip>\n          {inAnotherCall ? (\n            <Text>Already in another call</Text>\n          ) : callStartingInThisRoom ? (\n            <Text>Call is starting</Text>\n          ) : (\n            <Text>{readyCopy}</Text>\n          )}\n        </Tooltip>\n      }\n    >\n      {(triggerRef) => (\n        <IconButton\n          fill=\"None\"\n          ref={triggerRef}\n          onClick={startSelectedCall}\n          disabled={startDisabled}\n          aria-label={ariaLabel}\n        >\n          {composerIcon(icon)}\n        </IconButton>\n      )}\n    </TooltipProvider>\n  );\n}\n","import { useMemo } from 'react';\n\nimport { useAccountData } from './useAccountData';\nimport { useAllJoinedRoomsSet, useGetRoom } from './useGetRoom';\nimport { EventType } from '$types/matrix-sdk';\n\nexport const useDirectUsers = (): string[] => {\n  const directEvent = useAccountData(EventType.Direct);\n  const content = directEvent?.getContent();\n\n  const allJoinedRooms = useAllJoinedRoomsSet();\n  const getRoom = useGetRoom(allJoinedRooms);\n\n  const users = useMemo(() => {\n    if (typeof content !== 'object') return [];\n\n    const u = Object.keys(content).filter((userId) => {\n      const rooms = content[userId];\n      if (!Array.isArray(rooms)) return false;\n      const hasDM = rooms.some((roomId) => typeof roomId === 'string' && !!getRoom(roomId));\n      return hasDM;\n    });\n\n    return u;\n  }, [content, getRoom]);\n\n  return users;\n};\n","import { Text, color } from 'folds';\nimport type { AsyncState } from '$hooks/useAsyncCallback';\nimport { AsyncStatus } from '$hooks/useAsyncCallback';\n\ntype AsyncErrorProps = {\n  state: AsyncState<unknown, unknown>;\n  prefix?: string;\n  size?: 'T200' | 'T300';\n  bold?: boolean;\n};\n\nexport function AsyncError({ state, prefix, size = 'T200', bold }: AsyncErrorProps) {\n  if (state.status !== AsyncStatus.Error) return null;\n\n  const message = prefix\n    ? `${prefix}! ${state.error instanceof Error ? state.error.message : String(state.error)}`\n    : state.error instanceof Error\n      ? state.error.message\n      : String(state.error);\n\n  const content = bold ? <b>{message}</b> : message;\n\n  return (\n    <Text style={{ color: color.Critical.Main }} size={size}>\n      {content}\n    </Text>\n  );\n}\n","import type { ChangeEventHandler, FormEventHandler, KeyboardEventHandler } from 'react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { Overlay } from '$components/overlay-stack';\nimport {\n  OverlayBackdrop,\n  OverlayCenter,\n  Box,\n  Header,\n  config,\n  Text,\n  IconButton,\n  Input,\n  TextArea,\n  Dialog,\n  Menu,\n  toRem,\n  Scroll,\n  MenuItem,\n} from 'folds';\nimport type { Room } from '$types/matrix-sdk';\nimport { isKeyHotkey } from 'is-hotkey';\nimport FocusTrap from 'focus-trap-react';\nimport { stopPropagation } from '$utils/keyboard';\nimport { useDirectUsers } from '$hooks/useDirectUsers';\nimport { getMxIdLocalPart, isUserId } from '$utils/matrix';\nimport type { UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport { highlightText, makeHighlightRegex } from '$plugins/react-custom-html-parser';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { AsyncError } from '$components/AsyncError';\nimport { composerIcon, X } from '$components/icons/phosphor';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useAlive } from '$hooks/useAlive';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport { KnownMembership } from '$types/matrix-sdk';\nimport { Button } from '$components/button';\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  limit: 1000,\n  matchOptions: {\n    contain: true,\n  },\n};\nconst getUserIdString = (userId: string) => getMxIdLocalPart(userId) ?? userId;\n\ntype InviteUserProps = {\n  room: Room;\n  requestClose: () => void;\n};\nexport function InviteUserPrompt({ room, requestClose }: InviteUserProps) {\n  const mx = useMatrixClient();\n  const alive = useAlive();\n\n  const inputRef = useRef<HTMLInputElement>(null);\n  const directUsers = useDirectUsers();\n  const [validUserId, setValidUserId] = useState<string>();\n\n  const filteredUsers = useMemo(\n    () =>\n      directUsers.filter((userId) => {\n        const membership = room.getMember(userId)?.membership;\n        return membership !== KnownMembership.Join;\n      }),\n    [directUsers, room]\n  );\n  const [result, search, resetSearch] = useAsyncSearch(\n    filteredUsers,\n    getUserIdString,\n    SEARCH_OPTIONS\n  );\n  const queryHighlighRegex = result?.query\n    ? makeHighlightRegex(result.query.split(' '))\n    : undefined;\n\n  const [inviteState, invite] = useAsyncCallback<void, Error, [string, string | undefined]>(\n    useCallback(\n      async (userId, reason) => {\n        await mx.invite(room.roomId, userId, reason);\n      },\n      [mx, room]\n    )\n  );\n\n  const inviting = inviteState.status === AsyncStatus.Loading;\n\n  const handleReset = () => {\n    if (inputRef.current) inputRef.current.value = '';\n    setValidUserId(undefined);\n    resetSearch();\n  };\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    const target = evt.target as HTMLFormElement | undefined;\n\n    if (inviting || !validUserId) return;\n\n    const reasonInput = target?.reasonInput as HTMLTextAreaElement | undefined;\n    const reason = reasonInput?.value.trim();\n\n    invite(validUserId, reason || undefined).then(() => {\n      if (alive()) {\n        handleReset();\n        if (reasonInput) reasonInput.value = '';\n      }\n    });\n  };\n\n  const handleSearchChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const value = evt.currentTarget.value.trim();\n    if (isUserId(value)) {\n      setValidUserId(value);\n    } else {\n      setValidUserId(undefined);\n      const term = getMxIdLocalPart(value) ?? (value.startsWith('@') ? value.slice(1) : value);\n      if (term) {\n        search(term);\n      } else {\n        resetSearch();\n      }\n    }\n  };\n\n  const handleUserId = (userId: string) => {\n    if (inputRef.current) {\n      inputRef.current.value = userId;\n      setValidUserId(userId);\n      resetSearch();\n      inputRef.current.focus();\n    }\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      resetSearch();\n      return;\n    }\n    if (isKeyHotkey('tab', evt) && result && result.items.length > 0) {\n      evt.preventDefault();\n      const userId = result.items[0];\n      if (!userId) return;\n      handleUserId(userId);\n    }\n  };\n\n  return (\n    <Overlay open backdrop={<OverlayBackdrop />}>\n      <OverlayCenter>\n        <FocusTrap\n          focusTrapOptions={{\n            initialFocus: () => inputRef.current,\n            clickOutsideDeactivates: true,\n            onDeactivate: requestClose,\n            escapeDeactivates: stopPropagation,\n          }}\n        >\n          <Dialog>\n            <Box grow=\"Yes\" direction=\"Column\">\n              <Header\n                size=\"500\"\n                style={{ padding: `0 ${config.space.S200} 0 ${config.space.S400}` }}\n              >\n                <Box grow=\"Yes\">\n                  <Text size=\"H4\" truncate>\n                    Invite\n                  </Text>\n                </Box>\n                <Box shrink=\"No\">\n                  <IconButton size=\"300\" radii=\"300\" onClick={requestClose}>\n                    {composerIcon(X)}\n                  </IconButton>\n                </Box>\n              </Header>\n              <Box\n                as=\"form\"\n                onSubmit={handleSubmit}\n                shrink=\"No\"\n                style={{ padding: config.space.S400 }}\n                direction=\"Column\"\n                gap=\"400\"\n              >\n                <Box direction=\"Column\" gap=\"100\">\n                  <Text size=\"L400\">User ID</Text>\n                  <div>\n                    <Input\n                      size=\"500\"\n                      ref={inputRef}\n                      onChange={handleSearchChange}\n                      onKeyDown={handleKeyDown}\n                      placeholder=\"@username:server\"\n                      name=\"userIdInput\"\n                      variant=\"Background\"\n                      disabled={inviting}\n                      autoComplete=\"off\"\n                      required\n                    />\n                    {result && result.items.length > 0 && (\n                      <FocusTrap\n                        focusTrapOptions={{\n                          initialFocus: false,\n                          onDeactivate: resetSearch,\n                          returnFocusOnDeactivate: false,\n                          clickOutsideDeactivates: true,\n                          allowOutsideClick: true,\n                          isKeyForward: (evt: KeyboardEvent) => isKeyHotkey('arrowdown', evt),\n                          isKeyBackward: (evt: KeyboardEvent) => isKeyHotkey('arrowup', evt),\n                          escapeDeactivates: stopPropagation,\n                        }}\n                      >\n                        <Box style={{ position: 'relative' }}>\n                          <Menu\n                            style={{\n                              position: 'absolute',\n                              top: 0,\n                              zIndex: 1,\n                              width: '100%',\n                            }}\n                          >\n                            <Scroll size=\"300\" style={{ maxHeight: toRem(100) }}>\n                              <div\n                                style={{\n                                  padding: config.space.S100,\n                                }}\n                              >\n                                {result.items.map((userId) => {\n                                  const username = `${getMxIdLocalPart(userId)}`;\n                                  const userServer = getMxIdServer(userId);\n\n                                  return (\n                                    <MenuItem\n                                      key={userId}\n                                      type=\"button\"\n                                      size=\"300\"\n                                      variant=\"Surface\"\n                                      radii=\"300\"\n                                      onClick={() => handleUserId(userId)}\n                                      after={\n                                        <Text size=\"T200\" truncate>\n                                          {userServer}\n                                        </Text>\n                                      }\n                                      disabled={inviting}\n                                    >\n                                      <Box grow=\"Yes\">\n                                        <Text size=\"T300\" truncate>\n                                          <b>\n                                            {queryHighlighRegex\n                                              ? highlightText(queryHighlighRegex, [\n                                                  username ?? userId,\n                                                ])\n                                              : username}\n                                          </b>\n                                        </Text>\n                                      </Box>\n                                    </MenuItem>\n                                  );\n                                })}\n                              </div>\n                            </Scroll>\n                          </Menu>\n                        </Box>\n                      </FocusTrap>\n                    )}\n                  </div>\n                </Box>\n                <Box direction=\"Column\" gap=\"100\">\n                  <Text size=\"L400\">Reason (Optional)</Text>\n                  <TextArea\n                    size=\"500\"\n                    name=\"reasonInput\"\n                    variant=\"Background\"\n                    rows={4}\n                    resize=\"None\"\n                  />\n                </Box>\n                <AsyncError state={inviteState} bold />\n                <Button\n                  type=\"submit\"\n                  loading={inviting}\n                  spinnerSize=\"200\"\n                  spinnerVariant=\"Primary\"\n                  spinnerFill=\"Solid\"\n                  disabled={!validUserId}\n                >\n                  <Text size=\"B400\">Invite</Text>\n                </Button>\n              </Box>\n            </Box>\n          </Dialog>\n        </FocusTrap>\n      </OverlayCenter>\n    </Overlay>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Box, Dialog, Header, IconButton, Text, config } from 'folds';\nimport { composerIcon, X } from '$components/icons/phosphor';\nimport { ModalOverlay } from './ModalOverlay';\n\ntype PromptDialogProps = {\n  title: string;\n  requestClose: () => void;\n  children: ReactNode;\n};\n\n/** A titled dialog with a close button, over a dimmed backdrop. */\nexport function PromptDialog({ title, requestClose, children }: PromptDialogProps) {\n  return (\n    <ModalOverlay requestClose={requestClose}>\n      <Dialog variant=\"Surface\">\n        <Header\n          style={{\n            padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n            borderBottomWidth: config.borderWidth.B300,\n          }}\n          variant=\"Surface\"\n          size=\"500\"\n        >\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">{title}</Text>\n          </Box>\n          <IconButton size=\"300\" onClick={requestClose} radii=\"300\">\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        {children}\n      </Dialog>\n    </ModalOverlay>\n  );\n}\n","import { Box, Text, color, config } from 'folds';\nimport { PromptDialog } from '$components/modal-overlay/PromptDialog';\nimport { Button } from '$components/button';\n\ntype DirectInvitePromptProps = {\n  onCancel: () => void;\n  onInviteDirect: () => void;\n  onConvertAndInvite: () => void;\n  converting: boolean;\n  convertError?: string;\n};\n\nexport function DirectInvitePrompt({\n  onCancel,\n  onInviteDirect,\n  onConvertAndInvite,\n  converting,\n  convertError,\n}: DirectInvitePromptProps) {\n  return (\n    <PromptDialog title=\"Invite another Member\" requestClose={onCancel}>\n      <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n        <Box direction=\"Column\" gap=\"200\">\n          <Text size=\"T300\">\n            This is a <b>Direct Message</b> room, intended for a conversation between two persons.\n            Would you like to convert it into a <b>group chat</b> before continuing?\n          </Text>\n          {convertError && (\n            <Text style={{ color: color.Critical.Main }} size=\"T300\">\n              Failed to convert direct message to room! {convertError}\n            </Text>\n          )}\n        </Box>\n        <Box direction=\"Column\" gap=\"200\">\n          <Button\n            variant=\"Primary\"\n            onClick={onConvertAndInvite}\n            loading={converting}\n            spinnerVariant=\"Primary\"\n            spinnerSize=\"200\"\n            aria-disabled={converting}\n          >\n            <Text size=\"B400\">\n              {converting ? 'Converting...' : 'Convert to Group Chat and Invite'}\n            </Text>\n          </Button>\n          <Button variant=\"Warning\" fill=\"Soft\" onClick={onInviteDirect} disabled={converting}>\n            <Text size=\"B400\">Invite to Direct Message anyway</Text>\n          </Button>\n          <Button variant=\"Secondary\" fill=\"Soft\" onClick={onCancel} disabled={converting}>\n            <Text size=\"B400\">Cancel</Text>\n          </Button>\n        </Box>\n      </Box>\n    </PromptDialog>\n  );\n}\n","import type { DateFormat, MessageSpacing } from '$state/settings';\nimport { CaptionPosition, MessageLayout, ShowRoomIcon } from '$state/settings';\nimport type { SettingMenuOption } from './SettingMenuSelector';\n\nexport const MESSAGE_LAYOUT_OPTIONS: SettingMenuOption<MessageLayout>[] = [\n  { value: MessageLayout.Modern, label: 'Modern' },\n  { value: MessageLayout.Compact, label: 'Compact' },\n  { value: MessageLayout.Bubble, label: 'Bubble' },\n];\n\nexport const MESSAGE_SPACING_OPTIONS: SettingMenuOption<MessageSpacing>[] = [\n  { value: '0', label: 'None' },\n  { value: '100', label: 'Ultra Small' },\n  { value: '200', label: 'Extra Small' },\n  { value: '300', label: 'Small' },\n  { value: '400', label: 'Normal' },\n  { value: '500', label: 'Large' },\n];\n\nexport const CAPTION_POSITION_OPTIONS: SettingMenuOption<CaptionPosition>[] = [\n  { value: CaptionPosition.Above, label: 'Above' },\n  { value: CaptionPosition.Inline, label: 'Inline' },\n  { value: CaptionPosition.Hidden, label: 'Hidden' },\n  { value: CaptionPosition.Below, label: 'Below' },\n];\n\nexport const SHOW_ROOM_ICON_OPTIONS: SettingMenuOption<ShowRoomIcon>[] = [\n  { value: ShowRoomIcon.Always, label: 'Always' },\n  { value: ShowRoomIcon.Strict, label: 'Sometimes' },\n  { value: ShowRoomIcon.Smart, label: 'Collapsed' },\n  { value: ShowRoomIcon.Never, label: 'Never' },\n];\n\n/** Sentinel for rooms that follow the account wide icon setting. */\nexport const SHOW_ROOM_ICON_DEFAULT = 'default';\nexport type ShowRoomIconValue = ShowRoomIcon | typeof SHOW_ROOM_ICON_DEFAULT;\n\nexport const PER_ROOM_SHOW_ROOM_ICON_OPTIONS: SettingMenuOption<ShowRoomIconValue>[] = [\n  { value: SHOW_ROOM_ICON_DEFAULT, label: 'Default' },\n  ...SHOW_ROOM_ICON_OPTIONS,\n];\n\n/** Labels are the current date rendered in each pattern, so they are built at render. */\nexport const DATE_FORMATS: DateFormat[] = [\n  'D MMM YYYY',\n  'DD/MM/YYYY',\n  'MM/DD/YYYY',\n  'YYYY/MM/DD',\n  '',\n];\n\nexport type PanelSizeKey =\n  | 'roomSidebarWidth'\n  | 'memberSidebarWidth'\n  | 'threadSidebarWidth'\n  | 'threadRootHeight'\n  | 'vcmsgSidebarWidth'\n  | 'widgetSidebarWidth'\n  | 'roomBannerHeight';\n\nexport const PANEL_SIZE_OPTIONS: SettingMenuOption<PanelSizeKey>[] = [\n  { value: 'roomSidebarWidth', label: 'Room Panel Width' },\n  { value: 'memberSidebarWidth', label: 'Member Panel Width' },\n  { value: 'threadSidebarWidth', label: 'Thread Panel Width' },\n  { value: 'threadRootHeight', label: 'Thread Root Height' },\n  { value: 'vcmsgSidebarWidth', label: 'VoiceCall Msg Panel Width' },\n  { value: 'widgetSidebarWidth', label: 'Widget Panel Width' },\n  { value: 'roomBannerHeight', label: 'Room Banner Height' },\n];\n","import { Box, Text } from 'folds';\nimport type { ReactNode } from 'react';\nimport { type MouseEventHandler } from 'react';\nimport { SettingMenuSelector, type SettingMenuOption } from '$components/setting-menu-selector';\nimport {\n  roomNotificationModeIcon,\n  RoomNotificationMode,\n  useSetRoomNotificationPreference,\n} from '$hooks/useRoomsNotificationPreferences';\nimport { AsyncStatus } from '$hooks/useAsyncCallback';\n\nconst ROOM_NOTIFICATION_MODE_LABELS: Record<RoomNotificationMode, string> = {\n  [RoomNotificationMode.Unset]: 'Default',\n  [RoomNotificationMode.AllMessages]: 'All Messages',\n  [RoomNotificationMode.SpecialMessages]: 'Mention & Keywords',\n  [RoomNotificationMode.Mute]: 'Mute',\n};\n\nconst ROOM_NOTIFICATION_MODE_OPTIONS: SettingMenuOption<RoomNotificationMode>[] = [\n  RoomNotificationMode.Unset,\n  RoomNotificationMode.AllMessages,\n  RoomNotificationMode.SpecialMessages,\n  RoomNotificationMode.Mute,\n].map((mode) => ({\n  value: mode,\n  label: ROOM_NOTIFICATION_MODE_LABELS[mode],\n  description:\n    mode === RoomNotificationMode.Unset ? 'Follows your global notification rules' : undefined,\n}));\n\ntype NotificationModeSwitcherProps = {\n  roomId: string;\n  value?: RoomNotificationMode;\n  children: (\n    handleOpen: MouseEventHandler<HTMLButtonElement>,\n    opened: boolean,\n    changing: boolean\n  ) => ReactNode;\n};\nexport function RoomNotificationModeSwitcher({\n  roomId,\n  value = RoomNotificationMode.Unset,\n  children,\n}: NotificationModeSwitcherProps) {\n  const { modeState, setMode } = useSetRoomNotificationPreference(roomId);\n  const changing = modeState.status === AsyncStatus.Loading;\n\n  return (\n    <SettingMenuSelector\n      value={value}\n      options={ROOM_NOTIFICATION_MODE_OPTIONS}\n      onSelect={(mode) => setMode(mode, value)}\n      loading={changing}\n      offset={5}\n      position=\"Right\"\n      align=\"Start\"\n      renderTrigger={({ openMenu, opened }) => children(openMenu, opened, changing)}\n      renderOption={({ option, selected }) => (\n        <Box\n          alignItems=\"Center\"\n          gap=\"200\"\n          style={option.value === RoomNotificationMode.Unset ? { minHeight: '48px' } : undefined}\n        >\n          {roomNotificationModeIcon(option.value, { weight: selected ? 'fill' : 'regular' })}\n          <Box direction=\"Column\" gap=\"100\">\n            <Text size=\"T300\">{selected ? <b>{option.label}</b> : option.label}</Text>\n            {option.description && (\n              <Text size=\"T200\" priority=\"300\">\n                {option.description}\n              </Text>\n            )}\n          </Box>\n        </Box>\n      )}\n    />\n  );\n}\n","import type { ContainerColor as TContainerColor } from 'folds';\nimport { as } from 'folds';\nimport classNames from 'classnames';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport * as css from './CutoutCard.css';\n\nexport const CutoutCard = as<'div', { variant?: TContainerColor }>(\n  ({ as: AsCutoutCard = 'div', className, variant = 'Surface', ...props }, ref) => (\n    <AsCutoutCard\n      className={classNames(ContainerColor({ variant }), css.CutoutCard, className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n","import type { ReactNode } from 'react';\nimport { Box, Text, Scroll } from 'folds';\nimport { CutoutCard } from '$components/cutout-card';\nimport * as css from './styles.css';\n\nexport function PickerColumn({ title, children }: { title: string; children: ReactNode }) {\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text className={css.PickerColumnLabel} size=\"L400\">\n        {title}\n      </Text>\n      <Box grow=\"Yes\">\n        <CutoutCard variant=\"Background\">\n          <Scroll variant=\"Background\" size=\"300\" hideTrack>\n            <Box className={css.PickerColumnContent} direction=\"Column\" gap=\"100\">\n              {children}\n            </Box>\n          </Scroll>\n        </CutoutCard>\n      </Box>\n    </Box>\n  );\n}\n","import { forwardRef } from 'react';\nimport { Menu, Box, Text, Chip } from 'folds';\nimport dayjs from 'dayjs';\nimport { hour12to24, hour24to12, hoursToMs, inSameDay, minutesToMs } from '$utils/time';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { PickerColumn } from './PickerColumn';\nimport * as css from './styles.css';\n\ntype TimePickerProps = {\n  min: number;\n  max: number;\n  value: number;\n  onChange: (value: number) => void;\n};\nexport const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n  ({ min, max, value, onChange }, ref) => {\n    const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n\n    const hour24 = dayjs(value).hour();\n\n    const selectedHour = hour24Clock ? hour24 : hour24to12(hour24);\n    const selectedMinute = dayjs(value).minute();\n    const selectedPM = hour24 >= 12;\n\n    const handleSubmit = (newValue: number) => {\n      onChange(Math.min(Math.max(min, newValue), max));\n    };\n\n    const handleHour = (hour: number) => {\n      const seconds = hoursToMs(hour24Clock ? hour : hour12to24(hour, selectedPM));\n      const lastSeconds = hoursToMs(hour24);\n      const newValue = value + (seconds - lastSeconds);\n      handleSubmit(newValue);\n    };\n\n    const handleMinute = (minute: number) => {\n      const seconds = minutesToMs(minute);\n      const lastSeconds = minutesToMs(selectedMinute);\n      const newValue = value + (seconds - lastSeconds);\n      handleSubmit(newValue);\n    };\n\n    const handlePeriod = (pm: boolean) => {\n      const seconds = hoursToMs(hour12to24(selectedHour, pm));\n      const lastSeconds = hoursToMs(hour24);\n      const newValue = value + (seconds - lastSeconds);\n      handleSubmit(newValue);\n    };\n\n    const minHour24 = dayjs(min).hour();\n    const maxHour24 = dayjs(max).hour();\n\n    const minMinute = dayjs(min).minute();\n    const maxMinute = dayjs(max).minute();\n    const minPM = minHour24 >= 12;\n    const maxPM = maxHour24 >= 12;\n\n    const minDay = inSameDay(min, value);\n    const maxDay = inSameDay(max, value);\n\n    return (\n      <Menu className={css.PickerMenu} ref={ref}>\n        <Box direction=\"Row\" gap=\"200\" className={css.PickerContainer}>\n          <PickerColumn title=\"Hour\">\n            {hour24Clock\n              ? Array.from({ length: 24 }, (_, i) => i).map((hour) => (\n                  <Chip\n                    key={hour}\n                    size=\"500\"\n                    variant={hour === selectedHour ? 'Primary' : 'Background'}\n                    fill=\"None\"\n                    radii=\"300\"\n                    aria-selected={hour === selectedHour}\n                    onClick={() => handleHour(hour)}\n                    disabled={(minDay && hour < minHour24) || (maxDay && hour > maxHour24)}\n                  >\n                    <Text size=\"T300\">{hour < 10 ? `0${hour}` : hour}</Text>\n                  </Chip>\n                ))\n              : Array.from({ length: 12 }, (_, i) => {\n                  if (i === 0) return 12;\n                  return i;\n                }).map((hour) => (\n                  <Chip\n                    key={hour}\n                    size=\"500\"\n                    variant={hour === selectedHour ? 'Primary' : 'Background'}\n                    fill=\"None\"\n                    radii=\"300\"\n                    aria-selected={hour === selectedHour}\n                    onClick={() => handleHour(hour)}\n                    disabled={\n                      (minDay && hour12to24(hour, selectedPM) < minHour24) ||\n                      (maxDay && hour12to24(hour, selectedPM) > maxHour24)\n                    }\n                  >\n                    <Text size=\"T300\">{hour < 10 ? `0${hour}` : hour}</Text>\n                  </Chip>\n                ))}\n          </PickerColumn>\n          <PickerColumn title=\"Minutes\">\n            {Array.from({ length: 60 }, (_, i) => i).map((minute) => (\n              <Chip\n                key={minute}\n                size=\"500\"\n                variant={minute === selectedMinute ? 'Primary' : 'Background'}\n                fill=\"None\"\n                radii=\"300\"\n                aria-selected={minute === selectedMinute}\n                onClick={() => handleMinute(minute)}\n                disabled={\n                  (minDay && hour24 === minHour24 && minute < minMinute) ||\n                  (maxDay && hour24 === maxHour24 && minute > maxMinute)\n                }\n              >\n                <Text size=\"T300\">{minute < 10 ? `0${minute}` : minute}</Text>\n              </Chip>\n            ))}\n          </PickerColumn>\n          {!hour24Clock && (\n            <PickerColumn title=\"Period\">\n              <Chip\n                size=\"500\"\n                variant={selectedPM ? 'SurfaceVariant' : 'Primary'}\n                fill=\"None\"\n                radii=\"300\"\n                aria-selected={!selectedPM}\n                onClick={() => handlePeriod(false)}\n                disabled={minDay && minPM}\n              >\n                <Text size=\"T300\">AM</Text>\n              </Chip>\n              <Chip\n                size=\"500\"\n                variant={selectedPM ? 'Primary' : 'SurfaceVariant'}\n                fill=\"None\"\n                radii=\"300\"\n                aria-selected={selectedPM}\n                onClick={() => handlePeriod(true)}\n                disabled={maxDay && !maxPM}\n              >\n                <Text size=\"T300\">PM</Text>\n              </Chip>\n            </PickerColumn>\n          )}\n        </Box>\n      </Menu>\n    );\n  }\n);\n","import { forwardRef } from 'react';\nimport { Menu, Box, Text, Chip } from 'folds';\nimport dayjs from 'dayjs';\nimport { dateFor, daysInMonth, daysToMs } from '$utils/time';\nimport * as css from './styles.css';\nimport { PickerColumn } from './PickerColumn';\n\ntype DatePickerProps = {\n  min: number;\n  max: number;\n  value: number;\n  onChange: (value: number) => void;\n};\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n  ({ min, max, value, onChange }, ref) => {\n    const selectedYear = dayjs(value).year();\n    const selectedMonth = dayjs(value).month() + 1;\n    const selectedDay = dayjs(value).date();\n\n    const handleSubmit = (newValue: number) => {\n      onChange(Math.min(Math.max(min, newValue), max));\n    };\n\n    const handleDay = (day: number) => {\n      const seconds = daysToMs(day);\n      const lastSeconds = daysToMs(selectedDay);\n      const newValue = value + (seconds - lastSeconds);\n      handleSubmit(newValue);\n    };\n\n    const handleMonthAndYear = (month: number, year: number) => {\n      const mDays = daysInMonth(month, year);\n      const currentDate = dateFor(selectedYear, selectedMonth, selectedDay);\n      const time = value - currentDate;\n\n      const newDate = dateFor(year, month, Math.min(mDays, selectedDay));\n\n      const newValue = newDate + time;\n      handleSubmit(newValue);\n    };\n\n    const handleMonth = (month: number) => {\n      handleMonthAndYear(month, selectedYear);\n    };\n\n    const handleYear = (year: number) => {\n      handleMonthAndYear(selectedMonth, year);\n    };\n\n    const minYear = dayjs(min).year();\n    const maxYear = dayjs(max).year();\n    const yearsRange = maxYear - minYear + 1;\n\n    const minMonth = dayjs(min).month() + 1;\n    const maxMonth = dayjs(max).month() + 1;\n\n    const minDay = dayjs(min).date();\n    const maxDay = dayjs(max).date();\n    return (\n      <Menu className={css.PickerMenu} ref={ref}>\n        <Box direction=\"Row\" gap=\"200\" className={css.PickerContainer}>\n          <PickerColumn title=\"Day\">\n            {Array.from({ length: daysInMonth(selectedMonth, selectedYear) }, (_, i) => i + 1).map(\n              (day) => (\n                <Chip\n                  key={day}\n                  size=\"500\"\n                  variant={selectedDay === day ? 'Primary' : 'SurfaceVariant'}\n                  fill=\"None\"\n                  radii=\"300\"\n                  aria-selected={selectedDay === day}\n                  onClick={() => handleDay(day)}\n                  disabled={\n                    (selectedYear === minYear && selectedMonth === minMonth && day < minDay) ||\n                    (selectedYear === maxYear && selectedMonth === maxMonth && day > maxDay)\n                  }\n                >\n                  <Text size=\"T300\">{day}</Text>\n                </Chip>\n              )\n            )}\n          </PickerColumn>\n          <PickerColumn title=\"Month\">\n            {Array.from({ length: 12 }, (_, i) => i + 1).map((month) => (\n              <Chip\n                key={month}\n                size=\"500\"\n                variant={selectedMonth === month ? 'Primary' : 'SurfaceVariant'}\n                fill=\"None\"\n                radii=\"300\"\n                aria-selected={selectedMonth === month}\n                onClick={() => handleMonth(month)}\n                disabled={\n                  (selectedYear === minYear && month < minMonth) ||\n                  (selectedYear === maxYear && month > maxMonth)\n                }\n              >\n                <Text size=\"T300\">\n                  {dayjs()\n                    .month(month - 1)\n                    .format('MMM')}\n                </Text>\n              </Chip>\n            ))}\n          </PickerColumn>\n          <PickerColumn title=\"Year\">\n            {Array.from({ length: yearsRange }, (_, i) => minYear + i).map((year) => (\n              <Chip\n                key={year}\n                size=\"500\"\n                variant={selectedYear === year ? 'Primary' : 'SurfaceVariant'}\n                fill=\"None\"\n                radii=\"300\"\n                aria-selected={selectedYear === year}\n                onClick={() => handleYear(year)}\n              >\n                <Text size=\"T300\">{year}</Text>\n              </Chip>\n            ))}\n          </PickerColumn>\n        </Box>\n      </Menu>\n    );\n  }\n);\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport FocusTrap from 'focus-trap-react';\nimport { CaretDown, chipIcon, composerIcon, X } from '$components/icons/phosphor';\nimport type { RectCords } from 'folds';\nimport { Dialog, Header, config, Box, Text, IconButton, color, Button, Spinner, Chip } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport type { MatrixError } from '$types/matrix-sdk';\nimport { Direction, EventType } from '$types/matrix-sdk';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { stopPropagation } from '$utils/keyboard';\nimport { useAlive } from '$hooks/useAlive';\nimport { useStateEvent } from '$hooks/useStateEvent';\nimport { useRoom } from '$hooks/useRoom';\n\nimport { getToday, getYesterday, timeDayMonthYear, timeHourMinute } from '$utils/time';\nimport { DatePicker, TimePicker } from '$components/time-date';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\ntype JumpToTimeProps = {\n  onCancel: () => void;\n  onSubmit: (eventId: string) => void;\n};\nexport function JumpToTime({ onCancel, onSubmit }: JumpToTimeProps) {\n  const mx = useMatrixClient();\n  const room = useRoom();\n  const alive = useAlive();\n  const createStateEvent = useStateEvent(room, EventType.RoomCreate);\n\n  const todayTs = getToday();\n  const yesterdayTs = getYesterday();\n  const createTs = useMemo(() => createStateEvent?.getTs() ?? 0, [createStateEvent]);\n  const [ts, setTs] = useState(() => Date.now());\n\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n\n  const [timePickerCords, setTimePickerCords] = useState<RectCords>();\n  const [datePickerCords, setDatePickerCords] = useState<RectCords>();\n\n  const handleTimePicker: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setTimePickerCords(evt.currentTarget.getBoundingClientRect());\n  };\n  const handleDatePicker: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setDatePickerCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const handleToday = () => {\n    setTs(todayTs < createTs ? createTs : todayTs);\n  };\n  const handleYesterday = () => {\n    setTs(yesterdayTs < createTs ? createTs : yesterdayTs);\n  };\n  const handleBeginning = () => setTs(createTs);\n\n  const [timestampState, timestampToEvent] = useAsyncCallback<string, MatrixError, [number]>(\n    useCallback(\n      async (newTs) => {\n        const result = await mx.timestampToEvent(room.roomId, newTs, Direction.Forward);\n        return result.event_id;\n      },\n      [mx, room]\n    )\n  );\n\n  const handleSubmit = () => {\n    timestampToEvent(ts).then((eventId) => {\n      if (alive()) {\n        onSubmit(eventId);\n      }\n    });\n  };\n\n  return (\n    <ModalOverlay requestClose={onCancel}>\n      <Dialog variant=\"Surface\">\n        <Header\n          style={{\n            padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n            borderBottomWidth: config.borderWidth.B300,\n          }}\n          variant=\"Surface\"\n          size=\"500\"\n        >\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">Jump to Time</Text>\n          </Box>\n          <IconButton size=\"300\" onClick={onCancel} radii=\"300\">\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"500\">\n          <Box direction=\"Row\" gap=\"300\">\n            <Box direction=\"Column\" gap=\"100\">\n              <Text size=\"L400\" priority=\"400\">\n                Time\n              </Text>\n              <Box gap=\"100\" alignItems=\"Center\">\n                <Chip\n                  size=\"500\"\n                  variant=\"Surface\"\n                  fill=\"None\"\n                  outlined\n                  radii=\"300\"\n                  aria-pressed={!!timePickerCords}\n                  after={chipIcon(CaretDown)}\n                  onClick={handleTimePicker}\n                >\n                  <Text size=\"B300\">{timeHourMinute(ts, hour24Clock)}</Text>\n                </Chip>\n                <PopOut\n                  anchor={timePickerCords}\n                  offset={5}\n                  position=\"Bottom\"\n                  align=\"Center\"\n                  content={\n                    <FocusTrap\n                      focusTrapOptions={{\n                        initialFocus: false,\n                        onDeactivate: () => setTimePickerCords(undefined),\n                        clickOutsideDeactivates: true,\n                        isKeyForward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n                        isKeyBackward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n                        escapeDeactivates: stopPropagation,\n                      }}\n                    >\n                      <TimePicker min={createTs} max={Date.now()} value={ts} onChange={setTs} />\n                    </FocusTrap>\n                  }\n                />\n              </Box>\n            </Box>\n            <Box direction=\"Column\" gap=\"100\">\n              <Text size=\"L400\" priority=\"400\">\n                Date\n              </Text>\n              <Box gap=\"100\" alignItems=\"Center\">\n                <Chip\n                  size=\"500\"\n                  variant=\"Surface\"\n                  fill=\"None\"\n                  outlined\n                  radii=\"300\"\n                  aria-pressed={!!datePickerCords}\n                  after={chipIcon(CaretDown)}\n                  onClick={handleDatePicker}\n                >\n                  <Text size=\"B300\">{timeDayMonthYear(ts)}</Text>\n                </Chip>\n                <PopOut\n                  anchor={datePickerCords}\n                  offset={5}\n                  position=\"Bottom\"\n                  align=\"Center\"\n                  content={\n                    <FocusTrap\n                      focusTrapOptions={{\n                        initialFocus: false,\n                        onDeactivate: () => setDatePickerCords(undefined),\n                        clickOutsideDeactivates: true,\n                        isKeyForward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n                        isKeyBackward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n                        escapeDeactivates: stopPropagation,\n                      }}\n                    >\n                      <DatePicker min={createTs} max={Date.now()} value={ts} onChange={setTs} />\n                    </FocusTrap>\n                  }\n                />\n              </Box>\n            </Box>\n          </Box>\n          <Box direction=\"Column\" gap=\"100\">\n            <Text size=\"L400\">Preset</Text>\n            <Box gap=\"200\">\n              {createTs < todayTs && (\n                <Chip\n                  variant={ts === todayTs ? 'Success' : 'SurfaceVariant'}\n                  radii=\"Pill\"\n                  aria-pressed={ts === todayTs}\n                  onClick={handleToday}\n                >\n                  <Text size=\"B300\">Today</Text>\n                </Chip>\n              )}\n              {createTs < yesterdayTs && (\n                <Chip\n                  variant={ts === yesterdayTs ? 'Success' : 'SurfaceVariant'}\n                  radii=\"Pill\"\n                  aria-pressed={ts === yesterdayTs}\n                  onClick={handleYesterday}\n                >\n                  <Text size=\"B300\">Yesterday</Text>\n                </Chip>\n              )}\n              <Chip\n                variant={ts === createTs ? 'Success' : 'SurfaceVariant'}\n                radii=\"Pill\"\n                aria-pressed={ts === createTs}\n                onClick={handleBeginning}\n              >\n                <Text size=\"B300\">Beginning</Text>\n              </Chip>\n            </Box>\n          </Box>\n          {timestampState.status === AsyncStatus.Error && (\n            <Text style={{ color: color.Critical.Main }} size=\"T300\">\n              {timestampState.error.message}\n            </Text>\n          )}\n          <Button\n            type=\"submit\"\n            variant=\"Primary\"\n            before={\n              timestampState.status === AsyncStatus.Loading ? (\n                <Spinner fill=\"Solid\" variant=\"Primary\" size=\"200\" />\n              ) : undefined\n            }\n            aria-disabled={\n              timestampState.status === AsyncStatus.Loading ||\n              timestampState.status === AsyncStatus.Success\n            }\n            onClick={handleSubmit}\n          >\n            <Text size=\"B400\">Open Timeline</Text>\n          </Button>\n        </Box>\n      </Dialog>\n    </ModalOverlay>\n  );\n}\n","import { useCallback } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { selectAtom } from 'jotai/utils';\nimport type { RoomToUnread, Unread } from '$types/matrix/room';\nimport type { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { unreadEqual } from '$state/room/roomToUnread';\n\nconst compareUnreadEqual = (u1?: Unread, u2?: Unread): boolean => {\n  if (!u1 || !u2) return false;\n  return unreadEqual(u1, u2);\n};\n\nconst getRoomsUnread = (rooms: string[], roomToUnread: RoomToUnread): Unread | undefined => {\n  const unread = rooms.reduce<Unread | undefined>((u, roomId) => {\n    const roomUnread = roomToUnread.get(roomId);\n    if (!roomUnread) return u;\n    const newUnread: Unread = u ?? {\n      total: 0,\n      highlight: 0,\n      from: new Set(),\n    };\n    newUnread.total += roomUnread.total;\n    newUnread.highlight += roomUnread.highlight;\n    newUnread.from?.add(roomId);\n    return newUnread;\n  }, undefined);\n  return unread;\n};\n\nexport const useRoomsUnread = (\n  rooms: string[],\n  roomToUnreadAtm: typeof roomToUnreadAtom\n): Unread | undefined => {\n  const selector = useCallback(\n    (roomToUnread: RoomToUnread) => getRoomsUnread(rooms, roomToUnread),\n    [rooms]\n  );\n  return useAtomValue(selectAtom(roomToUnreadAtm, selector, compareUnreadEqual));\n};\n\nexport const useRoomUnread = (\n  roomId: string,\n  roomToUnreadAtm: typeof roomToUnreadAtom\n): Unread | undefined => {\n  const selector = useCallback((roomToUnread: RoomToUnread) => roomToUnread.get(roomId), [roomId]);\n  return useAtomValue(selectAtom(roomToUnreadAtm, selector, compareUnreadEqual));\n};\n","type Listener = () => void;\n\nclass Emitter<T> {\n  private listeners = new Set<(value: T) => void>();\n\n  emit(value: T) {\n    for (const fn of this.listeners) fn(value);\n  }\n\n  on(fn: (value: T) => void): Listener {\n    this.listeners.add(fn);\n    return () => {\n      this.listeners.delete(fn);\n    };\n  }\n}\n\n/** Destructive confirms stay centred alerts on mobile, never bottom sheets. */\nexport type ConfirmOptions = {\n  title: string;\n  description: string;\n  /** Label on the primary (destructive) button. */\n  action: string;\n  /** 'Critical' for destructive, 'Warning' for risky. */\n  variant: 'Critical' | 'Warning' | 'Primary';\n};\n\nexport type ConfirmRequest = ConfirmOptions & {\n  resolve: (value: boolean) => void;\n};\n\nconst emitter = new Emitter<ConfirmRequest>();\n\n/**\n * Resolves `true` on the destructive button, `false` on any dismissal — close\n * button, Escape, Android back, or click-outside.\n *\n * Carries no async state: the caller owns any spinner or error handling after\n * confirmation.\n */\nexport function confirm(opts: ConfirmOptions): Promise<boolean> {\n  return new Promise<boolean>((resolve) => {\n    emitter.emit({ ...opts, resolve });\n  });\n}\n\n/** Exported for ConfirmHost and tests only. Not part of the public API. */\nexport const confirmEmitter = emitter;\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useAtomValue } from 'jotai';\nimport type { Room } from '$types/matrix-sdk';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { getCanonicalAliasOrRoomId, isRoomAlias, removeRoomIdFromMDirect } from '$utils/matrix';\nimport { useRoomUnread } from '$state/hooks/unread';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { usePowerLevels } from '$hooks/usePowerLevels';\nimport { markAsRead } from '$utils/notifications';\nimport { copyToClipboard } from '$utils/dom';\nimport { confirm } from '$components/confirm/confirm';\nimport { showToast } from '$state/toast';\nimport { useOpenRoomSettings } from '$state/hooks/roomSettings';\nimport { getMatrixToRoom } from '$plugins/matrix-to';\nimport { getViaServers } from '$plugins/via-servers';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\n\nexport function useRoomMenuActions(room: Room) {\n  const mx = useMatrixClient();\n  const [hideReads] = useSetting(settingsAtom, 'hideReads');\n  const unread = useRoomUnread(room.roomId, roomToUnreadAtom);\n  const powerLevels = usePowerLevels(room);\n  const creators = useRoomCreators(room);\n\n  const permissions = useRoomPermissions(creators, powerLevels);\n  const canInvite = permissions.action('invite', mx.getSafeUserId());\n  const mDirects = useAtomValue(mDirectAtom);\n  const isDirectConversation = mDirects.has(room.roomId);\n\n  const openSettingsFn = useOpenRoomSettings();\n  const space = useSpaceOptionally();\n  const { navigateRoom } = useRoomNavigate();\n\n  const [invitePrompt, setInvitePrompt] = useState(false);\n  const [directInvitePrompt, setDirectInvitePrompt] = useState(false);\n\n  // Direct prompt's focus trap re-fires onCancel when it unmounts.\n  const invitePromptRef = useRef(invitePrompt);\n  invitePromptRef.current = invitePrompt;\n  const cancelConsumedRef = useRef(false);\n\n  const [convertState, convertToRoom] = useAsyncCallback<void, Error, []>(\n    useCallback(async () => {\n      await removeRoomIdFromMDirect(mx, room.roomId);\n    }, [mx, room.roomId])\n  );\n\n  const handleMarkAsRead = useCallback(() => {\n    markAsRead(mx, room.roomId, hideReads, true);\n  }, [mx, room.roomId, hideReads]);\n\n  const handleInvite = useCallback(() => {\n    cancelConsumedRef.current = false;\n    if (isDirectConversation) {\n      setDirectInvitePrompt(true);\n      return;\n    }\n    setInvitePrompt(true);\n  }, [isDirectConversation]);\n\n  const handleInviteDirect = useCallback(() => {\n    setDirectInvitePrompt(false);\n    setInvitePrompt(true);\n  }, []);\n\n  const handleDirectInviteCancel = useCallback((closeMenu: () => void) => {\n    setDirectInvitePrompt(false);\n    if (!invitePromptRef.current && !cancelConsumedRef.current) {\n      cancelConsumedRef.current = true;\n      closeMenu();\n    }\n  }, []);\n\n  const handleConvertAndInvite = useCallback(() => {\n    if (convertState.status === AsyncStatus.Loading) return;\n    convertToRoom().catch(() => {});\n  }, [convertState.status, convertToRoom]);\n\n  useEffect(() => {\n    if (convertState.status === AsyncStatus.Success) {\n      setDirectInvitePrompt(false);\n      setInvitePrompt(true);\n    }\n  }, [convertState.status]);\n\n  const handleCopyLink = useCallback(() => {\n    const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, room.roomId);\n    const viaServers = isRoomAlias(roomIdOrAlias) ? undefined : getViaServers(room);\n    copyToClipboard(getMatrixToRoom(roomIdOrAlias, viaServers));\n  }, [mx, room]);\n\n  const handleOpenSettings = useCallback(() => {\n    openSettingsFn(room.roomId, space?.roomId);\n  }, [openSettingsFn, room.roomId, space?.roomId]);\n\n  /** Resolves true only when the room was actually left, so callers can keep the menu open otherwise. */\n  const handleLeaveRoom = useCallback(async (): Promise<boolean> => {\n    const ok = await confirm({\n      title: 'Leave Room',\n      description: 'Are you sure you want to leave this room?',\n      action: 'Leave',\n      variant: 'Critical',\n    });\n    if (!ok) return false;\n    try {\n      await mx.leave(room.roomId);\n      return true;\n    } catch (e) {\n      showToast(`Failed to leave room: ${e instanceof Error ? e.message : 'unknown error'}`);\n      return false;\n    }\n  }, [mx, room.roomId]);\n\n  return {\n    handleMarkAsRead,\n    handleInvite,\n    handleCopyLink,\n    handleOpenSettings,\n    handleLeaveRoom,\n    canInvite,\n    unread,\n    invitePrompt,\n    setInvitePrompt,\n    directInvitePrompt,\n    setDirectInvitePrompt,\n    handleInviteDirect,\n    handleDirectInviteCancel,\n    handleConvertAndInvite,\n    convertState,\n    navigateRoom,\n  };\n}\n","import { forwardRef } from 'react';\nimport { Box, Text, Menu, MenuItem, toRem, config, Line, Spinner } from 'folds';\nimport type { Room } from '$types/matrix-sdk';\n\nimport {\n  Checks,\n  ClockCounterClockwise,\n  GearSix,\n  GridFour,\n  Link,\n  menuIcon,\n  SignOut,\n  UserCircle,\n  UserPlus,\n} from '$components/icons/phosphor';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { InviteUserPrompt } from '$components/invite-user-prompt';\nimport { DirectInvitePrompt } from '$components/direct-invite-prompt';\nimport {\n  getRoomNotificationMode,\n  roomNotificationModeIcon,\n  useRoomsNotificationPreferencesContext,\n} from '$hooks/useRoomsNotificationPreferences';\nimport { RoomNotificationModeSwitcher } from '$components/RoomNotificationSwitcher';\nimport { AsyncStatus } from '$hooks/useAsyncCallback';\nimport { JumpToTime } from './jump-to-time';\nimport { useRoomMenuActions } from '$hooks/useRoomMenuActions';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { useOpenRoomSettings } from '$state/hooks/roomSettings';\nimport { RoomSettingsPage } from '$state/roomSettings';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { useSetSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\n\ntype RoomMenuProps = {\n  room: Room;\n  requestClose: () => void;\n};\n\nconst RoomMenu = forwardRef<HTMLDivElement, RoomMenuProps>(({ room, requestClose }, ref) => {\n  const screenSize = useScreenSizeContext();\n  const space = useSpaceOptionally();\n  const openRoomSettings = useOpenRoomSettings();\n  const setWidgetDrawer = useSetSetting(settingsAtom, 'isWidgetDrawer');\n  const {\n    handleMarkAsRead,\n    handleInvite,\n    handleCopyLink,\n    handleOpenSettings,\n    handleLeaveRoom,\n    canInvite,\n    unread,\n    invitePrompt,\n    setInvitePrompt,\n    directInvitePrompt,\n    handleInviteDirect,\n    handleDirectInviteCancel,\n    handleConvertAndInvite,\n    convertState,\n    navigateRoom,\n  } = useRoomMenuActions(room);\n\n  const notificationPreferences = useRoomsNotificationPreferencesContext();\n  const notificationMode = getRoomNotificationMode(notificationPreferences, room.roomId);\n  const compact = screenSize !== ScreenSize.Desktop;\n\n  return (\n    <Menu ref={ref} style={{ maxWidth: toRem(200) }}>\n      {invitePrompt && (\n        <InviteUserPrompt\n          room={room}\n          requestClose={() => {\n            setInvitePrompt(false);\n            requestClose();\n          }}\n        />\n      )}\n      {directInvitePrompt && (\n        <DirectInvitePrompt\n          onCancel={() => handleDirectInviteCancel(requestClose)}\n          onInviteDirect={handleInviteDirect}\n          onConvertAndInvite={handleConvertAndInvite}\n          converting={convertState.status === AsyncStatus.Loading}\n          convertError={\n            convertState.status === AsyncStatus.Error ? convertState.error.message : undefined\n          }\n        />\n      )}\n      <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n        <MenuItem\n          onClick={() => {\n            handleMarkAsRead();\n            requestClose();\n          }}\n          size=\"300\"\n          after={menuIcon(Checks)}\n          radii=\"300\"\n          disabled={!unread}\n        >\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Mark as Read\n          </Text>\n        </MenuItem>\n        <RoomNotificationModeSwitcher roomId={room.roomId} value={notificationMode}>\n          {(handleOpen, opened, changing) => (\n            <MenuItem\n              size=\"300\"\n              after={\n                changing ? (\n                  <Spinner size=\"100\" variant=\"Secondary\" />\n                ) : (\n                  roomNotificationModeIcon(notificationMode)\n                )\n              }\n              radii=\"300\"\n              aria-pressed={opened}\n              onClick={handleOpen}\n            >\n              <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n                Notifications\n              </Text>\n            </MenuItem>\n          )}\n        </RoomNotificationModeSwitcher>\n      </Box>\n      <Line variant=\"Surface\" size=\"300\" />\n      <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n        <MenuItem\n          onClick={() => {\n            handleInvite();\n          }}\n          variant=\"Primary\"\n          fill=\"None\"\n          size=\"300\"\n          after={menuIcon(UserPlus)}\n          radii=\"300\"\n          aria-pressed={invitePrompt}\n          disabled={!canInvite}\n        >\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Invite\n          </Text>\n        </MenuItem>\n        {compact && (\n          <MenuItem\n            onClick={() => {\n              openRoomSettings(room.roomId, space?.roomId, RoomSettingsPage.MembersPage);\n              requestClose();\n            }}\n            size=\"300\"\n            after={menuIcon(UserCircle)}\n            radii=\"300\"\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Members\n            </Text>\n          </MenuItem>\n        )}\n        {compact && (\n          <MenuItem\n            onClick={() => {\n              setWidgetDrawer(true);\n              requestClose();\n            }}\n            size=\"300\"\n            after={menuIcon(GridFour)}\n            radii=\"300\"\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Widgets\n            </Text>\n          </MenuItem>\n        )}\n        <MenuItem\n          onClick={() => {\n            handleCopyLink();\n            requestClose();\n          }}\n          size=\"300\"\n          after={menuIcon(Link)}\n          radii=\"300\"\n        >\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Copy Link\n          </Text>\n        </MenuItem>\n        <MenuItem\n          onClick={() => {\n            handleOpenSettings();\n            requestClose();\n          }}\n          size=\"300\"\n          after={menuIcon(GearSix)}\n          radii=\"300\"\n        >\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Room Settings\n          </Text>\n        </MenuItem>\n        <UseStateProvider initial={false}>\n          {(promptJump, setPromptJump) => (\n            <>\n              <MenuItem\n                onClick={() => setPromptJump(true)}\n                size=\"300\"\n                after={menuIcon(ClockCounterClockwise)}\n                radii=\"300\"\n                aria-pressed={promptJump}\n              >\n                <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n                  Jump to Time\n                </Text>\n              </MenuItem>\n              {promptJump && (\n                <JumpToTime\n                  onSubmit={(eventId) => {\n                    setPromptJump(false);\n                    navigateRoom(room.roomId, eventId);\n                    requestClose();\n                  }}\n                  onCancel={() => setPromptJump(false)}\n                />\n              )}\n            </>\n          )}\n        </UseStateProvider>\n      </Box>\n      <Line variant=\"Surface\" size=\"300\" />\n      <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n        <MenuItem\n          onClick={async () => {\n            if (await handleLeaveRoom()) requestClose();\n          }}\n          variant=\"Critical\"\n          fill=\"None\"\n          size=\"300\"\n          after={menuIcon(SignOut)}\n          radii=\"300\"\n        >\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Leave Room\n          </Text>\n        </MenuItem>\n      </Box>\n    </Menu>\n  );\n});\nRoomMenu.displayName = 'RoomMenu';\n\nexport { RoomMenu };\n","import type { MouseEventHandler } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useAtom } from 'jotai';\nimport classNames from 'classnames';\nimport { Box, Avatar, Text, IconButton, Tooltip, toRem, Badge } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { useNavigate } from 'react-router';\nimport type { MatrixEvent } from '$types/matrix-sdk';\nimport {\n  Direction,\n  type EventTimeline,\n  NotificationCountType,\n  ThreadEvent,\n  RoomEvent,\n  EventType,\n} from '$types/matrix-sdk';\n\nimport { useStateEvent } from '$hooks/useStateEvent';\nimport { PageHeader } from '$components/page';\nimport {\n  ArrowLeft,\n  ChatCircleDots,\n  Chats,\n  composerIcon,\n  DotsThreeOutlineVerticalIcon,\n  GridFour,\n  MagnifyingGlass,\n  PushPin,\n  UserCircle,\n} from '$components/icons/phosphor';\nimport { RoomAvatar, RoomIcon } from '$components/room-avatar';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { RoomTopicViewer } from '$components/room-topic-viewer';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useIsDirectRoom, useRoom } from '$hooks/useRoom';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { getHomeSearchPath, getSpaceSearchPath, withSearchParam } from '$pages/pathUtils';\nimport { createLogger } from '$utils/debug';\nimport { getCanonicalAliasOrRoomId, mxcUrlToHttp } from '$utils/matrix';\nimport { type SearchPathSearchParams } from '$pages/paths';\nimport { useRoomAvatar, useRoomName, useRoomTopic } from '$hooks/useRoomMeta';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { BackRouteHandler } from '$components/BackRouteHandler';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRoomPinnedEvents } from '$hooks/useRoomPinnedEvents';\nimport { useOpenRoomSettings } from '$state/hooks/roomSettings';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { useRoomWidgets } from '$hooks/useRoomWidgets';\nimport { hasThreadRootAggregation, isThreadRelationEvent } from '$utils/room/relations';\nimport { callChatAtom } from '$state/callEmbed';\nimport { RoomSettingsPage } from '$state/roomSettings';\nimport { roomIdToThreadBrowserAtomFamily } from '$state/room/roomToThreadBrowser';\nimport { roomIdToOpenThreadAtomFamily } from '$state/room/roomToOpenThread';\nimport { useCallPreferences } from '$state/hooks/callPreferences';\nimport { useCallStartCapabilities } from '$features/call/useCallStartCapabilities';\nimport { RoomPinMenu } from './room-pin-menu';\nimport * as css from './RoomViewHeader.css';\nimport { RoomCallButton } from './RoomCallButton';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\nconst log = createLogger('RoomViewHeader');\n\nasync function getPinsHash(pinnedIds: string[]): Promise<string> {\n  const sorted = [...pinnedIds].toSorted().join(',');\n  const encoder = new TextEncoder();\n  const data = encoder.encode(sorted);\n  const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n  const hashArray = Array.from(new Uint8Array(hashBuffer));\n  const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n  return hashHex.slice(0, 10);\n}\n\nexport interface PinReadMarker {\n  hash: string;\n  count: number;\n  last_seen_id: string;\n}\n\nimport { RoomMenu } from './RoomMenu';\n\nexport function RoomViewHeader({ callView }: Readonly<{ callView?: boolean }>) {\n  const navigate = useNavigate();\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const screenSize = useScreenSizeContext();\n  const room = useRoom();\n  const space = useSpaceOptionally();\n  const optionsMenu = useMenuAnchor<HTMLButtonElement>();\n  const pinMenu = useMenuAnchor<HTMLButtonElement>();\n  const direct = useIsDirectRoom();\n  const [customDMCards] = useSetting(settingsAtom, 'customDMCards');\n  const { microphone, video, sound } = useCallPreferences();\n\n  const [chat, setChat] = useAtom(callChatAtom);\n  const [threadBrowserOpen, setThreadBrowserOpen] = useAtom(\n    roomIdToThreadBrowserAtomFamily(room.roomId)\n  );\n  const [openThreadId, setOpenThread] = useAtom(roomIdToOpenThreadAtomFamily(room.roomId));\n\n  const callStartCapabilities = useCallStartCapabilities(room);\n  const [alwaysShowCallButton] = useSetting(settingsAtom, 'alwaysShowCallButton');\n  const shouldShowCallButton = alwaysShowCallButton || room.getJoinedMemberCount() <= 10;\n\n  const encryptionEvent = useStateEvent(room, EventType.RoomEncryption);\n  const encryptedRoom = !!encryptionEvent;\n  const avatarMxc = useRoomAvatar(room, direct && !customDMCards);\n  const name = useRoomName(room);\n  const topic = useRoomTopic(room);\n  const avatarUrl = avatarMxc\n    ? (mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96, 'crop') ?? undefined)\n    : undefined;\n\n  const [peopleDrawer, setPeopleDrawer] = useSetting(settingsAtom, 'isPeopleDrawer');\n  const [widgetDrawer, setWidgetDrawer] = useSetting(settingsAtom, 'isWidgetDrawer');\n  const widgets = useRoomWidgets(room);\n\n  const pinnedIds = useRoomPinnedEvents(room);\n  const pinMarker = room\n    .getAccountData(CustomAccountDataEvent.SablePinStatus)\n    ?.getContent() as PinReadMarker;\n  const [unreadPinsCount, setUnreadPinsCount] = useState(0);\n  const [unreadThreadsCount, setUnreadThreadsCount] = useState(0);\n  const [hasThreadHighlights, setHasThreadHighlights] = useState(false);\n\n  const [currentHash, setCurrentHash] = useState('');\n\n  useEffect(() => {\n    getPinsHash(pinnedIds)\n      .then(setCurrentHash)\n      .catch((err) => {\n        log.warn('Failed to compute pins hash:', err);\n      });\n  }, [pinnedIds]);\n\n  useEffect(() => {\n    const checkUnreads = async () => {\n      if (!pinnedIds.length) {\n        setUnreadPinsCount(0);\n        return;\n      }\n\n      const hash = await getPinsHash(pinnedIds);\n\n      if (pinMarker?.hash === hash) {\n        setUnreadPinsCount(0);\n        return;\n      }\n\n      const lastSeenIndex = pinnedIds.indexOf(pinMarker?.last_seen_id);\n      if (lastSeenIndex === -1) {\n        const oldCount = pinMarker?.count ?? 0;\n        const startIndex = Math.max(0, oldCount - 1);\n        const newCount = pinnedIds.length > 0 ? pinnedIds.length - startIndex : 0;\n        setUnreadPinsCount(Math.max(0, newCount));\n      } else {\n        const newPins = pinnedIds.slice(lastSeenIndex + 1);\n        setUnreadPinsCount(newPins.length);\n      }\n    };\n    checkUnreads().catch((err) => {\n      log.warn('Failed to check unread pins:', err);\n    });\n  }, [pinnedIds, pinMarker]);\n\n  // Initialize Thread objects from room history on mount and create them for new timeline events\n  useEffect(() => {\n    const scanTimelineForThreads = (timeline: EventTimeline) => {\n      const events = timeline.getEvents();\n      const threadRoots = new Set<string>();\n\n      // Scan for both:\n      // 1. Events that ARE thread roots (have isThreadRoot = true or have replies)\n      // 2. Events that are IN threads (have threadRootId)\n      events.forEach((event: MatrixEvent) => {\n        // Check if this event is an actual thread root. `isThreadRoot` can be\n        // polluted by locally-created Thread shells, so require the server bundle.\n        if (hasThreadRootAggregation(event)) {\n          const rootId = event.getId();\n          if (rootId && !room.getThread(rootId)) {\n            threadRoots.add(rootId);\n          }\n        }\n\n        // Check if this event is a reply in a thread\n        const { threadRootId } = event;\n        if (\n          threadRootId &&\n          isThreadRelationEvent(event, threadRootId) &&\n          !room.getThread(threadRootId)\n        ) {\n          threadRoots.add(threadRootId);\n        }\n      });\n\n      // Create Thread objects for discovered thread roots\n      threadRoots.forEach((rootId) => {\n        const rootEvent = room.findEventById(rootId);\n        if (rootEvent) {\n          room.createThread(rootId, rootEvent, [], false);\n        }\n      });\n    };\n\n    // Scan all existing timelines on mount\n    const liveTimeline = room.getLiveTimeline();\n    scanTimelineForThreads(liveTimeline);\n\n    // Also scan backward timelines (historical messages already loaded)\n    let backwardTimeline = liveTimeline.getNeighbouringTimeline(Direction.Backward);\n    while (backwardTimeline) {\n      scanTimelineForThreads(backwardTimeline);\n      backwardTimeline = backwardTimeline.getNeighbouringTimeline(Direction.Backward);\n    }\n\n    // Listen for new timeline events (including pagination)\n    const handleTimelineEvent = (mEvent: MatrixEvent) => {\n      // Check if this event is an actual thread root. `isThreadRoot` can be\n      // polluted by locally-created Thread shells, so require the server bundle.\n      if (hasThreadRootAggregation(mEvent)) {\n        const rootId = mEvent.getId();\n        if (rootId && !room.getThread(rootId)) {\n          const rootEvent = room.findEventById(rootId);\n          if (rootEvent) {\n            room.createThread(rootId, rootEvent, [], false);\n          }\n        }\n      }\n\n      // Check if this is a reply in a thread\n      const { threadRootId } = mEvent;\n      if (\n        threadRootId &&\n        isThreadRelationEvent(mEvent, threadRootId) &&\n        !room.getThread(threadRootId)\n      ) {\n        const rootEvent = room.findEventById(threadRootId);\n        if (rootEvent) {\n          room.createThread(threadRootId, rootEvent, [], false);\n        }\n      }\n    };\n\n    mx.on(RoomEvent.Timeline, handleTimelineEvent);\n    return () => {\n      mx.off(RoomEvent.Timeline, handleTimelineEvent);\n    };\n  }, [room, mx]);\n\n  // Count unread threads where user has participated\n  useEffect(() => {\n    const checkThreadUnreads = () => {\n      // Use SDK's thread notification counting which respects user notification preferences,\n      // properly distinguishes highlights (mentions) from regular messages, and handles muted threads\n      const threads = room.getThreads();\n      let totalCount = 0;\n\n      // Sum up notification counts across all threads\n      threads.forEach((thread) => {\n        totalCount += room.getThreadUnreadNotificationCount(thread.id, NotificationCountType.Total);\n      });\n\n      // Use SDK's aggregate type to determine if any thread has highlights\n      const aggregateType = room.threadsAggregateNotificationType;\n      const hasHighlights = aggregateType === NotificationCountType.Highlight;\n\n      setUnreadThreadsCount(totalCount);\n      setHasThreadHighlights(hasHighlights);\n    };\n\n    checkThreadUnreads();\n\n    // Listen for thread updates\n    const onThreadUpdate = () => checkThreadUnreads();\n    room.on(ThreadEvent.New, onThreadUpdate);\n    room.on(ThreadEvent.Update, onThreadUpdate);\n    room.on(ThreadEvent.NewReply, onThreadUpdate);\n\n    return () => {\n      room.off(ThreadEvent.New, onThreadUpdate);\n      room.off(ThreadEvent.Update, onThreadUpdate);\n      room.off(ThreadEvent.NewReply, onThreadUpdate);\n    };\n  }, [room, mx]);\n\n  const handleSearchClick = () => {\n    const searchParams: SearchPathSearchParams = {\n      rooms: room.roomId,\n    };\n    const path = space\n      ? getSpaceSearchPath(getCanonicalAliasOrRoomId(mx, space.roomId))\n      : getHomeSearchPath();\n    navigate(withSearchParam(path, searchParams));\n  };\n\n  const handleOpenPinMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    pinMenu.openAt(evt.currentTarget);\n\n    const updateMarker = async () => {\n      if (pinnedIds.length === 0) return;\n\n      const hash = await getPinsHash(pinnedIds);\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      await mx.setRoomAccountData(room.roomId, CustomAccountDataEvent.SablePinStatus as any, {\n        hash,\n        count: pinnedIds.length,\n        last_seen_id: pinnedIds.at(-1),\n      });\n    };\n\n    updateMarker().catch((err) => {\n      log.warn('Failed to update pin marker:', err);\n    });\n  };\n\n  const openSettings = useOpenRoomSettings();\n  const parentSpace = useSpaceOptionally();\n  const handleMemberToggle = () => {\n    if (callView) {\n      openSettings(room.roomId, parentSpace?.roomId, RoomSettingsPage.MembersPage);\n      return;\n    }\n    setPeopleDrawer(!peopleDrawer);\n  };\n\n  return (\n    <PageHeader className={classNames(ContainerColor({ variant: 'Surface' }), css.HeaderBalance)}>\n      <Box grow=\"Yes\" gap=\"300\">\n        {screenSize === ScreenSize.Mobile && (\n          <BackRouteHandler>\n            {(onBack) => (\n              <Box shrink=\"No\" alignItems=\"Center\">\n                <IconButton fill=\"None\" onClick={onBack}>\n                  {composerIcon(ArrowLeft)}\n                </IconButton>\n              </Box>\n            )}\n          </BackRouteHandler>\n        )}\n        <Box grow=\"Yes\" alignItems=\"Center\" gap=\"300\">\n          {screenSize !== ScreenSize.Mobile && (\n            <Avatar size=\"300\">\n              <RoomAvatar\n                roomId={room.roomId}\n                src={avatarUrl}\n                alt={name}\n                renderFallback={() => (\n                  <RoomIcon\n                    size=\"200\"\n                    joinRule={room.getJoinRule()}\n                    roomType={room.getType()}\n                    withOverlay={false}\n                  />\n                )}\n              />\n            </Avatar>\n          )}\n          <Box direction=\"Column\">\n            <Text size={topic ? 'H5' : 'H3'} truncate>\n              {name}\n            </Text>\n            {topic && (\n              <UseStateProvider initial={false}>\n                {(viewTopic, setViewTopic) => (\n                  <>\n                    <ModalOverlay open={viewTopic} requestClose={() => setViewTopic(false)}>\n                      <RoomTopicViewer\n                        name={name}\n                        topic={topic}\n                        requestClose={() => setViewTopic(false)}\n                      />\n                    </ModalOverlay>\n                    <Text\n                      as=\"button\"\n                      type=\"button\"\n                      onClick={() => setViewTopic(true)}\n                      className={css.HeaderTopic}\n                      size=\"T200\"\n                      priority=\"300\"\n                      truncate\n                    >\n                      {topic}\n                    </Text>\n                  </>\n                )}\n              </UseStateProvider>\n            )}\n          </Box>\n        </Box>\n\n        <Box shrink=\"No\">\n          {(!room.isCallRoom() || chat) && (\n            <>\n              {!encryptedRoom && (\n                <TooltipProvider\n                  position=\"Bottom\"\n                  offset={4}\n                  tooltip={\n                    <Tooltip>\n                      <Text>Search</Text>\n                    </Tooltip>\n                  }\n                >\n                  {(triggerRef) => (\n                    <IconButton fill=\"None\" ref={triggerRef} onClick={handleSearchClick}>\n                      {composerIcon(MagnifyingGlass)}\n                    </IconButton>\n                  )}\n                </TooltipProvider>\n              )}\n              <ResponsiveMenu\n                anchor={pinMenu.anchor}\n                requestClose={pinMenu.close}\n                position=\"Bottom\"\n                align=\"Center\"\n                menu={\n                  <RoomPinMenu room={room} requestClose={pinMenu.close} currentHash={currentHash} />\n                }\n              >\n                <TooltipProvider\n                  position=\"Bottom\"\n                  offset={4}\n                  tooltip={\n                    <Tooltip>\n                      <Text>Pinned Messages</Text>\n                    </Tooltip>\n                  }\n                >\n                  {(triggerRef) => (\n                    <IconButton\n                      fill=\"None\"\n                      style={{ position: 'relative' }}\n                      onClick={handleOpenPinMenu}\n                      ref={triggerRef}\n                      aria-pressed={!!pinMenu.anchor}\n                    >\n                      {unreadPinsCount > 0 && (\n                        <Badge\n                          style={{\n                            position: 'absolute',\n                            left: toRem(3),\n                            top: toRem(3),\n                          }}\n                          variant=\"Secondary\"\n                          size=\"400\"\n                          fill=\"Solid\"\n                          radii=\"Pill\"\n                        >\n                          <Text as=\"span\" size=\"L400\">\n                            {unreadPinsCount}\n                          </Text>\n                        </Badge>\n                      )}\n                      {composerIcon(PushPin, { weight: pinMenu.anchor ? 'fill' : 'regular' })}\n                    </IconButton>\n                  )}\n                </TooltipProvider>\n              </ResponsiveMenu>\n              {!room.isCallRoom() &&\n                callStartCapabilities.canRenderCallButton &&\n                shouldShowCallButton && (\n                  <>\n                    <RoomCallButton\n                      room={room}\n                      direct={direct}\n                      kind=\"voice\"\n                      defaultPreferences={{ microphone, video, sound }}\n                    />\n                    <RoomCallButton\n                      room={room}\n                      direct={direct}\n                      kind=\"video\"\n                      defaultPreferences={{ microphone, video, sound }}\n                      allowVideoStart\n                    />\n                  </>\n                )}\n              <TooltipProvider\n                position=\"Bottom\"\n                offset={4}\n                tooltip={\n                  <Tooltip>\n                    <Text>Threads</Text>\n                  </Tooltip>\n                }\n              >\n                {(triggerRef) => (\n                  <IconButton\n                    fill=\"None\"\n                    ref={triggerRef}\n                    onClick={() => {\n                      // If a thread is open, close it and open thread browser\n                      if (openThreadId) {\n                        setOpenThread(undefined);\n                        setThreadBrowserOpen(true);\n                      } else {\n                        // Otherwise, toggle the thread browser\n                        setThreadBrowserOpen(!threadBrowserOpen);\n                      }\n                    }}\n                    aria-pressed={threadBrowserOpen || !!openThreadId}\n                    style={{ position: 'relative' }}\n                  >\n                    {unreadThreadsCount > 0 && (\n                      <Badge\n                        style={{\n                          position: 'absolute',\n                          left: toRem(3),\n                          top: toRem(3),\n                        }}\n                        variant={hasThreadHighlights ? 'Critical' : 'Secondary'}\n                        size=\"400\"\n                        fill=\"Solid\"\n                        radii=\"Pill\"\n                      >\n                        <Text as=\"span\" size=\"L400\">\n                          {unreadThreadsCount}\n                        </Text>\n                      </Badge>\n                    )}\n                    {composerIcon(Chats, { weight: threadBrowserOpen ? 'fill' : 'regular' })}\n                  </IconButton>\n                )}\n              </TooltipProvider>\n            </>\n          )}\n\n          {screenSize === ScreenSize.Desktop && (\n            <TooltipProvider\n              position=\"Bottom\"\n              offset={4}\n              tooltip={\n                <Tooltip>\n                  <Text>{widgetDrawer ? 'Hide Widgets' : 'Show Widgets'}</Text>\n                </Tooltip>\n              }\n            >\n              {(triggerRef) => (\n                <IconButton\n                  fill=\"None\"\n                  ref={triggerRef}\n                  onClick={() => setWidgetDrawer((d) => !d)}\n                  style={{ position: 'relative' }}\n                >\n                  {widgets.length > 0 && (\n                    <Badge\n                      style={{\n                        position: 'absolute',\n                        left: toRem(3),\n                        top: toRem(3),\n                      }}\n                      variant=\"Secondary\"\n                      size=\"400\"\n                      fill=\"Solid\"\n                      radii=\"Pill\"\n                    >\n                      <Text as=\"span\" size=\"L400\">\n                        {widgets.length}\n                      </Text>\n                    </Badge>\n                  )}\n                  {composerIcon(GridFour, { weight: widgetDrawer ? 'fill' : 'regular' })}\n                </IconButton>\n              )}\n            </TooltipProvider>\n          )}\n          {screenSize === ScreenSize.Desktop && (\n            <TooltipProvider\n              position=\"Bottom\"\n              offset={4}\n              tooltip={\n                <Tooltip>\n                  {callView ? (\n                    <Text>Members</Text>\n                  ) : (\n                    <Text>{peopleDrawer ? 'Hide Members' : 'Show Members'}</Text>\n                  )}\n                </Tooltip>\n              }\n            >\n              {(triggerRef) => (\n                <IconButton fill=\"None\" ref={triggerRef} onClick={handleMemberToggle}>\n                  {composerIcon(UserCircle, { weight: peopleDrawer ? 'fill' : 'regular' })}\n                </IconButton>\n              )}\n            </TooltipProvider>\n          )}\n\n          {callView && (\n            <TooltipProvider\n              position=\"Bottom\"\n              offset={4}\n              tooltip={\n                <Tooltip>\n                  <Text>{chat ? 'Hide Chat' : 'Show Chat'}</Text>\n                </Tooltip>\n              }\n            >\n              {(triggerRef) => (\n                <IconButton\n                  fill=\"None\"\n                  ref={triggerRef}\n                  onClick={() => {\n                    setChat(!chat);\n                  }}\n                >\n                  {composerIcon(ChatCircleDots, { weight: chat ? 'fill' : 'regular' })}\n                </IconButton>\n              )}\n            </TooltipProvider>\n          )}\n\n          <ResponsiveMenu\n            anchor={optionsMenu.anchor}\n            requestClose={optionsMenu.close}\n            position=\"Bottom\"\n            align=\"End\"\n            menu={<RoomMenu room={room} requestClose={optionsMenu.close} />}\n          >\n            <TooltipProvider\n              position=\"Bottom\"\n              align=\"End\"\n              offset={4}\n              tooltip={\n                <Tooltip>\n                  <Text>More Options</Text>\n                </Tooltip>\n              }\n            >\n              {(triggerRef) => (\n                <IconButton\n                  fill=\"None\"\n                  onClick={optionsMenu.triggerProps.onClick}\n                  ref={triggerRef}\n                  aria-pressed={!!optionsMenu.anchor}\n                >\n                  {composerIcon(DotsThreeOutlineVerticalIcon, {\n                    weight: optionsMenu.anchor ? 'fill' : 'regular',\n                  })}\n                </IconButton>\n              )}\n            </TooltipProvider>\n          </ResponsiveMenu>\n        </Box>\n      </Box>\n    </PageHeader>\n  );\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type { User, UserEventHandlerMap } from '$types/matrix-sdk';\nimport { UserEvent } from '$types/matrix-sdk';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport enum Presence {\n  Online = 'online',\n  Unavailable = 'unavailable',\n  Offline = 'offline',\n}\n\nexport type UserPresence = {\n  presence: Presence;\n  status?: string;\n  active: boolean;\n  lastActiveTs?: number;\n};\n\nconst getUserPresence = (user: User): UserPresence => ({\n  presence: user.presence as Presence,\n  status: user.presenceStatusMsg,\n  active: user.currentlyActive,\n  lastActiveTs: user.getLastActiveTs(),\n});\n\nexport const useUserPresence = (userId: string): UserPresence | undefined => {\n  const mx = useMatrixClient();\n  const user = mx.getUser(userId);\n  const [presence, setPresence] = useState(() => (user ? getUserPresence(user) : undefined));\n\n  useEffect(() => {\n    if (!user) {\n      setPresence(undefined);\n      return undefined;\n    }\n    setPresence(getUserPresence(user));\n    const updatePresence: UserEventHandlerMap[UserEvent.Presence] = (e, u) => {\n      if (u.userId === user.userId) {\n        setPresence(getUserPresence(user));\n      }\n    };\n    user.on(UserEvent.Presence, updatePresence);\n    user.on(UserEvent.CurrentlyActive, updatePresence);\n    user.on(UserEvent.LastPresenceTs, updatePresence);\n\n    return () => {\n      user.removeListener(UserEvent.Presence, updatePresence);\n      user.removeListener(UserEvent.CurrentlyActive, updatePresence);\n      user.removeListener(UserEvent.LastPresenceTs, updatePresence);\n    };\n  }, [user]);\n\n  return presence;\n};\n\nexport const usePresenceLabel = (): Record<Presence, string> =>\n  useMemo(\n    () => ({\n      [Presence.Online]: 'Active',\n      [Presence.Unavailable]: 'Busy',\n      [Presence.Offline]: 'Away',\n    }),\n    []\n  );\n","import type { ContainerColor, MainColor } from 'folds';\nimport { as, Badge, Box, color, Text, Tooltip, toRem } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport type { ReactNode } from 'react';\nimport { useId } from 'react';\nimport { Presence, usePresenceLabel } from '$hooks/useUserPresence';\nimport * as css from './styles.css';\n\nexport const PresenceToColor: Record<Presence, MainColor> = {\n  [Presence.Online]: 'Success',\n  [Presence.Unavailable]: 'Warning',\n  [Presence.Offline]: 'Secondary',\n};\n\ntype PresenceBadgeProps = {\n  presence: Presence;\n  size?: '200' | '300' | '400' | '500';\n};\nexport function PresenceBadge({ presence, size }: PresenceBadgeProps) {\n  const label = usePresenceLabel();\n  const badgeLabelId = useId();\n\n  return (\n    <TooltipProvider\n      position=\"Right\"\n      align=\"Center\"\n      offset={4}\n      delay={200}\n      tooltip={\n        <Tooltip id={badgeLabelId}>\n          <Box style={{ maxWidth: toRem(250) }} alignItems=\"Baseline\" gap=\"100\">\n            <Text size=\"L400\">{label[presence]}</Text>\n          </Box>\n        </Tooltip>\n      }\n    >\n      {(triggerRef) => (\n        <Badge\n          aria-labelledby={badgeLabelId}\n          ref={triggerRef}\n          size={size}\n          variant={PresenceToColor[presence]}\n          fill={presence === Presence.Offline ? 'Soft' : 'Solid'}\n          radii=\"Pill\"\n        />\n      )}\n    </TooltipProvider>\n  );\n}\n\ntype AvatarPresenceProps = {\n  badge: ReactNode;\n  variant?: ContainerColor;\n};\nexport const AvatarPresence = as<'div', AvatarPresenceProps>(\n  ({ as: AsAvatarPresence, badge, variant = 'Surface', children, ...props }, ref) => (\n    <Box as={AsAvatarPresence} className={css.AvatarPresence} {...props} ref={ref}>\n      {badge && (\n        <div\n          className={css.AvatarPresenceBadge}\n          style={{ backgroundColor: color[variant].Container }}\n        >\n          {badge}\n        </div>\n      )}\n      {children}\n    </Box>\n  )\n);\n","import { Box, as, toRem } from 'folds';\nimport * as css from './TypingIndicator.css';\n\ntype TypingIndicatorProps = {\n  size?: '300' | '400';\n  disableAnimation?: boolean;\n};\n\nexport const TypingIndicator = as<'div', TypingIndicatorProps>(\n  ({ size, disableAnimation, style, ...props }, ref) => (\n    <Box\n      as=\"span\"\n      alignItems=\"Center\"\n      shrink=\"No\"\n      style={{\n        gap: toRem(size === '300' ? 1 : 2),\n        zIndex: 10,\n        ...style,\n      }}\n      {...props}\n      ref={ref}\n    >\n      <span className={css.TypingDot({ size, index: '0', animated: !disableAnimation })} />\n      <span className={css.TypingDot({ size, index: '1', animated: !disableAnimation })} />\n      <span className={css.TypingDot({ size, index: '2', animated: !disableAnimation })} />\n    </Box>\n  )\n);\n","import { useEffect, useState } from 'react';\n\nexport type OnIntersectionCallback = (entries: IntersectionObserverEntry[]) => void;\n\nexport type IntersectionObserverOpts = {\n  root?: Element | Document | null;\n  rootMargin?: string;\n  threshold?: number | number[];\n};\n\nexport const getIntersectionObserverEntry = (\n  target: Element | Document,\n  entries: IntersectionObserverEntry[]\n): IntersectionObserverEntry | undefined => entries.find((entry) => entry.target === target);\n\nexport const useIntersectionObserver = (\n  onIntersectionCallback: OnIntersectionCallback,\n  opts?: IntersectionObserverOpts | (() => IntersectionObserverOpts),\n  observeElement?: Element | null | (() => Element | null)\n): IntersectionObserver | undefined => {\n  const [intersectionObserver, setIntersectionObserver] = useState<IntersectionObserver>();\n\n  useEffect(() => {\n    const initOpts = typeof opts === 'function' ? opts() : opts;\n    setIntersectionObserver(new IntersectionObserver(onIntersectionCallback, initOpts));\n  }, [onIntersectionCallback, opts]);\n\n  useEffect(() => () => intersectionObserver?.disconnect(), [intersectionObserver]);\n\n  useEffect(() => {\n    const element = typeof observeElement === 'function' ? observeElement() : observeElement;\n    if (element) intersectionObserver?.observe(element);\n    return () => {\n      if (element) intersectionObserver?.unobserve(element);\n    };\n  }, [intersectionObserver, observeElement]);\n\n  return intersectionObserver;\n};\n","import type { RefObject } from 'react';\nimport { useCallback, useState } from 'react';\nimport { Box, as } from 'folds';\nimport classNames from 'classnames';\nimport {\n  getIntersectionObserverEntry,\n  useIntersectionObserver,\n} from '$hooks/useIntersectionObserver';\nimport * as css from './style.css';\n\nexport const ScrollTopContainer = as<\n  'div',\n  {\n    scrollRef?: RefObject<HTMLElement | null>;\n    anchorRef: RefObject<HTMLElement | null>;\n    onVisibilityChange?: (onTop: boolean) => void;\n  }\n>(({ className, scrollRef, anchorRef, onVisibilityChange, ...props }, ref) => {\n  const [onTop, setOnTop] = useState(true);\n\n  useIntersectionObserver(\n    useCallback(\n      (intersectionEntries) => {\n        if (!anchorRef.current) return;\n        const entry = getIntersectionObserverEntry(anchorRef.current, intersectionEntries);\n        if (entry) {\n          setOnTop(entry.isIntersecting);\n          onVisibilityChange?.(entry.isIntersecting);\n        }\n      },\n      [anchorRef, onVisibilityChange]\n    ),\n    useCallback(() => ({ root: scrollRef?.current }), [scrollRef]),\n    useCallback(() => anchorRef.current, [anchorRef])\n  );\n\n  if (onTop) return null;\n\n  return <Box className={classNames(css.ScrollTopContainer, className)} {...props} ref={ref} />;\n});\n","import { produce } from 'immer';\nimport { atom, useSetAtom } from 'jotai';\nimport type { MatrixClient, RoomMemberEventHandlerMap } from '$types/matrix-sdk';\nimport { RoomMemberEvent } from '$types/matrix-sdk';\nimport { useEffect } from 'react';\nimport { useSetting } from './hooks/settings';\nimport { settingsAtom } from './settings';\n\nexport const TYPING_TIMEOUT_MS = 5000; // 5 seconds\n\nexport type TypingReceipt = {\n  userId: string;\n  ts: number;\n};\nexport type IRoomIdToTypingMembers = Map<string, TypingReceipt[]>;\n\ntype TypingMemberPutAction = {\n  type: 'PUT';\n  roomId: string;\n  userId: string;\n  ts: number;\n};\ntype TypingMemberDeleteAction = {\n  type: 'DELETE';\n  roomId: string;\n  userId: string;\n};\ntype IRoomIdToTypingMembersAction = TypingMemberPutAction | TypingMemberDeleteAction;\n\nconst baseRoomIdToTypingMembersAtom = atom(new Map());\n\nconst putTypingMember = (\n  roomToMembers: IRoomIdToTypingMembers,\n  action: TypingMemberPutAction\n): IRoomIdToTypingMembers => {\n  let typingMembers = roomToMembers.get(action.roomId) ?? [];\n\n  typingMembers = typingMembers.filter((receipt) => receipt.userId !== action.userId);\n  typingMembers.push({\n    userId: action.userId,\n    ts: action.ts,\n  });\n  roomToMembers.set(action.roomId, typingMembers);\n  return roomToMembers;\n};\n\nconst deleteTypingMember = (\n  roomToMembers: IRoomIdToTypingMembers,\n  action: TypingMemberDeleteAction\n): IRoomIdToTypingMembers => {\n  let typingMembers = roomToMembers.get(action.roomId) ?? [];\n\n  typingMembers = typingMembers.filter((receipt) => receipt.userId !== action.userId);\n  if (typingMembers.length === 0) {\n    roomToMembers.delete(action.roomId);\n  } else {\n    roomToMembers.set(action.roomId, typingMembers);\n  }\n  return roomToMembers;\n};\n\nconst timeoutReceipt = (\n  roomToMembers: IRoomIdToTypingMembers,\n  roomId: string,\n  userId: string,\n  timeout: number\n): boolean | undefined => {\n  const typingMembers = roomToMembers.get(roomId) ?? [];\n\n  const target = typingMembers.find((receipt) => receipt.userId === userId);\n  if (!target) return undefined;\n\n  return Date.now() - target.ts >= timeout;\n};\n\nexport const roomIdToTypingMembersAtom = atom<\n  IRoomIdToTypingMembers,\n  [IRoomIdToTypingMembersAction],\n  undefined\n>(\n  (get) => get(baseRoomIdToTypingMembersAtom),\n  (get, set, action) => {\n    const rToTyping = get(baseRoomIdToTypingMembersAtom);\n\n    if (action.type === 'PUT') {\n      set(\n        baseRoomIdToTypingMembersAtom,\n        produce(rToTyping, (draft) => putTypingMember(draft, action))\n      );\n\n      // remove typing receipt after some timeout\n      // to prevent stuck typing members\n      setTimeout(() => {\n        const { roomId, userId } = action;\n        const timeout = timeoutReceipt(\n          get(baseRoomIdToTypingMembersAtom),\n          roomId,\n          userId,\n          TYPING_TIMEOUT_MS\n        );\n        if (timeout) {\n          set(\n            baseRoomIdToTypingMembersAtom,\n            produce(get(baseRoomIdToTypingMembersAtom), (draft) =>\n              deleteTypingMember(draft, {\n                type: 'DELETE',\n                roomId,\n                userId,\n              })\n            )\n          );\n        }\n      }, TYPING_TIMEOUT_MS);\n    }\n\n    if (\n      action.type === 'DELETE' &&\n      rToTyping\n        .get(action.roomId)\n        ?.find((receipt: { userId: string }) => receipt.userId === action.userId)\n    ) {\n      set(\n        baseRoomIdToTypingMembersAtom,\n        produce(rToTyping, (draft) => deleteTypingMember(draft, action))\n      );\n    }\n  }\n);\n\nexport const useBindRoomIdToTypingMembersAtom = (\n  mx: MatrixClient,\n  typingMembersAtom: typeof roomIdToTypingMembersAtom\n) => {\n  const setTypingMembers = useSetAtom(typingMembersAtom);\n  const [hideActivity] = useSetting(settingsAtom, 'hideActivity');\n\n  useEffect(() => {\n    const handleTypingEvent: RoomMemberEventHandlerMap[RoomMemberEvent.Typing] = (\n      event,\n      member\n    ) => {\n      if (hideActivity) {\n        return;\n      }\n      setTypingMembers({\n        type: member.typing ? 'PUT' : 'DELETE',\n        roomId: member.roomId,\n        userId: member.userId,\n        ts: Date.now(),\n      });\n    };\n\n    mx.on(RoomMemberEvent.Typing, handleTypingEvent);\n    return () => {\n      mx.removeListener(RoomMemberEvent.Typing, handleTypingEvent);\n    };\n  }, [mx, setTypingMembers, hideActivity]);\n};\n","import { useAtomValue } from 'jotai';\nimport { selectAtom } from 'jotai/utils';\nimport { useCallback } from 'react';\nimport type { IRoomIdToTypingMembers, TypingReceipt } from '$state/typingMembers';\nimport { roomIdToTypingMembersAtom } from '$state/typingMembers';\n\nconst typingReceiptEqual = (a: TypingReceipt, b: TypingReceipt): boolean =>\n  a.userId === b.userId && a.ts === b.ts;\n\nconst equalTypingMembers = (x: TypingReceipt[], y: TypingReceipt[]): boolean => {\n  if (x.length !== y.length) return false;\n  return x.every((a, i) => {\n    const b = y[i];\n    return b ? typingReceiptEqual(a, b) : false;\n  });\n};\n\nexport const useRoomTypingMember = (roomId: string) => {\n  const selector = useCallback(\n    (roomToTyping: IRoomIdToTypingMembers) => roomToTyping.get(roomId) ?? [],\n    [roomId]\n  );\n\n  const typing = useAtomValue(selectAtom(roomIdToTypingMembersAtom, selector, equalTypingMembers));\n  return typing;\n};\n","import { useMemo } from 'react';\nimport type { RoomMember } from '$types/matrix-sdk';\nimport { KnownMembership } from '$types/matrix-sdk';\n\nconst MembershipFilter = {\n  filterJoined: (m: RoomMember) => m.membership === KnownMembership.Join,\n  filterInvited: (m: RoomMember) => m.membership === KnownMembership.Invite,\n  filterLeaved: (m: RoomMember) =>\n    m.membership === KnownMembership.Leave &&\n    m.events.member?.getStateKey() === m.events.member?.getSender(),\n  filterKicked: (m: RoomMember) =>\n    m.membership === KnownMembership.Leave &&\n    m.events.member?.getStateKey() !== m.events.member?.getSender(),\n  filterBanned: (m: RoomMember) => m.membership === KnownMembership.Ban,\n};\n\nexport type MembershipFilterFn = (m: RoomMember) => boolean;\n\nexport type MembershipFilterItem = {\n  name: string;\n  filterFn: MembershipFilterFn;\n};\n\nexport const useMembershipFilterMenu = (): MembershipFilterItem[] =>\n  useMemo(\n    () => [\n      {\n        name: 'Joined',\n        filterFn: MembershipFilter.filterJoined,\n      },\n      {\n        name: 'Invited',\n        filterFn: MembershipFilter.filterInvited,\n      },\n      {\n        name: 'Left',\n        filterFn: MembershipFilter.filterLeaved,\n      },\n      {\n        name: 'Kicked',\n        filterFn: MembershipFilter.filterKicked,\n      },\n      {\n        name: 'Banned',\n        filterFn: MembershipFilter.filterBanned,\n      },\n    ],\n    []\n  );\n\nexport const useMembershipFilter = (\n  index: number,\n  membershipFilter: MembershipFilterItem[]\n): MembershipFilterItem => {\n  const filter = membershipFilter[index] ?? membershipFilter[0];\n  if (!filter) {\n    return {\n      name: 'Joined',\n      filterFn: MembershipFilter.filterJoined,\n    };\n  }\n  return filter;\n};\n","import type { RoomMember } from '$types/matrix-sdk';\nimport { useCallback, useMemo } from 'react';\n\nconst MemberSort = {\n  Ascending: (a: RoomMember, b: RoomMember) =>\n    a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1,\n  Descending: (a: RoomMember, b: RoomMember) =>\n    a.name.toLowerCase() > b.name.toLowerCase() ? -1 : 1,\n  NewestFirst: (a: RoomMember, b: RoomMember) =>\n    (b.events.member?.getTs() ?? 0) - (a.events.member?.getTs() ?? 0),\n  Oldest: (a: RoomMember, b: RoomMember) =>\n    (a.events.member?.getTs() ?? 0) - (b.events.member?.getTs() ?? 0),\n};\n\nexport type MemberSortFn = (a: RoomMember, b: RoomMember) => number;\n\nexport type MemberSortItem = {\n  name: string;\n  sortFn: MemberSortFn;\n};\n\nexport const useMemberSortMenu = (): MemberSortItem[] =>\n  useMemo(\n    () => [\n      {\n        name: 'A to Z',\n        sortFn: MemberSort.Ascending,\n      },\n      {\n        name: 'Z to A',\n        sortFn: MemberSort.Descending,\n      },\n      {\n        name: 'Newest',\n        sortFn: MemberSort.NewestFirst,\n      },\n      {\n        name: 'Oldest',\n        sortFn: MemberSort.Oldest,\n      },\n    ],\n    []\n  );\n\nexport const useMemberSort = (index: number, memberSort: MemberSortItem[]): MemberSortItem => {\n  const item = memberSort[index] ?? memberSort[0];\n  if (!item) {\n    return {\n      name: 'A to Z',\n      sortFn: MemberSort.Ascending,\n    };\n  }\n  return item;\n};\n\nexport const useMemberPowerSort = (\n  creators: Set<string>,\n  getPowerLevel: (userId: string) => number\n): MemberSortFn => {\n  const sort: MemberSortFn = useCallback(\n    (a, b) => {\n      if (creators.has(a.userId) && creators.has(b.userId)) {\n        return 0;\n      }\n      if (creators.has(a.userId)) return -1;\n      if (creators.has(b.userId)) return 1;\n\n      return getPowerLevel(b.userId) - getPowerLevel(a.userId);\n    },\n    [creators, getPowerLevel]\n  );\n\n  return sort;\n};\n","import FocusTrap from 'focus-trap-react';\nimport { config, Menu, MenuItem, Text } from 'folds';\nimport { stopPropagation } from '$utils/keyboard';\n\ntype MemberMenuItem = {\n  name: string;\n};\n\ntype MemberMenuListProps = {\n  items: MemberMenuItem[];\n  requestClose: () => void;\n  selected: number;\n  onSelect: (index: number) => void;\n};\nexport function MemberMenuList({ items, selected, onSelect, requestClose }: MemberMenuListProps) {\n  return (\n    <FocusTrap\n      focusTrapOptions={{\n        initialFocus: false,\n        onDeactivate: requestClose,\n        clickOutsideDeactivates: true,\n        isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown',\n        isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp',\n        escapeDeactivates: stopPropagation,\n      }}\n    >\n      <Menu style={{ padding: config.space.S100 }}>\n        {items.map((menuItem, index) => (\n          <MenuItem\n            key={menuItem.name}\n            variant=\"Surface\"\n            aria-pressed={selected === index}\n            size=\"300\"\n            radii=\"300\"\n            onClick={() => {\n              onSelect(index);\n              requestClose();\n            }}\n          >\n            <Text size=\"T300\">{menuItem.name}</Text>\n          </MenuItem>\n        ))}\n      </Menu>\n    </FocusTrap>\n  );\n}\n","type FormatCompactNumberOptions = {\n  locales?: Intl.LocalesArgument;\n  maximumFractionDigits?: number;\n};\n\nconst DEFAULT_MAXIMUM_FRACTION_DIGITS = 1;\nconst FALLBACK_LOCALES: Intl.LocalesArgument = ['en'];\n\nconst isValidLocale = (locale: string): boolean => {\n  try {\n    Intl.NumberFormat(locale);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\nconst sanitizeLocales = (locales: Intl.LocalesArgument | undefined): Intl.LocalesArgument => {\n  if (locales === undefined) return FALLBACK_LOCALES;\n\n  const list = Array.isArray(locales) ? locales : [locales];\n  const valid = list.filter(\n    (locale): locale is string => typeof locale === 'string' && isValidLocale(locale)\n  );\n\n  return valid.length > 0 ? valid : FALLBACK_LOCALES;\n};\n\nconst getDefaultLocales = (): Intl.LocalesArgument | undefined =>\n  typeof navigator === 'undefined' ? undefined : sanitizeLocales(navigator.languages);\n\nexport function formatCompactNumber(\n  value: number,\n  {\n    locales = getDefaultLocales(),\n    maximumFractionDigits = DEFAULT_MAXIMUM_FRACTION_DIGITS,\n  }: FormatCompactNumberOptions = {}\n): string {\n  return new Intl.NumberFormat(sanitizeLocales(locales), {\n    notation: 'compact',\n    maximumFractionDigits,\n  }).format(value);\n}\n","import type { ChangeEventHandler, MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n  Avatar,\n  Badge,\n  Box,\n  Chip,\n  Header,\n  IconButton,\n  Input,\n  MenuItem,\n  Scroll,\n  Spinner,\n  Text,\n  Tooltip,\n  config,\n  toRem,\n} from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport type { MatrixClient, Room, RoomMember } from '$types/matrix-sdk';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport classNames from 'classnames';\n\nimport { AvatarPresence, PresenceBadge } from '$components/presence';\nimport { useUserPresence } from '$hooks/useUserPresence';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { SearchItemStrGetter, UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport { useDebounce } from '$hooks/useDebounce';\nimport { TypingIndicator } from '$components/typing-indicator';\nimport { getAvatarUrl, getMemberDisplayName, getMemberSearchStr } from '$utils/room/display';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { useSetSetting, useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useAtomValue } from 'jotai';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { ScrollTopContainer } from '$components/scroll-top-container';\nimport { UserAvatar } from '$components/user-avatar';\nimport {\n  ArrowsDownUp,\n  CaretUp,\n  chipIcon,\n  composerIcon,\n  Funnel,\n  MagnifyingGlass,\n  userFallbackIcon,\n  X,\n} from '$components/icons/phosphor';\nimport { useRoomTypingMember } from '$hooks/useRoomTypingMembers';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useMembershipFilter, useMembershipFilterMenu } from '$hooks/useMemberFilter';\nimport { useMemberPowerSort, useMemberSort, useMemberSortMenu } from '$hooks/useMemberSort';\nimport { useGetMemberPowerLevel, usePowerLevelsContext } from '$hooks/usePowerLevels';\nimport { MemberMenuList } from '$components/MemberSortMenu';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { useOpenUserRoomProfile, useUserRoomProfileState } from '$state/hooks/userRoomProfile';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { useFlattenPowerTagMembers, useGetMemberPowerTag } from '$hooks/useMemberPowerTag';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useSableCosmetics } from '$hooks/useSableCosmetics';\nimport { formatCompactNumber } from '$utils/formatCompactNumber';\nimport * as css from './MembersDrawer.css';\nimport { SidebarResizer } from '$pages/client/sidebar/SidebarResizer';\nimport { useScreenSizeContext, ScreenSize } from '$hooks/useScreenSize';\n\ntype MemberDrawerHeaderProps = {\n  room: Room;\n  hideText?: boolean;\n};\nfunction MemberDrawerHeader({ room, hideText }: MemberDrawerHeaderProps) {\n  const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer');\n\n  return (\n    <Header className={css.MembersDrawerHeader} variant=\"Background\" size=\"600\">\n      <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n        {!hideText && (\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            <Text title={`${room.getJoinedMemberCount()} Members`} size=\"H5\" truncate>\n              {`${formatCompactNumber(room.getJoinedMemberCount())} Members`}\n            </Text>\n          </Box>\n        )}\n        <Box shrink=\"No\" alignItems=\"Center\">\n          <TooltipProvider\n            position=\"Bottom\"\n            align=\"End\"\n            offset={4}\n            tooltip={\n              <Tooltip>\n                <Text>Close</Text>\n              </Tooltip>\n            }\n          >\n            {(triggerRef) => (\n              <IconButton\n                ref={triggerRef}\n                variant=\"Background\"\n                onClick={() => setPeopleDrawer(false)}\n              >\n                {composerIcon(X)}\n              </IconButton>\n            )}\n          </TooltipProvider>\n        </Box>\n      </Box>\n    </Header>\n  );\n}\n\ntype MemberItemProps = {\n  mx: MatrixClient;\n  useAuthentication: boolean;\n  room: Room;\n  member: RoomMember;\n  onClick: MouseEventHandler<HTMLButtonElement>;\n  pressed?: boolean;\n  typing?: boolean;\n  hideText?: boolean;\n};\nfunction MemberItem({\n  mx,\n  useAuthentication,\n  room,\n  member,\n  onClick,\n  pressed,\n  typing,\n  hideText,\n}: MemberItemProps) {\n  const nicknames = useAtomValue(nicknamesAtom);\n  const name =\n    getMemberDisplayName(room, member.userId, nicknames) ??\n    getMxIdLocalPart(member.userId) ??\n    member.userId;\n\n  // Increased the request size to 128x128 to maintain quality for the larger avatar\n  const avatarMxcUrl = member.getMxcAvatarUrl();\n  const avatarUrl = getAvatarUrl(mx, avatarMxcUrl, 128, useAuthentication);\n\n  const presence = useUserPresence(member.userId);\n  const { color, font } = useSableCosmetics(member.userId, room);\n  const MemberAvatar = (\n    <div\n      style={{\n        position: 'relative',\n        width: toRem(40),\n        height: toRem(40),\n        transform: 'scale(0.85)',\n        transformOrigin: 'center',\n      }}\n    >\n      <AvatarPresence\n        badge={\n          presence && presence.lastActiveTs !== 0 ? (\n            <PresenceBadge presence={presence.presence} size=\"200\" />\n          ) : undefined\n        }\n      >\n        <Avatar size=\"300\" radii=\"400\">\n          <UserAvatar\n            userId={member.userId}\n            src={avatarUrl ?? undefined}\n            alt={name}\n            renderFallback={() => userFallbackIcon('md')}\n          />\n        </Avatar>\n      </AvatarPresence>\n    </div>\n  );\n\n  if (hideText)\n    return (\n      <IconButton\n        onClick={onClick}\n        size=\"300\"\n        aria-pressed={pressed}\n        data-user-id={member.userId}\n        style={{ padding: '0' }}\n      >\n        {MemberAvatar}\n      </IconButton>\n    );\n  return (\n    <MenuItem\n      style={{ padding: `0 ${config.space.S200}` }}\n      aria-pressed={pressed}\n      data-user-id={member.userId}\n      variant=\"Background\"\n      radii=\"400\"\n      onClick={onClick}\n      before={MemberAvatar}\n      after={\n        typing && (\n          <Badge size=\"300\" variant=\"Secondary\" fill=\"Soft\" radii=\"Pill\" outlined>\n            <TypingIndicator size=\"300\" />\n          </Badge>\n        )\n      }\n    >\n      <Box direction=\"Column\" grow=\"Yes\" gap=\"0\">\n        <Text size=\"T300\" truncate style={{ color, fontFamily: font, lineHeight: '1.2' }}>\n          {name}\n        </Text>\n        {presence?.status && (\n          <Text\n            size=\"T200\"\n            truncate\n            style={{\n              opacity: config.opacity.P300,\n              fontFamily: font,\n              marginTop: '-2px',\n            }}\n          >\n            {presence.status}\n          </Text>\n        )}\n      </Box>\n    </MenuItem>\n  );\n}\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  limit: 1000,\n  matchOptions: {\n    contain: true,\n  },\n};\n\nconst mxIdToName = (mxId: string) => getMxIdLocalPart(mxId) ?? mxId;\n\ntype MembersDrawerProps = {\n  room: Room;\n  members: RoomMember[];\n};\nexport function MembersDrawer({ room, members }: MembersDrawerProps) {\n  const mx = useMatrixClient();\n  const nicknames = useAtomValue(nicknamesAtom);\n  const useAuthentication = useMediaAuthentication();\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const searchInputRef = useRef<HTMLInputElement>(null);\n  const scrollTopAnchorRef = useRef<HTMLDivElement>(null);\n  const powerLevels = usePowerLevelsContext();\n  const creators = useRoomCreators(room);\n  const getPowerTag = useGetMemberPowerTag(room, creators, powerLevels);\n  const getPowerLevel = useGetMemberPowerLevel(powerLevels);\n\n  const fetchingMembers = members.length < room.getJoinedMemberCount();\n  const openUserRoomProfile = useOpenUserRoomProfile();\n  const space = useSpaceOptionally();\n  const openProfileUserId = useUserRoomProfileState()?.userId;\n\n  const membershipFilterMenu = useMembershipFilterMenu();\n  const sortFilterMenu = useMemberSortMenu();\n  const [sortFilterIndex, setSortFilterIndex] = useSetting(settingsAtom, 'memberSortFilterIndex');\n  const [membershipFilterIndex, setMembershipFilterIndex] = useState(0);\n\n  const membershipFilter = useMembershipFilter(membershipFilterIndex, membershipFilterMenu);\n  const memberSort = useMemberSort(sortFilterIndex, sortFilterMenu);\n  const memberPowerSort = useMemberPowerSort(creators, getPowerLevel);\n\n  const typingMembers = useRoomTypingMember(room.roomId);\n\n  const filteredMembers = useMemo(\n    () =>\n      members.filter(membershipFilter.filterFn).toSorted(memberSort.sortFn).sort(memberPowerSort),\n    [members, membershipFilter, memberSort, memberPowerSort]\n  );\n\n  const getRoomMemberStr = useCallback<SearchItemStrGetter<RoomMember>>(\n    (m, query) => getMemberSearchStr(m, query, mxIdToName, nicknames),\n    [nicknames]\n  );\n\n  const [result, search, resetSearch] = useAsyncSearch(\n    filteredMembers,\n    getRoomMemberStr,\n    SEARCH_OPTIONS\n  );\n  if (!result && searchInputRef.current?.value) search(searchInputRef.current.value);\n\n  const processMembers = result ? result.items : filteredMembers;\n\n  const PLTagOrRoomMember = useFlattenPowerTagMembers(processMembers, getPowerTag);\n\n  const virtualizer = useVirtualizer({\n    count: PLTagOrRoomMember.length,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: () => 40,\n    overscan: 10,\n  });\n\n  const handleSearchChange: ChangeEventHandler<HTMLInputElement> = useDebounce(\n    useCallback(\n      (evt) => {\n        if (evt.target.value) search(evt.target.value);\n        else resetSearch();\n      },\n      [search, resetSearch]\n    ),\n    { wait: 200 }\n  );\n\n  const handleMemberClick: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    const btn = evt.currentTarget as HTMLButtonElement;\n    const userId = btn.getAttribute('data-user-id');\n    if (!userId) return;\n\n    const cords = btn.getBoundingClientRect();\n    // BODGE, dependent on menuItem height staying at toRem(40)\n    cords.y = Math.min(cords.y, window.innerHeight - 42);\n\n    openUserRoomProfile(room.roomId, space?.roomId, userId, undefined, cords, 'Left');\n  };\n\n  const [memberSidebarWidth, setMemberSidebarWidth] = useSetting(\n    settingsAtom,\n    'memberSidebarWidth'\n  );\n  const [curWidth, setCurWidth] = useState(memberSidebarWidth);\n  useEffect(() => {\n    setCurWidth(memberSidebarWidth);\n  }, [memberSidebarWidth]);\n\n  const screenSize = useScreenSizeContext();\n  const isMobile = screenSize === ScreenSize.Mobile;\n  const hideText = curWidth <= 80 && !isMobile;\n  const filterMenu = useMenuAnchor<HTMLButtonElement>();\n  const sortMenu = useMenuAnchor<HTMLButtonElement>();\n  return (\n    <Box\n      className={classNames(css.MembersDrawer, ContainerColor({ variant: 'Background' }))}\n      shrink=\"No\"\n      direction=\"Column\"\n      style={{\n        position: 'relative',\n        width: isMobile ? '100%' : toRem(curWidth),\n      }}\n    >\n      <MemberDrawerHeader room={room} hideText={hideText} />\n      <Box className={css.MemberDrawerContentBase} grow=\"Yes\">\n        {!isMobile && (\n          <SidebarResizer\n            setCurWidth={setCurWidth}\n            sidebarWidth={memberSidebarWidth}\n            setSidebarWidth={setMemberSidebarWidth}\n            instep={50}\n            outstep={176}\n            minValue={50}\n            maxValue={350}\n            isReversed\n          />\n        )}\n        <Scroll ref={scrollRef} variant=\"Background\" size=\"300\" visibility=\"Hover\" hideTrack>\n          <Box className={css.MemberDrawerContent} direction=\"Column\" gap=\"200\">\n            {!hideText && (\n              <>\n                <Box\n                  ref={scrollTopAnchorRef}\n                  className={css.DrawerGroup}\n                  direction=\"Column\"\n                  gap=\"200\"\n                >\n                  <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\" gap=\"200\">\n                    <ResponsiveMenu\n                      anchor={filterMenu.anchor}\n                      requestClose={filterMenu.close}\n                      position=\"Bottom\"\n                      align=\"Start\"\n                      offset={4}\n                      menu={\n                        <MemberMenuList\n                          items={membershipFilterMenu}\n                          selected={membershipFilterIndex}\n                          onSelect={setMembershipFilterIndex}\n                          requestClose={filterMenu.close}\n                        />\n                      }\n                    >\n                      <Chip\n                        onClick={filterMenu.triggerProps.onClick}\n                        variant=\"Background\"\n                        size=\"400\"\n                        radii=\"300\"\n                        before={chipIcon(Funnel)}\n                      >\n                        <Text size=\"T200\">{membershipFilter.name}</Text>\n                      </Chip>\n                    </ResponsiveMenu>\n                    <ResponsiveMenu\n                      anchor={sortMenu.anchor}\n                      requestClose={sortMenu.close}\n                      position=\"Bottom\"\n                      align=\"End\"\n                      offset={4}\n                      menu={\n                        <MemberMenuList\n                          items={sortFilterMenu}\n                          selected={sortFilterIndex}\n                          onSelect={setSortFilterIndex}\n                          requestClose={sortMenu.close}\n                        />\n                      }\n                    >\n                      <Chip\n                        onClick={sortMenu.triggerProps.onClick}\n                        variant=\"Background\"\n                        size=\"400\"\n                        radii=\"300\"\n                        after={chipIcon(ArrowsDownUp)}\n                      >\n                        <Text size=\"T200\">{memberSort.name}</Text>\n                      </Chip>\n                    </ResponsiveMenu>\n                  </Box>\n                  <Box direction=\"Column\" gap=\"100\">\n                    <Input\n                      ref={searchInputRef}\n                      onChange={handleSearchChange}\n                      style={{ paddingRight: config.space.S200 }}\n                      placeholder=\"Type name...\"\n                      variant=\"Surface\"\n                      size=\"400\"\n                      radii=\"400\"\n                      before={chipIcon(MagnifyingGlass)}\n                      after={\n                        result && (\n                          <Chip\n                            variant={result.items.length > 0 ? 'Success' : 'Critical'}\n                            size=\"400\"\n                            radii=\"Pill\"\n                            aria-pressed\n                            onClick={() => {\n                              if (searchInputRef.current) {\n                                searchInputRef.current.value = '';\n                                searchInputRef.current.focus();\n                              }\n                              resetSearch();\n                            }}\n                            after={chipIcon(X)}\n                          >\n                            <Text size=\"B300\">{`${result.items.length || 'No'} ${\n                              result.items.length === 1 ? 'Result' : 'Results'\n                            }`}</Text>\n                          </Chip>\n                        )\n                      }\n                    />\n                  </Box>\n                </Box>\n\n                <ScrollTopContainer scrollRef={scrollRef} anchorRef={scrollTopAnchorRef}>\n                  <IconButton\n                    onClick={() => virtualizer.scrollToOffset(0)}\n                    variant=\"Surface\"\n                    radii=\"Pill\"\n                    outlined\n                    size=\"300\"\n                    aria-label=\"Scroll to Top\"\n                  >\n                    {composerIcon(CaretUp)}\n                  </IconButton>\n                </ScrollTopContainer>\n\n                {!fetchingMembers && !result && processMembers.length === 0 && (\n                  <Text style={{ padding: config.space.S300 }} align=\"Center\">\n                    {`No \"${membershipFilter.name}\" Members`}\n                  </Text>\n                )}\n              </>\n            )}\n            <Box className={css.MembersGroup} direction=\"Column\" gap=\"100\">\n              <div\n                style={{\n                  position: 'relative',\n                  height: virtualizer.getTotalSize(),\n                }}\n              >\n                {virtualizer.getVirtualItems().map((vItem) => {\n                  const tagOrMember = PLTagOrRoomMember[vItem.index];\n                  if (!tagOrMember) return null;\n                  if (!('userId' in tagOrMember)) {\n                    return (\n                      <Text\n                        style={{\n                          transform: `translateY(${vItem.start}px)`,\n                        }}\n                        data-index={vItem.index}\n                        ref={virtualizer.measureElement}\n                        key={`${room.roomId}-${vItem.index}`}\n                        className={classNames(css.MembersGroupLabel, css.DrawerVirtualItem)}\n                        size=\"L400\"\n                        truncate={hideText}\n                      >\n                        {tagOrMember.name}\n                      </Text>\n                    );\n                  }\n\n                  return (\n                    <div\n                      style={{\n                        transform: `translateY(${vItem.start}px)`,\n                      }}\n                      className={css.DrawerVirtualItem}\n                      data-index={vItem.index}\n                      key={`${room.roomId}-${tagOrMember.userId}`}\n                      ref={virtualizer.measureElement}\n                    >\n                      <MemberItem\n                        mx={mx}\n                        useAuthentication={useAuthentication}\n                        room={room}\n                        member={tagOrMember}\n                        onClick={handleMemberClick}\n                        pressed={openProfileUserId === tagOrMember.userId}\n                        typing={typingMembers.some(\n                          (receipt) => receipt.userId === tagOrMember.userId\n                        )}\n                        hideText={hideText}\n                      />\n                    </div>\n                  );\n                })}\n              </div>\n            </Box>\n\n            {fetchingMembers && (\n              <Box justifyContent=\"Center\">\n                <Spinner />\n              </Box>\n            )}\n          </Box>\n        </Scroll>\n      </Box>\n    </Box>\n  );\n}\n","import { useCallback, useLayoutEffect, useRef, type ReactNode } from 'react';\nimport {\n  getTranslateX,\n  NATIVE_EASE_OUT,\n  setTranslateX,\n  transitionTo,\n} from '$utils/nativeAnimation';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom, RightSwipeAction } from '$state/settings';\nimport { haptic } from '$utils/haptics';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { useMobileNavDrawer } from '$components/page/MobileNavDrawerContext';\n\ninterface SwipeableChatWrapperProps {\n  children: ReactNode;\n  onOpenMembers?: () => void;\n  onReply?: () => void;\n}\n\nconst SETTLE_MS = 220;\nconst SETTLE_TRANSITION = `transform ${SETTLE_MS}ms ${NATIVE_EASE_OUT}`;\n\nexport function SwipeableChatWrapper({\n  children,\n  onOpenMembers,\n  onReply,\n}: SwipeableChatWrapperProps) {\n  const [rightSwipeAction] = useSetting(settingsAtom, 'rightSwipeAction');\n  const containerRef = useRef<HTMLDivElement>(null);\n  const contentRef = useRef<HTMLDivElement>(null);\n  const xRef = useRef(0);\n  const gestureActiveRef = useRef(false);\n  const settleRef = useRef<{ cancel: () => void } | undefined>(undefined);\n  const drawer = useMobileNavDrawer();\n\n  const setOffset = useCallback((value: number) => {\n    xRef.current = value;\n    if (contentRef.current) setTranslateX(contentRef.current, value);\n  }, []);\n\n  const cancelSettle = useCallback(() => {\n    const element = contentRef.current;\n    const liveOffset = element ? getTranslateX(element, xRef.current) : xRef.current;\n    settleRef.current?.cancel();\n    settleRef.current = undefined;\n    if (element) element.style.transition = 'none';\n    setOffset(liveOffset);\n  }, [setOffset]);\n\n  const settleToRest = useCallback(() => {\n    const element = contentRef.current;\n    if (!element) return;\n    cancelSettle();\n    settleRef.current = transitionTo(\n      element,\n      SETTLE_TRANSITION,\n      () => setOffset(0),\n      SETTLE_MS,\n      () => {\n        settleRef.current = undefined;\n      }\n    );\n  }, [cancelSettle, setOffset]);\n\n  const move = useCallback(\n    (distanceX: number) => {\n      if (!gestureActiveRef.current) {\n        gestureActiveRef.current = true;\n        cancelSettle();\n      }\n\n      if (!isMobileOrTablet()) return;\n\n      const canSwipeLeft =\n        rightSwipeAction === RightSwipeAction.Members ? !!onOpenMembers : !!onReply;\n      setOffset(canSwipeLeft ? Math.max(-200, Math.min(0, distanceX)) : 0);\n    },\n    [cancelSettle, onOpenMembers, onReply, rightSwipeAction, setOffset]\n  );\n\n  const finish = useCallback(\n    (commit: boolean, distanceX = 0, velocityX = 0) => {\n      if (commit && (distanceX < -120 || velocityX < -0.5)) {\n        haptic('light');\n        if (rightSwipeAction === RightSwipeAction.Members) {\n          onOpenMembers?.();\n        } else {\n          onReply?.();\n        }\n      }\n\n      gestureActiveRef.current = false;\n      settleToRest();\n    },\n    [onOpenMembers, onReply, rightSwipeAction, settleToRest]\n  );\n\n  useLayoutEffect(() => {\n    const element = containerRef.current;\n    if (!drawer || !element || !isMobileOrTablet()) return undefined;\n\n    return drawer.registerChatSwipe(element, {\n      move,\n      end: ({ distanceX, velocityX }) => finish(true, distanceX, velocityX),\n      cancel: () => finish(false),\n    });\n  }, [drawer, finish, move]);\n\n  if (!isMobileOrTablet()) {\n    return (\n      <div\n        style={{\n          display: 'flex',\n          flexDirection: 'column',\n          flexGrow: 1,\n          height: '100%',\n          width: '100%',\n        }}\n      >\n        {children}\n      </div>\n    );\n  }\n\n  return (\n    <div\n      ref={containerRef}\n      data-chat-swipe\n      style={{\n        overflow: 'hidden',\n        display: 'flex',\n        flexDirection: 'column',\n        flexGrow: 1,\n        height: '100%',\n        width: '100%',\n      }}\n    >\n      <div\n        ref={contentRef}\n        style={{\n          transform: 'translate3d(0, 0, 0)',\n          display: 'flex',\n          flexDirection: 'column',\n          flexGrow: 1,\n          height: '100%',\n          willChange: 'transform',\n        }}\n      >\n        {children}\n      </div>\n    </div>\n  );\n}\n","import { useRef } from 'react';\nimport { useSetAtom } from 'jotai';\nimport type { MatrixEvent, Room } from '$types/matrix-sdk';\nimport { EmojiBoard } from '$components/emoji-board';\nimport { MobileSwipeDownModal } from '$components/MobileSwipeDownModal';\nimport { modalAtom, popModalAtom } from '$state/modal';\nimport * as messageCss from '$features/room/message/styles.css';\n\ntype MessageReactionPickerInternalProps = {\n  mEvent: MatrixEvent;\n  imagePackRooms?: Room[];\n  onReactionToggle?: (targetEventId: string, key: string, shortcode?: string) => void;\n  closeMenu: () => void;\n};\n\nexport function MessageReactionPickerInternal({\n  mEvent,\n  imagePackRooms,\n  onReactionToggle,\n  closeMenu,\n}: MessageReactionPickerInternalProps) {\n  const setModal = useSetAtom(modalAtom);\n  const popModal = useSetAtom(popModalAtom);\n  const reactedRef = useRef(false);\n\n  const requestClose = () => {\n    if (!reactedRef.current) {\n      popModal();\n      return;\n    }\n    setModal(null);\n    closeMenu();\n  };\n\n  const react = (key: string, shortcode?: string) => {\n    reactedRef.current = true;\n    onReactionToggle?.(mEvent.getId() ?? '', key, shortcode);\n  };\n\n  return (\n    <MobileSwipeDownModal\n      requestClose={requestClose}\n      focusTrap\n      dialogLabel=\"Add reaction\"\n      sheetClassName={messageCss.MessageMobileOptionsContainerPicker}\n    >\n      {() => (\n        <EmojiBoard\n          sheet\n          isFullWidth\n          allowTextCustomEmoji\n          imagePackRooms={imagePackRooms ?? []}\n          requestClose={requestClose}\n          onEmojiSelect={(key) => react(key)}\n          onCustomEmojiSelect={(mxc, shortcode) => react(mxc, shortcode)}\n        />\n      )}\n    </MobileSwipeDownModal>\n  );\n}\n","import { useRef } from 'react';\nimport { useSetAtom } from 'jotai';\nimport type { MatrixEvent, Room, RoomMessageEventContent } from '$types/matrix-sdk';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { TemporaryPersonaPicker } from '$features/room/persona-picker/PersonaPicker';\nimport type { PerMessageProfileMsc4461 } from '$hooks/usePerMessageProfile';\nimport { buildReplacementPmpContent } from '$features/room/buildReplacementContent';\nimport { modalAtom, popModalAtom } from '$state/modal';\n\ntype MessageReproxyPickerInternalProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  closeMenu: () => void;\n};\n\nexport function MessageReproxyPickerInternal({\n  room,\n  mEvent,\n  closeMenu,\n}: MessageReproxyPickerInternalProps) {\n  const mx = useMatrixClient();\n  const setModal = useSetAtom(modalAtom);\n  const popModal = useSetAtom(popModalAtom);\n  const reproxiedRef = useRef(false);\n\n  const requestClose = () => {\n    if (!reproxiedRef.current) {\n      popModal();\n      return;\n    }\n    setModal(null);\n    closeMenu();\n  };\n\n  const reproxyMessage = async (profile: PerMessageProfileMsc4461 | undefined) => {\n    reproxiedRef.current = true;\n    const content = buildReplacementPmpContent(mEvent.getContent(), mEvent.getId()!, profile);\n    await mx.sendMessage(room.roomId, content as RoomMessageEventContent);\n    requestClose();\n  };\n\n  return (\n    <TemporaryPersonaPicker\n      open\n      mx={mx}\n      onPersonaSelect={reproxyMessage}\n      requestClose={requestClose}\n    />\n  );\n}\n","import { useAtomValue, useSetAtom } from 'jotai';\nimport { OverlayBackdrop, OverlayCenter, Box, Modal } from 'folds';\nimport { Overlay } from '$components/overlay-stack';\nimport FocusTrap from 'focus-trap-react';\nimport { stopPropagation } from '$utils/keyboard';\nimport { useDismissOnBack } from '$utils/androidBack';\nimport { modalAtom, ModalType, popModalAtom } from '$state/modal';\nimport { MessageReportInternal } from './MessageReport';\nimport { MessageDeleteInternal } from './MessageDelete';\nimport { MessageEditHistoryInternal } from './MessageEditHistory';\nimport { MessageSourceInternal } from './MessageSource';\nimport { MessageForwardInternal } from './MessageForward';\nimport { MessageAllReactionInternal } from './MessageReactions';\nimport { MessageReadReceiptInternal } from './MessageReadRecipts';\nimport { MobileOptionsInternal } from './Options';\nimport { MessageReactionPickerInternal } from './MessageReactionPicker';\nimport { MessageReproxyPickerInternal } from './MessageReproxyPicker';\n\nconst OWNS_BACK_HANDLER: ReadonlySet<ModalType> = new Set([\n  ModalType.Forward,\n  ModalType.MobileOptions,\n  ModalType.ReactionPicker,\n  ModalType.ReproxyPicker,\n]);\n\nexport function GlobalModalManager() {\n  const modal = useAtomValue(modalAtom);\n  const close = useSetAtom(popModalAtom);\n\n  useDismissOnBack(close, !!modal && !OWNS_BACK_HANDLER.has(modal.type));\n\n  if (!modal) return null;\n\n  if (modal.type === ModalType.ReactionPicker) {\n    return (\n      <MessageReactionPickerInternal\n        mEvent={modal.mEvent}\n        imagePackRooms={modal.imagePackRooms}\n        onReactionToggle={modal.onReactionToggle}\n        closeMenu={modal.closeMenu}\n      />\n    );\n  }\n  if (modal.type === ModalType.ReproxyPicker) {\n    return (\n      <MessageReproxyPickerInternal\n        room={modal.room}\n        mEvent={modal.mEvent}\n        closeMenu={modal.closeMenu}\n      />\n    );\n  }\n\n  if (modal.type === ModalType.Forward) {\n    return <MessageForwardInternal room={modal.room} mEvent={modal.mEvent} onClose={close} />;\n  }\n  if (modal.type === ModalType.MobileOptions) {\n    return <MobileOptionsInternal options={modal.options} />;\n  }\n  return (\n    <Overlay open backdrop={<OverlayBackdrop />}>\n      <OverlayCenter>\n        <FocusTrap\n          focusTrapOptions={{\n            initialFocus: false,\n            onDeactivate: close,\n            allowOutsideClick: (e: { preventDefault?: () => void }) => {\n              if (e.preventDefault) e.preventDefault();\n              close();\n              return false;\n            },\n            escapeDeactivates: stopPropagation,\n          }}\n        >\n          <div>\n            {' '}\n            {modal.type === ModalType.Report && (\n              <Box>\n                <MessageReportInternal room={modal.room} mEvent={modal.mEvent} onClose={close} />\n              </Box>\n            )}\n            {modal.type === ModalType.Delete && (\n              <Box>\n                <MessageDeleteInternal room={modal.room} mEvent={modal.mEvent} onClose={close} />\n              </Box>\n            )}\n            {modal.type === ModalType.Source && (\n              <Modal variant=\"Surface\" size=\"300\">\n                <MessageSourceInternal room={modal.room} mEvent={modal.mEvent} onClose={close} />\n              </Modal>\n            )}\n            {modal.type === ModalType.Reactions && (\n              <Modal variant=\"Surface\" size=\"300\">\n                <MessageAllReactionInternal\n                  room={modal.room}\n                  relations={modal.relations}\n                  onClose={close}\n                />\n              </Modal>\n            )}\n            {modal.type === ModalType.EditHistory && (\n              <Modal variant=\"Surface\" size=\"300\">\n                <MessageEditHistoryInternal\n                  room={modal.room}\n                  mEvent={modal.mEvent}\n                  onClose={close}\n                />\n              </Modal>\n            )}\n            {modal.type === ModalType.ReadReceipts && (\n              <Modal variant=\"Surface\" size=\"300\">\n                <MessageReadReceiptInternal\n                  room={modal.room}\n                  eventId={modal.eventId}\n                  onClose={close}\n                />\n              </Modal>\n            )}\n          </div>\n        </FocusTrap>\n      </OverlayCenter>\n    </Overlay>\n  );\n}\n","import { atom } from 'jotai';\nimport { atomFamily } from 'jotai/utils';\n\nexport const delayedEventsSupportedAtom = atom(false);\n\nexport const getScheduledMessageStateKey = (userId: string, roomId: string): string =>\n  `${userId}\\0${roomId}`;\n\nexport const roomIdToScheduledTimeAtomFamily = atomFamily<\n  string,\n  ReturnType<typeof atom<Date | null>>\n>(() => atom<Date | null>(null));\n\n// Save the delay_id instead of cancelling the message immediately in case\n// the edit process is cancelled\nexport const roomIdToEditingScheduledDelayIdAtomFamily = atomFamily<\n  string,\n  ReturnType<typeof atom<string | null>>\n>(() => atom<string | null>(null));\n\nexport const serverMaxDelayMsAtom = atom<number | null>(null);\n","import { EventType, MatrixEvent, UpdateDelayedEventAction } from '$types/matrix-sdk';\nimport type {\n  DelayedEventInfoItem,\n  SendDelayedEventResponse,\n  IContent,\n  MatrixClient,\n  Room,\n  RoomMessageEventContent,\n  TimelineEvents,\n} from '$types/matrix-sdk';\n\n// Grab types needed for encryption\ninterface EncryptableBackend {\n  encryptEvent(event: MatrixEvent, room: Room): Promise<void>;\n}\n\n// matrix-js-sdk's own `DelayedEventInfo` type declares this array under `scheduled`, but its\n// `_unstable_getDelayedEvents` call is a raw passthrough of the server's response, and MSC4140\n// (and every homeserver implementing it) puts the array under `delayed_events`:\n// https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/4140-delayed-events-futures.md\nexport type DelayedEventsResponse = {\n  delayed_events: DelayedEventInfoItem[];\n  next_batch?: string;\n};\n\nexport async function supportsDelayedEvents(mx: MatrixClient): Promise<boolean> {\n  try {\n    return await mx.doesServerSupportUnstableFeature('org.matrix.msc4140');\n  } catch {\n    return false;\n  }\n}\n\nexport async function sendDelayedMessage(\n  mx: MatrixClient,\n  roomId: string,\n  content: IContent,\n  delayMs: number,\n  threadId?: string | null,\n  eventType: keyof TimelineEvents = EventType.RoomMessage\n): Promise<SendDelayedEventResponse> {\n  return mx._unstable_sendDelayedEvent(\n    roomId,\n    { delay: delayMs },\n    threadId ?? null,\n    eventType as Parameters<typeof mx._unstable_sendDelayedEvent>[3],\n    content as RoomMessageEventContent\n  );\n}\n\n/**\n * Send a delayed message in an E2EE room by pre-encrypting the content at\n * scheduling time. The message is encrypted with the current Megolm session.\n * Devices that join or add new device keys after this call will not be\n * able to decrypt it.\n */\nexport async function sendDelayedMessageE2EE(\n  mx: MatrixClient,\n  roomId: string,\n  room: Room,\n  content: IContent,\n  delayMs: number,\n  threadId?: string | null,\n  eventType: keyof TimelineEvents = EventType.RoomMessage\n): Promise<SendDelayedEventResponse> {\n  const crypto = mx.getCrypto();\n  if (!crypto || !('encryptEvent' in crypto)) {\n    throw new Error('Encryption not available: no crypto backend with encryptEvent');\n  }\n\n  // Create a temporary MatrixEvent to encrypt in-place.\n  const event = new MatrixEvent({\n    type: eventType,\n    content,\n    room_id: roomId,\n    sender: mx.getUserId() ?? '',\n    event_id: `~${roomId}:${Date.now()}`,\n    origin_server_ts: Date.now(),\n    unsigned: {},\n  });\n\n  // Minimal interface to CryptoAPI\n  await (crypto as unknown as EncryptableBackend).encryptEvent(event, room);\n\n  // After encryption:\n  //   event.getWireType()    === 'm.room.encrypted'\n  //   event.getWireContent() === the Megolm ciphertext object\n  // Pass the pre-encrypted payload directly to the delayed-events API.\n\n  return (\n    mx as unknown as { _unstable_sendDelayedEvent: typeof mx._unstable_sendDelayedEvent }\n  )._unstable_sendDelayedEvent(\n    roomId,\n    { delay: delayMs },\n    threadId ?? null,\n    event.getWireType() as Parameters<typeof mx._unstable_sendDelayedEvent>[3],\n    event.getWireContent() as TimelineEvents[keyof TimelineEvents]\n  );\n}\n\nexport async function getDelayedEvents(mx: MatrixClient): Promise<DelayedEventsResponse> {\n  return mx._unstable_getDelayedEvents() as unknown as Promise<DelayedEventsResponse>;\n}\n\nexport async function cancelDelayedEvent(mx: MatrixClient, delayId: string): Promise<void> {\n  await mx._unstable_updateDelayedEvent(delayId, UpdateDelayedEventAction.Cancel);\n}\n\nexport function computeDelayMs(targetDate: Date): number {\n  const delay = targetDate.getTime() - Date.now();\n  if (delay <= 0) throw new Error('Scheduled time must be in the future');\n  return delay;\n}\n","import { useEffect } from 'react';\nimport { useSetAtom } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { delayedEventsSupportedAtom } from '$state/scheduledMessages';\nimport { supportsDelayedEvents } from '$utils/delayedEvents';\n\nexport function useDelayedEventsSupport(): void {\n  const mx = useMatrixClient();\n  const setSupported = useSetAtom(delayedEventsSupportedAtom);\n\n  useEffect(() => {\n    let cancelled = false;\n    supportsDelayedEvents(mx).then((supported) => {\n      if (!cancelled) setSupported(supported);\n    });\n    return () => {\n      cancelled = true;\n    };\n  }, [mx, setSupported]);\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { ProseMirrorEditorController } from '$components/editor/prosemirrorController';\n\nexport interface UseMessageEditOptions {\n  onReset?: () => void;\n  alive?: () => boolean;\n  focusOnCancel?: boolean;\n}\n\n/**\n * Manages the \"edit mode\" state for a message composer.\n *\n * Centralises the `editId` state and the `handleEdit` callback so both\n * `RoomTimeline` and `ThreadDrawer` share identical behaviour: setting an\n * edit target activates the editor for that event; clearing it resets the\n * editor and returns focus.\n */\nexport function useMessageEdit(\n  editor: ProseMirrorEditorController,\n  options?: UseMessageEditOptions\n): { editId: string | undefined; handleEdit: (editId?: string) => void } {\n  const [editId, setEditId] = useState<string | undefined>(undefined);\n\n  // Use refs so the callback never goes stale on options changes.\n  const aliveRef = useRef(options?.alive);\n  aliveRef.current = options?.alive;\n  const onResetRef = useRef(options?.onReset);\n  onResetRef.current = options?.onReset;\n  const focusOnCancelRef = useRef(options?.focusOnCancel ?? true);\n  focusOnCancelRef.current = options?.focusOnCancel ?? true;\n\n  const handleEdit = useCallback(\n    (targetEditId?: string) => {\n      if (targetEditId) {\n        setEditId(targetEditId);\n        return;\n      }\n      setEditId(undefined);\n      if (!focusOnCancelRef.current) return;\n      requestAnimationFrame(() => {\n        if (aliveRef.current && !aliveRef.current()) return;\n        if (onResetRef.current && editor.isEmpty()) onResetRef.current();\n        editor.focus();\n      });\n    },\n    [editor]\n  );\n\n  return { editId, handleEdit };\n}\n","import type { MatrixEvent, Room, RoomEventHandlerMap } from '$types/matrix-sdk';\nimport { RoomEvent, EventType } from '$types/matrix-sdk';\nimport { useEffect, useState } from 'react';\n\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { isMembershipChanged, reactionOrEditEvent } from '$utils/room/relations';\n\nexport const useRoomLatestRenderedEvent = (room: Room) => {\n  const [hideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents');\n  const [hideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents');\n  const [showHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents');\n  const [latestEvent, setLatestEvent] = useState<MatrixEvent>();\n\n  useEffect(() => {\n    const getLatestEvent = (): MatrixEvent | undefined => {\n      const liveEvents = room.getLiveTimeline().getEvents();\n      for (let i = liveEvents.length - 1; i >= 0; i -= 1) {\n        const evt = liveEvents[i];\n\n        if (!evt) continue;\n        if (reactionOrEditEvent(evt)) continue;\n        if (evt.getType() === (EventType.RoomMember as string)) {\n          const membershipChanged = isMembershipChanged(evt);\n          if (membershipChanged && hideMembershipEvents) continue;\n          if (!membershipChanged && hideNickAvatarEvents) continue;\n          return evt;\n        }\n\n        if (\n          evt.getType() === (EventType.RoomMessage as string) ||\n          evt.getType() === (EventType.RoomMessageEncrypted as string) ||\n          evt.getType() === (EventType.Sticker as string) ||\n          evt.getType() === (EventType.RoomName as string) ||\n          evt.getType() === (EventType.RoomTopic as string) ||\n          evt.getType() === (EventType.RoomAvatar as string)\n        ) {\n          return evt;\n        }\n\n        if (showHiddenEvents) return evt;\n      }\n      return undefined;\n    };\n\n    const handleTimelineEvent: RoomEventHandlerMap[RoomEvent.Timeline] = () => {\n      setLatestEvent(getLatestEvent());\n    };\n    setLatestEvent(getLatestEvent());\n\n    room.on(RoomEvent.Timeline, handleTimelineEvent);\n    return () => {\n      room.removeListener(RoomEvent.Timeline, handleTimelineEvent);\n    };\n  }, [room, hideMembershipEvents, hideNickAvatarEvents, showHiddenEvents]);\n\n  return latestEvent;\n};\n","import { useAtomValue } from 'jotai';\nimport { Box, Text, as, config } from 'folds';\nimport { Checks, menuIcon } from '$components/icons/phosphor';\nimport type { Room } from '$types/matrix-sdk';\nimport classNames from 'classnames';\nimport { useAtom } from 'jotai';\n\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRoomLatestRenderedEvent } from '$hooks/useRoomLatestRenderedEvent';\nimport { useRoomEventReaders } from '$hooks/useRoomEventReaders';\nimport { modalAtom, ModalType } from '$state/modal';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport * as css from './RoomViewFollowing.css';\n\nexport function RoomViewFollowingPlaceholder() {\n  return <div className={css.RoomViewFollowingPlaceholder} />;\n}\n\ntype RoomViewFollowingProps = {\n  room: Room;\n  threadEventId?: string;\n  participantIds?: Set<string>;\n};\nexport const RoomViewFollowing = as<'div', RoomViewFollowingProps>(\n  ({ className, room, threadEventId, participantIds, ...props }, ref) => {\n    const mx = useMatrixClient();\n    const [, setModal] = useAtom(modalAtom);\n    const latestEvent = useRoomLatestRenderedEvent(room);\n    const resolvedEventId = threadEventId ?? latestEvent?.getId();\n    const latestEventReaders = useRoomEventReaders(room, resolvedEventId);\n    const nicknames = useAtomValue(nicknamesAtom);\n    const cachedProfiles = useAtomValue(profilesCacheAtom);\n    const names = latestEventReaders\n      .filter((readerId) => readerId !== mx.getUserId())\n      .filter((readerId) => !participantIds || participantIds.has(readerId))\n      .map(\n        (readerId) =>\n          getMemberDisplayName(room, readerId, nicknames) ??\n          cachedProfiles[readerId]?.displayName ??\n          getMxIdLocalPart(readerId) ??\n          readerId\n      );\n\n    const eventId = resolvedEventId;\n\n    return (\n      <Box\n        as={names.length > 0 ? 'button' : 'div'}\n        data-no-button-motion={names.length > 0 || undefined}\n        onClick={\n          names.length > 0\n            ? () => {\n                if (eventId) {\n                  setModal({ type: ModalType.ReadReceipts, room, eventId });\n                }\n              }\n            : undefined\n        }\n        className={classNames(css.RoomViewFollowing({ clickable: names.length > 0 }), className)}\n        alignItems=\"Center\"\n        justifyContent=\"End\"\n        gap=\"200\"\n        {...props}\n        ref={ref}\n      >\n        {names.length > 0 && (\n          <>\n            {menuIcon(Checks, { style: { opacity: config.opacity.P300 } })}\n            <Text size=\"T300\" truncate>\n              {names.length === 1 && (\n                <>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[0]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {' is following the conversation.'}\n                  </Text>\n                </>\n              )}\n              {names.length === 2 && (\n                <>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[0]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {' and '}\n                  </Text>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[1]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {' are following the conversation.'}\n                  </Text>\n                </>\n              )}\n              {names.length === 3 && (\n                <>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[0]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {', '}\n                  </Text>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[1]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {' and '}\n                  </Text>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[2]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {' are following the conversation.'}\n                  </Text>\n                </>\n              )}\n              {names.length > 3 && (\n                <>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[0]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {', '}\n                  </Text>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[1]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {', '}\n                  </Text>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names[2]}</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {' and '}\n                  </Text>\n                  <b style={{ WebkitTextFillColor: 'inherit' }}>{names.length - 3} others</b>\n                  <Text\n                    as=\"span\"\n                    size=\"Inherit\"\n                    priority=\"300\"\n                    style={{ WebkitTextFillColor: 'currentColor' }}\n                  >\n                    {' are following the conversation.'}\n                  </Text>\n                </>\n              )}\n            </Text>\n          </>\n        )}\n      </Box>\n    );\n  }\n);\n","import type { MatrixClient } from '$types/matrix-sdk';\nimport { useMemo, useRef } from 'react';\nimport { TYPING_TIMEOUT_MS } from '$state/typingMembers';\n\ntype TypingStatusUpdater = (typing: boolean) => void;\n\ntype TypingStatusUpdaterOptions = {\n  disabled?: boolean;\n};\n\nexport const useTypingStatusUpdater = (\n  mx: MatrixClient,\n  roomId: string,\n  options?: TypingStatusUpdaterOptions\n): TypingStatusUpdater => {\n  const statusSentTsRef = useRef(0);\n  const disabled = options?.disabled ?? false;\n\n  const sendTypingStatus: TypingStatusUpdater = useMemo(() => {\n    statusSentTsRef.current = 0;\n    return (typing) => {\n      if (disabled) return;\n      if (typing) {\n        if (Date.now() - statusSentTsRef.current < TYPING_TIMEOUT_MS) {\n          return;\n        }\n\n        mx.sendTyping(roomId, true, TYPING_TIMEOUT_MS);\n        const sentTs = Date.now();\n        statusSentTsRef.current = sentTs;\n\n        // Don't believe server will timeout typing status;\n        // Clear typing status after timeout if already not;\n        setTimeout(() => {\n          if (statusSentTsRef.current === sentTs) {\n            mx.sendTyping(roomId, false, TYPING_TIMEOUT_MS);\n            statusSentTsRef.current = 0;\n          }\n        }, TYPING_TIMEOUT_MS);\n        return;\n      }\n\n      if (Date.now() - statusSentTsRef.current < TYPING_TIMEOUT_MS) {\n        mx.sendTyping(roomId, false, TYPING_TIMEOUT_MS);\n      }\n      statusSentTsRef.current = 0;\n    };\n  }, [mx, roomId, disabled]);\n\n  return sendTypingStatus;\n};\n","import { useCallback } from 'react';\nimport { selectFile } from '$utils/dom';\n\nexport const useFilePicker = <M extends boolean | undefined = undefined>(\n  onSelect: (file: M extends true ? File[] : File) => void,\n  multiple?: M\n) =>\n  useCallback(\n    async (accept: string) => {\n      const file = await selectFile(accept, multiple);\n      if (!file) return;\n      onSelect(file);\n    },\n    [multiple, onSelect]\n  );\n","import type { ClipboardEventHandler } from 'react';\nimport { useCallback } from 'react';\nimport { getDataTransferFiles } from '$utils/dom';\n\nexport const useFilePasteHandler = (onPaste: (file: File[]) => void): ClipboardEventHandler =>\n  useCallback(\n    (evt) => {\n      const files = getDataTransferFiles(evt.clipboardData);\n      if (files) onPaste(files);\n    },\n    [onPaste]\n  );\n","import type { RefObject } from 'react';\nimport { useState, useEffect, useRef } from 'react';\nimport { getDataTransferFiles } from '$utils/dom';\n\nexport const useFileDropZone = (\n  zoneRef: RefObject<HTMLElement | null>,\n  onDrop: (file: File[]) => void\n): boolean => {\n  const dragStateRef = useRef<'start' | 'leave' | 'over' | undefined>(undefined);\n  const [active, setActive] = useState(false);\n\n  useEffect(() => {\n    const target = zoneRef.current;\n    const handleDrop = (evt: DragEvent) => {\n      evt.preventDefault();\n      dragStateRef.current = undefined;\n      setActive(false);\n      if (!evt.dataTransfer) return;\n      const files = getDataTransferFiles(evt.dataTransfer);\n      if (files) onDrop(files);\n    };\n\n    target?.addEventListener('drop', handleDrop);\n    return () => {\n      target?.removeEventListener('drop', handleDrop);\n    };\n  }, [zoneRef, onDrop]);\n\n  useEffect(() => {\n    const target = zoneRef.current;\n    const handleDragEnter = (evt: DragEvent) => {\n      if (evt.dataTransfer?.types.includes('Files')) {\n        dragStateRef.current = 'start';\n        setActive(true);\n      }\n    };\n    const handleDragLeave = () => {\n      if (dragStateRef.current !== 'over') return;\n      dragStateRef.current = 'leave';\n      setActive(false);\n    };\n    const handleDragOver = (evt: DragEvent) => {\n      evt.preventDefault();\n      dragStateRef.current = 'over';\n    };\n\n    target?.addEventListener('dragenter', handleDragEnter);\n    target?.addEventListener('dragleave', handleDragLeave);\n    target?.addEventListener('dragover', handleDragOver);\n    return () => {\n      target?.removeEventListener('dragenter', handleDragEnter);\n      target?.removeEventListener('dragleave', handleDragLeave);\n      target?.removeEventListener('dragover', handleDragOver);\n    };\n  }, [zoneRef]);\n\n  return active;\n};\n","import { Badge, Box, ProgressBar, Text, percent } from 'folds';\nimport { Warning, sizedIcon } from '$components/icons/phosphor';\nimport type { ReactNode } from 'react';\nimport { forwardRef } from 'react';\n\nimport { bytesToSize } from '$utils/common';\nimport * as css from './UploadCard.css';\n\ntype UploadCardProps = {\n  before?: ReactNode;\n  children: ReactNode;\n  after?: ReactNode;\n  bottom?: ReactNode;\n};\n\nexport const UploadCard = forwardRef<\n  HTMLDivElement,\n  UploadCardProps & css.UploadCardVariant & { style?: React.CSSProperties }\n>(({ before, after, children, bottom, radii, outlined, compact, style }, ref) => (\n  <Box\n    className={css.UploadCard({ radii, outlined, compact })}\n    direction=\"Column\"\n    gap=\"200\"\n    style={style}\n    ref={ref}\n  >\n    <Box alignItems=\"Center\" gap=\"200\">\n      {before}\n      <Box alignItems=\"Center\" grow=\"Yes\" gap=\"200\" style={{ minWidth: 0 }}>\n        {children}\n      </Box>\n      {after}\n    </Box>\n    {bottom}\n  </Box>\n));\n\ntype UploadCardProgressProps = {\n  sentBytes: number;\n  totalBytes: number;\n};\n\nexport function UploadCardProgress({ sentBytes, totalBytes }: UploadCardProgressProps) {\n  return (\n    <Box grow=\"Yes\" direction=\"Column\" gap=\"200\">\n      <ProgressBar variant=\"Secondary\" size=\"300\" min={0} max={totalBytes} value={sentBytes} />\n      <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\">\n        <Badge variant=\"Secondary\" fill=\"Solid\" radii=\"Pill\">\n          <Text size=\"L400\">{`${Math.round(percent(0, totalBytes, sentBytes))}%`}</Text>\n        </Badge>\n        <Badge variant=\"Secondary\" fill=\"Soft\" radii=\"Pill\">\n          <Text size=\"L400\">\n            {bytesToSize(sentBytes)} / {bytesToSize(totalBytes)}\n          </Text>\n        </Badge>\n      </Box>\n    </Box>\n  );\n}\n\nexport function CompactUploadCardProgress({ sentBytes, totalBytes }: UploadCardProgressProps) {\n  return (\n    <Box grow=\"Yes\" gap=\"200\" alignItems=\"Center\">\n      <Badge variant=\"Secondary\" fill=\"Solid\" radii=\"Pill\">\n        <Text size=\"L400\">{`${Math.round(percent(0, totalBytes, sentBytes))}%`}</Text>\n      </Badge>\n      <Box grow=\"Yes\" direction=\"Column\">\n        <ProgressBar variant=\"Secondary\" size=\"300\" min={0} max={totalBytes} value={sentBytes} />\n      </Box>\n      <Badge variant=\"Secondary\" fill=\"Soft\" radii=\"Pill\">\n        <Text size=\"L400\">\n          {bytesToSize(sentBytes)} / {bytesToSize(totalBytes)}\n        </Text>\n      </Badge>\n    </Box>\n  );\n}\n\ntype UploadCardErrorProps = {\n  children: ReactNode;\n};\n\nexport function UploadCardError({ children }: UploadCardErrorProps) {\n  return (\n    <Box className={css.UploadCardError} alignItems=\"Center\" gap=\"300\">\n      {sizedIcon(Warning, '50')}\n      {children}\n    </Box>\n  );\n}\n","import { createContext, useContext } from 'react';\n\nexport interface MediaConfig {\n  [key: string]: unknown;\n  'm.upload.size'?: number;\n}\n\nconst MediaConfigContext = createContext<MediaConfig | null>(null);\n\nexport const MediaConfigProvider = MediaConfigContext.Provider;\n\nexport function useMediaConfig(): MediaConfig {\n  const mediaConfig = useContext(MediaConfigContext);\n  if (!mediaConfig) throw new Error('Media configs are not provided!');\n  return mediaConfig;\n}\n","import type { KeyboardEventHandler } from 'react';\nimport { useCallback, useEffect, useRef } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport type { RectCords } from 'folds';\nimport { Box, Chip, IconButton, Spinner, Text, config } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { Smiley, sizedIcon } from '$components/icons/phosphor';\nimport { isKeyHotkey } from 'is-hotkey';\nimport {\n  AutocompletePrefix,\n  useAutocompleteQuery,\n  EmoticonAutocomplete,\n  MarkdownFormattingToolbarBottom,\n  MarkdownFormattingToolbarToggle,\n  createEmoticonElement,\n  plainToEditorInput,\n  ProseMirrorEditorSurface,\n  toMatrixCustomHTML,\n  toPlainText,\n  trimCustomHtml,\n  toggleProseMirrorKeyboardShortcut,\n  useEditor,\n} from '$components/editor';\nimport { htmlToMarkdown } from '$plugins/markdown';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { EmojiBoard } from '$components/emoji-board';\nimport * as css from './UploadDescriptionEditor.css';\n\ntype DescriptionEditorProps = {\n  value?: string;\n  isSaving?: boolean;\n  imagePackRooms?: Room[];\n  onSave: (plaintext: string, htmlContent: string) => void;\n  onCancel: () => void;\n};\n\nexport function DescriptionEditor({\n  value,\n  isSaving,\n  imagePackRooms,\n  onSave,\n  onCancel,\n}: Readonly<DescriptionEditorProps>) {\n  const editor = useEditor();\n  const [enterForNewline] = useSetting(settingsAtom, 'enterForNewline');\n  const [shortcutOverrides] = useSetting(settingsAtom, 'shortcutOverrides');\n\n  const [autocompleteQuery, setAutocompleteQuery, handleCloseAutocomplete] =\n    useAutocompleteQuery(editor);\n\n  const prevValue = useRef(value);\n  const initialized = useRef(false);\n  const handleSave = useCallback(() => {\n    const plainText = toPlainText(editor.getDocument()).trim();\n\n    const customHtml = trimCustomHtml(toMatrixCustomHTML(editor.getDocument(), {}));\n\n    onSave(plainText, customHtml || plainText);\n  }, [editor, onSave]);\n\n  useEffect(() => {\n    const valueChanged = prevValue.current !== value;\n    const isFirstValidLoad = !initialized.current && value !== undefined;\n\n    if (valueChanged || isFirstValidLoad) {\n      prevValue.current = value;\n\n      let normalizedValue = value;\n      if (\n        typeof normalizedValue === 'object' &&\n        normalizedValue !== null &&\n        'formatted_body' in normalizedValue\n      ) {\n        normalizedValue = (normalizedValue as { formatted_body: string }).formatted_body;\n      }\n\n      const safeValue = typeof normalizedValue === 'string' ? normalizedValue : '';\n\n      const incomingPlainText = toPlainText(\n        plainToEditorInput(safeValue.includes('<') ? htmlToMarkdown(safeValue) : safeValue)\n      ).trim();\n      const currentPlainText = toPlainText(editor.getDocument()).trim();\n\n      if (currentPlainText === incomingPlainText && initialized.current) return;\n\n      const isLikelyHtml = safeValue.includes('<') || safeValue.includes('>');\n      const initialValue = isLikelyHtml\n        ? plainToEditorInput(htmlToMarkdown(safeValue))\n        : plainToEditorInput(safeValue);\n\n      editor.setDocument(initialValue);\n\n      initialized.current = true;\n    }\n  }, [value, editor]);\n\n  const handleKeyDown: KeyboardEventHandler = useCallback(\n    (evt) => {\n      if (toggleProseMirrorKeyboardShortcut(editor, evt, shortcutOverrides)) {\n        evt.preventDefault();\n        return;\n      }\n      if (isKeyHotkey('mod+enter', evt) || (!enterForNewline && isKeyHotkey('enter', evt))) {\n        evt.preventDefault();\n        handleSave();\n      }\n    },\n    [editor, enterForNewline, handleSave, shortcutOverrides]\n  );\n\n  const handleKeyUp: KeyboardEventHandler = useCallback(\n    (evt) => {\n      if (isKeyHotkey('escape', evt)) {\n        evt.preventDefault();\n        onCancel();\n        return;\n      }\n      setAutocompleteQuery(editor.getAutocompleteQuery([AutocompletePrefix.Emoticon]));\n    },\n    [editor, onCancel, setAutocompleteQuery]\n  );\n\n  const handleEmoticonSelect = (key: string, shortcode: string) => {\n    editor.insertInline(createEmoticonElement(key, shortcode));\n    editor.insertText(' ');\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Box\n        className={css.DescriptionEditorContainer}\n        direction=\"Column\"\n        style={{ position: 'relative' }}\n      >\n        {autocompleteQuery?.prefix === AutocompletePrefix.Emoticon && (\n          <EmoticonAutocomplete\n            imagePackRooms={imagePackRooms || []}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n          />\n        )}\n        <ProseMirrorEditorSurface\n          controller={editor}\n          placeholder=\"File Description...\"\n          onKeyDown={handleKeyDown}\n          onKeyUp={handleKeyUp}\n          maxHeight=\"200px\"\n          variant=\"Background\"\n          bottom={\n            <Box direction=\"Column\" style={{ backgroundColor: 'var(--sable-bg-container)' }}>\n              <MarkdownFormattingToolbarBottom controller={editor} />\n              <Box\n                style={{ padding: config.space.S200, paddingTop: 0 }}\n                alignItems=\"End\"\n                justifyContent=\"SpaceBetween\"\n                gap=\"100\"\n              >\n                <Box gap=\"200\">\n                  <Box gap=\"200\" alignItems=\"Center\">\n                    <Chip\n                      onClick={handleSave}\n                      variant=\"Primary\"\n                      radii=\"Pill\"\n                      outlined\n                      before={\n                        isSaving ? <Spinner variant=\"Primary\" fill=\"Soft\" size=\"100\" /> : undefined\n                      }\n                    >\n                      <Text size=\"B300\">{isSaving ? 'Saving' : 'Save'}</Text>\n                    </Chip>\n                  </Box>\n                  <Box gap=\"200\" alignItems=\"Center\">\n                    <Chip\n                      onClick={onCancel}\n                      variant=\"Warning\"\n                      radii=\"Pill\"\n                      outlined\n                      before={\n                        isSaving ? <Spinner variant=\"Primary\" fill=\"Soft\" size=\"100\" /> : undefined\n                      }\n                    >\n                      <Text size=\"B300\">Cancel</Text>\n                    </Chip>\n                  </Box>\n                </Box>\n                <Box gap=\"Inherit\">\n                  <MarkdownFormattingToolbarToggle variant=\"Background\" />\n                  <UseStateProvider initial={undefined}>\n                    {(anchor: RectCords | undefined, setAnchor) => (\n                      <PopOut\n                        anchor={anchor}\n                        alignOffset={-8}\n                        position=\"Top\"\n                        align=\"End\"\n                        content={\n                          <EmojiBoard\n                            imagePackRooms={imagePackRooms ?? []}\n                            returnFocusOnDeactivate={false}\n                            onEmojiSelect={handleEmoticonSelect}\n                            onCustomEmojiSelect={handleEmoticonSelect}\n                            requestClose={() =>\n                              setAnchor((v) => {\n                                if (v) {\n                                  editor.focus();\n                                  return undefined;\n                                }\n                                return v;\n                              })\n                            }\n                          />\n                        }\n                      >\n                        <IconButton\n                          aria-pressed={anchor !== undefined}\n                          variant=\"Background\"\n                          size=\"300\"\n                          radii=\"300\"\n                          onClick={(evt) => setAnchor(evt.currentTarget.getBoundingClientRect())}\n                        >\n                          {sizedIcon(Smiley, '400', { filled: anchor !== undefined })}\n                        </IconButton>\n                      </PopOut>\n                    )}\n                  </UseStateProvider>\n                </Box>\n              </Box>\n            </Box>\n          }\n        />\n      </Box>\n    </Box>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Chip, IconButton, Text, Tooltip, color, config, toRem } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport {\n  Check,\n  EyeSlash,\n  File,\n  Image,\n  Info,\n  PencilSimple,\n  VideoCamera,\n  X,\n  sizedIcon,\n  type PhosphorIcon,\n  phosphorSizeRem,\n} from '$components/icons/phosphor';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport { Play, Pause } from '@phosphor-icons/react';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { Image as MediaImage } from '$components/media';\nimport type { Opts as LinkifyOpts } from 'linkifyjs';\nimport { getReactCustomHtmlParser, LINKIFY_OPTS } from '$plugins/react-custom-html-parser';\nimport { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler';\nimport { RenderBody } from '$components/message';\nimport type { UploadSuccess } from '$state/upload';\nimport { UploadStatus, useBindUploadAtom } from '$state/upload';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { TUploadContent } from '$utils/matrix';\nimport { isImageMimeType } from '$utils/mimeTypes';\nimport { bytesToSize } from '$utils/common';\nimport type { TUploadItem, TUploadMetadata } from '$state/room/roomInputDrafts';\nimport { roomUploadAtomFamily } from '$state/room/roomInputDrafts';\nimport { useObjectURL } from '$hooks/useObjectURL';\nimport { useMediaConfig } from '$hooks/useMediaConfig';\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { UploadCard, UploadCardError, UploadCardProgress } from './UploadCard';\nimport * as css from './UploadCard.css';\nimport { DescriptionEditor } from './UploadDescriptionEditor';\n\nfunction getFileTypeIconComponent(fileType: string): PhosphorIcon {\n  const type = fileType.toLowerCase();\n  if (type.startsWith('audio')) return Play;\n  if (type.startsWith('video')) return VideoCamera;\n  if (isImageMimeType(type)) return Image;\n  return File;\n}\n\ntype PreviewImageProps = {\n  fileItem: TUploadItem;\n};\nfunction PreviewImage({ fileItem }: Readonly<PreviewImageProps>) {\n  const { originalFile, metadata } = fileItem;\n  const fileUrl = useObjectURL(originalFile);\n\n  return (\n    <MediaImage\n      style={{\n        objectFit: 'contain',\n        width: '100%',\n        height: toRem(128),\n        filter: metadata.markedAsSpoiler ? 'blur(44px)' : undefined,\n      }}\n      alt={originalFile.name}\n      src={fileUrl}\n    />\n  );\n}\n\ntype PreviewVideoProps = {\n  fileItem: TUploadItem;\n};\nfunction PreviewVideo({ fileItem }: Readonly<PreviewVideoProps>) {\n  const { originalFile, metadata } = fileItem;\n  const fileUrl = useObjectURL(originalFile);\n\n  return (\n    // oxlint-disable-next-line jsx-a11y/media-has-caption\n    <video\n      style={{\n        objectFit: 'contain',\n        width: '100%',\n        height: toRem(128),\n        filter: metadata.markedAsSpoiler ? 'blur(44px)' : undefined,\n      }}\n      src={fileUrl}\n    />\n  );\n}\n\nconst BAR_COUNT = 44;\n\nfunction formatAudioTime(s: number): string {\n  if (!Number.isFinite(s) || s < 0) return '0:00';\n  const m = Math.floor(s / 60);\n  const sec = Math.floor(s % 60);\n  return `${m}:${sec.toString().padStart(2, '0')}`;\n}\n\ntype PreviewAudioProps = {\n  fileItem: TUploadItem;\n};\nfunction PreviewAudio({ fileItem }: PreviewAudioProps) {\n  const { originalFile, metadata } = fileItem;\n  const audioUrl = useObjectURL(originalFile);\n  const { waveform, audioDuration } = metadata;\n  const duration = audioDuration ?? 0;\n\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [currentTime, setCurrentTime] = useState(0);\n  const audioRef = useRef<HTMLAudioElement | null>(null);\n  const rafRef = useRef<number | null>(null);\n\n  const bars = useMemo(() => {\n    if (!waveform || waveform.length === 0) {\n      return Array(BAR_COUNT).fill(0.3);\n    }\n    if (waveform.length <= BAR_COUNT) {\n      const step = (waveform.length - 1) / (BAR_COUNT - 1);\n      return Array.from({ length: BAR_COUNT }, (_, i) => {\n        const position = i * step;\n        const lower = Math.floor(position);\n        const upper = Math.min(Math.ceil(position), waveform.length - 1);\n        const fraction = position - lower;\n        if (lower === upper) {\n          return waveform[lower] ?? 0.3;\n        }\n        return (waveform[lower] ?? 0.3) * (1 - fraction) + (waveform[upper] ?? 0.3) * fraction;\n      });\n    }\n    const step = waveform.length / BAR_COUNT;\n    return Array.from({ length: BAR_COUNT }, (_, i) => {\n      const start = Math.floor(i * step);\n      const end = Math.floor((i + 1) * step);\n      const slice = waveform.slice(start, end);\n      return slice.length > 0 ? Math.max(...slice) : 0.3;\n    });\n  }, [waveform]);\n\n  const progress = duration > 0 ? Math.min(currentTime / duration, 1) : 0;\n  const previewBars = useMemo(\n    () =>\n      bars.map((level, index) => ({\n        id: `upload-audio-bar-${index}`,\n        level,\n        ratio: index / BAR_COUNT,\n      })),\n    [bars]\n  );\n\n  useEffect(() => {\n    if (!audioUrl) {\n      return undefined;\n    }\n    const audio = new Audio(audioUrl);\n    audio.preload = 'auto';\n    // Explicitly load so Firefox parses metadata immediately, making\n    // currentTime writable before the user has ever pressed play.\n    audio.load();\n    audioRef.current = audio;\n\n    const handleEnded = () => {\n      setIsPlaying(false);\n      setCurrentTime(0);\n      if (rafRef.current !== null) {\n        cancelAnimationFrame(rafRef.current);\n        rafRef.current = null;\n      }\n    };\n    audio.addEventListener('ended', handleEnded);\n\n    return () => {\n      audio.pause();\n      audio.removeEventListener('ended', handleEnded);\n      if (rafRef.current !== null) {\n        cancelAnimationFrame(rafRef.current);\n      }\n    };\n  }, [audioUrl]);\n\n  const startRaf = (audio: HTMLAudioElement) => {\n    const tick = () => {\n      setCurrentTime(audio.currentTime);\n      rafRef.current = requestAnimationFrame(tick);\n    };\n    rafRef.current = requestAnimationFrame(tick);\n  };\n\n  const stopRaf = () => {\n    if (rafRef.current !== null) {\n      cancelAnimationFrame(rafRef.current);\n      rafRef.current = null;\n    }\n  };\n\n  const handlePlayPause = () => {\n    const audio = audioRef.current;\n    if (!audio) return;\n\n    if (isPlaying) {\n      audio.pause();\n      setIsPlaying(false);\n      stopRaf();\n    } else {\n      audio.play().catch(() => {});\n      setIsPlaying(true);\n      startRaf(audio);\n    }\n  };\n\n  const seekTo = (audio: HTMLAudioElement, targetTime: number) => {\n    // Alias to a local const to satisfy no-param-reassign.\n    const el = audio;\n    if (el.seekable.length > 0) {\n      el.currentTime = targetTime;\n      setCurrentTime(targetTime);\n    } else {\n      // Metadata not yet loaded (Firefox, first scrub before load() resolves).\n      // Do NOT call load() again here  Ethat resets currentTime to 0 and\n      // restarts the fetch. load() was already called in the useEffect;\n      // just wait for the in-flight loadedmetadata event.\n      el.addEventListener(\n        'loadedmetadata',\n        () => {\n          el.currentTime = targetTime;\n          setCurrentTime(targetTime);\n        },\n        { once: true }\n      );\n    }\n  };\n\n  const handleScrubClick = (e: React.MouseEvent<HTMLDivElement>) => {\n    const audio = audioRef.current;\n    if (!audio || !duration) return;\n    const rect = e.currentTarget.getBoundingClientRect();\n    const ratio = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n    seekTo(audio, ratio * duration);\n  };\n\n  const handleKeyDown = (e: React.KeyboardEvent) => {\n    const audio = audioRef.current;\n    if (!audio || !duration) return;\n\n    const SEEK_STEP = 5;\n    let newTime = currentTime;\n\n    if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n      e.preventDefault();\n      newTime = Math.max(0, currentTime - SEEK_STEP);\n    } else if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n      e.preventDefault();\n      newTime = Math.min(duration, currentTime + SEEK_STEP);\n    } else if (e.key === 'Home') {\n      e.preventDefault();\n      newTime = 0;\n    } else if (e.key === 'End') {\n      e.preventDefault();\n      newTime = duration;\n    } else {\n      return;\n    }\n\n    seekTo(audio, newTime);\n  };\n\n  return (\n    <Box alignItems=\"Center\" gap=\"200\" className={css.AudioPreviewContainer}>\n      <IconButton\n        variant=\"Secondary\"\n        size=\"400\"\n        radii=\"300\"\n        onClick={handlePlayPause}\n        title={isPlaying ? 'Pause' : 'Play voice message'}\n        aria-label={isPlaying ? 'Pause' : 'Play voice message'}\n        aria-pressed={isPlaying}\n      >\n        {isPlaying ? (\n          <Pause size={phosphorSizeRem(20)} weight=\"fill\" />\n        ) : (\n          <Play size={phosphorSizeRem(20)} weight=\"fill\" />\n        )}\n      </IconButton>\n\n      <Box\n        grow=\"Yes\"\n        alignItems=\"Center\"\n        gap=\"100\"\n        onClick={handleScrubClick}\n        onKeyDown={handleKeyDown}\n        className={css.AudioWaveformContainer}\n        tabIndex={0}\n        role=\"slider\"\n        aria-label=\"Audio position\"\n        aria-valuemin={0}\n        aria-valuemax={duration}\n        aria-valuenow={Math.floor(currentTime)}\n        title=\"Seek\"\n      >\n        {previewBars.map((bar) => {\n          const played = progress > 0 && bar.ratio <= progress;\n          return (\n            <div\n              key={bar.id}\n              className={`${css.AudioWaveformBar} ${played ? css.AudioWaveformBarPlayed : css.AudioWaveformBarUnplayed}`}\n              style={{ height: Math.max(3, Math.round(bar.level * 24)) }}\n            />\n          );\n        })}\n      </Box>\n\n      <Text size=\"T200\" className={css.AudioTimeDisplay}>\n        {formatAudioTime(isPlaying ? currentTime : duration)}\n      </Text>\n    </Box>\n  );\n}\n\ntype MediaPreviewProps = {\n  fileItem: TUploadItem;\n  onSpoiler: (marked: boolean) => void;\n  children: ReactNode;\n};\nfunction MediaPreview({ fileItem, onSpoiler, children }: MediaPreviewProps) {\n  const { originalFile, metadata } = fileItem;\n  const fileUrl = useObjectURL(originalFile);\n\n  return fileUrl ? (\n    <Box\n      style={{\n        borderRadius: config.radii.R300,\n        overflow: 'hidden',\n        backgroundColor: 'black',\n        position: 'relative',\n      }}\n    >\n      {children}\n      <Box\n        justifyContent=\"End\"\n        style={{\n          position: 'absolute',\n          bottom: config.space.S100,\n          left: config.space.S100,\n          right: config.space.S100,\n        }}\n      >\n        <Chip\n          variant={metadata.markedAsSpoiler ? 'Warning' : 'Secondary'}\n          fill=\"Soft\"\n          radii=\"Pill\"\n          aria-pressed={metadata.markedAsSpoiler}\n          before={sizedIcon(EyeSlash, '50')}\n          onClick={() => onSpoiler(!metadata.markedAsSpoiler)}\n        >\n          <Text size=\"B300\">Spoiler</Text>\n        </Chip>\n      </Box>\n    </Box>\n  ) : null;\n}\n\ntype UploadCardRendererProps = {\n  isEncrypted?: boolean;\n  fileItem: TUploadItem;\n  setMetadata: (fileItem: TUploadItem, metadata: TUploadMetadata) => void;\n  setDesc: (fileItem: TUploadItem, body: string, formatted_body: string) => void;\n  onRemove: (file: TUploadContent) => void;\n  onComplete?: (upload: UploadSuccess) => void;\n  roomId: string;\n  hideCaption?: boolean;\n};\nexport function UploadCardRenderer({\n  isEncrypted,\n  fileItem,\n  setMetadata,\n  setDesc,\n  onRemove,\n  onComplete,\n  roomId,\n  hideCaption,\n}: Readonly<UploadCardRendererProps>) {\n  const mx = useMatrixClient();\n  const mediaConfig = useMediaConfig();\n  const allowSize = mediaConfig['m.upload.size'] || Infinity;\n\n  const uploadAtom = roomUploadAtomFamily(fileItem.file);\n  const { metadata } = fileItem;\n  const { upload, startUpload, cancelUpload } = useBindUploadAtom(mx, uploadAtom, isEncrypted);\n  const { file } = upload;\n  const fileSizeExceeded = file.size >= allowSize;\n\n  const [isDescribed, setIsDescribed] = useState(false);\n\n  if (upload.status === UploadStatus.Idle && !fileSizeExceeded && !fileItem.encrypting) {\n    startUpload();\n  }\n\n  const handleSpoiler = (marked: boolean) => {\n    setMetadata(fileItem, { ...metadata, markedAsSpoiler: marked });\n  };\n\n  const removeUpload = () => {\n    cancelUpload();\n    onRemove(file);\n  };\n\n  useEffect(() => {\n    if (upload.status === UploadStatus.Success) {\n      onComplete?.(upload);\n    }\n  }, [upload, onComplete]);\n\n  const linkifyOpts = useMemo<LinkifyOpts>(() => ({ ...LINKIFY_OPTS }), []);\n\n  const spoilerClickHandler = useSpoilerClickHandler();\n  const useAuthentication = useMediaAuthentication();\n  const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n  const [incomingInlineImagesDefaultHeight] = useSetting(\n    settingsAtom,\n    'incomingInlineImagesDefaultHeight'\n  );\n  const [incomingInlineImagesMaxHeight] = useSetting(settingsAtom, 'incomingInlineImagesMaxHeight');\n  const htmlReactParserOptions = useMemo<HTMLReactParserOptions>(\n    () =>\n      getReactCustomHtmlParser(mx, roomId, {\n        settingsLinkBaseUrl,\n        linkifyOpts,\n        useAuthentication,\n        handleSpoilerClick: spoilerClickHandler,\n        incomingInlineImagesDefaultHeight,\n        incomingInlineImagesMaxHeight,\n      }),\n    [\n      linkifyOpts,\n      mx,\n      roomId,\n      settingsLinkBaseUrl,\n      spoilerClickHandler,\n      useAuthentication,\n      incomingInlineImagesDefaultHeight,\n      incomingInlineImagesMaxHeight,\n    ]\n  );\n  return (\n    <UploadCard\n      radii=\"300\"\n      compact\n      style={{ maxWidth: toRem(400), flexShrink: 0 }}\n      before={sizedIcon(getFileTypeIconComponent(file.type))}\n      after={\n        <>\n          {upload.status === UploadStatus.Error && (\n            <Chip\n              as=\"button\"\n              onClick={startUpload}\n              aria-label=\"Retry Upload\"\n              variant=\"Critical\"\n              radii=\"Pill\"\n              outlined\n            >\n              <Text size=\"B300\">Retry</Text>\n            </Chip>\n          )}\n          {!isDescribed && !hideCaption && (\n            <IconButton\n              onClick={() => {\n                setIsDescribed(true);\n              }}\n              aria-label=\"Add Upload Description\"\n              variant=\"SurfaceVariant\"\n              radii=\"Pill\"\n              size=\"300\"\n            >\n              {sizedIcon(PencilSimple, '50')}\n            </IconButton>\n          )}\n          {isDescribed && !hideCaption && (\n            <TooltipProvider\n              delay={400}\n              position=\"Top\"\n              style={{ textAlign: 'center' }}\n              tooltip={\n                <Tooltip>\n                  <Text size=\"H5\">\n                    Don&apos;t forget to save your description before sending the message!\n                  </Text>\n                </Tooltip>\n              }\n            >\n              {(triggerRef) => <span ref={triggerRef}>{sizedIcon(Info, '50')}</span>}\n            </TooltipProvider>\n          )}\n\n          <IconButton\n            onClick={removeUpload}\n            aria-label=\"Cancel Upload\"\n            variant=\"SurfaceVariant\"\n            radii=\"Pill\"\n            size=\"300\"\n          >\n            {sizedIcon(X, '200')}\n          </IconButton>\n        </>\n      }\n      bottom={\n        <>\n          {isImageMimeType(fileItem.originalFile.type) && (\n            <MediaPreview fileItem={fileItem} onSpoiler={handleSpoiler}>\n              <PreviewImage fileItem={fileItem} />\n            </MediaPreview>\n          )}\n          {fileItem.originalFile.type.startsWith('video') && (\n            <MediaPreview fileItem={fileItem} onSpoiler={handleSpoiler}>\n              <PreviewVideo fileItem={fileItem} />\n            </MediaPreview>\n          )}\n          {fileItem.metadata.waveform && <PreviewAudio fileItem={fileItem} />}\n          {upload.status === UploadStatus.Idle && !fileSizeExceeded && (\n            <UploadCardProgress sentBytes={0} totalBytes={file.size} />\n          )}\n          {upload.status === UploadStatus.Loading && (\n            <UploadCardProgress sentBytes={upload.progress.loaded} totalBytes={file.size} />\n          )}\n          {upload.status === UploadStatus.Error && (\n            <UploadCardError>\n              <Text size=\"T200\">{upload.error.message}</Text>\n            </UploadCardError>\n          )}\n          {upload.status === UploadStatus.Idle && fileSizeExceeded && (\n            <UploadCardError>\n              <Text size=\"T200\">\n                The file size exceeds the limit. Maximum allowed size is{' '}\n                <b>{bytesToSize(allowSize)}</b>, but the uploaded file is{' '}\n                <b>{bytesToSize(file.size)}</b>.\n              </Text>\n            </UploadCardError>\n          )}\n\n          {isDescribed && !hideCaption && (\n            <DescriptionEditor\n              value={fileItem.formatted_body || fileItem.body}\n              onSave={(plainText, htmlContent) => {\n                setDesc(fileItem, plainText, htmlContent);\n                setIsDescribed(false);\n              }}\n              onCancel={() => setIsDescribed(false)}\n            />\n          )}\n          {!isDescribed && !hideCaption && fileItem.body && fileItem.body.length > 0 && (\n            <Box style={{ padding: config.space.S200, wordBreak: 'break-word' }}>\n              <Text size=\"T200\" priority=\"400\" as=\"div\">\n                <RenderBody\n                  body={fileItem.body}\n                  customBody={fileItem.formatted_body}\n                  htmlReactParserOptions={htmlReactParserOptions}\n                  linkifyOpts={linkifyOpts}\n                />\n              </Text>\n            </Box>\n          )}\n        </>\n      }\n    >\n      <Text size=\"H6\" truncate style={{ minWidth: 0, flexGrow: 1 }}>\n        {file.name}\n      </Text>\n      {upload.status === UploadStatus.Success &&\n        sizedIcon(Check, '100', { style: { color: color.Success.Main } })}\n    </UploadCard>\n  );\n}\n","import { useEffect } from 'react';\nimport { Chip, IconButton, Text, color } from 'folds';\nimport {\n  Check,\n  File,\n  Image,\n  Play,\n  VideoCamera,\n  X,\n  sizedIcon,\n  type PhosphorIcon,\n} from '$components/icons/phosphor';\nimport type { TUploadAtom, UploadSuccess } from '$state/upload';\nimport { UploadStatus, useBindUploadAtom } from '$state/upload';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { TUploadContent } from '$utils/matrix';\nimport { isImageMimeType } from '$utils/mimeTypes';\nimport { bytesToSize } from '$utils/common';\nimport { useMediaConfig } from '$hooks/useMediaConfig';\nimport { UploadCard, UploadCardError, CompactUploadCardProgress } from './UploadCard';\n\nfunction getFileTypeIconComponent(fileType: string): PhosphorIcon {\n  const type = fileType.toLowerCase();\n  if (type.startsWith('audio')) return Play;\n  if (type.startsWith('video')) return VideoCamera;\n  if (isImageMimeType(type)) return Image;\n  return File;\n}\n\ntype CompactUploadCardRendererProps = {\n  isEncrypted?: boolean;\n  uploadAtom: TUploadAtom;\n  onRemove: (file: TUploadContent) => void;\n  onComplete?: (upload: UploadSuccess) => void;\n};\nexport function CompactUploadCardRenderer({\n  isEncrypted,\n  uploadAtom,\n  onRemove,\n  onComplete,\n}: CompactUploadCardRendererProps) {\n  const mx = useMatrixClient();\n  const mediaConfig = useMediaConfig();\n  const allowSize = mediaConfig['m.upload.size'] || Infinity;\n\n  const { upload, startUpload, cancelUpload } = useBindUploadAtom(mx, uploadAtom, isEncrypted);\n  const { file } = upload;\n  const fileSizeExceeded = file.size >= allowSize;\n\n  if (upload.status === UploadStatus.Idle && !fileSizeExceeded) {\n    startUpload();\n  }\n\n  const removeUpload = () => {\n    cancelUpload();\n    onRemove(file);\n  };\n\n  useEffect(() => {\n    if (upload.status === UploadStatus.Success) {\n      onComplete?.(upload);\n    }\n  }, [upload, onComplete]);\n\n  return (\n    <UploadCard\n      compact\n      outlined\n      radii=\"300\"\n      before={sizedIcon(getFileTypeIconComponent(file.type))}\n      after={\n        <>\n          {upload.status === UploadStatus.Error && (\n            <Chip\n              as=\"button\"\n              onClick={startUpload}\n              aria-label=\"Retry Upload\"\n              variant=\"Critical\"\n              radii=\"Pill\"\n              outlined\n            >\n              <Text size=\"B300\">Retry</Text>\n            </Chip>\n          )}\n          <IconButton\n            onClick={removeUpload}\n            aria-label=\"Cancel Upload\"\n            variant=\"SurfaceVariant\"\n            radii=\"Pill\"\n            size=\"300\"\n          >\n            {sizedIcon(X, '200')}\n          </IconButton>\n        </>\n      }\n    >\n      {upload.status === UploadStatus.Success ? (\n        <>\n          <Text size=\"H6\" truncate>\n            {file.name}\n          </Text>\n          {sizedIcon(Check, '100', { style: { color: color.Success.Main } })}\n        </>\n      ) : (\n        <>\n          {upload.status === UploadStatus.Idle && !fileSizeExceeded && (\n            <CompactUploadCardProgress sentBytes={0} totalBytes={file.size} />\n          )}\n          {upload.status === UploadStatus.Loading && (\n            <CompactUploadCardProgress sentBytes={upload.progress.loaded} totalBytes={file.size} />\n          )}\n          {upload.status === UploadStatus.Error && (\n            <UploadCardError>\n              <Text size=\"T200\">{upload.error.message}</Text>\n            </UploadCardError>\n          )}\n          {upload.status === UploadStatus.Idle && fileSizeExceeded && (\n            <UploadCardError>\n              <Text size=\"T200\">\n                The file size exceeds the limit. Maximum allowed size is{' '}\n                <b>{bytesToSize(allowSize)}</b>, but the uploaded file is{' '}\n                <b>{bytesToSize(file.size)}</b>.\n              </Text>\n            </UploadCardError>\n          )}\n        </>\n      )}\n    </UploadCard>\n  );\n}\n","import type { MutableRefObject, ReactNode } from 'react';\nimport { useEffect, useImperativeHandle } from 'react';\nimport { Badge, Box, Chip, Header, Spinner, Text, as, percent } from 'folds';\nimport { CaretRight, CaretUp, X, sizedIcon } from '$components/icons/phosphor';\nimport classNames from 'classnames';\nimport { useAtomValue } from 'jotai';\n\nimport type { TUploadFamilyObserverAtom, Upload } from '$state/upload';\nimport { UploadStatus } from '$state/upload';\nimport * as css from './UploadBoard.css';\n\ntype UploadBoardProps = {\n  header: ReactNode;\n};\nexport const UploadBoard = as<'div', UploadBoardProps>(({ header, children, ...props }, ref) => (\n  <Box className={css.UploadBoardBase} {...props} ref={ref}>\n    <Box className={css.UploadBoardContainer} justifyContent=\"End\">\n      <Box className={classNames(css.UploadBoard)} direction=\"Column\">\n        <Box grow=\"Yes\" direction=\"Column\">\n          {children}\n        </Box>\n        <Box direction=\"Column\" shrink=\"No\">\n          {header}\n        </Box>\n      </Box>\n    </Box>\n  </Box>\n));\n\n// Progress ticks re-render this header, so the caller reads uploads on demand here\n// instead of subscribing to them itself.\nexport type UploadBoardImperativeHandlers = { getSendableUploads: () => Upload[] };\n\ntype UploadBoardHeaderProps = {\n  open: boolean;\n  onToggle: () => void;\n  uploadFamilyObserverAtom: TUploadFamilyObserverAtom;\n  onCancel: (uploads: Upload[]) => void;\n  onBusyChange?: (busy: boolean) => void;\n  imperativeHandlerRef: MutableRefObject<UploadBoardImperativeHandlers | undefined>;\n};\n\nexport function UploadBoardHeader({\n  open,\n  onToggle,\n  uploadFamilyObserverAtom,\n  onCancel,\n  onBusyChange,\n  imperativeHandlerRef,\n}: UploadBoardHeaderProps) {\n  const uploads = useAtomValue(uploadFamilyObserverAtom);\n\n  const isSuccess = uploads.every((upload) => upload.status === UploadStatus.Success);\n  const isError = uploads.some((upload) => upload.status === UploadStatus.Error);\n  const busy = uploads.length > 0 && !isSuccess && !isError;\n  useEffect(() => {\n    onBusyChange?.(busy);\n    return () => onBusyChange?.(false);\n  }, [busy, onBusyChange]);\n  const progress = uploads.reduce(\n    (acc, upload) => {\n      acc.total += upload.file.size;\n      if (upload.status === UploadStatus.Loading) {\n        acc.loaded += upload.progress.loaded;\n      }\n      if (upload.status === UploadStatus.Success) {\n        acc.loaded += upload.file.size;\n      }\n      return acc;\n    },\n    { loaded: 0, total: 0 }\n  );\n\n  useImperativeHandle(imperativeHandlerRef, () => ({\n    getSendableUploads: () =>\n      uploads.filter(\n        (upload) => upload.status === UploadStatus.Success || upload.status === UploadStatus.Loading\n      ),\n  }));\n  const handleCancel = () => onCancel(uploads);\n\n  return (\n    <Header size=\"400\">\n      <Box\n        as=\"button\"\n        style={{ cursor: 'pointer' }}\n        onClick={onToggle}\n        className={css.UploadBoardHeaderContent}\n        alignItems=\"Center\"\n        grow=\"Yes\"\n        gap=\"100\"\n      >\n        {sizedIcon(open ? CaretUp : CaretRight, '50')}\n        <Text size=\"H6\">Files</Text>\n      </Box>\n      <Box className={css.UploadBoardHeaderContent} alignItems=\"Center\" gap=\"100\">\n        {isError && !open && (\n          <Badge variant=\"Critical\" fill=\"Solid\" radii=\"300\">\n            <Text size=\"L400\">Upload Failed</Text>\n          </Badge>\n        )}\n        {!isSuccess && !isError && !open && (\n          <>\n            <Badge variant=\"Secondary\" fill=\"Solid\" radii=\"Pill\">\n              <Text size=\"L400\">{Math.round(percent(0, progress.total, progress.loaded))}%</Text>\n            </Badge>\n            <Spinner variant=\"Secondary\" size=\"200\" />\n          </>\n        )}\n        {open && (\n          <Chip\n            as=\"button\"\n            onClick={handleCancel}\n            variant=\"SurfaceVariant\"\n            radii=\"Pill\"\n            after={sizedIcon(X, '50')}\n          >\n            <Text size=\"B300\">{uploads.length === 1 ? 'Remove' : 'Remove All'}</Text>\n          </Chip>\n        )}\n      </Box>\n    </Header>\n  );\n}\n\nexport const UploadBoardContent = as<'div'>(({ className, children, ...props }, ref) => (\n  <Box\n    className={classNames(css.UploadBoardContent, className)}\n    direction=\"Row\"\n    gap=\"200\"\n    {...props}\n    ref={ref}\n  >\n    {children}\n  </Box>\n));\n","import type { Room } from '$types/matrix-sdk';\nimport { DuplicateStrategy, EventType, MatrixEvent, MsgType } from '$types/matrix-sdk';\n\nexport function sendFeedback(msg: string, room: Room, userId: string) {\n  const localNotice = new MatrixEvent({\n    type: EventType.RoomMessage,\n    content: { msgtype: MsgType.Notice, body: msg },\n    event_id: `~sable-feedback-${Date.now()}`,\n    room_id: room.roomId,\n    sender: userId,\n  });\n  room.addLiveEvents([localNotice], {\n    duplicateStrategy: DuplicateStrategy.Ignore,\n    addToState: false,\n  });\n}\n","export function generateShortId(length: number): string {\n  const uuid = crypto.randomUUID();\n  return uuid.replaceAll('-', '').substring(0, length);\n}\n","import type {\n  PerMessageProfileMsc4461,\n  PerMessageProfileProxyAssociationV2,\n} from '$hooks/usePerMessageProfile';\nimport {\n  addOrUpdatePerMessageProfile,\n  extractCircumfixProxyTagsFromKey,\n  getAllPerMessageProfiles,\n  getPerMessageProfileById,\n} from '$hooks/usePerMessageProfile';\nimport { sendFeedback } from '$utils/sendFeedbackToUser';\nimport type { MatrixClient, Room } from '$types/matrix-sdk';\nimport { generateShortId } from '$utils/shortIdGen';\n\nconst pkMemberRenameRegex = /^(pk;member)\\s+\"?([\\w\\s]+)\"?\\s*rename\\s+\"?([\\w\\s]+)\"?$/;\nconst pkMemberNewRegex = /^(pk;member)\\s+new\\s+\"?([\\w\\s]+)\"?$/;\nconst pkMemberNewProxy = /^(pk;member)\\s+\"?([\\w\\s]+)\"?\\s+proxy(\\s+add)?\\s+(.*text.*)$/;\nconst pkMemberRemoveProxy = /^(pk;member)\\s+\"?([\\w\\s]+)\"?\\s+proxy\\s+remove\\s+(.*text.*)$/;\n\nconst helpTextPkMemberNew = 'To create a new persona: pk;member new Yumi';\nconst helpTextPkMemberRename = 'To rename a persona: pk;member \"Rain Deer\" rename \"Micky Mouse\"';\nconst helpTextPkMemberNewProxy = 'To add a shorthand to a persona: pk;member Yumi proxy [text]';\nconst helpTextPkMemberRemoveProxy =\n  'To remove a shorthand from a persona: pk;member Yumi proxy remove [text]';\nconst helpTextPkMember = `Available 'pk;member' commands:\\n${helpTextPkMemberNew}\\n${helpTextPkMemberRename}\\n${helpTextPkMemberNewProxy}\\n${helpTextPkMemberRemoveProxy}`;\n\nfunction regexEscapeFallBackFunc(template: string): string {\n  return template.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * @deprecated\n * build a regex to recognize proxies\n * a template can be for example `[text]` or `f:text`\n *\n * @param {string} template\n * @return {*}  {RegExp}\n */\nexport function buildProxyRegex({ prefix, suffix }: PerMessageProfileProxyAssociationV2): RegExp {\n  const escape = (s: string) =>\n    // @ts-ignore TS2339 - RegExp.escape is a new/proposed method\n    typeof RegExp.escape === 'function' ? RegExp.escape(s) : regexEscapeFallBackFunc(s);\n\n  const pattern = `${escape(prefix ?? '')}(.+)${escape(suffix ?? '')}`;\n  return new RegExp(`^${pattern}$`);\n}\n\n/**\n * a class to use as PluralKit command message handler\n *\n * @export\n * @class PluralKitCommandMessageHandler\n * @author Rye\n */\nexport class PKitCommandMessageHandler {\n  /**\n   * the matrix client we use, is set in the constructor\n   *\n   * @private\n   * @type {MatrixClient}\n   * @memberof PKitCommandMessageHandler\n   */\n  private readonly mx: MatrixClient;\n\n  private message = '';\n\n  private readonly room: Room;\n\n  /**\n   * flag to interpret the name given as id\n   *\n   * @private\n   * @type {boolean}\n   * @memberof PKitCommandMessageHandler\n   */\n  private useIdInsteadOfNameWherePossible: boolean;\n\n  public constructor(mx: MatrixClient, room: Room) {\n    this.mx = mx;\n    this.room = room;\n    this.useIdInsteadOfNameWherePossible = false;\n  }\n\n  /**\n   * Handler for `pk;member` commands\n   * @async\n   */\n  private async memberHandler() {\n    if (this.message.match(pkMemberNewRegex)) {\n      // adding a new member\n      const cmdParts = pkMemberNewRegex.exec(this.message);\n      if (!cmdParts) {\n        sendFeedback(`malformed input, ${helpTextPkMemberNew}`, this.room, this.mx.getSafeUserId());\n        return;\n      }\n      const memberName = cmdParts[2];\n      if (!memberName) {\n        sendFeedback(`malformed input, ${helpTextPkMemberNew}`, this.room, this.mx.getSafeUserId());\n        return;\n      }\n      const generatedID = generateShortId(5);\n      sendFeedback(\n        `adding new member has been created with id: ${generatedID} and name ${memberName}`,\n        this.room,\n        this.mx.getSafeUserId()\n      );\n      await addOrUpdatePerMessageProfile(this.mx, {\n        id: generatedID,\n        displayname: memberName,\n        triggers: [],\n      });\n      sendFeedback(\n        `added new member has been created with id: ${generatedID} and name ${memberName}`,\n        this.room,\n        this.mx.getSafeUserId()\n      );\n    } else if (this.message.match(pkMemberRenameRegex)) {\n      // renaming a profile based on the name\n      const cmdParts = pkMemberRenameRegex.exec(this.message);\n      if (!cmdParts) {\n        sendFeedback(\n          `malformed input, ${helpTextPkMemberRename}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n      // extract from the cmd the old and the new name\n      /**\n       * The old name we want to search for in our records, is in capture group 2\n       */\n      const oldName = cmdParts[2];\n      /**\n       * The new name we want to set is in capture group 3\n       */\n      const newName = cmdParts[3];\n      /**\n       * The id of the per-message-profile\n       */\n      const pmpId = (await getAllPerMessageProfiles(this.mx)).find(\n        (pmp) => pmp.displayname === oldName\n      )?.id;\n      if (!pmpId) {\n        sendFeedback(\n          `Persona with name \"${oldName}\" doesn't exist in your records, ${helpTextPkMemberNew}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n      /**\n       * get the persona record we already have for the id\n       */\n      const pmp = await getPerMessageProfileById(this.mx, pmpId);\n      if (!pmp) {\n        sendFeedback(\n          \"Persona record can't be retrieved, data might be corrupted\",\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n      // actually change the name\n      if (!newName) {\n        sendFeedback(\n          `malformed input, ${helpTextPkMemberRename}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n      pmp.displayname = newName;\n      sendFeedback(\n        `renaming your profile ${pmpId} from ${oldName} to ${newName}`,\n        this.room,\n        this.mx.getSafeUserId()\n      );\n      await addOrUpdatePerMessageProfile(this.mx, pmp);\n    } else if (pkMemberRemoveProxy.test(this.message)) {\n      const cmdParts = pkMemberRemoveProxy.exec(this.message);\n      if (!cmdParts) return;\n      const name = cmdParts[2];\n      const matchAgainst = cmdParts[3];\n      const pmpId = this.useIdInsteadOfNameWherePossible\n        ? name\n        : (await getAllPerMessageProfiles(this.mx)).find((pmp) => pmp.displayname === name)?.id;\n      if (!pmpId) {\n        sendFeedback(\n          `Persona with ${this.useIdInsteadOfNameWherePossible ? 'id' : 'name'} \"${name}\" doesn't exist in your records, ${helpTextPkMemberNew}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n\n      if (!matchAgainst) {\n        sendFeedback(\n          `malformed input, ${helpTextPkMemberRemoveProxy}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n      const proxyTags = extractCircumfixProxyTagsFromKey(matchAgainst);\n      const pmp = await getPerMessageProfileById(this.mx, pmpId);\n\n      if (pmp && proxyTags) {\n        const { prefix, suffix } = proxyTags;\n\n        if (!pmp.triggers) {\n          pmp.triggers = [];\n        }\n        pmp.triggers.push({ prefix, suffix });\n\n        await addOrUpdatePerMessageProfile(this.mx, pmp);\n\n        sendFeedback(\n          `Persona with ${this.useIdInsteadOfNameWherePossible ? 'id' : 'name'} \"${name}\" (${pmpId}) is now no longer associated with ${matchAgainst}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n      }\n    } else if (pkMemberNewProxy.test(this.message)) {\n      const cmdParts = pkMemberNewProxy.exec(this.message);\n      if (!cmdParts) return;\n      const name = cmdParts[2];\n      const matchAgainst = cmdParts[4];\n      const pmpId = this.useIdInsteadOfNameWherePossible\n        ? name\n        : (await getAllPerMessageProfiles(this.mx)).find((pmp) => pmp.displayname === name)?.id;\n      if (!pmpId) {\n        sendFeedback(\n          `Persona with ${this.useIdInsteadOfNameWherePossible ? 'id' : 'name'} \"${name}\" doesn't exist in your records, ${helpTextPkMemberNew}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n      if (!matchAgainst) {\n        sendFeedback(\n          `malformed input, ${helpTextPkMemberNewProxy}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n      const proxyTags = extractCircumfixProxyTagsFromKey(matchAgainst);\n\n      if (!proxyTags) {\n        sendFeedback(\n          `malformed input: could not find a prefix and/or suffix, ${helpTextPkMemberNewProxy}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n        return;\n      }\n      let pmp = await getPerMessageProfileById(this.mx, pmpId);\n      if (pmp) {\n        const { prefix, suffix } = proxyTags;\n\n        if (!pmp.triggers) {\n          pmp.triggers = [];\n        }\n        pmp.triggers.push({ prefix, suffix });\n\n        await addOrUpdatePerMessageProfile(this.mx, pmp);\n        sendFeedback(\n          `Persona with ${this.useIdInsteadOfNameWherePossible ? 'id' : 'name'} \"${name}\" (${pmpId}) is now associated with ${matchAgainst}`,\n          this.room,\n          this.mx.getSafeUserId()\n        );\n      }\n    } else {\n      // default to looking up member info\n      const listOfProfiles: PerMessageProfileMsc4461[] = await getAllPerMessageProfiles(this.mx);\n      const stringListOfProfiles: string = listOfProfiles\n        .map(\n          (pmp: PerMessageProfileMsc4461) =>\n            `${pmp.id}: ${pmp.displayname ? pmp.displayname : '(empty name)'}`\n        )\n        .join('\\n');\n      sendFeedback(\n        `If you see this, you have messed up a command\\n\\nYou currently have the following persona set up:\\n${stringListOfProfiles}\\n\\n${helpTextPkMember}`,\n        this.room,\n        this.mx.getSafeUserId()\n      );\n    }\n  }\n\n  /**\n   * check if a message is a pluralkit-style command\n   * @param message the message to check\n   * @returns true if it's a pluralkit style command\n   */\n  public static isPKCommand(message: string): boolean {\n    return message.startsWith('pk;');\n  }\n\n  /**\n   * handle a message, which might be a pk command\n   * @param message the message we want to handle\n   * @returns void\n   */\n  public async handleMessage(message: string, useId?: boolean): Promise<void> {\n    this.message = message;\n    this.useIdInsteadOfNameWherePossible = useId ?? false;\n    if (!this.message.startsWith('pk;')) return;\n    if (this.message.startsWith('pk;member')) {\n      await this.memberHandler();\n      return;\n    }\n    sendFeedback(\n      `Command currently not supported, right now compatibility is limited and only a subset of pk;member is supported\\n\\n${helpTextPkMember}`,\n      this.room,\n      this.mx.getSafeUserId()\n    );\n  }\n}\n","import type { MatrixClient, Room } from '$types/matrix-sdk';\nimport type { PKitCommandMessageHandler } from '$plugins/pluralkit-handler/PKitCommandMessageHandler';\nimport type { useRoomNavigate } from '../useRoomNavigate';\n\nexport type CommandExe = (payload: string, html?: string) => Promise<void>;\n\nexport enum Command {\n  // Cinny commands\n  Me = 'me',\n  Notice = 'notice',\n  Shrug = 'shrug',\n  StartDm = 'startdm',\n  Join = 'join',\n  Leave = 'leave',\n  Invite = 'invite',\n  DisInvite = 'disinvite',\n  Kick = 'kick',\n  Ban = 'ban',\n  UnBan = 'unban',\n  Ignore = 'ignore',\n  UnIgnore = 'unignore',\n  MyRoomNick = 'myroomnick',\n  MyRoomAvatar = 'myroomavatar',\n  ConvertToDm = 'converttodm',\n  ConvertToRoom = 'converttoroom',\n  TableFlip = 'tableflip',\n  UnFlip = 'unflip',\n  Delete = 'delete',\n  Acl = 'acl',\n  // Sable commands\n  Knock = 'knock',\n  Color = 'color',\n  SColor = 'scolor',\n  Font = 'font',\n  SFont = 'sfont',\n  AddWidget = 'addwidget',\n  AddPerMessageProfileToAccount = 'addpmp',\n  DeletePerMessageProfileFromAccount = 'delpmp',\n  UsePerMessageProfile = 'usepmp',\n  AssociateProxyPerMessageProfile = 'pmpproxy',\n  Pronoun = 'pronoun',\n  SPronoun = 'spronoun',\n  Rainbow = 'rainbow',\n  RainbowMe = 'rainbowme',\n  RawMsg = 'rawmsg',\n  Raw = 'raw',\n  RawAcc = 'rawacc',\n  DelAcc = 'delacc',\n  SetExt = 'setext',\n  DelExt = 'delext',\n  DiscardSession = 'discardsession',\n  Html = 'html',\n  // Cute Events\n  Hug = 'hug',\n  Cuddle = 'cuddle',\n  // our own cute events, not part of FluffyChat or other clients\n  Wave = 'wave',\n  Poke = 'poke',\n  Headpat = 'headpat',\n  // Meta\n  Report = 'bugreport',\n  // Experimental\n  ShareE2EEHistory = 'sharehistory',\n  // Spec missing from cinny\n  Location = 'location',\n  ShareMyLocation = 'sharemylocation',\n  Poll = 'poll',\n}\n\nexport type CommandContent = {\n  name: string;\n  description: string;\n  exe: CommandExe;\n};\n\nexport type CommandRecord = Record<Command, CommandContent>;\n\nexport type CommandContext = {\n  mx: MatrixClient;\n  room: Room;\n  navigateRoom: ReturnType<typeof useRoomNavigate>['navigateRoom'];\n  profileDisplayName: string | undefined;\n  pkitcmdHandler: PKitCommandMessageHandler;\n  developerTools: boolean;\n  enableMSC4268CMD: boolean;\n  openBugReport: () => void;\n};\n","import type { RoomMessageEventContent } from '$types/matrix-sdk';\nimport { MsgType } from '$types/matrix-sdk';\nimport type { CommandContext, CommandRecord } from './types';\nimport { Command } from './types';\n\nexport const SHRUG = String.raw`¯\\_(ツ)_/¯`;\nexport const TABLEFLIP = '(╯°□°)╯︵ ┻━┻';\nexport const UNFLIP = '┬─┬ノ( º_ºノ)';\n\nexport const createFunCommands = (ctx: CommandContext): Partial<CommandRecord> => {\n  const { mx, room } = ctx;\n  return {\n    [Command.Me]: {\n      name: Command.Me,\n      description: 'Send action message',\n      exe: async () => undefined,\n    },\n    [Command.Notice]: {\n      name: Command.Notice,\n      description: 'Send notice message',\n      exe: async () => undefined,\n    },\n    [Command.Shrug]: {\n      name: Command.Shrug,\n      description: String.raw`Send ¯\\_(ツ)_/¯ as message`,\n      exe: async () => undefined,\n    },\n    [Command.TableFlip]: {\n      name: Command.TableFlip,\n      description: `Send ${TABLEFLIP} as message`,\n      exe: async () => undefined,\n    },\n    [Command.UnFlip]: {\n      name: Command.UnFlip,\n      description: `Send ${UNFLIP} as message`,\n      exe: async () => undefined,\n    },\n    [Command.Hug]: {\n      name: Command.Hug,\n      description: 'Send a hug to someone. Example: /hug [@user:example.org]',\n      exe: async (payload) => {\n        const target = payload.trim();\n        await mx.sendMessage(room.roomId, {\n          msgtype: 'im.fluffychat.cute_event',\n          'm.mentions': {\n            user_ids: target ? [target] : [],\n          },\n          cute_type: 'hug',\n          body: `🤗`,\n        } as unknown as RoomMessageEventContent);\n      },\n    },\n    [Command.Cuddle]: {\n      name: Command.Cuddle,\n      description: 'Send a cuddle to someone. Example: /cuddle [@user:example.org]',\n      exe: async (payload) => {\n        const target = payload.trim();\n        await mx.sendMessage(room.roomId, {\n          msgtype: 'im.fluffychat.cute_event',\n          cute_type: 'cuddle',\n          'm.mentions': {\n            user_ids: target ? [target] : [],\n          },\n          body: `😊`,\n        } as unknown as RoomMessageEventContent);\n      },\n    },\n    [Command.Wave]: {\n      name: Command.Wave,\n      description: 'Send a wave to someone. Example: /wave [@user:example.org]',\n      exe: async (payload) => {\n        const target = payload.trim();\n        await mx.sendMessage(room.roomId, {\n          msgtype: 'im.fluffychat.cute_event',\n          cute_type: 'wave',\n          'm.mentions': {\n            user_ids: target ? [target] : [],\n          },\n          body: `👋`,\n        } as unknown as RoomMessageEventContent);\n      },\n    },\n    [Command.Poke]: {\n      name: Command.Poke,\n      description: 'Send a poke to someone. Example: /poke [@user:example.org]',\n      exe: async (payload) => {\n        const target = payload.trim();\n        await mx.sendMessage(room.roomId, {\n          msgtype: 'im.fluffychat.cute_event',\n          cute_type: 'poke',\n          'm.mentions': {\n            user_ids: target ? [target] : [],\n          },\n          body: `🫵`,\n        } as unknown as RoomMessageEventContent);\n      },\n    },\n    [Command.Headpat]: {\n      name: Command.Headpat,\n      description: 'Send a headpat to someone. Example: /headpat [@user:example.org]',\n      // not really like any of the other cute events, but it was too good not to include\n      // using a custom msgtype to avoid confusion with the other existing cute events\n      exe: async (payload) => {\n        const target = payload.trim();\n        await mx.sendMessage(room.roomId, {\n          msgtype: MsgType.Emote,\n          'm.mentions': {\n            user_ids: target ? [target] : [],\n          },\n          body: `pats ${target || 'you'}`,\n          'fyi.cisnt.headpat': true,\n        } as unknown as RoomMessageEventContent);\n      },\n    },\n  };\n};\n","export enum CreateRoomType {\n  TextRoom = 'text',\n  VoiceRoom = 'voice',\n  ForumRoom = 'forum',\n}\n\nexport enum CreateRoomAccess {\n  Private = 'private',\n  Restricted = 'restricted',\n  Public = 'public',\n}\n","import type { ReactNode } from 'react';\nimport { Box, Text, config } from 'folds';\nimport { Check, sizedIcon } from '$components/icons/phosphor';\nimport { SequenceCard } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { CreateRoomAccess } from './types';\n\ntype CreateRoomAccessSelectorProps = {\n  value?: CreateRoomAccess;\n  onSelect: (value: CreateRoomAccess) => void;\n  canRestrict?: boolean;\n  disabled?: boolean;\n  getIcon: (access: CreateRoomAccess) => ReactNode;\n};\nexport function CreateRoomAccessSelector({\n  value,\n  onSelect,\n  canRestrict,\n  disabled,\n  getIcon,\n}: CreateRoomAccessSelectorProps) {\n  return (\n    <Box shrink=\"No\" direction=\"Column\" gap=\"100\">\n      {canRestrict && (\n        <SequenceCard\n          style={{ padding: config.space.S300 }}\n          variant={value === CreateRoomAccess.Restricted ? 'Primary' : 'SurfaceVariant'}\n          direction=\"Column\"\n          gap=\"100\"\n          as=\"button\"\n          type=\"button\"\n          aria-pressed={value === CreateRoomAccess.Restricted}\n          onClick={() => onSelect(CreateRoomAccess.Restricted)}\n          disabled={disabled}\n        >\n          <SettingTile\n            before={getIcon(CreateRoomAccess.Restricted)}\n            after={value === CreateRoomAccess.Restricted && sizedIcon(Check)}\n          >\n            <Text size=\"H6\">Restricted</Text>\n            <Text size=\"T300\" priority=\"300\">\n              Only member of parent space can join.\n            </Text>\n          </SettingTile>\n        </SequenceCard>\n      )}\n      <SequenceCard\n        style={{ padding: config.space.S300 }}\n        variant={value === CreateRoomAccess.Private ? 'Primary' : 'SurfaceVariant'}\n        direction=\"Column\"\n        gap=\"100\"\n        as=\"button\"\n        type=\"button\"\n        aria-pressed={value === CreateRoomAccess.Private}\n        onClick={() => onSelect(CreateRoomAccess.Private)}\n        disabled={disabled}\n      >\n        <SettingTile\n          before={getIcon(CreateRoomAccess.Private)}\n          after={value === CreateRoomAccess.Private && sizedIcon(Check)}\n        >\n          <Text size=\"H6\">Private</Text>\n          <Text size=\"T300\" priority=\"300\">\n            Only people with invite can join.\n          </Text>\n        </SettingTile>\n      </SequenceCard>\n      <SequenceCard\n        style={{ padding: config.space.S300 }}\n        variant={value === CreateRoomAccess.Public ? 'Primary' : 'SurfaceVariant'}\n        direction=\"Column\"\n        gap=\"100\"\n        as=\"button\"\n        type=\"button\"\n        aria-pressed={value === CreateRoomAccess.Public}\n        onClick={() => onSelect(CreateRoomAccess.Public)}\n        disabled={disabled}\n      >\n        <SettingTile\n          before={getIcon(CreateRoomAccess.Public)}\n          after={value === CreateRoomAccess.Public && sizedIcon(Check)}\n        >\n          <Text size=\"H6\">Public</Text>\n          <Text size=\"T300\" priority=\"300\">\n            Anyone with the address can join.\n          </Text>\n        </SettingTile>\n      </SequenceCard>\n    </Box>\n  );\n}\n","import type { FormEventHandler, KeyboardEventHandler } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { MatrixError } from '$types/matrix-sdk';\nimport { Box, color, Input, Spinner, Text, toRem } from 'folds';\nimport { Hash, Warning, sizedIcon } from '$components/icons/phosphor';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { replaceSpaceWithDash } from '$utils/common';\nimport type { AsyncState } from '$hooks/useAsyncCallback';\nimport { AsyncStatus, useAsync } from '$hooks/useAsyncCallback';\nimport { useDebounce } from '$hooks/useDebounce';\nimport { getMxIdServer } from '$utils/mxIdHelper';\n\nexport function CreateRoomAliasInput({ disabled }: { disabled?: boolean }) {\n  const mx = useMatrixClient();\n  const aliasInputRef = useRef<HTMLInputElement>(null);\n  const [aliasAvail, setAliasAvail] = useState<AsyncState<boolean, Error>>({\n    status: AsyncStatus.Idle,\n  });\n\n  useEffect(() => {\n    if (aliasAvail.status === AsyncStatus.Success && aliasInputRef.current?.value === '') {\n      setAliasAvail({ status: AsyncStatus.Idle });\n    }\n  }, [aliasAvail]);\n\n  const checkAliasAvail = useAsync(\n    useCallback(\n      async (aliasLocalPart: string) => {\n        const roomAlias = `#${aliasLocalPart}:${getMxIdServer(mx.getSafeUserId())}`;\n        try {\n          const result = await mx.getRoomIdForAlias(roomAlias);\n          return typeof result.room_id !== 'string';\n        } catch (e) {\n          if (e instanceof MatrixError && e.httpStatus === 404) {\n            return true;\n          }\n          throw e;\n        }\n      },\n      [mx]\n    ),\n    setAliasAvail\n  );\n  const aliasAvailable: boolean | undefined =\n    aliasAvail.status === AsyncStatus.Success ? aliasAvail.data : undefined;\n\n  const debounceCheckAliasAvail = useDebounce(checkAliasAvail, { wait: 500 });\n\n  const handleAliasChange: FormEventHandler<HTMLInputElement> = (evt) => {\n    const aliasInput = evt.currentTarget;\n    const aliasLocalPart = replaceSpaceWithDash(aliasInput.value);\n    if (aliasLocalPart) {\n      aliasInput.value = aliasLocalPart;\n      debounceCheckAliasAvail(aliasLocalPart);\n    } else {\n      setAliasAvail({ status: AsyncStatus.Idle });\n    }\n  };\n\n  const handleAliasKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('enter', evt)) {\n      evt.preventDefault();\n\n      const aliasInput = evt.currentTarget;\n      const aliasLocalPart = replaceSpaceWithDash(aliasInput.value);\n      if (aliasLocalPart) {\n        checkAliasAvail(aliasLocalPart);\n      } else {\n        setAliasAvail({ status: AsyncStatus.Idle });\n      }\n    }\n  };\n\n  return (\n    <Box shrink=\"No\" direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Address (Optional)</Text>\n      <Text size=\"T200\" priority=\"300\">\n        Pick an unique address to make it discoverable.\n      </Text>\n      <Input\n        ref={aliasInputRef}\n        onChange={handleAliasChange}\n        before={\n          aliasAvail.status === AsyncStatus.Loading ? (\n            <Spinner size=\"100\" variant=\"Secondary\" />\n          ) : (\n            sizedIcon(Hash, '100')\n          )\n        }\n        after={\n          <Text style={{ maxWidth: toRem(150) }} truncate>\n            :{getMxIdServer(mx.getSafeUserId())}\n          </Text>\n        }\n        onKeyDown={handleAliasKeyDown}\n        name=\"aliasInput\"\n        size=\"500\"\n        variant={aliasAvailable === true ? 'Success' : 'SurfaceVariant'}\n        radii=\"400\"\n        autoComplete=\"off\"\n        disabled={disabled}\n      />\n      {aliasAvailable === false && (\n        <Box style={{ color: color.Critical.Main }} alignItems=\"Center\" gap=\"100\">\n          {sizedIcon(Warning, '50', { filled: true })}\n          <Text size=\"T200\">\n            <b>This address is already taken. Please select a different one.</b>\n          </Text>\n        </Box>\n      )}\n    </Box>\n  );\n}\n","import type { MouseEventHandler } from 'react';\nimport { Box, Button, Chip, config, Menu, Text, toRem } from 'folds';\nimport { CaretDown, CaretUp, sizedIcon } from '$components/icons/phosphor';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { SettingTile } from '$components/setting-tile';\nimport { SequenceCard } from '$components/sequence-card';\n\nexport function RoomVersionSelector({\n  versions,\n  value,\n  onChange,\n  disabled,\n}: {\n  versions: string[];\n  value: string;\n  onChange: (value: string) => void;\n  disabled?: boolean;\n}) {\n  const menuAnchor = useMenuAnchor<HTMLButtonElement>();\n\n  const handleMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    menuAnchor.openAt(evt.currentTarget);\n  };\n\n  const handleSelect = (version: string) => {\n    menuAnchor.close();\n    onChange(version);\n  };\n\n  return (\n    <SequenceCard\n      style={{ padding: config.space.S300 }}\n      variant=\"SurfaceVariant\"\n      direction=\"Column\"\n      gap=\"500\"\n    >\n      <SettingTile\n        title=\"Version\"\n        after={\n          <ResponsiveMenu\n            anchor={menuAnchor.anchor}\n            requestClose={menuAnchor.close}\n            offset={5}\n            position=\"Bottom\"\n            align=\"End\"\n            mobile=\"dialog\"\n            menu={\n              <Menu>\n                <Box\n                  direction=\"Column\"\n                  gap=\"200\"\n                  style={{ padding: config.space.S200, maxWidth: toRem(300) }}\n                >\n                  <Text size=\"L400\">Versions</Text>\n                  <Box wrap=\"Wrap\" gap=\"100\">\n                    {versions.map((version) => (\n                      <Chip\n                        key={version}\n                        variant={value === version ? 'Primary' : 'SurfaceVariant'}\n                        aria-pressed={value === version}\n                        outlined={value === version}\n                        radii=\"300\"\n                        onClick={() => handleSelect(version)}\n                        type=\"button\"\n                      >\n                        <Text truncate size=\"T300\">\n                          {version}\n                        </Text>\n                      </Chip>\n                    ))}\n                  </Box>\n                </Box>\n              </Menu>\n            }\n          >\n            <Button\n              type=\"button\"\n              onClick={handleMenu}\n              size=\"300\"\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              radii=\"300\"\n              aria-pressed={!!menuAnchor.anchor}\n              before={sizedIcon(menuAnchor.anchor ? CaretUp : CaretDown, '50')}\n              disabled={disabled}\n            >\n              <Text size=\"B300\">{value}</Text>\n            </Button>\n          </ResponsiveMenu>\n        }\n      />\n    </SequenceCard>\n  );\n}\n","import type {\n  ICreateRoomOpts,\n  ICreateRoomStateEvent,\n  MatrixClient,\n  Room,\n  RoomJoinRulesEventContent,\n} from '$types/matrix-sdk';\nimport { JoinRule, RestrictedAllowType, EventType, RoomType } from '$types/matrix-sdk';\n\nimport type { StateEvents } from '$types/matrix-sdk';\nimport type { CustomRoomType } from '$types/matrix/room';\nimport { getViaServers } from '$plugins/via-servers';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport { CreateRoomAccess } from './types';\nimport * as prefix from '$unstable/prefixes';\n\nexport const createRoomCreationContent = (\n  type: RoomType | CustomRoomType | undefined,\n  allowFederation: boolean,\n  additionalCreators: string[] | undefined\n): object => {\n  const content: Record<string, unknown> = {};\n  if (typeof type === 'string') {\n    content.type = type;\n  }\n  if (!allowFederation) {\n    content['m.federate'] = false;\n  }\n  if (Array.isArray(additionalCreators)) {\n    content.additional_creators = additionalCreators;\n  }\n\n  return content;\n};\n\nexport const createRoomJoinRulesState = (\n  access: CreateRoomAccess,\n  parent: Room | undefined,\n  knock: boolean\n) => {\n  let content: RoomJoinRulesEventContent = {\n    join_rule: knock ? JoinRule.Knock : JoinRule.Invite,\n  };\n\n  if (access === CreateRoomAccess.Public) {\n    content = {\n      join_rule: JoinRule.Public,\n    };\n  }\n\n  if (access === CreateRoomAccess.Restricted && parent) {\n    content = {\n      join_rule: knock ? ('knock_restricted' as JoinRule) : JoinRule.Restricted,\n      allow: [\n        {\n          type: RestrictedAllowType.RoomMembership,\n          room_id: parent.roomId,\n        },\n      ],\n    };\n  }\n\n  return {\n    type: EventType.RoomJoinRules,\n    state_key: '',\n    content,\n  };\n};\n\nexport const createRoomParentState = (parent: Room) => ({\n  type: EventType.SpaceParent,\n  state_key: parent.roomId,\n  content: {\n    canonical: true,\n    via: getViaServers(parent),\n  },\n});\n\nconst createSpacePowerLevelsOverride = () => ({\n  events_default: 50,\n});\n\nexport const createRoomEncryptionState = () => ({\n  type: 'm.room.encryption',\n  state_key: '',\n  content: {\n    algorithm: 'm.megolm.v1.aes-sha2',\n  },\n});\n\nexport const createRoomCallState = () => ({\n  type: prefix.MATRIX_UNSTABLE_ROOM_TYPE_CALL_PROPERTY_NAME,\n  state_key: '',\n  content: {},\n});\n\nexport const createVoiceRoomPowerLevelsOverride = () => ({\n  events: {\n    [EventType.GroupCallMemberPrefix]: 0,\n  },\n});\n\nexport type CreateRoomData = {\n  version: string;\n  type?: RoomType | CustomRoomType;\n  parent?: Room;\n  access: CreateRoomAccess;\n  name: string;\n  topic?: string;\n  aliasLocalPart?: string;\n  encryption?: boolean;\n  knock: boolean;\n  allowFederation: boolean;\n  additionalCreators?: string[];\n};\nexport const createRoom = async (mx: MatrixClient, data: CreateRoomData): Promise<string> => {\n  const initialState: ICreateRoomStateEvent[] = [];\n\n  if (data.encryption) {\n    initialState.push(createRoomEncryptionState());\n  }\n\n  if (data.parent) {\n    initialState.push(createRoomParentState(data.parent));\n  }\n\n  if (data.type === RoomType.UnstableCall) {\n    initialState.push(createRoomCallState());\n  }\n\n  initialState.push(createRoomJoinRulesState(data.access, data.parent, data.knock));\n\n  const options: ICreateRoomOpts = {\n    room_version: data.version,\n    name: data.name,\n    topic: data.topic,\n    room_alias_name: data.aliasLocalPart,\n    creation_content: createRoomCreationContent(\n      data.type,\n      data.allowFederation,\n      data.additionalCreators\n    ),\n    power_level_content_override:\n      data.type === RoomType.UnstableCall ? createVoiceRoomPowerLevelsOverride() : undefined,\n    initial_state: initialState,\n  };\n\n  if (data.type === RoomType.Space) {\n    options.power_level_content_override = createSpacePowerLevelsOverride();\n  }\n\n  const result = await mx.createRoom(options);\n\n  if (data.parent) {\n    await mx.sendStateEvent(\n      data.parent.roomId,\n      EventType.SpaceChild as keyof StateEvents,\n      {\n        auto_join: false,\n        suggested: false,\n        via: [getMxIdServer(mx.getUserId() ?? '') ?? ''],\n      } as StateEvents[keyof StateEvents],\n      result.room_id\n    );\n  }\n\n  return result.room_id;\n};\n","import type { RectCords } from 'folds';\nimport { Box, Button, Chip, config, Input, Line, Menu, MenuItem, Scroll, Text, toRem } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { Plus, X, sizedIcon } from '$components/icons/phosphor';\nimport { isKeyHotkey } from 'is-hotkey';\nimport FocusTrap from 'focus-trap-react';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport type { ChangeEventHandler, KeyboardEventHandler, MouseEventHandler } from 'react';\nimport { useMemo, useState } from 'react';\nimport { getMxIdLocalPart, isUserId } from '$utils/matrix';\nimport { useDirectUsers } from '$hooks/useDirectUsers';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { stopPropagation } from '$utils/keyboard';\nimport type { UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport { highlightText, makeHighlightRegex } from '$plugins/react-custom-html-parser';\nimport { SettingTile } from '$components/setting-tile';\n\nexport const useAdditionalCreators = (defaultCreators?: string[]) => {\n  const mx = useMatrixClient();\n  const [additionalCreators, setAdditionalCreators] = useState<string[]>(\n    () => defaultCreators?.filter((id) => id !== mx.getSafeUserId()) ?? []\n  );\n\n  const addAdditionalCreator = (userId: string) => {\n    if (userId === mx.getSafeUserId()) return;\n\n    setAdditionalCreators((creators) => {\n      const creatorsSet = new Set(creators);\n      creatorsSet.add(userId);\n      return Array.from(creatorsSet);\n    });\n  };\n\n  const removeAdditionalCreator = (userId: string) => {\n    setAdditionalCreators((creators) => {\n      const creatorsSet = new Set(creators);\n      creatorsSet.delete(userId);\n      return Array.from(creatorsSet);\n    });\n  };\n\n  return {\n    additionalCreators,\n    addAdditionalCreator,\n    removeAdditionalCreator,\n  };\n};\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  limit: 1000,\n  matchOptions: {\n    contain: true,\n  },\n};\nconst getUserIdString = (userId: string) => getMxIdLocalPart(userId) ?? userId;\n\ntype AdditionalCreatorInputProps = {\n  additionalCreators: string[];\n  onSelect: (userId: string) => void;\n  onRemove: (userId: string) => void;\n  disabled?: boolean;\n};\nexport function AdditionalCreatorInput({\n  additionalCreators,\n  onSelect,\n  onRemove,\n  disabled,\n}: AdditionalCreatorInputProps) {\n  const mx = useMatrixClient();\n  const [menuCords, setMenuCords] = useState<RectCords>();\n  const directUsers = useDirectUsers();\n\n  const [validUserId, setValidUserId] = useState<string>();\n  const filteredUsers = useMemo(\n    () => directUsers.filter((userId) => !additionalCreators.includes(userId)),\n    [directUsers, additionalCreators]\n  );\n  const [result, search, resetSearch] = useAsyncSearch(\n    filteredUsers,\n    getUserIdString,\n    SEARCH_OPTIONS\n  );\n  const queryHighlighRegex = result?.query ? makeHighlightRegex([result.query]) : undefined;\n\n  const suggestionUsers = result\n    ? result.items\n    : filteredUsers.toSorted((a, b) => (a.toLocaleLowerCase() >= b.toLocaleLowerCase() ? 1 : -1));\n\n  const handleOpenMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setMenuCords(evt.currentTarget.getBoundingClientRect());\n  };\n  const handleCloseMenu = () => {\n    setMenuCords(undefined);\n    setValidUserId(undefined);\n    resetSearch();\n  };\n\n  const handleCreatorChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const creatorInput = evt.currentTarget;\n    const creator = creatorInput.value.trim();\n    if (isUserId(creator)) {\n      setValidUserId(creator);\n    } else {\n      setValidUserId(undefined);\n      const term =\n        getMxIdLocalPart(creator) ?? (creator.startsWith('@') ? creator.slice(1) : creator);\n      if (term) {\n        search(term);\n      } else {\n        resetSearch();\n      }\n    }\n  };\n\n  const handleSelectUserId = (userId?: string) => {\n    if (userId && isUserId(userId)) {\n      onSelect(userId);\n      handleCloseMenu();\n    }\n  };\n\n  const handleCreatorKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('enter', evt)) {\n      evt.preventDefault();\n      const creator = evt.currentTarget.value.trim();\n      handleSelectUserId(isUserId(creator) ? creator : suggestionUsers[0]);\n    }\n  };\n\n  const handleEnterClick = () => {\n    handleSelectUserId(validUserId);\n  };\n\n  return (\n    <SettingTile\n      title=\"Founders\"\n      description=\"Special privileged users can be assigned during creation. These users have elevated control and can only be modified during a upgrade.\"\n    >\n      <Box shrink=\"No\" direction=\"Column\" gap=\"100\">\n        <Box gap=\"200\" wrap=\"Wrap\">\n          <Chip type=\"button\" variant=\"Primary\" radii=\"Pill\" outlined>\n            <Text size=\"B300\">{mx.getSafeUserId()}</Text>\n          </Chip>\n          {additionalCreators.map((creator) => (\n            <Chip\n              type=\"button\"\n              key={creator}\n              variant=\"Secondary\"\n              radii=\"Pill\"\n              after={sizedIcon(X, '50')}\n              onClick={() => onRemove(creator)}\n              disabled={disabled}\n            >\n              <Text size=\"B300\">{creator}</Text>\n            </Chip>\n          ))}\n          <PopOut\n            anchor={menuCords}\n            position=\"Bottom\"\n            align=\"Center\"\n            content={\n              <FocusTrap\n                focusTrapOptions={{\n                  onDeactivate: handleCloseMenu,\n                  clickOutsideDeactivates: true,\n                  isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown',\n                  isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp',\n                  escapeDeactivates: stopPropagation,\n                }}\n              >\n                <Menu\n                  style={{\n                    width: '100vw',\n                    maxWidth: toRem(300),\n                    height: toRem(250),\n                    display: 'flex',\n                  }}\n                >\n                  <Box grow=\"Yes\" direction=\"Column\">\n                    <Box shrink=\"No\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                      <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n                        <Input\n                          size=\"400\"\n                          variant=\"Background\"\n                          radii=\"300\"\n                          outlined\n                          placeholder=\"@username:server\"\n                          onChange={handleCreatorChange}\n                          onKeyDown={handleCreatorKeyDown}\n                        />\n                      </Box>\n                      <Button\n                        type=\"button\"\n                        variant=\"Success\"\n                        radii=\"300\"\n                        onClick={handleEnterClick}\n                        disabled={!validUserId}\n                      >\n                        <Text size=\"B400\">Enter</Text>\n                      </Button>\n                    </Box>\n                    <Line size=\"300\" />\n                    <Box grow=\"Yes\" direction=\"Column\">\n                      {!validUserId && suggestionUsers.length > 0 ? (\n                        <Scroll size=\"300\" hideTrack>\n                          <Box\n                            grow=\"Yes\"\n                            direction=\"Column\"\n                            gap=\"100\"\n                            style={{\n                              padding: config.space.S200,\n                              paddingRight: 0,\n                            }}\n                          >\n                            {suggestionUsers.map((userId) => (\n                              <MenuItem\n                                key={userId}\n                                size=\"300\"\n                                variant=\"Surface\"\n                                radii=\"300\"\n                                onClick={() => handleSelectUserId(userId)}\n                                after={\n                                  <Text size=\"T200\" truncate>\n                                    {getMxIdServer(userId)}\n                                  </Text>\n                                }\n                              >\n                                <Box grow=\"Yes\">\n                                  <Text size=\"T200\" truncate>\n                                    <b>\n                                      {queryHighlighRegex\n                                        ? highlightText(queryHighlighRegex, [\n                                            getMxIdLocalPart(userId) ?? userId,\n                                          ])\n                                        : getMxIdLocalPart(userId)}\n                                    </b>\n                                  </Text>\n                                </Box>\n                              </MenuItem>\n                            ))}\n                          </Box>\n                        </Scroll>\n                      ) : (\n                        <Box\n                          grow=\"Yes\"\n                          alignItems=\"Center\"\n                          justifyContent=\"Center\"\n                          direction=\"Column\"\n                          gap=\"100\"\n                        >\n                          <Text size=\"H6\" align=\"Center\">\n                            No Suggestions\n                          </Text>\n                          <Text size=\"T200\" align=\"Center\">\n                            Please provide the user ID and hit Enter.\n                          </Text>\n                        </Box>\n                      )}\n                    </Box>\n                  </Box>\n                </Menu>\n              </FocusTrap>\n            }\n          >\n            <Chip\n              type=\"button\"\n              variant=\"Secondary\"\n              radii=\"Pill\"\n              onClick={handleOpenMenu}\n              aria-pressed={!!menuCords}\n              disabled={disabled}\n            >\n              {sizedIcon(Plus, '50')}\n            </Chip>\n          </PopOut>\n        </Box>\n      </Box>\n    </SettingTile>\n  );\n}\n","import { Preset, Visibility } from '$types/matrix-sdk';\nimport {\n  addRoomIdToMDirect,\n  getDMRoomFor,\n  guessDmRoomUserId,\n  isRoomAlias,\n  isRoomId,\n  isUserId,\n  removeRoomIdFromMDirect,\n} from '$utils/matrix';\nimport { createRoomEncryptionState } from '$components/create-room';\nimport { splitWithSpace } from '$utils/common';\nimport type { CommandContext, CommandRecord } from './types';\nimport { Command } from './types';\n\nexport const createMembershipCommands = (ctx: CommandContext): Partial<CommandRecord> => {\n  const { mx, room, navigateRoom } = ctx;\n  return {\n    [Command.StartDm]: {\n      name: Command.StartDm,\n      description: 'Start direct message with user. Example: /startdm userId1',\n      exe: async (payload) => {\n        const rawIds = splitWithSpace(payload);\n        const userIds = rawIds.filter((id) => isUserId(id) && id !== mx.getSafeUserId());\n        if (userIds.length === 0) return;\n        if (userIds.length === 1) {\n          const dmRoomId = getDMRoomFor(mx, userIds[0]!)?.roomId;\n          if (dmRoomId) {\n            navigateRoom(dmRoomId);\n            return;\n          }\n        }\n        const result = await mx.createRoom({\n          is_direct: true,\n          invite: userIds,\n          visibility: Visibility.Private,\n          preset: Preset.TrustedPrivateChat,\n          initial_state: [createRoomEncryptionState()],\n        });\n        addRoomIdToMDirect(mx, result.room_id, userIds[0]!);\n        navigateRoom(result.room_id);\n      },\n    },\n    [Command.Join]: {\n      name: Command.Join,\n      description: 'Join room with address. Example: /join address1 address2',\n      exe: async (payload) => {\n        const rawIds = splitWithSpace(payload);\n        const roomIdOrAliases = rawIds.filter(\n          (idOrAlias) => isRoomId(idOrAlias) || isRoomAlias(idOrAlias)\n        );\n        roomIdOrAliases.forEach(async (idOrAlias) => {\n          await mx.joinRoom(idOrAlias);\n        });\n      },\n    },\n    [Command.Leave]: {\n      name: Command.Leave,\n      description: 'Leave current room.',\n      exe: async (payload) => {\n        if (payload.trim() === '') {\n          mx.leave(room.roomId);\n          return;\n        }\n        const rawIds = splitWithSpace(payload);\n        const roomIds = rawIds.filter((id) => isRoomId(id));\n        roomIds.map((id) => mx.leave(id));\n      },\n    },\n    [Command.ConvertToDm]: {\n      name: Command.ConvertToDm,\n      description: 'Convert room to direct message',\n      exe: async () => {\n        const dmUserId = guessDmRoomUserId(room, mx.getSafeUserId());\n        await addRoomIdToMDirect(mx, room.roomId, dmUserId);\n      },\n    },\n    [Command.ConvertToRoom]: {\n      name: Command.ConvertToRoom,\n      description: 'Convert direct message to room',\n      exe: async () => {\n        await removeRoomIdFromMDirect(mx, room.roomId);\n      },\n    },\n    [Command.Knock]: {\n      name: Command.Knock,\n      description:\n        'Knock on (request to join) room with address. Example: /knock address1 address2',\n      exe: async (payload) => {\n        const rawIds = splitWithSpace(payload);\n        const roomIdOrAliases = rawIds.filter(\n          (idOrAlias) => isRoomId(idOrAlias) || isRoomAlias(idOrAlias)\n        );\n        roomIdOrAliases.forEach(async (idOrAlias) => {\n          await mx.knockRoom(idOrAlias);\n        });\n      },\n    },\n  };\n};\n","import type { Room, RoomMember } from '$types/matrix-sdk';\nimport { isServerName, isUserId } from '$utils/matrix';\nimport { splitWithSpace } from '$utils/common';\n\nconst FLAG_PAT = String.raw`(?:^|\\s)-(\\w+)\\b`;\nconst FLAG_REG = new RegExp(FLAG_PAT);\nconst FLAG_REG_G = new RegExp(FLAG_PAT, 'g');\n\nexport const splitPayloadContentAndFlags = (payload: string): [string, string | undefined] => {\n  const flagMatch = new RegExp(FLAG_REG).exec(payload);\n\n  if (!flagMatch) {\n    return [payload, undefined];\n  }\n  const content = payload.slice(0, flagMatch.index);\n  const flags = payload.slice(flagMatch.index);\n\n  return [content, flags];\n};\n\nexport const parseFlags = (flags: string | undefined): Record<string, string | undefined> => {\n  const result: Record<string, string> = {};\n  if (!flags) return result;\n\n  const matches: { key: string; index: number; match: string }[] = [];\n\n  for (let match = FLAG_REG_G.exec(flags); match !== null; match = FLAG_REG_G.exec(flags)) {\n    if (!match[1] || !match[0]) continue;\n    matches.push({ key: match[1], index: match.index, match: match[0] });\n  }\n\n  for (let i = 0; i < matches.length; i += 1) {\n    const current = matches[i];\n    if (!current) continue;\n    const { key, match } = current;\n    const start = current.index + match.length;\n    const end = i + 1 < matches.length ? (matches[i + 1]?.index ?? flags.length) : flags.length;\n    const value = flags.slice(start, end).trim();\n    result[key] = value;\n  }\n\n  return result;\n};\n\nexport const parseUsers = (payload: string): string[] => {\n  const users: string[] = [];\n\n  splitWithSpace(payload).forEach((item) => {\n    if (isUserId(item)) {\n      users.push(item);\n    }\n  });\n\n  return users;\n};\n\nexport const parseServers = (payload: string): string[] => {\n  const servers: string[] = [];\n\n  splitWithSpace(payload).forEach((item) => {\n    if (isServerName(item)) {\n      servers.push(item);\n    }\n  });\n\n  return servers;\n};\n\nexport const getServerMembers = (room: Room, server: string): RoomMember[] => {\n  const members: RoomMember[] = room\n    .getMembers()\n    .filter((member) => member.userId.endsWith(`:${server}`));\n\n  return members;\n};\n\nexport const parseTimestampFlag = (input: string): number | undefined => {\n  const match = input.match(/^(\\d+(?:\\.\\d+)?)([dhms])$/); // supports floats like 1.5d\n\n  if (!match) {\n    return undefined;\n  }\n\n  const value = Number.parseFloat(match[1]!); // supports decimal values\n  const unit = match[2];\n\n  const now = Date.now(); // in milliseconds\n  let delta = 0;\n\n  switch (unit) {\n    case 'd':\n      delta = value * 24 * 60 * 60 * 1000;\n      break;\n    case 'h':\n      delta = value * 60 * 60 * 1000;\n      break;\n    case 'm':\n      delta = value * 60 * 1000;\n      break;\n    case 's':\n      delta = value * 1000;\n      break;\n    default:\n      return undefined;\n  }\n\n  const timestamp = now - delta;\n  return timestamp;\n};\n","import type { IContextResponse, RoomServerAclEventContent } from '$types/matrix-sdk';\nimport { Direction, EventType, KnownMembership, Method } from '$types/matrix-sdk';\nimport { isUserId, rateLimitedActions } from '$utils/matrix';\nimport { getStateEvent } from '$utils/room/hierarchy';\nimport { splitWithSpace } from '$utils/common';\nimport type { CommandContext, CommandRecord } from './types';\nimport { Command } from './types';\nimport {\n  getServerMembers,\n  parseFlags,\n  parseServers,\n  parseTimestampFlag,\n  parseUsers,\n  splitPayloadContentAndFlags,\n} from './parsing';\n\nexport const createModerationCommands = (ctx: CommandContext): Partial<CommandRecord> => {\n  const { mx, room } = ctx;\n  return {\n    [Command.Invite]: {\n      name: Command.Invite,\n      description: 'Invite user to room. Example: /invite userId1 userId2 [-r reason]',\n      exe: async (payload) => {\n        const [content, flags] = splitPayloadContentAndFlags(payload);\n        const users = parseUsers(content);\n        const flagToContent = parseFlags(flags);\n        const reason = flagToContent.r;\n        users.map((id) => mx.invite(room.roomId, id, reason));\n      },\n    },\n    [Command.DisInvite]: {\n      name: Command.DisInvite,\n      description: 'Disinvite user to room. Example: /disinvite userId1 userId2 [-r reason]',\n      exe: async (payload) => {\n        const [content, flags] = splitPayloadContentAndFlags(payload);\n        const users = parseUsers(content);\n        const flagToContent = parseFlags(flags);\n        const reason = flagToContent.r;\n        users.map((id) => mx.kick(room.roomId, id, reason));\n      },\n    },\n    [Command.Kick]: {\n      name: Command.Kick,\n      description: 'Kick user from room. Example: /kick userId1 userId2 servername [-r reason]',\n      exe: async (payload) => {\n        const [content, flags] = splitPayloadContentAndFlags(payload);\n        const users = parseUsers(content);\n        const servers = parseServers(content);\n        const flagToContent = parseFlags(flags);\n        const reason = flagToContent.r;\n\n        const serverMembers = servers?.flatMap((server) => getServerMembers(room, server));\n        const serverUsers = serverMembers\n          ?.filter((m) => m.membership !== KnownMembership.Ban)\n          .map((m) => m.userId);\n\n        if (Array.isArray(serverUsers)) {\n          serverUsers.forEach((user) => {\n            if (!users.includes(user)) users.push(user);\n          });\n        }\n\n        rateLimitedActions(users, (id) => mx.kick(room.roomId, id, reason));\n      },\n    },\n    [Command.Ban]: {\n      name: Command.Ban,\n      description: 'Ban user from room. Example: /ban userId1 userId2 servername [-r reason]',\n      exe: async (payload) => {\n        const [content, flags] = splitPayloadContentAndFlags(payload);\n        const users = parseUsers(content);\n        const servers = parseServers(content);\n        const flagToContent = parseFlags(flags);\n        const reason = flagToContent.r;\n\n        const serverMembers = servers?.flatMap((server) => getServerMembers(room, server));\n        const serverUsers = serverMembers?.map((m) => m.userId);\n\n        if (Array.isArray(serverUsers)) {\n          serverUsers.forEach((user) => {\n            if (!users.includes(user)) users.push(user);\n          });\n        }\n\n        rateLimitedActions(users, (id) => mx.ban(room.roomId, id, reason));\n      },\n    },\n    [Command.UnBan]: {\n      name: Command.UnBan,\n      description: 'Unban user from room. Example: /unban userId1 userId2',\n      exe: async (payload) => {\n        const rawIds = splitWithSpace(payload);\n        const users = rawIds.filter((id) => isUserId(id));\n        users.map((id) => mx.unban(room.roomId, id));\n      },\n    },\n    [Command.Ignore]: {\n      name: Command.Ignore,\n      description: 'Ignore user. Example: /ignore userId1 userId2',\n      exe: async (payload) => {\n        const rawIds = splitWithSpace(payload);\n        const userIds = rawIds.filter((id) => isUserId(id));\n        if (userIds.length > 0) {\n          let ignoredUsers = mx.getIgnoredUsers().concat(userIds);\n          ignoredUsers = [...new Set(ignoredUsers)];\n          await mx.setIgnoredUsers(ignoredUsers);\n        }\n      },\n    },\n    [Command.UnIgnore]: {\n      name: Command.UnIgnore,\n      description: 'Unignore user. Example: /unignore userId1 userId2',\n      exe: async (payload) => {\n        const rawIds = splitWithSpace(payload);\n        const userIds = rawIds.filter((id) => isUserId(id));\n        if (userIds.length > 0) {\n          const ignoredUsers = mx.getIgnoredUsers();\n          await mx.setIgnoredUsers(ignoredUsers.filter((id) => !userIds.includes(id)));\n        }\n      },\n    },\n    [Command.Delete]: {\n      name: Command.Delete,\n      description:\n        'Delete messages from users. Example: /delete userId1 servername -past 1d|2h|5m|30s [-t m.room.message] [-r spam]',\n      exe: async (payload) => {\n        const [content, flags] = splitPayloadContentAndFlags(payload);\n        const users = parseUsers(content);\n        const servers = parseServers(content);\n\n        const flagToContent = parseFlags(flags);\n        const reason = flagToContent.r;\n        const pastContent = flagToContent.past ?? '';\n        const msgTypeContent = flagToContent.t;\n        const messageTypes: string[] = msgTypeContent ? splitWithSpace(msgTypeContent) : [];\n\n        const ts = parseTimestampFlag(pastContent);\n        if (!ts) return;\n\n        const serverMembers = servers?.flatMap((server) => getServerMembers(room, server));\n        const serverUsers = serverMembers?.map((m) => m.userId);\n\n        if (Array.isArray(serverUsers)) {\n          serverUsers.forEach((user) => {\n            if (!users.includes(user)) users.push(user);\n          });\n        }\n\n        const result = await mx.timestampToEvent(room.roomId, ts, Direction.Forward);\n        const startEventId = result.event_id;\n\n        const path = `/rooms/${encodeURIComponent(room.roomId)}/context/${encodeURIComponent(\n          startEventId\n        )}`;\n        const eventContext = await mx.http.authedRequest<IContextResponse>(Method.Get, path, {\n          limit: 0,\n        });\n\n        let token: string | undefined = eventContext.start;\n        while (token) {\n          // oxlint-disable-next-line no-await-in-loop\n          const response = await mx.createMessagesRequest(\n            room.roomId,\n            token,\n            20,\n            Direction.Forward\n          );\n          const { end, chunk } = response;\n          // remove until the latest event;\n          token = end;\n\n          const eventsToDelete = chunk.filter(\n            (roomEvent) =>\n              (messageTypes.length > 0 ? messageTypes.includes(roomEvent.type) : true) &&\n              users.includes(roomEvent.sender) &&\n              roomEvent.unsigned?.redacted_because === undefined\n          );\n\n          const eventIds = eventsToDelete.map((roomEvent) => roomEvent.event_id);\n\n          // oxlint-disable-next-line no-await-in-loop\n          await rateLimitedActions(eventIds, (eventId) =>\n            mx.redactEvent(room.roomId, eventId, undefined, { reason })\n          );\n        }\n      },\n    },\n    [Command.Acl]: {\n      name: Command.Acl,\n      description:\n        'Manage server access control list. Example: /acl [-a servername1] [-d servername2] [-ra servername1] [-rd servername2]',\n      exe: async (payload) => {\n        const [, flags] = splitPayloadContentAndFlags(payload);\n\n        const flagToContent = parseFlags(flags);\n        const allowFlag = flagToContent.a;\n        const denyFlag = flagToContent.d;\n        const removeAllowFlag = flagToContent.ra;\n        const removeDenyFlag = flagToContent.rd;\n\n        const allowList = allowFlag ? splitWithSpace(allowFlag) : [];\n        const denyList = denyFlag ? splitWithSpace(denyFlag) : [];\n        const removeAllowList = removeAllowFlag ? splitWithSpace(removeAllowFlag) : [];\n        const removeDenyList = removeDenyFlag ? splitWithSpace(removeDenyFlag) : [];\n\n        const serverAcl = getStateEvent(\n          room,\n          EventType.RoomServerAcl\n        )?.getContent<RoomServerAclEventContent>();\n\n        const aclContent: RoomServerAclEventContent = {\n          allow: serverAcl?.allow ? [...serverAcl.allow] : [],\n          allow_ip_literals: serverAcl?.allow_ip_literals,\n          deny: serverAcl?.deny ? [...serverAcl.deny] : [],\n        };\n\n        allowList.forEach((servername) => {\n          if (!Array.isArray(aclContent.allow) || aclContent.allow.includes(servername)) return;\n          aclContent.allow.push(servername);\n        });\n        denyList.forEach((servername) => {\n          if (!Array.isArray(aclContent.deny) || aclContent.deny.includes(servername)) return;\n          aclContent.deny.push(servername);\n        });\n\n        aclContent.allow = aclContent.allow?.filter(\n          (servername) => !removeAllowList.includes(servername)\n        );\n        aclContent.deny = aclContent.deny?.filter(\n          (servername) => !removeDenyList.includes(servername)\n        );\n\n        aclContent.allow?.sort();\n        aclContent.deny?.sort();\n\n        await mx.sendStateEvent(room.roomId, EventType.RoomServerAcl, aclContent);\n      },\n    },\n  };\n};\n","import type { MatrixClient, Room } from '$types/matrix-sdk';\nimport { EventType, MatrixEvent } from '$types/matrix-sdk';\nimport type { CustomRoomMemberEventContent } from '$unstable/CustomRoomMemberEventContent';\n\n/** Send an own-membership profile update and immediately reflect the accepted state locally. */\nexport async function setOwnRoomMemberProfile(\n  mx: MatrixClient,\n  room: Room,\n  content: CustomRoomMemberEventContent\n): Promise<void> {\n  const userId = mx.getSafeUserId();\n  const response = await mx.sendStateEvent(room.roomId, EventType.RoomMember, content, userId);\n\n  room.currentState.setStateEvents([\n    new MatrixEvent({\n      event_id: response.event_id,\n      origin_server_ts: Date.now(),\n      room_id: room.roomId,\n      sender: userId,\n      state_key: userId,\n      type: EventType.RoomMember,\n      content,\n    }),\n  ]);\n}\n","import { EventTimeline, EventType, MatrixError } from '$types/matrix-sdk';\nimport { setOwnRoomMemberProfile } from '$utils/roomMemberProfile';\nimport { parsePronounsInput } from '$utils/pronouns';\nimport { sendFeedback } from '$utils/sendFeedbackToUser';\nimport { CustomStateEvent } from '$types/matrix/room';\nimport { ErrorCode } from '../../cs-errorcode';\nimport type { CommandContext, CommandRecord } from './types';\nimport { Command } from './types';\nimport { isValidHex } from '$hooks/useUserProfile';\nimport * as prefix from '$unstable/prefixes';\nimport type { CustomRoomMemberEventContent } from '$unstable/CustomRoomMemberEventContent';\n\nexport const createProfileCommands = (ctx: CommandContext): Partial<CommandRecord> => {\n  const { mx, room, profileDisplayName } = ctx;\n  return {\n    [Command.MyRoomNick]: {\n      name: Command.MyRoomNick,\n      description: 'Change nick in current room.',\n      exe: async (payload) => {\n        let nick: string | null = payload.trim();\n        if (nick === '') nick = profileDisplayName ?? null;\n        const mEvent = room\n          .getLiveTimeline()\n          .getState(EventTimeline.FORWARDS)\n          ?.getStateEvents(EventType.RoomMember, mx.getSafeUserId());\n        const content = mEvent?.getContent<CustomRoomMemberEventContent>();\n        if (!content) return;\n        const updatedContent: CustomRoomMemberEventContent = { ...content };\n        const withDisplay = updatedContent as CustomRoomMemberEventContent & {\n          displayname?: string;\n        };\n        if (nick == null || nick === '') {\n          delete withDisplay.displayname;\n        } else {\n          withDisplay.displayname = nick;\n        }\n        await setOwnRoomMemberProfile(mx, room, updatedContent);\n      },\n    },\n    [Command.MyRoomAvatar]: {\n      name: Command.MyRoomAvatar,\n      description: 'Change profile picture in current room. Example /myroomavatar mxc://xyzabc',\n      exe: async (payload) => {\n        const trimmed = payload.trim();\n        const isRemove = trimmed.length === 0;\n        const mEvent = room\n          .getLiveTimeline()\n          .getState(EventTimeline.FORWARDS)\n          ?.getStateEvents(EventType.RoomMember, mx.getSafeUserId());\n        const content = mEvent?.getContent<CustomRoomMemberEventContent>();\n        if (!content) return;\n        const updatedContent: CustomRoomMemberEventContent = { ...content };\n        if (isRemove) {\n          // Reset to global avatar\n          const globalAvatar = mx.getUser(mx.getSafeUserId())?.avatarUrl ?? undefined;\n          (updatedContent as CustomRoomMemberEventContent & { avatar_url?: string }).avatar_url =\n            globalAvatar;\n        } else {\n          if (!trimmed.match(/^mxc:\\/\\/\\S+$/)) {\n            // bad mxc\n            return;\n          }\n          (updatedContent as CustomRoomMemberEventContent & { avatar_url?: string }).avatar_url =\n            trimmed;\n        }\n        await setOwnRoomMemberProfile(mx, room, updatedContent);\n      },\n    },\n    [Command.Color]: {\n      name: Command.Color,\n      description: 'Set a room-specific color. Example: /color light #ff00ff | /color reset',\n      exe: async (payload) => {\n        const input = payload.trim().toLowerCase().split(' ');\n        const userId = mx.getSafeUserId();\n        const completeClear = input.length >= 0 && (input[0] === 'reset' || input[0] === 'clear');\n        const isLight =\n          input.length === 2 &&\n          (input[0] === 'light' || input[0] === 'on_light' || input[0] === 'both');\n        const isDark =\n          input.length === 2 &&\n          (input[0] === 'dark' || input[0] === 'on_dark' || input[0] === 'both');\n        const color =\n          input[1] === 'reset' || input[1] === 'clear'\n            ? undefined\n            : input[1]?.length\n              ? input[1]\n              : '';\n\n        try {\n          if (!color || isValidHex(color) || completeClear) {\n            const mEvent = room\n              .getLiveTimeline()\n              .getState(EventTimeline.FORWARDS)\n              ?.getStateEvents(EventType.RoomMember, mx.getSafeUserId());\n            const content = mEvent?.getContent<CustomRoomMemberEventContent>();\n            if (!content) return;\n            const updatedContent: CustomRoomMemberEventContent = { ...content };\n            if (completeClear) {\n              // Reset\n              updatedContent[prefix.MATRIX_UNSTABLE_COLORS] = undefined;\n\n              await mx.sendStateEvent(room.roomId, CustomStateEvent.RoomCosmeticsColor, {}, userId);\n            } else {\n              if (color && !isValidHex(color)) {\n                return;\n              }\n              updatedContent[prefix.MATRIX_UNSTABLE_COLORS] = {\n                on_dark: isDark ? color : content[prefix.MATRIX_UNSTABLE_COLORS]?.on_dark,\n                on_light: isLight ? color : content[prefix.MATRIX_UNSTABLE_COLORS]?.on_light,\n              };\n            }\n            await setOwnRoomMemberProfile(mx, room, updatedContent);\n            sendFeedback(\n              `Room color set to:\\nOver dark themes ${updatedContent[prefix.MATRIX_UNSTABLE_COLORS]?.on_dark},\\nOver light themes ${updatedContent[prefix.MATRIX_UNSTABLE_COLORS]?.on_light}.`,\n              room,\n              userId\n            );\n            await mx.sendStateEvent(room.roomId, CustomStateEvent.RoomCosmeticsColor, {}, userId);\n          } else {\n            sendFeedback(\n              'Invalid format. Use #RRGGBB for colors and specify which color.',\n              room,\n              userId\n            );\n          }\n        } catch (e: unknown) {\n          if (e instanceof MatrixError && e.errcode === ErrorCode.M_FORBIDDEN) {\n            sendFeedback('Permission Denied.', room, userId);\n          }\n        }\n      },\n    },\n    [Command.SColor]: {\n      name: Command.SColor,\n      description:\n        'Set your color for the current Space. Example: /scolor light #ff00ff | /scolor reset',\n      exe: async (payload) => {\n        const input = payload.trim().toLowerCase().split(' ');\n        const userId = mx.getSafeUserId();\n\n        const parents = room\n          .getLiveTimeline()\n          .getState(EventTimeline.FORWARDS)\n          ?.getStateEvents(EventType.SpaceParent);\n\n        const targetSpaceId =\n          parents && parents.length > 0 ? parents[0]!.getStateKey() : room.roomId;\n        const targetRoom = mx.getRoom(targetSpaceId);\n        const completeClear = input.length >= 0 && (input[0] === 'reset' || input[0] === 'clear');\n        const isLight =\n          input.length === 2 &&\n          (input[0] === 'light' || input[0] === 'on_light' || input[0] === 'both');\n        const isDark =\n          input.length === 2 &&\n          (input[0] === 'dark' || input[0] === 'on_dark' || input[0] === 'both');\n        const color =\n          input[1] === 'reset' || input[1] === 'clear'\n            ? undefined\n            : input[1]?.length\n              ? input[1]\n              : '';\n\n        try {\n          if (!color || isValidHex(color) || completeClear) {\n            const mEvent = room\n              .getLiveTimeline()\n              .getState(EventTimeline.FORWARDS)\n              ?.getStateEvents(EventType.RoomMember, mx.getSafeUserId());\n            const content = mEvent?.getContent<CustomRoomMemberEventContent>();\n            if (!content) return;\n            const updatedContent: CustomRoomMemberEventContent = { ...content };\n            if (completeClear) {\n              // Reset\n              updatedContent[prefix.MATRIX_UNSTABLE_COLORS] = undefined;\n              //This may be ignored since it is to delete the old key when updated\n              try {\n                await mx.sendStateEvent(\n                  room.roomId,\n                  CustomStateEvent.RoomCosmeticsColor,\n                  {},\n                  userId\n                );\n              } catch {}\n            } else {\n              if (color && !isValidHex(color)) {\n                return;\n              }\n              updatedContent[prefix.MATRIX_UNSTABLE_COLORS] = {\n                on_dark: isDark ? color : content[prefix.MATRIX_UNSTABLE_COLORS]?.on_dark,\n                on_light: isLight ? color : content[prefix.MATRIX_UNSTABLE_COLORS]?.on_light,\n              };\n            }\n            if (targetRoom) {\n              await setOwnRoomMemberProfile(mx, targetRoom, updatedContent);\n              sendFeedback(\n                `Room color set to:\\nOver dark themes ${updatedContent[prefix.MATRIX_UNSTABLE_COLORS]?.on_dark},\\nOver light themes ${updatedContent[prefix.MATRIX_UNSTABLE_COLORS]?.on_light}.`,\n                room,\n                userId\n              );\n              try {\n                await mx.sendStateEvent(\n                  room.roomId,\n                  CustomStateEvent.RoomCosmeticsColor,\n                  {},\n                  userId\n                );\n              } catch {}\n            }\n          } else {\n            sendFeedback(\n              'Invalid format. Use #RRGGBB for colors and specify which color (on_light|on_dark).',\n              room,\n              userId\n            );\n          }\n        } catch (e: unknown) {\n          if (e instanceof MatrixError && e.errcode === ErrorCode.M_FORBIDDEN) {\n            sendFeedback('Permission Denied.', room, userId);\n          }\n        }\n      },\n    },\n    [Command.Font]: {\n      name: Command.Font,\n      description: 'Set a room-specific font. Example: /font Courier New | /font reset',\n      exe: async (payload) => {\n        const input = payload\n          .trim()\n          .replaceAll(/[;{}<>]/g, '')\n          .slice(0, 32);\n        const userId = mx.getSafeUserId();\n\n        try {\n          if (input.toLowerCase() === 'reset' || input === '') {\n            await mx.sendStateEvent(room.roomId, CustomStateEvent.RoomCosmeticsFont, {}, userId);\n            sendFeedback('Room font reset.', room, userId);\n            return;\n          }\n\n          await mx.sendStateEvent(\n            room.roomId,\n            CustomStateEvent.RoomCosmeticsFont,\n            { font: input },\n            userId\n          );\n          sendFeedback(`Room font set to \"${input}\".`, room, userId);\n        } catch (e: unknown) {\n          if (e instanceof MatrixError && e.errcode === ErrorCode.M_FORBIDDEN) {\n            sendFeedback(\n              'Permission Denied. An admin must enable \"Room Fonts\" in Settings > Cosmetics in app.sable.moe or another supported client.',\n              room,\n              userId\n            );\n          }\n        }\n      },\n    },\n    [Command.SFont]: {\n      name: Command.SFont,\n      description: 'Set a font for the current Space. Example: /sfont Courier New | /sfont reset',\n      exe: async (payload) => {\n        const input = payload\n          .trim()\n          .replaceAll(/[;{}<>]/g, '')\n          .slice(0, 32);\n        const userId = mx.getSafeUserId();\n\n        const parents = room\n          .getLiveTimeline()\n          .getState(EventTimeline.FORWARDS)\n          ?.getStateEvents(EventType.SpaceParent);\n\n        const targetSpaceId =\n          parents && parents.length > 0 ? parents[0]!.getStateKey() : room.roomId;\n\n        try {\n          if (input.toLowerCase() === 'reset' || input === '') {\n            await mx.sendStateEvent(\n              targetSpaceId as string,\n              CustomStateEvent.RoomCosmeticsFont,\n              {},\n              userId\n            );\n            sendFeedback('Space font reset.', room, userId);\n            return;\n          }\n\n          await mx.sendStateEvent(\n            targetSpaceId as string,\n            CustomStateEvent.RoomCosmeticsFont,\n            { font: input },\n            userId\n          );\n          sendFeedback(`Space font set to \"${input}\".`, room, userId);\n        } catch (e: unknown) {\n          if (e instanceof MatrixError && e.errcode === ErrorCode.M_FORBIDDEN) {\n            sendFeedback(\n              'Permission Denied. An admin must enable \"Space-Wide Fonts\" in Settings > Cosmetics in app.sable.moe or another supported client.',\n              room,\n              userId\n            );\n          }\n        }\n      },\n    },\n    [Command.Pronoun]: {\n      name: Command.Pronoun,\n      description:\n        'Set your pronouns for this room. Example: /pronoun \"en:they/them, de:sie/ihr\" | /pronoun reset',\n      exe: async (payload) => {\n        const match = payload.trim().match(/^\"(.*)\"$/);\n        const rawInput = match ? (match[1] ?? '').trim() : payload.trim();\n        const userId = mx.getSafeUserId();\n\n        try {\n          if (['reset', 'clear', ''].includes(rawInput.toLowerCase())) {\n            await mx.sendStateEvent(\n              room.roomId,\n              CustomStateEvent.RoomCosmeticsPronouns,\n              {},\n              userId\n            );\n            sendFeedback('Room pronouns have been reset.', room, userId);\n            return;\n          }\n\n          const pronounsArray = parsePronounsInput(rawInput);\n\n          await mx.sendStateEvent(\n            room.roomId,\n            CustomStateEvent.RoomCosmeticsPronouns,\n            { pronouns: pronounsArray },\n            userId\n          );\n\n          const feedbackString = pronounsArray\n            .map((p) => (p.language ? `for ${p.language} \"${p.summary}\" was set` : p.summary))\n            .join(', ');\n\n          sendFeedback(`Room pronouns set: ${feedbackString}`, room, userId);\n        } catch (e: unknown) {\n          if (e instanceof MatrixError && e.errcode === ErrorCode.M_FORBIDDEN) {\n            sendFeedback('Permission Denied. Could not update room pronouns.', room, userId);\n          }\n        }\n      },\n    },\n    [Command.SPronoun]: {\n      name: Command.SPronoun,\n      description:\n        'Set your pronouns for this space. Example: /spronoun \"en:they/them, de:sie/ihr\" | /spronoun reset',\n      exe: async (payload) => {\n        const match = payload.trim().match(/^\"(.*)\"$/);\n        const rawInput = match ? (match[1] ?? '').trim() : payload.trim();\n        const userId = mx.getSafeUserId();\n\n        const parents = room\n          .getLiveTimeline()\n          .getState(EventTimeline.FORWARDS)\n          ?.getStateEvents(EventType.SpaceParent);\n\n        const targetSpaceId =\n          parents && parents.length > 0 ? parents[0]!.getStateKey() : room.roomId;\n\n        try {\n          if (['reset', 'clear', ''].includes(rawInput.toLowerCase())) {\n            await mx.sendStateEvent(\n              targetSpaceId as string,\n              CustomStateEvent.RoomCosmeticsPronouns,\n              {},\n              userId\n            );\n            sendFeedback('Global space pronouns reset.', room, userId);\n            return;\n          }\n\n          const pronounsArray = parsePronounsInput(rawInput);\n\n          await mx.sendStateEvent(\n            targetSpaceId as string,\n            CustomStateEvent.RoomCosmeticsPronouns,\n            { pronouns: pronounsArray },\n            userId\n          );\n\n          const feedbackString = pronounsArray\n            .map((p) => (p.language ? `for ${p.language} \"${p.summary}\" was set` : p.summary))\n            .join(', ');\n\n          sendFeedback(`Global space pronouns set: ${feedbackString}`, room, userId);\n        } catch (e: unknown) {\n          if (e instanceof MatrixError && e.errcode === ErrorCode.M_FORBIDDEN) {\n            sendFeedback('Permission Denied. Could not update space pronouns.', room, userId);\n          }\n        }\n      },\n    },\n  };\n};\n","import { splitWithSpace } from '$utils/common';\nimport { sendFeedback } from '$utils/sendFeedbackToUser';\nimport type { PerMessageProfileMsc4461 } from '../usePerMessageProfile';\nimport {\n  addOrUpdatePerMessageProfile,\n  deletePerMessageProfile,\n  setCurrentlyUsedPerMessageProfileIdForRoom,\n} from '../usePerMessageProfile';\nimport type { CommandContext, CommandRecord } from './types';\nimport { Command } from './types';\n\nconst ADDPMP_REGEX = /(\\S+) (name=)?\"?([\\w\\s]*)\"? (avatar=)?([\\w.:/]+)/;\nconst USEPMP_REGEX = /^(\\S+)\\s*(-g)?(-o)?(-u)?\\s*(\\d+)?$/;\n\nexport const createPmpCommands = (ctx: CommandContext): Partial<CommandRecord> => {\n  const { mx, room, pkitcmdHandler } = ctx;\n  return {\n    [Command.AddPerMessageProfileToAccount]: {\n      name: Command.AddPerMessageProfileToAccount,\n      description:\n        'Add or update a per message profile to your account. Example: /addpmp profileId name=Profile Name avatar=mxc://xyzabc',\n      exe: async (payload) => {\n        // Parse key=value pairs\n        const args = ADDPMP_REGEX.exec(payload);\n        if (!args) {\n          sendFeedback(`invalid payload`, room, mx.getSafeUserId());\n          return;\n        }\n        const avatar_url: string | undefined = args[5];\n        const name: string | undefined = args[3];\n        const profileId = args[1];\n\n        if (!avatar_url || !name || !profileId) {\n          sendFeedback(`invalid payload`, room, mx.getSafeUserId());\n          return;\n        }\n\n        const pmp: PerMessageProfileMsc4461 = {\n          id: profileId,\n          displayname: name || '',\n          avatar_url,\n        };\n        await addOrUpdatePerMessageProfile(mx, pmp)\n          .then(() => {\n            sendFeedback(\n              `Per message profile \"${profileId}\" added/updated in account.`,\n              room,\n              mx.getSafeUserId()\n            );\n          })\n          .catch(() => {\n            sendFeedback(\n              `Failed to add/update per message profile \"${profileId}\" in account.`,\n              room,\n              mx.getSafeUserId()\n            );\n          });\n      },\n    },\n    [Command.DeletePerMessageProfileFromAccount]: {\n      name: Command.DeletePerMessageProfileFromAccount,\n      description: 'Delete a per message profile from your account. Example: /delpmp profileId',\n      exe: async (payload) => {\n        const [profileId] = splitWithSpace(payload);\n        if (profileId === 'index') {\n          // \"index\" is reserved for the profile index, reject it as a profile id\n          sendFeedback('Cannot delete reserved profile ID \"index\".', room, mx.getSafeUserId());\n          return;\n        }\n        await deletePerMessageProfile(mx, profileId ?? '')\n          .then(() => {\n            sendFeedback(\n              `Per message profile \"${profileId}\" deleted from account.`,\n              room,\n              mx.getSafeUserId()\n            );\n          })\n          .catch(() => {\n            sendFeedback(\n              `Failed to delete per message profile \"${profileId}\" from account.`,\n              room,\n              mx.getSafeUserId()\n            );\n          });\n      },\n    },\n    [Command.UsePerMessageProfile]: {\n      name: Command.UsePerMessageProfile,\n      description:\n        'Use a per message profile for this room once, or until reset. Example: /usepmp (profileId,reset) [-o,-u,-g] [ts]',\n      exe: async (payload) => {\n        const args = USEPMP_REGEX.exec(payload);\n        if (!args) {\n          sendFeedback(`invalid payload`, room, mx.getSafeUserId());\n          return;\n        }\n        const profileId = args[1];\n        const globalFlag = args[2] !== undefined;\n        const onceFlag = args[3] !== undefined;\n        // const untilFlag = args[4] !== undefined;\n        const validUntil = Number.parseInt(args[5] ?? '', 10);\n        if (onceFlag || globalFlag) {\n          sendFeedback(\n            'Currently not implemented, consider using shorthands, with /pmpproxy id ✨:text',\n            room,\n            mx.getSafeUserId()\n          );\n          return;\n        }\n\n        if ((profileId ?? '').normalize() === 'reset') {\n          setCurrentlyUsedPerMessageProfileIdForRoom(mx, room.roomId, undefined, undefined, true)\n            .then(() => {\n              sendFeedback('Per message profile reset for this room.', room, mx.getSafeUserId());\n            })\n            .catch((e) => {\n              sendFeedback(\n                `Failed to reset per message profile for this room. Failed with: \"${(e as Error).message}\"`,\n                room,\n                mx.getSafeUserId()\n              );\n            });\n          return;\n        }\n        await setCurrentlyUsedPerMessageProfileIdForRoom(mx, room.roomId, profileId, validUntil)\n          .then(() => {\n            sendFeedback(\n              `Per message profile \"${profileId}\" will be used for messages in this room for the until ${\n                validUntil ?? 'reset'\n              }. Use \\`/usepmp reset\\` to reset it at any time.`,\n              room,\n              mx.getSafeUserId()\n            );\n          })\n          .catch((e) => {\n            sendFeedback(\n              `Failed to set per message profile for this room. Failed with: \"${(e as Error).message}\"`,\n              room,\n              mx.getSafeUserId()\n            );\n          });\n      },\n    },\n    [Command.AssociateProxyPerMessageProfile]: {\n      name: Command.AssociateProxyPerMessageProfile,\n      description: 'Associate proxy with a profile. Example /pmpproxy id ✨:text',\n      exe: async (payload) => {\n        const pid: string = splitWithSpace(payload)[0] ?? '';\n        const proxy: string = splitWithSpace(payload)[1] ?? '';\n        await pkitcmdHandler.handleMessage(`pk;member \"${pid}\" proxy ${proxy}`, true);\n      },\n    },\n  };\n};\n","import { MsgType } from '$types/matrix-sdk';\nimport type { CommandContext, CommandRecord } from './types';\nimport { Command } from './types';\n\nconst hslToHex = (h: number, s: number, l: number): string => {\n  const a = s * Math.min(l, 1 - l);\n  const f = (n: number) => {\n    const k = (n + h * 12) % 12;\n    const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n    return Math.round(255 * color)\n      .toString(16)\n      .padStart(2, '0');\n  };\n  return `#${f(0)}${f(8)}${f(4)}`;\n};\n\nconst getAllTextNodes = (root: Node): Node[] =>\n  root.nodeType === Node.TEXT_NODE\n    ? [root]\n    : Array.from(root.childNodes).reduce<Node[]>(\n        (acc, child) => acc.concat(getAllTextNodes(child)),\n        []\n      );\n\nconst rainbowify = (htmlInput: string): string => {\n  const div = document.createElement('div');\n  div.innerHTML = htmlInput;\n  const textNodes = getAllTextNodes(div);\n  const totalTextLen = textNodes.reduce((acc, node) => {\n    const text = node.textContent || '';\n    const cleanLen = Array.from(text).filter((c) => c.trim().length > 0).length;\n    return acc + cleanLen;\n  }, 0);\n\n  textNodes.reduce((currentGlobalIdx, node) => {\n    const text = node.textContent || '';\n    if (!text.trim()) return currentGlobalIdx;\n\n    const chars = Array.from(text);\n\n    const { html: newHtml, count: charsProcessed } = chars.reduce(\n      (acc, char) => {\n        if (char.trim().length === 0) {\n          return { html: acc.html + char, count: acc.count };\n        }\n        const hue = ((currentGlobalIdx + acc.count) / totalTextLen) * (5 / 6);\n        const color = hslToHex(hue, 1.0, 0.5);\n        const coloredChar = `<span data-mx-color=\"${color}\">${char}</span>`;\n        return { html: acc.html + coloredChar, count: acc.count + 1 };\n      },\n      { html: '', count: 0 }\n    );\n\n    const span = document.createElement('span');\n    span.innerHTML = newHtml;\n    node.parentNode?.replaceChild(span, node);\n    return currentGlobalIdx + charsProcessed;\n  }, 0);\n\n  return div.innerHTML;\n};\n\nexport const createRainbowCommands = (ctx: CommandContext): Partial<CommandRecord> => {\n  const { mx, room } = ctx;\n  return {\n    [Command.Rainbow]: {\n      name: Command.Rainbow,\n      description: 'Send rainbow text.',\n      exe: async (payload, html) => {\n        if (!payload || payload.trim().length === 0) return;\n        const inputHtml = html || payload;\n        const rainbowHtml = rainbowify(inputHtml);\n        await mx.sendMessage(room.roomId, {\n          msgtype: MsgType.Text,\n          body: payload,\n          format: 'org.matrix.custom.html',\n          formatted_body: rainbowHtml,\n        });\n      },\n    },\n    [Command.RainbowMe]: {\n      name: Command.RainbowMe,\n      description: 'Send a rainbow action message.',\n      exe: async (payload, html) => {\n        if (!payload || payload.trim().length === 0) return;\n        const inputHtml = html || payload;\n        const rainbowHtml = rainbowify(inputHtml);\n        await mx.sendMessage(room.roomId, {\n          msgtype: MsgType.Emote,\n          body: payload,\n          format: 'org.matrix.custom.html',\n          formatted_body: rainbowHtml,\n        });\n      },\n    },\n  };\n};\n","import { MsgType } from '$types/matrix-sdk';\nimport { sendFeedback } from '$utils/sendFeedbackToUser';\nimport type { CommandContext, CommandRecord } from './types';\nimport { Command } from './types';\nimport { parseFlags, splitPayloadContentAndFlags } from './parsing';\n\nexport const createRawCommands = (ctx: CommandContext): Partial<CommandRecord> => {\n  const { mx, room, developerTools } = ctx;\n  return {\n    [Command.RawMsg]: {\n      name: Command.RawMsg,\n      description:\n        '[Dev only] Send raw message event. Example: /rawmsg {\"msgtype\":\"m.text\", \"body\":\"hello\"}',\n      exe: async (payload) => {\n        const userId = mx.getSafeUserId();\n        if (!developerTools) {\n          sendFeedback('Command available in Developer Mode only.', room, userId);\n          return;\n        }\n        try {\n          const content = JSON.parse(payload);\n          await mx.sendMessage(room.roomId, content);\n        } catch (e: unknown) {\n          sendFeedback(`Invalid JSON: ${(e as Error).message}`, room, userId);\n        }\n      },\n    },\n    [Command.Raw]: {\n      name: Command.Raw,\n      description: '[Dev only] Send any raw event. Usage: /raw <type> <json> [-s stateKey]',\n      exe: async (payload) => {\n        const userId = mx.getSafeUserId();\n\n        if (!developerTools) {\n          sendFeedback('Command available in Developer Mode only.', room, userId);\n          return;\n        }\n\n        const [mainPayload, flags] = splitPayloadContentAndFlags(payload);\n        const flagMap = parseFlags(flags);\n        const stateKey = flagMap.s;\n        const parts = mainPayload.trim().split(/\\s+/);\n        const eventType = parts[0] ?? '';\n        const jsonString = mainPayload.trim().substring(eventType.length).trim();\n\n        if (!eventType || !jsonString) {\n          sendFeedback('Usage: /rawevent <type> <json> [-s stateKey]', room, userId);\n          return;\n        }\n\n        try {\n          const content = JSON.parse(jsonString);\n\n          if (typeof stateKey === 'string') {\n            await mx.sendStateEvent(\n              room.roomId,\n              eventType as Parameters<typeof mx.sendStateEvent>[1],\n              content,\n              stateKey\n            );\n            sendFeedback(\n              `State event \"${eventType}\" sent with state key \"${stateKey}\".`,\n              room,\n              userId\n            );\n          } else {\n            await mx.sendEvent(\n              room.roomId,\n              eventType as unknown as Parameters<typeof mx.sendEvent>[2],\n              content\n            );\n            sendFeedback(`Event \"${eventType}\" sent.`, room, userId);\n          }\n        } catch (e: unknown) {\n          sendFeedback(`Error: ${(e as Error).message}`, room, userId);\n        }\n      },\n    },\n    [Command.RawAcc]: {\n      name: Command.RawAcc,\n      description: '[Dev only] Merge global account data. Usage: /rawacc <type> <json>',\n      exe: async (payload) => {\n        const userId = mx.getSafeUserId();\n\n        if (!developerTools) {\n          sendFeedback('Command available in Developer Mode only.', room, userId);\n          return;\n        }\n\n        const trimmed = payload.trim();\n        const firstSpaceIndex = trimmed.indexOf(' ');\n        if (firstSpaceIndex === -1) {\n          sendFeedback('Usage: /rawacc <type> <json>', room, userId);\n          return;\n        }\n\n        const type = trimmed.substring(0, firstSpaceIndex);\n        const jsonString = trimmed.substring(firstSpaceIndex).trim();\n\n        try {\n          const newContent = JSON.parse(jsonString);\n\n          const existingEvent = mx.getAccountData(type as Parameters<typeof mx.getAccountData>[0]);\n          const existingContent = existingEvent ? existingEvent.getContent() : {};\n\n          const mergedContent = { ...existingContent, ...newContent };\n\n          await mx.setAccountData(type as Parameters<typeof mx.setAccountData>[0], mergedContent);\n          sendFeedback(`Account data \"${type}\" merged successfully.`, room, userId);\n        } catch (e: unknown) {\n          sendFeedback(`Error: ${(e as Error).message}`, room, userId);\n        }\n      },\n    },\n    [Command.DelAcc]: {\n      name: Command.DelAcc,\n      description: '[Dev Only] Remove a key from account data. Usage: /delacc <type> <key>',\n      exe: async (payload) => {\n        const userId = mx.getSafeUserId();\n        const parts = payload.trim().split(/\\s+/);\n        if (parts.length < 2) {\n          sendFeedback('Usage: /delacc <type> <key>', room, userId);\n          return;\n        }\n        const [type, key] = parts;\n        try {\n          const existingEvent = mx.getAccountData(type as Parameters<typeof mx.getAccountData>[0]);\n          if (!existingEvent) {\n            sendFeedback(`No account data found for type \"${type}\".`, room, userId);\n            return;\n          }\n          if (!key) {\n            sendFeedback(`Key \"${key}\" not found in \"${type}\".`, room, userId);\n            return;\n          }\n          const content = { ...existingEvent?.getContent() };\n          if (!(key in content)) {\n            sendFeedback(`Key \"${key}\" not found in \"${type}\".`, room, userId);\n            return;\n          }\n          delete content[key as keyof typeof content];\n          await mx.setAccountData(\n            type as Parameters<typeof mx.setAccountData>[0],\n            content as Parameters<typeof mx.setAccountData>[1]\n          );\n          sendFeedback(`Key \"${key}\" removed from \"${type}\".`, room, userId);\n        } catch (e: unknown) {\n          sendFeedback(`Error: ${(e as Error).message}`, room, userId);\n        }\n      },\n    },\n    [Command.SetExt]: {\n      name: Command.SetExt,\n      description: '[Dev Only] Set an extended profile property. Usage: /setext <key> <value>',\n      exe: async (payload) => {\n        const userId = mx.getSafeUserId();\n        if (!developerTools) {\n          sendFeedback('Command available in Developer Mode only.', room, userId);\n          return;\n        }\n        const parts = payload.trim().split(/\\s+/);\n        if (parts.length < 2) {\n          sendFeedback('Usage: /setext <key> <value>', room, userId);\n          return;\n        }\n        const key = parts[0];\n        const value = parts.slice(1).join(' ');\n        let finalValue: string | number | boolean = value;\n        if (value === 'true') finalValue = true;\n        else if (value === 'false') finalValue = false;\n        else if (!Number.isNaN(Number(value)) && value.trim() !== '') finalValue = Number(value);\n        try {\n          if (typeof mx.setExtendedProfileProperty === 'function') {\n            await mx.setExtendedProfileProperty(key ?? '', finalValue);\n            sendFeedback(`Extended profile property \"${key}\" set to: ${finalValue}`, room, userId);\n          } else {\n            sendFeedback('Error: setExtendedProfileProperty is not supported.', room, userId);\n          }\n        } catch (e: unknown) {\n          sendFeedback(`Failed to set extended profile: ${(e as Error).message}`, room, userId);\n        }\n      },\n    },\n    [Command.DelExt]: {\n      name: Command.DelExt,\n      description: '[Dev Only] Remove an extended profile property. Usage: /delext <key>',\n      exe: async (payload) => {\n        const userId = mx.getSafeUserId();\n        const key = payload.trim();\n\n        if (!developerTools) {\n          sendFeedback('Command available in Developer Mode only.', room, userId);\n          return;\n        }\n\n        if (!key) {\n          sendFeedback('Usage: /delext <key>', room, userId);\n          return;\n        }\n\n        try {\n          if (typeof mx.deleteExtendedProfileProperty === 'function') {\n            await mx.deleteExtendedProfileProperty(key);\n            sendFeedback(`Extended profile property \"${key}\" removed.`, room, userId);\n          } else {\n            sendFeedback('Error: setExtendedProfileProperty is not supported.', room, userId);\n          }\n        } catch (e: unknown) {\n          sendFeedback(`Failed to remove property: ${(e as Error).message}`, room, userId);\n        }\n      },\n    },\n    [Command.DiscardSession]: {\n      name: Command.DiscardSession,\n      description: 'Force discard the current outbound E2EE session in this room.',\n      exe: async () => {\n        const userId = mx.getSafeUserId();\n\n        try {\n          const crypto = mx.getCrypto();\n          if (!crypto) {\n            sendFeedback('Encryption is not enabled on this client.', room, userId);\n            return;\n          }\n          await crypto.forceDiscardSession(room.roomId);\n          sendFeedback('Outbound encryption session discarded.', room, userId);\n        } catch (e: unknown) {\n          sendFeedback(`Failed to discard session: ${(e as Error).message}`, room, userId);\n        }\n      },\n    },\n    [Command.Html]: {\n      name: Command.Html,\n      description:\n        'Send a message with HTML content. Example: /html <span data-mx-color=\"#ff0000\">Red</span>',\n      exe: async (payload) => {\n        await mx.sendMessage(room.roomId, {\n          msgtype: MsgType.Text,\n          body: payload\n            .replaceAll('<br>', '\\n')\n            .replaceAll('<li>', '\\n- ')\n            .replaceAll(\n              /<a(.*?)href=\"(?<link>(.*?))\"(.*?)>(?<text>(.*?))<\\/a>/g,\n              '[$<text>]($<link>)'\n            )\n            .replaceAll(/<[^>]*>/g, ''),\n          format: 'org.matrix.custom.html',\n          formatted_body: payload,\n        });\n      },\n    },\n  };\n};\n","import type { RoomMessageEventContent } from '$types/matrix-sdk';\nimport { MatrixError, MsgType } from '$types/matrix-sdk';\nimport { sendFeedback } from '$utils/sendFeedbackToUser';\nimport { CustomStateEvent } from '$types/matrix/room';\nimport { ErrorCode } from '../../cs-errorcode';\nimport { enrichWidgetUrl } from '../useRoomWidgets';\nimport type { LocationPoint } from '$features/room/location-modal/LocationDialog';\nimport { filterLocationString, LocationErrors } from '$features/room/location-modal/LocationDialog';\nimport type { CommandContext, CommandRecord } from './types';\nimport { Command } from './types';\n\nexport const createMiscCommands = (ctx: CommandContext): Partial<CommandRecord> => {\n  const { mx, room, enableMSC4268CMD, openBugReport } = ctx;\n  return {\n    [Command.AddWidget]: {\n      name: Command.AddWidget,\n      description: 'Add a widget to this room. Usage: /addwidget <url> [name]',\n      exe: async (payload) => {\n        const userId = mx.getSafeUserId();\n\n        const parts = payload.trim().split(/\\s+/);\n        const url = parts[0];\n        const name = parts.slice(1).join(' ') || 'Widget';\n\n        if (!url) {\n          sendFeedback('Usage: /addwidget <url> [name]', room, userId);\n          return;\n        }\n\n        let parsedUrl: URL;\n        try {\n          parsedUrl = new URL(url);\n        } catch {\n          sendFeedback('Invalid URL. Please provide a valid widget URL.', room, userId);\n          return;\n        }\n\n        try {\n          const widgetId = `${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n          await mx.sendStateEvent(\n            room.roomId,\n            CustomStateEvent.RoomWidget,\n            {\n              type: 'm.custom',\n              url: enrichWidgetUrl(parsedUrl.toString()),\n              name,\n              id: widgetId,\n              creatorUserId: userId,\n            },\n            widgetId\n          );\n          sendFeedback(`Widget \"${name}\" added.`, room, userId);\n        } catch (e: unknown) {\n          if (e instanceof MatrixError && e.errcode === ErrorCode.M_FORBIDDEN) {\n            sendFeedback(\n              'Permission denied. You need permission to manage widgets in this room.',\n              room,\n              userId\n            );\n          } else {\n            sendFeedback(\n              `Failed to add widget: ${(e as Error).message || 'Unknown error'}`,\n              room,\n              userId\n            );\n          }\n        }\n      },\n    },\n    [Command.Report]: {\n      name: Command.Report,\n      description: 'Report a bug or request a feature',\n      exe: async () => {\n        openBugReport();\n      },\n    },\n    [Command.ShareE2EEHistory]: {\n      name: Command.ShareE2EEHistory,\n      description:\n        'Share E2EE history (MSC4268) of this room with a user. Example: /sharee2eehistory @user:example.org',\n      exe: async (payload) => {\n        const targetUserId = payload.trim();\n        const { roomId } = room;\n        if (!enableMSC4268CMD) {\n          sendFeedback(\n            'This command is disabled. Enable it under experimental settings to use it.',\n            room,\n            mx.getSafeUserId()\n          );\n          return;\n        }\n        if (!targetUserId) {\n          sendFeedback('Usage: /sharee2eehistory @user:example.org', room, mx.getSafeUserId());\n          return;\n        }\n        const crypto = mx.getCrypto();\n        if (!crypto) {\n          sendFeedback('Encryption is not enabled on this client.', room, mx.getSafeUserId());\n          return;\n        }\n        (\n          crypto as unknown as {\n            shareRoomHistoryWithUser: (roomId: string, userId: string) => Promise<void>;\n          }\n        )\n          .shareRoomHistoryWithUser(roomId, targetUserId)\n          .then(() => {\n            sendFeedback(\n              `E2EE history shared with ${targetUserId}. (Their client needs to support MSC4268)`,\n              room,\n              mx.getSafeUserId()\n            );\n          })\n          .catch((e: Error) => {\n            sendFeedback(\n              `Failed to share E2EE history: ${(e as Error).message}`,\n              room,\n              mx.getSafeUserId()\n            );\n          });\n      },\n    },\n    [Command.Location]: {\n      name: Command.Location,\n      description:\n        'Open location sharing menu or share a location as /location <latitude> <longitude>',\n      exe: async (payload) => {\n        const coords: LocationPoint = filterLocationString(payload);\n        if (!coords.lat || !coords.lon || coords.status !== LocationErrors.none) {\n          sendFeedback(\n            'You need to specify a latitude, and a longitude parameter, as for example: /location 43.959971 -59.790623 or have nothing after the /location to open the map to click which location to share',\n            room,\n            mx.getSafeUserId()\n          );\n          return;\n        }\n\n        const mlat = coords.lat;\n        const mlon = coords.lon;\n\n        if (mlat && mlon)\n          await mx.sendMessage(room.roomId, {\n            msgtype: MsgType.Location,\n            geo_uri: `geo:${mlat},${mlon};u=0`,\n            body: `https://www.openstreetmap.org/?mlat=${mlat}&mlon=${mlon}#map=16/${mlat}/${mlon}\"`,\n          } as RoomMessageEventContent);\n      },\n    },\n    [Command.ShareMyLocation]: {\n      name: Command.ShareMyLocation,\n      description:\n        'Share current location. Requires your browser to have location permissions. Add the flag --accurate or -a for enabling the high accuracy option',\n      exe: async (payload) => {\n        const target = payload.trim();\n        const options = {\n          enableHighAccuracy:\n            target === '--accurate' ||\n            target === '-a' ||\n            target === '--high-accuracy' ||\n            target === '-h',\n          timeout: 5000,\n          maximumAge: 0,\n        };\n        function success(pos: GeolocationPosition) {\n          const crd = pos.coords;\n\n          const mlat = crd.latitude;\n          const mlon = crd.longitude;\n          const malt = crd.altitude;\n          if (!mlat || !mlon) {\n            sendFeedback(\n              'Unable to retrieve the location data for an unknown reason',\n              room,\n              mx.getSafeUserId()\n            );\n            return;\n          }\n          mx.sendMessage(room.roomId, {\n            msgtype: MsgType.Location,\n            geo_uri: `geo:${mlat},${mlon}${malt ? `,${malt}` : ''};u=0`,\n            body: `https://www.openstreetmap.org/?mlat=${mlat}&mlon=${mlon}#map=16/${mlat}/${mlon}\"`,\n          } as unknown as RoomMessageEventContent);\n        }\n\n        function error(err: GeolocationPositionError) {\n          let response = `Unable to retrieve the location data, Error no. ${err.code}: ${err.message}`;\n          if (err.code === 1) response = 'You have denied Sable access to you location services.';\n          if (err.code === 2)\n            response = 'Your device does not have a gps module, or it may not be turned on.';\n          sendFeedback(response, room, mx.getSafeUserId());\n        }\n        navigator.geolocation.getCurrentPosition(success, error, options);\n      },\n    },\n    [Command.Poll]: {\n      name: Command.Poll,\n      description: 'Create a poll',\n      exe: async () => {\n        return;\n      },\n    },\n  };\n};\n","import type { MatrixClient, Room } from '$types/matrix-sdk';\nimport { useCallback, useMemo } from 'react';\n\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useOpenShallowRoute } from '$pages/client/useShallowRoute';\nimport { getBugReportPath } from '$pages/pathUtils';\nimport { PKitCommandMessageHandler } from '$plugins/pluralkit-handler/PKitCommandMessageHandler';\nimport { useRoomNavigate } from './useRoomNavigate';\nimport { useUserProfile } from './useUserProfile';\n\nimport type { CommandContext, CommandRecord } from './commands/types';\nimport { createFunCommands } from './commands/fun';\nimport { createMembershipCommands } from './commands/membership';\nimport { createModerationCommands } from './commands/moderation';\nimport { createProfileCommands } from './commands/profile';\nimport { createPmpCommands } from './commands/pmp';\nimport { createRainbowCommands } from './commands/rainbow';\nimport { createRawCommands } from './commands/raw';\nimport { createMiscCommands } from './commands/misc';\n\nexport type { CommandExe, CommandContent, CommandRecord } from './commands/types';\nexport { Command } from './commands/types';\nexport { SHRUG, TABLEFLIP, UNFLIP } from './commands/fun';\n\nexport const useCommands = (mx: MatrixClient, room: Room): CommandRecord => {\n  const { navigateRoom } = useRoomNavigate();\n  const [developerTools] = useSetting(settingsAtom, 'developerTools');\n  const [enableMSC4268CMD] = useSetting(settingsAtom, 'enableMSC4268CMD');\n  // helper for pkit commands\n  const pkitcmdHandler = useMemo(() => new PKitCommandMessageHandler(mx, room), [mx, room]);\n  const profile = useUserProfile(mx.getSafeUserId());\n  const openShallowRoute = useOpenShallowRoute();\n  const openBugReport = useCallback(() => openShallowRoute(getBugReportPath()), [openShallowRoute]);\n\n  const commands: CommandRecord = useMemo(() => {\n    const ctx: CommandContext = {\n      mx,\n      room,\n      navigateRoom,\n      profileDisplayName: profile.displayName,\n      pkitcmdHandler,\n      developerTools,\n      enableMSC4268CMD,\n      openBugReport,\n    };\n\n    return {\n      ...createFunCommands(ctx),\n      ...createMembershipCommands(ctx),\n      ...createModerationCommands(ctx),\n      ...createProfileCommands(ctx),\n      ...createPmpCommands(ctx),\n      ...createRainbowCommands(ctx),\n      ...createRawCommands(ctx),\n      ...createMiscCommands(ctx),\n    } as CommandRecord;\n  }, [\n    mx,\n    navigateRoom,\n    room,\n    profile.displayName,\n    pkitcmdHandler,\n    developerTools,\n    enableMSC4268CMD,\n    openBugReport,\n  ]);\n\n  return commands;\n};\n","import type { Room } from '$types/matrix-sdk';\nimport { useMemo } from 'react';\nimport { getAllParents } from '$utils/room/hierarchy';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport const useImagePackRooms = (\n  roomId: string,\n  roomToParents: Map<string, Set<string>>\n): Room[] => {\n  const mx = useMatrixClient();\n\n  const imagePackRooms: Room[] = useMemo(() => {\n    const allParentSpaces = [roomId].concat(Array.from(getAllParents(roomToParents, roomId)));\n    return allParentSpaces.reduce<Room[]>((list, rId) => {\n      const r = mx.getRoom(rId);\n      if (r) list.push(r);\n      return list;\n    }, []);\n  }, [mx, roomId, roomToParents]);\n\n  return imagePackRooms;\n};\n","import { createKeyedQueue } from '$utils/keyedQueue';\nimport type { MatrixClient } from '$types/matrix-sdk';\n\nconst runQueued = createKeyedQueue();\n\n/** Serializes delayed-event mutations per account and room. */\nexport const roomScheduleCoordinator = {\n  run<T>(\n    mx: Pick<MatrixClient, 'getSafeUserId'>,\n    roomId: string,\n    operation: () => T | PromiseLike<T>\n  ): Promise<T> {\n    return runQueued(`${mx.getSafeUserId()}\\0${roomId}`, operation);\n  },\n};\n","import type { ReactNode } from 'react';\nimport { Header, Menu } from 'folds';\nimport { BaseAutocompleteMenu } from './BaseAutocompleteMenu';\nimport * as css from './AutocompleteMenu.css';\n\ntype AutocompleteNoticeProps = {\n  children: ReactNode;\n};\nexport function AutocompleteNotice({ children }: AutocompleteNoticeProps) {\n  return (\n    <BaseAutocompleteMenu>\n      <Menu className={css.AutocompleteMenu}>\n        <Header className={css.AutocompleteNotice} size=\"400\">\n          {children}\n        </Header>\n      </Menu>\n    </BaseAutocompleteMenu>\n  );\n}\n","const safariPreferredCodecs = [\n  // Safari works best with MP4/AAC but fails when strict codecs are defined on iOS.\n  // Prioritize the plain container to avoid NotSupportedError during MediaRecorder initialization.\n  'audio/mp4',\n  'audio/mp4;codecs=mp4a.40.2',\n  'audio/mp4;codecs=mp4a.40.5',\n  'audio/mp4;codecs=aac',\n  'audio/aac',\n  // Fallbacks\n  'audio/wav;codecs=1',\n  'audio/wav',\n  'audio/mpeg',\n];\n\nconst defaultPreferredCodecs = [\n  // Firefox: ogg produces seekable blobs; webm passes isTypeSupported() but\n  // records without a cue index so currentTime assignment silently fails.\n  // Must come before webm so Firefox picks ogg.\n  'audio/ogg;codecs=opus',\n  'audio/ogg',\n  // Chromium: webm is seekable and preferred. Since Chromium doesn't support\n  // ogg recording, it will skip the above and land here.\n  'audio/webm;codecs=opus',\n  'audio/webm',\n  // Fallbacks\n  'audio/ogg;codecs=vorbis',\n  'audio/wav;codecs=1',\n  'audio/wav',\n  'audio/mpeg',\n  // Keep MP4/AAC as late fallback for non-Safari browsers.\n  'audio/mp4;codecs=mp4a.40.2',\n  'audio/mp4;codecs=mp4a.40.5',\n  'audio/mp4;codecs=aac',\n  'audio/mp4',\n  'audio/aac',\n  'audio/ogg;codecs=speex',\n  'audio/webm;codecs=vorbis',\n];\n\n/**\n * Checks for supported audio codecs in the current browser and returns the first supported codec.\n * If no supported codec is found, it returns null.\n */\nexport function getSupportedAudioCodec(): string | null {\n  if (!('MediaRecorder' in globalThis) || !globalThis.MediaRecorder) {\n    return null;\n  }\n\n  const userAgent = globalThis.navigator?.userAgent ?? '';\n  const isIOS =\n    /iPad|iPhone|iPod/.test(userAgent) ||\n    (globalThis.navigator?.platform === 'MacIntel' && globalThis.navigator?.maxTouchPoints > 1);\n  const isSafari = /^((?!chrome|android|crios|fxios|edgios).)*safari/i.test(userAgent) || isIOS;\n\n  const preferredCodecs = isSafari ? safariPreferredCodecs : defaultPreferredCodecs;\n  const supportedCodec = preferredCodecs.find((codec) => MediaRecorder.isTypeSupported(codec));\n  return supportedCodec || null;\n}\n\n/**\n * Returns the appropriate file extension for a given audio codec.\n * This is used to ensure that the recorded audio file has the correct extension based on the codec used for recording.\n */\nexport function getSupportedAudioExtension(codec: string): string {\n  const baseType = codec.split(';')[0]?.trim() ?? codec;\n  switch (baseType) {\n    case 'audio/ogg':\n      return 'ogg';\n    case 'audio/webm':\n      return 'webm';\n    case 'audio/mp4':\n      return 'm4a';\n    case 'audio/mpeg':\n      return 'mp3';\n    case 'audio/wav':\n      return 'wav';\n    case 'audio/aac':\n      return 'aac';\n    default:\n      return 'dat'; // default extension for unknown codecs\n  }\n}\n","import type { MutableRefObject } from 'react';\nimport type { Icon } from '@phosphor-icons/react';\nimport {\n  GridFour,\n  Image as ImageIcon,\n  ListBullets,\n  MapPinPlusIcon,\n  PlusCircle,\n} from '$components/icons/phosphor';\nimport * as css from './AttachmentContent.css';\nimport { useMobileSheetClose } from '$components/MobileSwipeDownModal';\n\ninterface AttachmentAction {\n  icon: Icon;\n  label: string;\n  onClick: () => void;\n}\n\nexport interface AttachmentContentProps {\n  onPickPhotos: () => void;\n  onPickFile: () => void;\n  onPickPoll: () => void;\n  onPickLocation: () => void;\n  skipReturnFocusRef: MutableRefObject<boolean>;\n}\n\nexport function AttachmentContent({\n  onPickPhotos,\n  onPickFile,\n  onPickPoll,\n  onPickLocation,\n  skipReturnFocusRef,\n}: AttachmentContentProps) {\n  const mobileSheetClose = useMobileSheetClose();\n  const actions: AttachmentAction[] = [\n    { icon: PlusCircle, label: 'Add File', onClick: onPickFile },\n    { icon: ListBullets, label: 'Create Poll', onClick: onPickPoll },\n    { icon: MapPinPlusIcon, label: 'Add Location', onClick: onPickLocation },\n  ];\n\n  const handleAction = (action: () => void) => {\n    skipReturnFocusRef.current = true;\n    action();\n    mobileSheetClose?.();\n  };\n\n  return (\n    <div className={css.Sheet}>\n      <div className={css.SheetHeader}>\n        <h2 id=\"attachment-sheet-title\" className={css.Heading}>\n          Share\n        </h2>\n      </div>\n\n      <div className={css.GallerySection}>\n        <button\n          type=\"button\"\n          className={css.GalleryButton}\n          onClick={() => handleAction(onPickPhotos)}\n          data-gestures=\"ignore\"\n          aria-label=\"Open photo gallery\"\n        >\n          <div className={css.GalleryIcon} aria-hidden=\"true\">\n            <ImageIcon size={28} weight=\"regular\" />\n          </div>\n          <span className={css.GalleryCopy}>\n            <span className={css.GalleryTitle}>Photos</span>\n            <span className={css.GalleryLabel}>Choose from your device</span>\n          </span>\n          <div className={css.GalleryGrid} aria-hidden=\"true\">\n            <GridFour size={22} weight=\"regular\" />\n          </div>\n        </button>\n      </div>\n\n      <div className={css.ActionsRow}>\n        {actions.map((action) => (\n          <button\n            key={action.label}\n            type=\"button\"\n            className={css.ActionButton}\n            onClick={() => handleAction(action.onClick)}\n            data-gestures=\"ignore\"\n            aria-label={action.label}\n          >\n            <span className={css.ActionIcon} aria-hidden=\"true\">\n              <action.icon size={26} weight=\"regular\" />\n            </span>\n            <span className={css.ActionLabel}>{action.label}</span>\n          </button>\n        ))}\n      </div>\n    </div>\n  );\n}\n","import type { MouseEventHandler } from 'react';\nimport { useState } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { CaretDown, chipIcon, composerIcon, X } from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport type { RectCords } from 'folds';\nimport { Dialog, Header, config, Box, Text, IconButton, color, Button, Chip } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { stopPropagation } from '$utils/keyboard';\nimport { timeDayMonthYear, timeHourMinute, hoursToMs, daysToMs } from '$utils/time';\nimport { DatePicker, TimePicker } from '$components/time-date';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { serverMaxDelayMsAtom } from '$state/scheduledMessages';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\ntype SchedulePickerDialogProps = {\n  initialTime?: number;\n  showEncryptionWarning?: boolean;\n  onCancel: () => void;\n  onSubmit: (scheduledDate: Date) => void;\n};\n\nexport function SchedulePickerDialog({\n  initialTime,\n  showEncryptionWarning,\n  onCancel,\n  onSubmit,\n}: SchedulePickerDialogProps) {\n  const now = Date.now();\n  const serverMaxDelayMs = useAtomValue(serverMaxDelayMsAtom);\n  const maxDelay = serverMaxDelayMs ?? daysToMs(30);\n  const maxDays = Math.round(maxDelay / daysToMs(1));\n  const defaultTs = initialTime ?? now + hoursToMs(1);\n  const [ts, setTs] = useState(() => Math.max(defaultTs, now + 60000));\n  const [error, setError] = useState<string>();\n\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n  const [timePickerCords, setTimePickerCords] = useState<RectCords>();\n  const [datePickerCords, setDatePickerCords] = useState<RectCords>();\n\n  const handleTimePicker: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setTimePickerCords(evt.currentTarget.getBoundingClientRect());\n  };\n  const handleDatePicker: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setDatePickerCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const handlePreset = (offsetMs: number) => {\n    setTs(Date.now() + offsetMs);\n    setError(undefined);\n  };\n\n  const handleSubmit = () => {\n    const delay = ts - Date.now();\n    if (delay <= 0) {\n      setError('Scheduled time must be in the future');\n      return;\n    }\n    if (delay > maxDelay) {\n      setError(`Cannot schedule more than ${maxDays} day${maxDays !== 1 ? 's' : ''} in advance`);\n      return;\n    }\n    setError(undefined);\n    onSubmit(new Date(ts));\n  };\n\n  const isPast = ts <= now;\n\n  return (\n    <ModalOverlay requestClose={onCancel}>\n      <Dialog variant=\"Surface\">\n        <Header\n          style={{\n            padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n            borderBottomWidth: config.borderWidth.B300,\n          }}\n          variant=\"Surface\"\n          size=\"500\"\n        >\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">Schedule Send</Text>\n          </Box>\n          <IconButton\n            size=\"300\"\n            onClick={onCancel}\n            radii=\"300\"\n            title=\"Cancel scheduling\"\n            aria-label=\"Cancel scheduling\"\n          >\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        <Box direction=\"Column\" gap=\"500\" style={{ padding: config.space.S400 }}>\n          <Box direction=\"Row\" gap=\"300\">\n            <Box direction=\"Column\" gap=\"100\">\n              <Text size=\"L400\" priority=\"400\">\n                Time\n              </Text>\n              <Box gap=\"100\" alignItems=\"Center\">\n                <Chip\n                  size=\"500\"\n                  variant=\"Surface\"\n                  fill=\"None\"\n                  outlined\n                  radii=\"300\"\n                  aria-pressed={!!timePickerCords}\n                  after={chipIcon(CaretDown)}\n                  onClick={handleTimePicker}\n                >\n                  <Text size=\"B300\">{timeHourMinute(ts, hour24Clock)}</Text>\n                </Chip>\n                <PopOut\n                  anchor={timePickerCords}\n                  offset={5}\n                  position=\"Bottom\"\n                  align=\"Center\"\n                  content={\n                    <FocusTrap\n                      focusTrapOptions={{\n                        initialFocus: false,\n                        onDeactivate: () => setTimePickerCords(undefined),\n                        clickOutsideDeactivates: true,\n                        isKeyForward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n                        isKeyBackward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n                        escapeDeactivates: stopPropagation,\n                      }}\n                    >\n                      <TimePicker min={now} max={now + maxDelay} value={ts} onChange={setTs} />\n                    </FocusTrap>\n                  }\n                />\n              </Box>\n            </Box>\n            <Box direction=\"Column\" gap=\"100\">\n              <Text size=\"L400\" priority=\"400\">\n                Date\n              </Text>\n              <Box gap=\"100\" alignItems=\"Center\">\n                <Chip\n                  size=\"500\"\n                  variant=\"Surface\"\n                  fill=\"None\"\n                  outlined\n                  radii=\"300\"\n                  aria-pressed={!!datePickerCords}\n                  after={chipIcon(CaretDown)}\n                  onClick={handleDatePicker}\n                >\n                  <Text size=\"B300\">{timeDayMonthYear(ts)}</Text>\n                </Chip>\n                <PopOut\n                  anchor={datePickerCords}\n                  offset={5}\n                  position=\"Bottom\"\n                  align=\"Center\"\n                  content={\n                    <FocusTrap\n                      focusTrapOptions={{\n                        initialFocus: false,\n                        onDeactivate: () => setDatePickerCords(undefined),\n                        clickOutsideDeactivates: true,\n                        isKeyForward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n                        isKeyBackward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n                        escapeDeactivates: stopPropagation,\n                      }}\n                    >\n                      <DatePicker min={now} max={now + maxDelay} value={ts} onChange={setTs} />\n                    </FocusTrap>\n                  }\n                />\n              </Box>\n            </Box>\n          </Box>\n          <Box direction=\"Column\" gap=\"100\">\n            <Text size=\"L400\">Quick Schedule</Text>\n            <Box gap=\"200\" wrap=\"Wrap\">\n              <Chip\n                variant=\"SurfaceVariant\"\n                radii=\"Pill\"\n                onClick={() => handlePreset(hoursToMs(1))}\n              >\n                <Text size=\"B300\">In 1 hour</Text>\n              </Chip>\n              <Chip\n                variant=\"SurfaceVariant\"\n                radii=\"Pill\"\n                onClick={() => handlePreset(hoursToMs(4))}\n              >\n                <Text size=\"B300\">In 4 hours</Text>\n              </Chip>\n              <Chip\n                variant=\"SurfaceVariant\"\n                radii=\"Pill\"\n                onClick={() => {\n                  const tomorrow = new Date();\n                  tomorrow.setDate(tomorrow.getDate() + 1);\n                  tomorrow.setHours(9, 0, 0, 0);\n                  setTs(tomorrow.getTime());\n                  setError(undefined);\n                }}\n              >\n                <Text size=\"B300\">Tomorrow 9 AM</Text>\n              </Chip>\n              <Chip\n                variant=\"SurfaceVariant\"\n                radii=\"Pill\"\n                onClick={() => {\n                  const tomorrow = new Date();\n                  tomorrow.setDate(tomorrow.getDate() + 1);\n                  tomorrow.setHours(14, 0, 0, 0);\n                  setTs(tomorrow.getTime());\n                  setError(undefined);\n                }}\n              >\n                <Text size=\"B300\">Tomorrow 2 PM</Text>\n              </Chip>\n            </Box>\n          </Box>\n          {showEncryptionWarning && (\n            <Text size=\"T300\" priority=\"400\">\n              Note: This message will be encrypted with current room keys. Devices that join or are\n              added after scheduling may not be able to decrypt it.\n            </Text>\n          )}\n          {(error || isPast) && (\n            <Text style={{ color: color.Critical.Main }} size=\"T300\">\n              {error || 'Selected time is in the past'}\n            </Text>\n          )}\n          <Button\n            type=\"submit\"\n            variant=\"Primary\"\n            aria-disabled={isPast}\n            onClick={handleSubmit}\n            title=\"Schedule Send\"\n            aria-label=\"Schedule send\"\n          >\n            <Text size=\"B400\">Schedule Send</Text>\n          </Button>\n        </Box>\n      </Dialog>\n    </ModalOverlay>\n  );\n}\n","import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { Box, Text, Chip, IconButton, Spinner } from 'folds';\nimport {\n  CaretDown,\n  CaretUp,\n  chipIcon,\n  Clock,\n  Lock,\n  PencilSimple,\n  X,\n} from '$components/icons/phosphor';\nimport type { Room } from '$types/matrix-sdk';\nimport { EventType, MatrixEvent } from '$types/matrix-sdk';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport {\n  getDelayedEvents,\n  cancelDelayedEvent,\n  type DelayedEventsResponse,\n} from '$utils/delayedEvents';\nimport {\n  delayedEventsSupportedAtom,\n  getScheduledMessageStateKey,\n  roomIdToScheduledTimeAtomFamily,\n  roomIdToEditingScheduledDelayIdAtomFamily,\n} from '$state/scheduledMessages';\nimport { timeHourMinute, timeDayMonthYear } from '$utils/time';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { roomScheduleCoordinator } from '$state/room/roomScheduleCoordinator';\nimport { MessagePreview, useRoomMessagePreviewRenderer } from '$components/message-preview';\nimport { SchedulePickerDialog } from './SchedulePickerDialog';\nimport * as css from './ScheduledMessagesList.css';\n\ntype ScheduledMessagesListProps = {\n  room: Room;\n  onEditMessage?: (body: string, formattedBody?: string) => void;\n};\n\ntype ScheduledEvent = DelayedEventsResponse['delayed_events'][number];\n\ntype ScheduledMessageRowProps = {\n  room: Room;\n  event: ScheduledEvent;\n  hour24Clock: boolean;\n  onEdit: (delayId: string, body: string, formattedBody?: string, scheduledTs?: number) => void;\n  onCancel: (delayId: string) => void;\n  cancellationState: CancellationState;\n};\n\ntype CancellationState = {\n  status: 'idle' | 'pending' | 'error';\n  error?: string;\n};\n\nfunction ScheduledMessageRow({\n  room,\n  event,\n  hour24Clock,\n  onEdit,\n  onCancel,\n  cancellationState,\n}: ScheduledMessageRowProps) {\n  const mx = useMatrixClient();\n  const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n  const renderContent = useRoomMessagePreviewRenderer(room);\n  const deliveryTs = 'delay' in event ? event.running_since + event.delay : event.running_since;\n  const isEncrypted = event.type === 'm.room.encrypted';\n  const body = !isEncrypted && typeof event.content.body === 'string' ? event.content.body : '';\n  const formattedBody =\n    !isEncrypted && typeof event.content.formatted_body === 'string'\n      ? event.content.formatted_body\n      : undefined;\n  const isCancelling = cancellationState.status === 'pending';\n  const cancelIcon = isCancelling ? <Spinner size=\"100\" /> : chipIcon(X);\n  const matrixEvent = useMemo(\n    () =>\n      new MatrixEvent({\n        type: event.type,\n        content: event.content,\n        room_id: room.roomId,\n        sender: mx.getSafeUserId(),\n        event_id: `$scheduled-${event.delay_id}`,\n        origin_server_ts: event.running_since,\n      }),\n    [event, mx, room.roomId]\n  );\n\n  return (\n    <Box className={css.ScheduledMessageRow} direction=\"Column\" gap=\"100\">\n      {isEncrypted ? (\n        <Box direction=\"Row\" gap=\"100\" alignItems=\"Center\">\n          {chipIcon(Lock)}\n          <Text size=\"T300\" priority=\"300\">\n            Encrypted — cancel and resend to edit\n          </Text>\n        </Box>\n      ) : (\n        <MessagePreview\n          room={room}\n          event={matrixEvent}\n          renderContent={renderContent}\n          actions={\n            <Box gap=\"100\" shrink=\"No\">\n              <IconButton\n                size=\"300\"\n                variant=\"SurfaceVariant\"\n                radii=\"300\"\n                onClick={() => onEdit(event.delay_id, body, formattedBody, deliveryTs)}\n                aria-label=\"Edit scheduled message\"\n              >\n                {chipIcon(PencilSimple)}\n              </IconButton>\n              <IconButton\n                size=\"300\"\n                variant=\"Critical\"\n                radii=\"300\"\n                onClick={() => onCancel(event.delay_id)}\n                disabled={isCancelling}\n                aria-busy={isCancelling}\n                aria-label=\"Cancel scheduled message\"\n              >\n                {cancelIcon}\n              </IconButton>\n            </Box>\n          }\n          hour24Clock={hour24Clock}\n          dateFormatString={dateFormatString}\n        />\n      )}\n      <Box justifyContent=\"SpaceBetween\" alignItems=\"Center\" gap=\"200\">\n        <Text size=\"T200\" priority=\"300\">\n          {timeDayMonthYear(deliveryTs)} at {timeHourMinute(deliveryTs, hour24Clock)}\n        </Text>\n        {isEncrypted && (\n          <IconButton\n            size=\"300\"\n            variant=\"Critical\"\n            radii=\"300\"\n            onClick={() => onCancel(event.delay_id)}\n            disabled={isCancelling}\n            aria-busy={isCancelling}\n            aria-label=\"Cancel scheduled message\"\n          >\n            {cancelIcon}\n          </IconButton>\n        )}\n      </Box>\n      {cancellationState.status === 'error' && (\n        <Text size=\"T200\" priority=\"300\" role=\"alert\" aria-live=\"polite\">\n          {cancellationState.error}\n        </Text>\n      )}\n    </Box>\n  );\n}\n\nexport function ScheduledMessagesList({ room, onEditMessage }: ScheduledMessagesListProps) {\n  const mx = useMatrixClient();\n  const queryClient = useQueryClient();\n  const supported = useAtomValue(delayedEventsSupportedAtom);\n  const scheduledStateKey = getScheduledMessageStateKey(mx.getSafeUserId(), room.roomId);\n  const setScheduledTime = useSetAtom(roomIdToScheduledTimeAtomFamily(scheduledStateKey));\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n  const [expanded, setExpanded] = useState(false);\n  const [editingDelayId, setEditingDelayId] = useAtom(\n    roomIdToEditingScheduledDelayIdAtomFamily(scheduledStateKey)\n  );\n  const [cancellationStates, setCancellationStates] = useState<Record<string, CancellationState>>(\n    {}\n  );\n  const pendingCancellations = useRef(new Set<string>());\n\n  const { data } = useQuery({\n    queryKey: ['delayedEvents', room.roomId],\n    queryFn: () => getDelayedEvents(mx),\n    refetchInterval: 30000,\n    enabled: supported,\n  });\n\n  const roomEvents = data?.delayed_events.filter(\n    (event) =>\n      event.room_id === room.roomId &&\n      (event.type === (EventType.RoomMessage as string) ||\n        event.type === (EventType.RoomMessageEncrypted as string))\n  );\n\n  const invalidateEvents = useCallback(() => {\n    queryClient.invalidateQueries({ queryKey: ['delayedEvents', room.roomId] });\n  }, [queryClient, room.roomId]);\n\n  const handleCancel = useCallback(\n    async (delayId: string) => {\n      if (pendingCancellations.current.has(delayId)) return;\n\n      pendingCancellations.current.add(delayId);\n      setCancellationStates((states) => ({\n        ...states,\n        [delayId]: { status: 'pending' },\n      }));\n\n      try {\n        await roomScheduleCoordinator.run(mx, room.roomId, () => cancelDelayedEvent(mx, delayId));\n        invalidateEvents();\n        setCancellationStates((states) => {\n          const next = { ...states };\n          delete next[delayId];\n          return next;\n        });\n      } catch {\n        setCancellationStates((states) => ({\n          ...states,\n          [delayId]: {\n            status: 'error',\n            error: 'Failed to cancel scheduled message. Try again.',\n          },\n        }));\n      } finally {\n        pendingCancellations.current.delete(delayId);\n      }\n    },\n    [mx, room.roomId, invalidateEvents]\n  );\n\n  const handleEdit = useCallback(\n    (delayId: string, body: string, formattedBody?: string, scheduledTs?: number) => {\n      onEditMessage?.(body, formattedBody);\n      if (scheduledTs) setScheduledTime(new Date(scheduledTs));\n      setEditingDelayId(delayId);\n    },\n    [onEditMessage, setScheduledTime, setEditingDelayId]\n  );\n\n  const handleReschedule = useCallback(\n    (scheduledDate: Date) => {\n      setScheduledTime(scheduledDate);\n      setEditingDelayId(null);\n    },\n    [setScheduledTime, setEditingDelayId]\n  );\n\n  const visibleEvents = roomEvents?.filter((event) => event.delay_id !== editingDelayId) ?? [];\n  if (!supported || visibleEvents.length === 0) return null;\n\n  return (\n    <Box direction=\"Column\">\n      <Box className={css.ScheduledMessagesToggle}>\n        <Chip\n          variant=\"SurfaceVariant\"\n          radii=\"Pill\"\n          before={chipIcon(Clock)}\n          after={chipIcon(expanded ? CaretUp : CaretDown)}\n          onClick={() => setExpanded(!expanded)}\n        >\n          <Text size=\"B300\">\n            {visibleEvents.length} scheduled {visibleEvents.length === 1 ? 'message' : 'messages'}\n          </Text>\n        </Chip>\n      </Box>\n      {expanded && (\n        <Box direction=\"Column\" className={css.ScheduledMessagesPanel}>\n          {visibleEvents.map((event) => (\n            <ScheduledMessageRow\n              key={event.delay_id}\n              room={room}\n              event={event}\n              hour24Clock={hour24Clock}\n              onEdit={handleEdit}\n              onCancel={handleCancel}\n              cancellationState={cancellationStates[event.delay_id] ?? { status: 'idle' }}\n            />\n          ))}\n        </Box>\n      )}\n      {editingDelayId && !onEditMessage && (\n        <SchedulePickerDialog\n          onCancel={() => setEditingDelayId(null)}\n          onSubmit={handleReschedule}\n        />\n      )}\n    </Box>\n  );\n}\n","import type { IContent, MatrixClient } from '$types/matrix-sdk';\nimport { MsgType } from '$types/matrix-sdk';\nimport to from 'await-to-js';\nimport type { IGalleryItem } from '$types/matrix/common';\nimport { GALLERY_MSGTYPE, type IThumbnailContent } from '$types/matrix/common';\nimport {\n  getImageFileUrl,\n  getThumbnail,\n  getThumbnailDimensions,\n  getVideoFileUrl,\n  loadImageElement,\n  loadVideoElement,\n} from '$utils/dom';\nimport {\n  encryptFile,\n  getImageInfo,\n  getThumbnailContent,\n  getVideoInfo,\n  uploadContentToServer,\n} from '$utils/matrix';\nimport { isImageMimeType, mimeTypeToExt } from '$utils/mimeTypes';\nimport type { TUploadItem } from '$state/room/roomInputDrafts';\nimport type { GifData } from '$components/emoji-board/types';\nimport { encodeBlurHashAsync } from '$utils/blurHash';\nimport { scaleYDimension } from '$utils/common';\nimport { createLogger } from '$utils/debug';\nimport { getProxiedGif, isAllowedGifMediaUrl } from '$utils/gifProviders';\nimport {\n  MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME,\n  MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME,\n} from '../../../unstable/prefixes';\n\nconst log = createLogger('msgContent');\n\nconst generateThumbnailContent = async (\n  mx: MatrixClient,\n  img: HTMLImageElement | HTMLVideoElement,\n  dimensions: [number, number],\n  encrypt: boolean\n): Promise<IThumbnailContent> => {\n  const thumbnail = await getThumbnail(img, ...dimensions);\n  if (!thumbnail) throw new Error('Can not create thumbnail!');\n  const encThumbData = encrypt ? await encryptFile(thumbnail) : undefined;\n  const thumbnailFile = encThumbData?.file ?? thumbnail;\n  if (!thumbnailFile) throw new Error('Can not create thumbnail!');\n\n  const data = await uploadContentToServer(mx, thumbnailFile);\n  const thumbMxc = data?.content_uri;\n  if (!thumbMxc) throw new Error('Failed when uploading thumbnail!');\n  const thumbnailContent = getThumbnailContent({\n    thumbnail: thumbnailFile,\n    encInfo: encThumbData?.encInfo,\n    mxc: thumbMxc,\n    width: dimensions[0],\n    height: dimensions[1],\n  });\n  return thumbnailContent;\n};\n\nexport const getImageMsgContent = async (\n  mx: MatrixClient,\n  item: TUploadItem,\n  mxc: string\n): Promise<IContent> => {\n  const { file, originalFile, encInfo, metadata } = item;\n  const imgUrl = getImageFileUrl(originalFile);\n  const content: IContent = {\n    msgtype: MsgType.Image,\n    filename: file.name,\n    body: file.name,\n    [MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME]: metadata.markedAsSpoiler,\n  };\n  try {\n    const [imgError, imgEl] = await to(loadImageElement(imgUrl));\n    if (imgError) log.warn('Failed to load image element:', imgError);\n\n    if (imgEl) {\n      const blurHash = await encodeBlurHashAsync(\n        imgEl,\n        512,\n        scaleYDimension(imgEl.width, 512, imgEl.height)\n      );\n\n      content.info = {\n        ...getImageInfo(imgEl, file),\n        [MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]: blurHash,\n      };\n    } else {\n      content.info = {\n        mimetype: originalFile.type,\n        size: originalFile.size,\n      };\n    }\n  } finally {\n    URL.revokeObjectURL(imgUrl);\n  }\n  if (encInfo) {\n    content.file = {\n      ...encInfo,\n      url: mxc,\n    };\n  } else {\n    content.url = mxc;\n  }\n  if (item.body && item.body.length > 0) content.body = item.body;\n  if (item.formatted_body && item.formatted_body.length > 0) {\n    content.format = 'org.matrix.custom.html';\n    content.formatted_body = item.formatted_body;\n  }\n  return content;\n};\n\nexport const getVideoMsgContent = async (\n  mx: MatrixClient,\n  item: TUploadItem,\n  mxc: string\n): Promise<IContent> => {\n  const { file, originalFile, encInfo, metadata } = item;\n\n  const videoUrl = getVideoFileUrl(originalFile);\n\n  const content: IContent = {\n    msgtype: MsgType.Video,\n    filename: file.name,\n    body: file.name,\n    [MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME]: metadata.markedAsSpoiler,\n  };\n  try {\n    const [videoError, videoEl] = await to(loadVideoElement(videoUrl));\n    if (videoError) log.warn('Failed to load video element:', videoError);\n\n    if (videoEl) {\n      const [thumbError, thumbContent] = await to(\n        generateThumbnailContent(\n          mx,\n          videoEl,\n          getThumbnailDimensions(videoEl.videoWidth, videoEl.videoHeight),\n          !!encInfo\n        )\n      );\n      if (thumbContent && thumbContent.thumbnail_info) {\n        thumbContent.thumbnail_info[MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME] =\n          await encodeBlurHashAsync(\n            videoEl,\n            512,\n            scaleYDimension(videoEl.videoWidth, 512, videoEl.videoHeight)\n          );\n      }\n      if (thumbError) log.warn('Failed to generate video thumbnail:', thumbError);\n      content.info = {\n        ...getVideoInfo(videoEl, file),\n        ...thumbContent,\n      };\n    }\n  } finally {\n    URL.revokeObjectURL(videoUrl);\n  }\n  if (encInfo) {\n    content.file = {\n      ...encInfo,\n      url: mxc,\n    };\n  } else {\n    content.url = mxc;\n  }\n  if (item.body && item.body.length > 0) content.body = item.body;\n  if (item.formatted_body && item.formatted_body.length > 0) {\n    content.format = 'org.matrix.custom.html';\n    content.formatted_body = item.formatted_body;\n  }\n  return content;\n};\n\nexport type AudioMsgContent = IContent & {\n  waveform?: number[];\n  audioLength?: number;\n};\n\nexport const getAudioMsgContent = (item: TUploadItem, mxc: string): AudioMsgContent => {\n  const { file, encInfo, metadata } = item;\n  const { waveform, audioDuration, markedAsSpoiler } = metadata;\n  const isVoice = waveform !== undefined && waveform.length > 0;\n  const fallbackBody = isVoice ? 'a voice message' : file.name;\n  let content: IContent = {\n    msgtype: MsgType.Audio,\n    filename: file.name,\n    body: item.body && item.body.length > 0 ? item.body : fallbackBody,\n    info: {\n      mimetype: file.type,\n      size: file.size,\n      duration: markedAsSpoiler || !audioDuration ? 0 : audioDuration * 1000,\n    },\n\n    // Element-compatible unstable extensible-event keys\n    'org.matrix.msc1767.audio': {\n      waveform: waveform?.map((v) => Math.round(v * 1024)),\n      duration: markedAsSpoiler || !audioDuration ? 0 : audioDuration * 1000,\n    },\n    'org.matrix.msc1767.text': item.body && item.body.length > 0 ? item.body : fallbackBody,\n    'org.matrix.msc3245.voice.v2': {\n      duration: markedAsSpoiler || !audioDuration ? 0 : audioDuration,\n      waveform: waveform?.map((v) => Math.round(v * 1024)),\n    },\n    // for element compat\n    'org.matrix.msc3245.voice': {},\n  };\n  if (encInfo) {\n    content.file = {\n      ...encInfo,\n      url: mxc,\n    };\n    content = {\n      ...content,\n\n      // Element-compatible unstable extensible-event keys\n      'org.matrix.msc1767.file': {\n        name: file.name,\n        mimetype: file.type,\n        size: file.size,\n        file: content.file,\n      },\n    };\n  } else {\n    content.url = mxc;\n    content = {\n      ...content,\n\n      // Element-compatible unstable extensible-event keys\n      'org.matrix.msc1767.file': {\n        name: file.name,\n        mimetype: file.type,\n        size: file.size,\n        url: content.url,\n      },\n    };\n  }\n  if (item.body && item.body.length > 0) content.body = item.body;\n  if (item.formatted_body && item.formatted_body.length > 0) {\n    content.format = 'org.matrix.custom.html';\n    content.formatted_body = item.formatted_body;\n  }\n  return content;\n};\n\nexport const getFileMsgContent = (item: TUploadItem, mxc: string): IContent => {\n  const { file, encInfo } = item;\n  const content: IContent = {\n    msgtype: MsgType.File,\n    filename: file.name,\n    body: file.name,\n    info: {\n      mimetype: file.type,\n      size: file.size,\n    },\n  };\n  if (encInfo) {\n    content.file = {\n      ...encInfo,\n      url: mxc,\n    };\n  } else {\n    content.url = mxc;\n  }\n  if (item.body && item.body.length > 0) content.body = item.body;\n  if (item.formatted_body && item.formatted_body.length > 0) {\n    content.format = 'org.matrix.custom.html';\n    content.formatted_body = item.formatted_body;\n  }\n  return content;\n};\n\nconst getGifBlurHash = async (gif: GifData): Promise<string | undefined> => {\n  const source =\n    gif.preview_url && isAllowedGifMediaUrl(gif.preview_url) ? gif.preview_url : gif.mediaUrl;\n  if (!isAllowedGifMediaUrl(source) || !gif.width || !gif.height) return undefined;\n\n  try {\n    const imgEl = await loadImageElement(source, 'anonymous');\n    return await encodeBlurHashAsync(imgEl, 32, scaleYDimension(gif.width, 32, gif.height));\n  } catch (e) {\n    log.warn('Failed to load GIF for blurhash:', e);\n    return undefined;\n  }\n};\n\nexport const getGifMsgContent = async (\n  gif: GifData,\n  options: { proxyUrl?: string; spoiler?: boolean }\n): Promise<IContent | undefined> => {\n  const proxied = gif.mediaUrl.startsWith('mxc://')\n    ? { mxcUrl: gif.mediaUrl, mimetype: gif.mimetype ?? 'image/gif' }\n    : getProxiedGif(gif, options.proxyUrl);\n  if (!proxied) return undefined;\n\n  const ext = mimeTypeToExt(proxied.mimetype);\n  const blurHash = await getGifBlurHash(gif);\n\n  return {\n    msgtype: MsgType.Image,\n    body: gif.title.endsWith(`.${ext}`) ? gif.title : `${gif.title}.${ext}`,\n    url: proxied.mxcUrl,\n    info: {\n      w: gif.width,\n      h: gif.height,\n      mimetype: proxied.mimetype,\n      ...(gif.size && proxied.mimetype === (gif.mimetype ?? 'image/gif') ? { size: gif.size } : {}),\n      ...(blurHash ? { [MATRIX_UNSTABLE_BLUR_HASH_PROPERTY_NAME]: blurHash } : {}),\n    },\n    ...(options.spoiler ? { [MATRIX_UNSTABLE_SPOILER_PROPERTY_NAME]: true } : {}),\n  };\n};\n\nconst swapMsgTypeToItemType = (\n  content: IContent,\n  itemtype: IGalleryItem['itemtype']\n): IGalleryItem => {\n  const result = { ...content, itemtype };\n  delete result.msgtype;\n  return result as IGalleryItem;\n};\n\nexport const getGalleryItemContent = async (\n  mx: MatrixClient,\n  item: TUploadItem,\n  mxc: string\n): Promise<IGalleryItem> => {\n  if (isImageMimeType(item.file.type)) {\n    return swapMsgTypeToItemType(await getImageMsgContent(mx, item, mxc), MsgType.Image);\n  }\n  if (item.file.type.startsWith('video')) {\n    return swapMsgTypeToItemType(await getVideoMsgContent(mx, item, mxc), MsgType.Video);\n  }\n  if (item.file.type.startsWith('audio')) {\n    return swapMsgTypeToItemType(getAudioMsgContent(item, mxc), MsgType.Audio);\n  }\n  return swapMsgTypeToItemType(getFileMsgContent(item, mxc), MsgType.File);\n};\n\nexport const buildGalleryContent = (\n  items: IGalleryItem[],\n  caption?: string,\n  formattedCaption?: string\n): IContent => {\n  const body =\n    caption ||\n    items.map((item) => `[${item.filename ?? item.itemtype}: ${item.url ?? 'file'}]`).join('\\n');\n\n  const content: IContent = {\n    msgtype: GALLERY_MSGTYPE,\n    body,\n    itemtypes: items,\n  };\n\n  if (formattedCaption) {\n    content.format = 'org.matrix.custom.html';\n    content.formatted_body = formattedCaption;\n  }\n\n  return content;\n};\n","import type { KeyboardEvent as ReactKeyboardEvent, MouseEvent as ReactMouseEvent } from 'react';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { Box, config, MenuItem, Text } from 'folds';\nimport type { Room } from '$types/matrix-sdk';\nimport type { Command } from '$hooks/useCommands';\nimport { useCommands } from '$hooks/useCommands';\nimport type {\n  EditorAutocompleteQuery,\n  ProseMirrorEditorController,\n} from '$components/editor/prosemirrorController';\nimport { AutocompleteMenu, createCommandElement } from '$components/editor';\nimport type { UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useKeyDown } from '$hooks/useKeyDown';\nimport { onTabPress } from '$utils/keyboard';\n\ntype CommandAutoCompleteHandler = (commandName: string) => void;\nconst GIF_COMMAND = 'gif';\n\ntype CommandAutocompleteProps = {\n  room: Room;\n  controller: ProseMirrorEditorController;\n  query: EditorAutocompleteQuery<string>;\n  requestClose: () => void;\n};\n\nconst SEARCH_OPTIONS: UseAsyncSearchOptions = {\n  matchOptions: {\n    contain: true,\n  },\n};\n\nexport function CommandAutocomplete({\n  room,\n  controller,\n  query,\n  requestClose,\n}: CommandAutocompleteProps) {\n  const mx = useMatrixClient();\n  const commands = useCommands(mx, room);\n  const commandNames = useMemo(\n    () => [GIF_COMMAND, ...(Object.keys(commands) as Command[])],\n    [commands]\n  );\n\n  const [result, search, resetSearch] = useAsyncSearch(\n    commandNames,\n    useCallback((commandName: string) => commandName, []),\n    SEARCH_OPTIONS\n  );\n\n  const autoCompleteNames = result ? result.items : commandNames;\n\n  useEffect(() => {\n    if (query.text) search(query.text);\n    else resetSearch();\n  }, [query.text, search, resetSearch]);\n\n  const handleAutocomplete: CommandAutoCompleteHandler = (commandName) => {\n    const cmdEl = createCommandElement(commandName);\n    controller.insertInline(cmdEl, query.from, query.to);\n    controller.insertText(' ');\n    requestClose();\n  };\n\n  useKeyDown(window, (evt: KeyboardEvent) => {\n    onTabPress(evt, () => {\n      if (autoCompleteNames.length === 0) {\n        return;\n      }\n      const cmdName = autoCompleteNames[0]!;\n      handleAutocomplete(cmdName);\n    });\n  });\n\n  return autoCompleteNames.length === 0 ? null : (\n    <AutocompleteMenu\n      headerContent={\n        <Box grow=\"Yes\" direction=\"Row\" gap=\"200\" justifyContent=\"SpaceBetween\">\n          <Text size=\"L400\">Commands</Text>\n        </Box>\n      }\n      requestClose={requestClose}\n    >\n      {autoCompleteNames.map((commandName) => (\n        <MenuItem\n          key={commandName}\n          as=\"button\"\n          radii=\"300\"\n          style={{ height: 'unset' }}\n          onKeyDown={(evt: ReactKeyboardEvent<HTMLButtonElement>) =>\n            onTabPress(evt, () => handleAutocomplete(commandName))\n          }\n          onMouseDown={(evt: ReactMouseEvent<HTMLButtonElement>) => evt.preventDefault()}\n          onClick={() => handleAutocomplete(commandName)}\n        >\n          <Box\n            style={{ padding: `${config.space.S300} 0` }}\n            grow=\"Yes\"\n            direction=\"Column\"\n            gap=\"100\"\n            justifyContent=\"SpaceBetween\"\n          >\n            <Text style={{ flexGrow: 1 }} size=\"B400\" truncate>\n              {`/${commandName}`}\n            </Text>\n            <Text truncate priority=\"300\" size=\"T200\">\n              {commandName === GIF_COMMAND\n                ? 'Search and send a GIF: /gif <search>'\n                : commands[commandName as Command].description}\n            </Text>\n          </Box>\n        </MenuItem>\n      ))}\n    </AutocompleteMenu>\n  );\n}\n","// Based on https://github.com/mohamad-fallah/react-voice-recorder-kit by mohamad-fallah\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type {\n  UseVoiceRecorderOptions,\n  UseVoiceRecorderReturn,\n  RecorderState,\n  VoiceRecorderStopPayload,\n} from './types';\nimport { getSupportedAudioCodec, getSupportedAudioExtension } from './supportedCodec';\n\nconst BAR_COUNT = 40;\nconst WAVEFORM_POINT_COUNT = 100;\n\nlet sharedAudioContext: AudioContext | null = null;\n\nfunction getSharedAudioContext(): AudioContext {\n  if (!sharedAudioContext || sharedAudioContext.state === 'closed') {\n    sharedAudioContext = new AudioContext();\n  }\n  return sharedAudioContext;\n}\n\nfunction stopMediaStream(stream: MediaStream): void {\n  stream.getTracks().forEach((track: MediaStreamTrack) => track.stop());\n}\n\n// downsample an array of samples to a target count by averaging blocks of samples together\nfunction downsampleWaveform(samples: number[], targetCount: number): number[] {\n  if (samples.length === 0) return Array.from({ length: targetCount }, () => 0.15);\n  if (samples.length <= targetCount) {\n    const step = (samples.length - 1) / (targetCount - 1);\n    return Array.from({ length: targetCount }, (_, i) => {\n      const position = i * step;\n      const lower = Math.floor(position);\n      const upper = Math.min(Math.ceil(position), samples.length - 1);\n      const fraction = position - lower;\n      if (lower === upper) {\n        return samples[lower] ?? 0.15;\n      }\n      return (samples[lower] ?? 0.15) * (1 - fraction) + (samples[upper] ?? 0.15) * fraction;\n    });\n  }\n  const step = samples.length / targetCount;\n  return Array.from({ length: targetCount }, (_, i) => {\n    const start = Math.floor(i * step);\n    const end = Math.floor((i + 1) * step);\n    const slice = samples.slice(start, end);\n    return slice.length > 0 ? Math.max(...slice) : 0.15;\n  });\n}\n\nexport function useVoiceRecorder(options: UseVoiceRecorderOptions = {}): UseVoiceRecorderReturn {\n  const { autoStart = true, onStop, onDelete } = options;\n\n  /**\n   * The audio codec we will use\n   * we will choose depending on the browser support\n   */\n  const audioCodec = getSupportedAudioCodec();\n\n  const [isRecording, setIsRecording] = useState(false);\n  const [isStopped, setIsStopped] = useState(false);\n  const [isTemporaryStopped, setIsTemporaryStopped] = useState(false);\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isPaused, setIsPaused] = useState(false);\n  const [seconds, setSeconds] = useState(0);\n  const [levels, setLevels] = useState<number[]>(() =>\n    Array.from({ length: BAR_COUNT }, () => 0.15)\n  );\n  const [error, setError] = useState<string | null>(null);\n  const [audioUrl, setAudioUrl] = useState<string | null>(null);\n  const [audioFile, setAudioFile] = useState<File | null>(null);\n  const [waveform, setWaveform] = useState<number[] | null>(null);\n\n  const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n  const chunksRef = useRef<Blob[]>([]);\n  const streamRef = useRef<MediaStream | null>(null);\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const recordingSourceRef = useRef<MediaStreamAudioSourceNode | null>(null);\n  const recordingAnalyserRef = useRef<AnalyserNode | null>(null);\n  const recordingDestinationRef = useRef<MediaStreamAudioDestinationNode | null>(null);\n  const recordingStreamRef = useRef<MediaStream | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n  const dataArrayRef = useRef<Uint8Array | null>(null);\n  const animationFrameIdRef = useRef<number | null>(null);\n  const frameCountRef = useRef(0);\n  const timerRef = useRef<number | null>(null);\n  const startTimeRef = useRef<number | null>(null);\n  const pausedTimeRef = useRef(0);\n  const secondsRef = useRef(0);\n  const lastUrlRef = useRef<string | null>(null);\n  const audioRef = useRef<HTMLAudioElement | null>(null);\n  const previousChunksRef = useRef<Blob[]>([]);\n  const isResumingRef = useRef(false);\n  const isRestartingRef = useRef(false);\n  const isTemporaryStopRef = useRef(false);\n  const startGenerationRef = useRef(0);\n  const temporaryPreviewUrlRef = useRef<string | null>(null);\n  /**\n   * waveform samples collected during recording, used to generate waveform on stop.\n   * We collect all samples and downsample at the end to get a more accurate waveform, especially for short recordings.\n   * We use a ref to avoid causing re-renders on every sample.\n   */\n  const waveformSamplesRef = useRef<number[]>([]);\n  /**\n   * Flag to indicate whether we should be collecting waveform samples.\n   * We need this because there can be a short delay between starting recording\n   * and the audio graph being set up, during which we might get some samples that we don't want to include in the waveform.\n   */\n  const isCollectingWaveformRef = useRef(false);\n\n  const cleanupStream = useCallback(() => {\n    if (streamRef.current) {\n      stopMediaStream(streamRef.current);\n      streamRef.current = null;\n    }\n  }, []);\n\n  const cleanupMediaRecorder = useCallback(() => {\n    const mediaRecorder = mediaRecorderRef.current;\n    mediaRecorderRef.current = null;\n    if (!mediaRecorder) return;\n    mediaRecorder.ondataavailable = null;\n    mediaRecorder.onstop = null;\n  }, []);\n\n  const cleanupAudioContext = useCallback(() => {\n    const audioContext = audioContextRef.current;\n    const recordingSource = recordingSourceRef.current;\n    const recordingAnalyser = recordingAnalyserRef.current;\n    const recordingDestination = recordingDestinationRef.current;\n    const recordingStream = recordingStreamRef.current;\n\n    if (animationFrameIdRef.current !== null) {\n      cancelAnimationFrame(animationFrameIdRef.current);\n      animationFrameIdRef.current = null;\n    }\n    frameCountRef.current = 0;\n    audioContextRef.current = null;\n    recordingSourceRef.current = null;\n    recordingAnalyserRef.current = null;\n    recordingDestinationRef.current = null;\n    recordingStreamRef.current = null;\n    analyserRef.current = null;\n    dataArrayRef.current = null;\n\n    recordingStream?.getTracks().forEach((track) => track.stop());\n    recordingSource?.disconnect();\n    recordingAnalyser?.disconnect();\n    recordingDestination?.disconnect();\n\n    if (!audioContext) return;\n    if (recordingStream) {\n      // Recording contexts are disposable. Closing them fully releases the capture graph so\n      // mobile browsers do not keep the mic route or low-quality audio mode alive.\n      if (audioContext.state !== 'closed') {\n        audioContext.close().catch(() => {});\n      }\n      return;\n    }\n    // Playback reuses a shared context, so suspend it instead of tearing it down.\n    if (audioContext.state !== 'closed') {\n      audioContext.suspend().catch(() => {});\n    }\n  }, []);\n\n  const stopTimer = useCallback(() => {\n    if (timerRef.current !== null) {\n      window.clearInterval(timerRef.current);\n      timerRef.current = null;\n    }\n  }, []);\n\n  const invalidatePendingStart = useCallback(() => {\n    startGenerationRef.current += 1;\n  }, []);\n\n  const cleanupRecordingResources = useCallback(() => {\n    cleanupAudioContext();\n    cleanupStream();\n    cleanupMediaRecorder();\n    stopTimer();\n  }, [cleanupAudioContext, cleanupMediaRecorder, cleanupStream, stopTimer]);\n\n  const stopMediaRecorder = useCallback(\n    (mediaRecorder: MediaRecorder) => {\n      let stopThrew = false;\n      try {\n        mediaRecorder.stop();\n      } catch {\n        stopThrew = true;\n      }\n\n      if (stopThrew || !mediaRecorder.onstop) {\n        cleanupRecordingResources();\n      }\n    },\n    [cleanupRecordingResources]\n  );\n\n  const startRecordingTimer = useCallback(() => {\n    startTimeRef.current = Date.now() - pausedTimeRef.current * 1000;\n    stopTimer();\n    timerRef.current = window.setInterval(() => {\n      if (startTimeRef.current === null) return;\n      const diffMs = Date.now() - startTimeRef.current;\n      setSeconds(Math.floor(diffMs / 1000));\n    }, 1000);\n  }, [stopTimer]);\n\n  const startPlaybackTimer = useCallback(\n    (audio: HTMLAudioElement) => {\n      setSeconds(0);\n      stopTimer();\n      timerRef.current = window.setInterval(() => {\n        setSeconds(Math.floor(audio.currentTime));\n      }, 250);\n    },\n    [stopTimer]\n  );\n\n  useEffect(() => {\n    // Keep a ref copy of seconds for use in callbacks to avoid stale closures\n    secondsRef.current = seconds;\n  }, [seconds]);\n\n  const getAudioLength = useCallback(() => {\n    if (startTimeRef.current === null) {\n      return secondsRef.current;\n    }\n    const elapsedSeconds = Math.floor((Date.now() - startTimeRef.current) / 1000);\n    return Math.max(secondsRef.current, elapsedSeconds);\n  }, []);\n\n  const emitStopPayload = useCallback(\n    (file: File, url: string, waveformData: number[], audioLength: number) => {\n      if (!onStop) return;\n      const payload: VoiceRecorderStopPayload = {\n        audioFile: file,\n        audioUrl: url,\n        waveform: waveformData,\n        audioLength,\n        audioCodec: file.type,\n      };\n      onStop(payload);\n    },\n    [onStop]\n  );\n\n  const animateLevels = useCallback(() => {\n    const analyser = analyserRef.current;\n    const storedArray = dataArrayRef.current;\n    if (!analyser || !storedArray) return;\n\n    const dataArray = new Uint8Array(storedArray);\n\n    const draw = () => {\n      analyser.getByteFrequencyData(dataArray);\n      const bufferLength = dataArray.length;\n      let sum = 0;\n      for (let i = 0; i < bufferLength; i += 1) {\n        sum += dataArray[i] ?? 0;\n      }\n      const avg = sum / bufferLength;\n      let normalized = (avg / 255) * 3.5;\n      const minLevel = 0.05;\n      if (normalized < minLevel) normalized = minLevel;\n      if (normalized > 1) normalized = 1;\n\n      frameCountRef.current += 1;\n      if (frameCountRef.current >= 5) {\n        setLevels((prev: number[]) => {\n          const next: number[] = prev.slice(1);\n          next.push(normalized);\n          return next;\n        });\n        if (isCollectingWaveformRef.current) {\n          waveformSamplesRef.current.push(normalized);\n        }\n        frameCountRef.current = 0;\n      }\n\n      animationFrameIdRef.current = requestAnimationFrame(draw);\n    };\n    draw();\n  }, []);\n\n  const setupAudioGraph = useCallback(\n    (stream: MediaStream): MediaStream => {\n      const audioContext = new AudioContext();\n      audioContextRef.current = audioContext;\n      const source = audioContext.createMediaStreamSource(stream);\n      const analyser = audioContext.createAnalyser();\n      analyser.fftSize = 512;\n      analyser.smoothingTimeConstant = 0.6;\n      const bufferLength = analyser.frequencyBinCount;\n      const dataArray = new Uint8Array(bufferLength);\n      recordingSourceRef.current = source;\n      recordingAnalyserRef.current = analyser;\n      analyserRef.current = analyser;\n      dataArrayRef.current = dataArray;\n\n      // Fix for iOS Safari: routing the stream through a MediaStreamDestination\n      // prevents the AudioContext from \"stealing\" the track from the MediaRecorder\n      const destination = audioContext.createMediaStreamDestination();\n      recordingDestinationRef.current = destination;\n      recordingStreamRef.current = destination.stream;\n      source.connect(analyser);\n      analyser.connect(destination);\n\n      if (audioContext.state === 'suspended') {\n        audioContext.resume().catch(() => {});\n      }\n      animateLevels();\n\n      return destination.stream;\n    },\n    [animateLevels]\n  );\n\n  const setupPlaybackGraph = useCallback(\n    (audio: HTMLAudioElement) => {\n      const audioContext = getSharedAudioContext();\n      audioContextRef.current = audioContext;\n      const source = audioContext.createMediaElementSource(audio);\n      const analyser = audioContext.createAnalyser();\n      analyser.fftSize = 512;\n      analyser.smoothingTimeConstant = 0.6;\n      const bufferLength = analyser.frequencyBinCount;\n      const dataArray = new Uint8Array(bufferLength);\n      analyserRef.current = analyser;\n      dataArrayRef.current = dataArray;\n      source.connect(analyser);\n      analyser.connect(audioContext.destination);\n      if (audioContext.state === 'suspended') {\n        audioContext.resume().catch(() => {});\n      }\n      animateLevels();\n    },\n    [animateLevels]\n  );\n\n  const internalStartRecording = useCallback(async () => {\n    if (typeof window === 'undefined') return;\n    if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {\n      setError('Browser does not support audio recording.');\n      return;\n    }\n\n    const startGeneration = ++startGenerationRef.current;\n    setError(null);\n    isResumingRef.current = false;\n\n    try {\n      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      if (startGeneration !== startGenerationRef.current) {\n        stopMediaStream(stream);\n        return;\n      }\n      const codec = getSupportedAudioCodec();\n      if (!codec) {\n        setError('No supported audio codec found for recording.');\n        stopMediaStream(stream);\n        return;\n      }\n      streamRef.current = stream;\n      chunksRef.current = [];\n      previousChunksRef.current = [];\n      waveformSamplesRef.current = [];\n      isCollectingWaveformRef.current = true;\n      const recordedStream = setupAudioGraph(stream);\n      startRecordingTimer();\n\n      const mediaRecorder = new MediaRecorder(recordedStream, { mimeType: codec });\n      mediaRecorderRef.current = mediaRecorder;\n\n      mediaRecorder.ondataavailable = (event: BlobEvent) => {\n        if (event.data && event.data.size > 0) {\n          chunksRef.current.push(event.data);\n        }\n      };\n\n      mediaRecorder.onstop = () => {\n        cleanupAudioContext();\n        cleanupStream();\n        cleanupMediaRecorder();\n        stopTimer();\n        setIsRecording(false);\n        setIsPaused(false);\n        const audioLength = getAudioLength();\n        pausedTimeRef.current = 0;\n        startTimeRef.current = null;\n\n        isCollectingWaveformRef.current = false;\n\n        if (isResumingRef.current) {\n          isResumingRef.current = false;\n          return;\n        }\n\n        if (isRestartingRef.current) {\n          isRestartingRef.current = false;\n          return;\n        }\n\n        if (chunksRef.current.length === 0) {\n          if (isTemporaryStopRef.current) {\n            setIsTemporaryStopped(true);\n            setIsStopped(true);\n            isTemporaryStopRef.current = false;\n          } else {\n            setIsStopped(true);\n            setIsTemporaryStopped(false);\n          }\n          return;\n        }\n\n        const actualType = chunksRef.current[0]?.type || codec || 'audio/webm';\n        const blob = new Blob(chunksRef.current, { type: actualType });\n        if (lastUrlRef.current) {\n          URL.revokeObjectURL(lastUrlRef.current);\n        }\n        const url = URL.createObjectURL(blob);\n        lastUrlRef.current = url;\n        setAudioUrl(url);\n\n        const file = new File(\n          [blob],\n          `voice-${Date.now()}.${getSupportedAudioExtension(actualType)}`,\n          {\n            type: actualType,\n          }\n        );\n        setAudioFile(file);\n\n        const waveformData = downsampleWaveform(waveformSamplesRef.current, WAVEFORM_POINT_COUNT);\n        setWaveform(waveformData);\n\n        if (isTemporaryStopRef.current) {\n          setIsTemporaryStopped(true);\n          setIsStopped(true);\n          isTemporaryStopRef.current = false;\n        } else {\n          setIsStopped(true);\n          setIsTemporaryStopped(false);\n          emitStopPayload(file, url, waveformData, audioLength);\n        }\n      };\n\n      // Pass a timeslice to ensure Safari iOS periodically flushes chunks\n      // Otherwise Safari might fail to emit any chunks when stopped abruptly\n      mediaRecorder.start(1000);\n      setIsRecording(true);\n      setIsPaused(false);\n      setIsStopped(false);\n      pausedTimeRef.current = 0;\n    } catch {\n      if (startGeneration !== startGenerationRef.current) return;\n      setError('Microphone access denied or an error occurred.');\n      cleanupAudioContext();\n      cleanupStream();\n      cleanupMediaRecorder();\n      stopTimer();\n      setIsRecording(false);\n    }\n  }, [\n    cleanupAudioContext,\n    cleanupMediaRecorder,\n    cleanupStream,\n    emitStopPayload,\n    getAudioLength,\n    setupAudioGraph,\n    startRecordingTimer,\n    stopTimer,\n  ]);\n\n  const start = useCallback(() => {\n    internalStartRecording();\n  }, [internalStartRecording]);\n\n  const handlePause = useCallback(() => {\n    const mediaRecorder = mediaRecorderRef.current;\n    if (!mediaRecorder || mediaRecorder.state !== 'recording') return;\n\n    try {\n      mediaRecorder.requestData();\n      mediaRecorder.pause();\n      stopTimer();\n      pausedTimeRef.current = seconds;\n      setIsPaused(true);\n\n      if (animationFrameIdRef.current !== null) {\n        cancelAnimationFrame(animationFrameIdRef.current);\n        animationFrameIdRef.current = null;\n      }\n\n      if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n        audioContextRef.current.suspend().catch(() => {});\n      }\n\n      setLevels(Array.from({ length: BAR_COUNT }, () => 0.15));\n    } catch {\n      setError('Error pausing recording');\n    }\n  }, [seconds, stopTimer]);\n\n  const handleStopTemporary = useCallback(() => {\n    invalidatePendingStart();\n    const mediaRecorder = mediaRecorderRef.current;\n\n    if (mediaRecorder && mediaRecorder.state !== 'inactive') {\n      previousChunksRef.current = [...chunksRef.current];\n      isTemporaryStopRef.current = false;\n\n      if (mediaRecorder.state === 'recording') {\n        try {\n          mediaRecorder.requestData();\n        } catch {\n          // ignore\n        }\n      }\n\n      stopMediaRecorder(mediaRecorder);\n\n      // Let cleanupStream() be handled by mediaRecorder.onstop\n      // Calling it synchronously here can kill the stream before Safari finishes emitting data\n      setIsStopped(true);\n      setIsTemporaryStopped(false);\n      setIsPaused(false);\n      pausedTimeRef.current = 0;\n    } else {\n      if (audioUrl && audioFile) {\n        const waveformData =\n          waveform ?? downsampleWaveform(waveformSamplesRef.current, WAVEFORM_POINT_COUNT);\n        emitStopPayload(audioFile, audioUrl, waveformData, secondsRef.current);\n      }\n      cleanupAudioContext();\n      cleanupStream();\n      cleanupMediaRecorder();\n      stopTimer();\n      setIsRecording(false);\n      setIsStopped(true);\n      setIsTemporaryStopped(false);\n      setIsPaused(false);\n      pausedTimeRef.current = 0;\n      startTimeRef.current = null;\n    }\n  }, [\n    audioFile,\n    audioUrl,\n    cleanupAudioContext,\n    cleanupMediaRecorder,\n    cleanupStream,\n    emitStopPayload,\n    invalidatePendingStart,\n    stopTimer,\n    stopMediaRecorder,\n    waveform,\n  ]);\n\n  const handleStop = useCallback(() => {\n    invalidatePendingStart();\n    const mediaRecorder = mediaRecorderRef.current;\n\n    if (mediaRecorder && mediaRecorder.state !== 'inactive') {\n      previousChunksRef.current = [...chunksRef.current];\n      isTemporaryStopRef.current = false;\n\n      if (mediaRecorder.state === 'recording') {\n        try {\n          mediaRecorder.requestData();\n        } catch {\n          // ignore\n        }\n      }\n\n      stopMediaRecorder(mediaRecorder);\n\n      // Let cleanupStream() be handled by mediaRecorder.onstop\n      // Calling it synchronously here can kill the stream before Safari finishes emitting data\n      setIsStopped(true);\n      setIsTemporaryStopped(false);\n      setIsPaused(false);\n      pausedTimeRef.current = 0;\n    } else {\n      if (audioUrl && audioFile) {\n        const waveformData =\n          waveform ?? downsampleWaveform(waveformSamplesRef.current, WAVEFORM_POINT_COUNT);\n        emitStopPayload(audioFile, audioUrl, waveformData, secondsRef.current);\n      }\n      cleanupAudioContext();\n      cleanupStream();\n      cleanupMediaRecorder();\n      stopTimer();\n      setIsRecording(false);\n      setIsStopped(true);\n      setIsTemporaryStopped(false);\n      setIsPaused(false);\n      pausedTimeRef.current = 0;\n      startTimeRef.current = null;\n    }\n  }, [\n    audioFile,\n    audioUrl,\n    cleanupAudioContext,\n    cleanupMediaRecorder,\n    cleanupStream,\n    emitStopPayload,\n    invalidatePendingStart,\n    stopTimer,\n    stopMediaRecorder,\n    waveform,\n  ]);\n\n  const handlePreviewPlay = useCallback(() => {\n    let urlToPlay = audioUrl;\n\n    if (!urlToPlay && isPaused) {\n      if (temporaryPreviewUrlRef.current) {\n        URL.revokeObjectURL(temporaryPreviewUrlRef.current);\n      }\n\n      const allChunks =\n        chunksRef.current.length > 0 ? chunksRef.current : previousChunksRef.current;\n\n      if (allChunks.length > 0) {\n        const actualType = allChunks[0]?.type || audioCodec || 'audio/webm';\n        const blob = new Blob(allChunks, { type: actualType });\n        urlToPlay = URL.createObjectURL(blob);\n        temporaryPreviewUrlRef.current = urlToPlay;\n      }\n    }\n\n    if (!urlToPlay) return;\n\n    if (temporaryPreviewUrlRef.current && temporaryPreviewUrlRef.current !== urlToPlay) {\n      URL.revokeObjectURL(temporaryPreviewUrlRef.current);\n      temporaryPreviewUrlRef.current = null;\n    }\n\n    if (!audioRef.current || audioRef.current.src !== urlToPlay) {\n      if (audioRef.current) {\n        audioRef.current.pause();\n        audioRef.current = null;\n      }\n      const audio = new Audio(urlToPlay);\n      audioRef.current = audio;\n\n      const onEnded = () => {\n        setIsPlaying(false);\n        stopTimer();\n        cleanupAudioContext();\n        audio.currentTime = 0;\n        setSeconds(pausedTimeRef.current); // Reset to total recorded time\n      };\n      const onPause = () => {\n        setIsPlaying(false);\n        stopTimer();\n        cleanupAudioContext();\n      };\n      const onPlay = () => {\n        setIsPlaying(true);\n        cleanupAudioContext();\n        setupPlaybackGraph(audio);\n        startPlaybackTimer(audio);\n      };\n      audio.addEventListener('ended', onEnded);\n      audio.addEventListener('pause', onPause);\n      audio.addEventListener('play', onPlay);\n    }\n\n    const audio = audioRef.current;\n    if (!audio) return;\n\n    if (isPlaying) {\n      audio.pause();\n    } else {\n      if (audio.ended || (audio.duration && audio.currentTime >= audio.duration - 0.01)) {\n        audio.currentTime = 0;\n        setSeconds(0);\n      }\n      audio.play().catch(() => {});\n    }\n  }, [\n    audioUrl,\n    isPaused,\n    isPlaying,\n    audioCodec,\n    stopTimer,\n    cleanupAudioContext,\n    setupPlaybackGraph,\n    startPlaybackTimer,\n  ]);\n\n  const handlePlay = useCallback(() => {\n    if (!audioUrl) return;\n\n    if (!audioRef.current) {\n      const audio = new Audio(audioUrl);\n      audioRef.current = audio;\n\n      const onEnded = () => {\n        setIsPlaying(false);\n        stopTimer();\n        cleanupAudioContext();\n        audio.currentTime = 0;\n        setSeconds(0);\n      };\n      const onPause = () => {\n        setIsPlaying(false);\n        stopTimer();\n        cleanupAudioContext();\n      };\n      const onPlay = () => {\n        setIsPlaying(true);\n        cleanupAudioContext();\n        setupPlaybackGraph(audio);\n        startPlaybackTimer(audio);\n      };\n      audio.addEventListener('ended', onEnded);\n      audio.addEventListener('pause', onPause);\n      audio.addEventListener('play', onPlay);\n    }\n\n    const audio = audioRef.current;\n    if (!audio) return;\n\n    if (isPlaying) {\n      audio.pause();\n    } else {\n      if (audio.ended || (audio.duration && audio.currentTime >= audio.duration - 0.01)) {\n        audio.currentTime = 0;\n        setSeconds(0);\n      }\n      audio.play().catch(() => {});\n    }\n  }, [audioUrl, cleanupAudioContext, isPlaying, setupPlaybackGraph, startPlaybackTimer, stopTimer]);\n\n  const handleResume = useCallback(async () => {\n    if (typeof window === 'undefined') return;\n    if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {\n      setError('Browser does not support audio recording.');\n      return;\n    }\n\n    const startGeneration = ++startGenerationRef.current;\n    setError(null);\n    isResumingRef.current = true;\n\n    try {\n      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      if (startGeneration !== startGenerationRef.current) {\n        stopMediaStream(stream);\n        return;\n      }\n      streamRef.current = stream;\n      const recordedStream = setupAudioGraph(stream);\n\n      // Force update seconds to the correct total time before starting timer\n      setSeconds(pausedTimeRef.current);\n      startRecordingTimer();\n\n      const codec = getSupportedAudioCodec() || audioCodec;\n      const mediaRecorder = codec\n        ? new MediaRecorder(recordedStream, { mimeType: codec })\n        : new MediaRecorder(recordedStream);\n      mediaRecorderRef.current = mediaRecorder;\n\n      mediaRecorder.ondataavailable = (event: BlobEvent) => {\n        if (event.data && event.data.size > 0) {\n          chunksRef.current.push(event.data);\n        }\n      };\n\n      mediaRecorder.onstop = () => {\n        cleanupAudioContext();\n        cleanupStream();\n        cleanupMediaRecorder();\n        stopTimer();\n        setIsRecording(false);\n        setIsPaused(false);\n        const audioLength = getAudioLength();\n        pausedTimeRef.current = 0;\n        startTimeRef.current = null;\n\n        isCollectingWaveformRef.current = false;\n\n        if (chunksRef.current.length === 0) {\n          setIsStopped(true);\n          return;\n        }\n\n        const actualType = chunksRef.current[0]?.type || audioCodec || 'audio/webm';\n        const blob = new Blob(chunksRef.current, { type: actualType });\n        if (lastUrlRef.current) {\n          URL.revokeObjectURL(lastUrlRef.current);\n        }\n        const url = URL.createObjectURL(blob);\n        lastUrlRef.current = url;\n        setAudioUrl(url);\n\n        const file = new File(\n          [blob],\n          `voice-${Date.now()}.${getSupportedAudioExtension(blob.type)}`,\n          { type: blob.type }\n        );\n        setAudioFile(file);\n\n        const waveformData = downsampleWaveform(waveformSamplesRef.current, WAVEFORM_POINT_COUNT);\n        setWaveform(waveformData);\n\n        emitStopPayload(file, url, waveformData, audioLength);\n      };\n\n      // Pass a timeslice to ensure Safari iOS periodically flushes chunks\n      // Otherwise Safari might fail to emit any chunks when stopped abruptly\n      mediaRecorder.start(1000);\n      setIsRecording(true);\n      setIsPaused(false);\n      setIsStopped(false);\n      setIsTemporaryStopped(false);\n      setIsPlaying(false);\n\n      isCollectingWaveformRef.current = true;\n\n      if (audioRef.current) {\n        audioRef.current.pause();\n        audioRef.current = null;\n      }\n      if (temporaryPreviewUrlRef.current) {\n        URL.revokeObjectURL(temporaryPreviewUrlRef.current);\n        temporaryPreviewUrlRef.current = null;\n      }\n\n      // We removed: pausedTimeRef.current = seconds\n      // So it keeps the correct total time from previous Pause\n      startTimeRef.current = Date.now() - pausedTimeRef.current * 1000;\n    } catch {\n      if (startGeneration !== startGenerationRef.current) return;\n      setError('Microphone access denied or an error occurred.');\n      cleanupAudioContext();\n      cleanupStream();\n      cleanupMediaRecorder();\n      stopTimer();\n      setIsRecording(false);\n      isResumingRef.current = false;\n    }\n  }, [\n    audioCodec,\n    cleanupAudioContext,\n    cleanupMediaRecorder,\n    cleanupStream,\n    emitStopPayload,\n    getAudioLength,\n    setupAudioGraph,\n    startRecordingTimer,\n    stopTimer,\n  ]);\n\n  const handleDelete = useCallback(() => {\n    invalidatePendingStart();\n    const mediaRecorder = mediaRecorderRef.current;\n    if (mediaRecorder && mediaRecorder.state !== 'inactive') {\n      stopMediaRecorder(mediaRecorder);\n    }\n\n    if (audioRef.current) {\n      audioRef.current.pause();\n      audioRef.current = null;\n    }\n\n    cleanupAudioContext();\n    cleanupStream();\n    cleanupMediaRecorder();\n    stopTimer();\n    setIsPlaying(false);\n    setIsStopped(true);\n    setIsRecording(false);\n    setIsPaused(false);\n    setSeconds(0);\n    pausedTimeRef.current = 0;\n    startTimeRef.current = null;\n    setLevels(Array.from({ length: BAR_COUNT }, () => 0.15));\n    previousChunksRef.current = [];\n    chunksRef.current = [];\n    waveformSamplesRef.current = [];\n    isCollectingWaveformRef.current = false;\n    setWaveform(null);\n\n    if (temporaryPreviewUrlRef.current) {\n      URL.revokeObjectURL(temporaryPreviewUrlRef.current);\n      temporaryPreviewUrlRef.current = null;\n    }\n\n    if (onDelete) {\n      onDelete();\n    }\n  }, [\n    cleanupAudioContext,\n    cleanupMediaRecorder,\n    cleanupStream,\n    invalidatePendingStart,\n    onDelete,\n    stopMediaRecorder,\n    stopTimer,\n  ]);\n\n  const handleRestart = useCallback(() => {\n    invalidatePendingStart();\n    isRestartingRef.current = true;\n    const mediaRecorder = mediaRecorderRef.current;\n\n    if (mediaRecorder && mediaRecorder.state !== 'inactive') {\n      stopMediaRecorder(mediaRecorder);\n    }\n\n    if (audioRef.current) {\n      audioRef.current.pause();\n      audioRef.current = null;\n    }\n\n    cleanupAudioContext();\n    cleanupStream();\n    cleanupMediaRecorder();\n    stopTimer();\n    setIsRecording(false);\n    setIsStopped(false);\n    setIsTemporaryStopped(false);\n    setIsPaused(false);\n    setIsPlaying(false);\n    setSeconds(0);\n    pausedTimeRef.current = 0;\n    startTimeRef.current = null;\n    setLevels(Array.from({ length: BAR_COUNT }, () => 0.15));\n    previousChunksRef.current = [];\n    chunksRef.current = [];\n    isResumingRef.current = false;\n    waveformSamplesRef.current = [];\n    isCollectingWaveformRef.current = false;\n    setWaveform(null);\n\n    if (lastUrlRef.current) {\n      URL.revokeObjectURL(lastUrlRef.current);\n      lastUrlRef.current = null;\n    }\n\n    if (temporaryPreviewUrlRef.current) {\n      URL.revokeObjectURL(temporaryPreviewUrlRef.current);\n      temporaryPreviewUrlRef.current = null;\n    }\n\n    setAudioUrl(null);\n    setAudioFile(null);\n    internalStartRecording();\n  }, [\n    cleanupAudioContext,\n    cleanupMediaRecorder,\n    cleanupStream,\n    internalStartRecording,\n    invalidatePendingStart,\n    stopMediaRecorder,\n    stopTimer,\n  ]);\n\n  useEffect(() => {\n    if (autoStart) {\n      internalStartRecording();\n    }\n    return () => {\n      invalidatePendingStart();\n      const mediaRecorder = mediaRecorderRef.current;\n      if (mediaRecorder && mediaRecorder.state !== 'inactive') {\n        stopMediaRecorder(mediaRecorder);\n      } else {\n        cleanupMediaRecorder();\n      }\n      cleanupAudioContext();\n      cleanupStream();\n      stopTimer();\n      if (audioRef.current) {\n        audioRef.current.pause();\n        audioRef.current = null;\n      }\n      if (lastUrlRef.current) {\n        URL.revokeObjectURL(lastUrlRef.current);\n        lastUrlRef.current = null;\n      }\n      if (temporaryPreviewUrlRef.current) {\n        URL.revokeObjectURL(temporaryPreviewUrlRef.current);\n        temporaryPreviewUrlRef.current = null;\n      }\n    };\n  }, [\n    autoStart,\n    cleanupAudioContext,\n    cleanupMediaRecorder,\n    cleanupStream,\n    internalStartRecording,\n    invalidatePendingStart,\n    stopMediaRecorder,\n    stopTimer,\n  ]);\n\n  const getState = (): RecorderState => {\n    if (isPlaying) return 'playing';\n    if (isStopped && !isTemporaryStopped && audioUrl) return 'reviewing';\n    if (isRecording && isPaused) return 'paused';\n    if (isRecording) return 'recording';\n    return 'idle';\n  };\n\n  const handleRecordAgain = useCallback(() => {\n    handleRestart();\n  }, [handleRestart]);\n\n  return {\n    state: getState(),\n    isRecording,\n    isStopped,\n    isTemporaryStopped,\n    isPlaying,\n    isPaused,\n    seconds,\n    levels,\n    error,\n    audioUrl,\n    audioFile,\n    waveform,\n    start,\n    handlePause,\n    handleStopTemporary,\n    handleStop,\n    handleResume,\n    handlePreviewPlay,\n    handlePlay,\n    handleRestart,\n    handleDelete,\n    handleRecordAgain,\n  };\n}\n","import {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { useElementSizeObserver } from '$hooks/useElementSizeObserver';\nimport { useVoiceRecorder } from '$plugins/voice-recorder-kit';\nimport type { VoiceRecorderStopPayload } from '$plugins/voice-recorder-kit';\nimport { Box, Text } from 'folds';\nimport * as css from './AudioMessageRecorder.css';\n\nexport type AudioRecordingCompletePayload = {\n  audioBlob: Blob;\n  waveform: number[];\n  audioLength: number;\n  audioCodec: string;\n};\n\nexport type AudioMessageRecorderHandle = {\n  stop: () => void;\n  cancel: () => void;\n};\n\ntype AudioMessageRecorderProps = {\n  onRecordingComplete: (payload: AudioRecordingCompletePayload) => void;\n  onRequestClose: () => void;\n  onWaveformUpdate: (waveform: number[]) => void;\n  onAudioLengthUpdate: (length: number) => void;\n};\n\nfunction formatTime(seconds: number): string {\n  const m = Math.floor(seconds / 60);\n  const s = seconds % 60;\n  return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nconst MAX_BAR_COUNT = 28;\nconst MIN_BAR_COUNT = 8;\nconst BAR_WIDTH_PX = 2;\nconst BAR_GAP_PX = 4;\nconst RECORDER_CHROME_PX = 72;\n\nexport const AudioMessageRecorder = forwardRef<\n  AudioMessageRecorderHandle,\n  AudioMessageRecorderProps\n>(({ onRecordingComplete, onRequestClose, onWaveformUpdate, onAudioLengthUpdate }, ref) => {\n  const userRequestedStopRef = useRef(false);\n  const actionRef = useRef<'active' | 'stopping' | 'canceling' | 'dismissed'>('active');\n  const cancelTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [isCanceling, setIsCanceling] = useState(false);\n  const [announcedTime, setAnnouncedTime] = useState(0);\n  const [barCount, setBarCount] = useState(MAX_BAR_COUNT);\n\n  const onRecordingCompleteRef = useRef(onRecordingComplete);\n  onRecordingCompleteRef.current = onRecordingComplete;\n  const onRequestCloseRef = useRef(onRequestClose);\n  onRequestCloseRef.current = onRequestClose;\n  const onWaveformUpdateRef = useRef(onWaveformUpdate);\n  onWaveformUpdateRef.current = onWaveformUpdate;\n  const onAudioLengthUpdateRef = useRef(onAudioLengthUpdate);\n  onAudioLengthUpdateRef.current = onAudioLengthUpdate;\n\n  const stableOnStop = useCallback((payload: VoiceRecorderStopPayload) => {\n    // useVoiceRecorder also stops during cancel/teardown paths, so only surface a completed\n    // recording after an explicit user stop.\n    if (!userRequestedStopRef.current || actionRef.current !== 'stopping') return;\n    actionRef.current = 'dismissed';\n    onRecordingCompleteRef.current({\n      audioBlob: payload.audioFile,\n      waveform: payload.waveform,\n      audioLength: payload.audioLength,\n      audioCodec: payload.audioCodec,\n    });\n    onWaveformUpdateRef.current(payload.waveform);\n    onAudioLengthUpdateRef.current(payload.audioLength);\n  }, []);\n\n  const stableOnDelete = useCallback(() => {\n    if (cancelTimerRef.current !== null) {\n      clearTimeout(cancelTimerRef.current);\n      cancelTimerRef.current = null;\n    }\n    actionRef.current = 'dismissed';\n    onRequestCloseRef.current();\n  }, []);\n\n  const { levels, seconds, error, handleStop, handleDelete } = useVoiceRecorder({\n    autoStart: true,\n    onStop: stableOnStop,\n    onDelete: stableOnDelete,\n  });\n\n  const doStop = useCallback(() => {\n    if (actionRef.current !== 'active') return;\n    actionRef.current = 'stopping';\n    userRequestedStopRef.current = true;\n    handleStop();\n  }, [handleStop]);\n\n  const doCancel = useCallback(() => {\n    if (actionRef.current !== 'active') return;\n    actionRef.current = 'canceling';\n    setIsCanceling(true);\n    cancelTimerRef.current = setTimeout(() => {\n      cancelTimerRef.current = null;\n      if (actionRef.current !== 'canceling') return;\n      actionRef.current = 'dismissed';\n      handleDelete();\n    }, 180);\n  }, [handleDelete]);\n\n  useImperativeHandle(ref, () => ({ stop: doStop, cancel: doCancel }), [doStop, doCancel]);\n\n  useEffect(\n    () => () => {\n      if (cancelTimerRef.current !== null) clearTimeout(cancelTimerRef.current);\n      cancelTimerRef.current = null;\n      actionRef.current = 'dismissed';\n    },\n    []\n  );\n\n  useEffect(() => {\n    if (seconds > 0 && seconds % 30 === 0 && seconds !== announcedTime) {\n      setAnnouncedTime(seconds);\n    }\n  }, [seconds, announcedTime]);\n\n  useElementSizeObserver(\n    useCallback(() => containerRef.current, []),\n    useCallback((width) => {\n      const availableWaveformWidth = Math.max(0, width - RECORDER_CHROME_PX);\n      const nextBarCount = Math.max(\n        MIN_BAR_COUNT,\n        Math.min(\n          MAX_BAR_COUNT,\n          Math.floor((availableWaveformWidth + BAR_GAP_PX) / (BAR_WIDTH_PX + BAR_GAP_PX))\n        )\n      );\n      setBarCount((current) => (current === nextBarCount ? current : nextBarCount));\n    }, [])\n  );\n\n  const bars = useMemo(() => {\n    if (levels.length === 0) {\n      return Array(barCount).fill(0.15);\n    }\n    if (levels.length <= barCount) {\n      const step = (levels.length - 1) / (barCount - 1);\n      return Array.from({ length: barCount }, (_, i) => {\n        const position = i * step;\n        const lower = Math.floor(position);\n        const upper = Math.min(Math.ceil(position), levels.length - 1);\n        const fraction = position - lower;\n        if (lower === upper) {\n          return levels[lower] ?? 0.15;\n        }\n        return (levels[lower] ?? 0.15) * (1 - fraction) + (levels[upper] ?? 0.15) * fraction;\n      });\n    }\n    const step = levels.length / barCount;\n    return Array.from({ length: barCount }, (_, i) => {\n      const start = Math.floor(i * step);\n      const end = Math.floor((i + 1) * step);\n      const slice = levels.slice(start, end);\n      return slice.length > 0 ? Math.max(...slice) : 0.15;\n    });\n  }, [barCount, levels]);\n  const waveformBars = useMemo(\n    () =>\n      bars.map((level, index) => ({\n        id: `recording-waveform-bar-${index}`,\n        level,\n      })),\n    [bars]\n  );\n\n  const containerClassName = [css.Container, isCanceling ? css.ContainerCanceling : null]\n    .filter(Boolean)\n    .join(' ');\n\n  return (\n    <>\n      {error && (\n        <Text size=\"T200\" style={{ color: 'var(--color-critical-main)' }}>\n          {error}\n        </Text>\n      )}\n      <Box ref={containerRef} alignItems=\"Center\" gap=\"200\" className={containerClassName}>\n        <div aria-hidden className={css.RecDot} />\n\n        <Box\n          grow=\"Yes\"\n          alignItems=\"Center\"\n          justifyContent=\"SpaceBetween\"\n          className={css.WaveformContainer}\n        >\n          {waveformBars.map((bar) => (\n            <div\n              key={bar.id}\n              className={css.WaveformBar}\n              style={{ height: Math.max(3, Math.round(bar.level * 20)) }}\n            />\n          ))}\n        </Box>\n\n        <Text size=\"T200\" className={css.Timer} aria-live=\"polite\" aria-atomic=\"true\">\n          {formatTime(seconds)}\n        </Text>\n        {announcedTime > 0 && announcedTime === seconds && (\n          <span className={css.SrOnly} aria-live=\"polite\">\n            Recording duration: {formatTime(announcedTime)}\n          </span>\n        )}\n      </Box>\n    </>\n  );\n});\n","export type ComposerOperation<T> = (isLive: () => boolean) => T | Promise<T>;\n\nexport interface ComposerController {\n  enqueue<T>(operation: ComposerOperation<T>): Promise<T | undefined>;\n  dispose(): void;\n}\n\n/** Serializes composer sends so a slow send cannot interleave with the next one. */\nexport const createComposerController = (): ComposerController => {\n  let queueTail: Promise<void> = Promise.resolve();\n  let disposed = false;\n  const isLive = () => !disposed;\n\n  const enqueue = <T>(operation: ComposerOperation<T>): Promise<T | undefined> =>\n    new Promise<T | undefined>((resolve, reject) => {\n      const run = async () => {\n        if (disposed) {\n          resolve(undefined);\n          return;\n        }\n        try {\n          resolve(await operation(isLive));\n        } catch (error) {\n          reject(error);\n        }\n      };\n\n      queueTail = queueTail.then(run, run).then(\n        () => undefined,\n        () => undefined\n      );\n    });\n\n  return {\n    enqueue,\n    dispose: () => {\n      disposed = true;\n    },\n  };\n};\n","import { find as findLinks } from 'linkifyjs';\nimport type {\n  EditorDocument,\n  EditorParagraph,\n  EditorText,\n  InlineToken,\n} from '$components/editor/model';\nimport { isEditorText } from '$components/editor/model';\nimport { BlockType } from '$components/editor/types';\nimport { getMarkdownCodeSpanRanges, isInsideMarkdownCodeSpan } from '$components/editor/utils';\nimport { getSettingsLinkLabel, parseSettingsLink } from '$features/settings/settingsLink';\n\ntype RewritableSettingsLinkMatch = {\n  end: number;\n  href: string;\n  label: string;\n  start: number;\n};\n\nconst isMarkdownSettingsLink = (text: string, start: number, end: number): boolean =>\n  text.slice(0, start).endsWith('](') && text.slice(end).startsWith(')');\n\nconst isMarkdownAutolink = (text: string, start: number, end: number): boolean =>\n  text[start - 1] === '<' && text[end] === '>';\n\nconst isInsideHtmlTag = (text: string, start: number): boolean => {\n  const tagStart = text.lastIndexOf('<', start);\n  if (tagStart === -1) return false;\n\n  const tagEnd = text.lastIndexOf('>', start);\n  if (tagEnd > tagStart) return false;\n\n  return /^<\\/?[A-Za-z][^>]*$/.test(text.slice(tagStart, start));\n};\n\nconst isProtectedMarkdownContext = (\n  text: string,\n  start: number,\n  end: number,\n  codeSpanRanges: [number, number][]\n): boolean =>\n  isMarkdownSettingsLink(text, start, end) ||\n  isInsideMarkdownCodeSpan(start, end, codeSpanRanges) ||\n  isMarkdownAutolink(text, start, end) ||\n  isInsideHtmlTag(text, start);\n\nconst getRewritableSettingsLinkMatches = (\n  text: string,\n  baseUrl: string\n): RewritableSettingsLinkMatch[] => {\n  const matches = findLinks(text, 'url');\n  if (matches.length === 0) return [];\n\n  const codeSpanRanges = getMarkdownCodeSpanRanges(text);\n  return matches.flatMap((match) => {\n    const href = match.value;\n    const settingsLink = parseSettingsLink(baseUrl, href);\n\n    if (!settingsLink || isProtectedMarkdownContext(text, match.start, match.end, codeSpanRanges)) {\n      return [];\n    }\n\n    return [\n      {\n        end: match.end,\n        href,\n        label: getSettingsLinkLabel(settingsLink.section, settingsLink.focus),\n        start: match.start,\n      },\n    ];\n  });\n};\n\nconst hasRewritableSettingsLinksInInlineChildren = (\n  children: InlineToken[],\n  baseUrl: string\n): boolean =>\n  children.some(\n    (child) =>\n      isEditorText(child) && getRewritableSettingsLinkMatches(child.text, baseUrl).length > 0\n  );\n\nconst createTextSegment = (node: EditorText, text: string): EditorText => ({\n  ...node,\n  text,\n});\n\nconst rewriteInlineText = (node: EditorText, baseUrl: string): InlineToken[] => {\n  const matches = getRewritableSettingsLinkMatches(node.text, baseUrl);\n  if (matches.length === 0) return [node];\n\n  const rewritten: InlineToken[] = [];\n  let cursor = 0;\n\n  matches.forEach((match) => {\n    if (cursor < match.start) {\n      rewritten.push(createTextSegment(node, node.text.slice(cursor, match.start)));\n    }\n\n    rewritten.push({\n      type: BlockType.Link,\n      href: match.href,\n      children: [createTextSegment(node, match.label)],\n    });\n    cursor = match.end;\n  });\n\n  if (rewritten.length === 0) return [node];\n\n  if (cursor < node.text.length) {\n    rewritten.push(createTextSegment(node, node.text.slice(cursor)));\n  }\n\n  return rewritten.filter((child) => !isEditorText(child) || child.text.length > 0);\n};\n\nconst rewriteInlineChildren = (children: InlineToken[], baseUrl: string): InlineToken[] =>\n  children.flatMap((child) => (isEditorText(child) ? rewriteInlineText(child, baseUrl) : [child]));\n\nconst rewriteInlineContainer = (node: EditorParagraph, baseUrl: string): EditorParagraph => ({\n  ...node,\n  children: rewriteInlineChildren(node.children, baseUrl),\n});\n\nconst hasSettingsLinksToRewriteInNode = (node: EditorParagraph, baseUrl: string): boolean => {\n  switch (node.type) {\n    case BlockType.Paragraph:\n      return hasRewritableSettingsLinksInInlineChildren(node.children, baseUrl);\n    default:\n      return false;\n  }\n};\n\nconst rewriteNode = (node: EditorParagraph, baseUrl: string): EditorParagraph => {\n  switch (node.type) {\n    case BlockType.Paragraph:\n      return rewriteInlineContainer(node, baseUrl);\n    default:\n      return node;\n  }\n};\n\nexport const hasSettingsLinksToRewrite = (nodes: EditorDocument, baseUrl: string): boolean =>\n  nodes.some((node) => hasSettingsLinksToRewriteInNode(node, baseUrl));\n\nexport const rewriteSettingsLinks = (nodes: EditorDocument, baseUrl: string): EditorDocument =>\n  nodes.map((node) => rewriteNode(node, baseUrl));\n","import type { EditorDocument } from '$components/editor/model';\nimport { hasSettingsLinksToRewrite, rewriteSettingsLinks } from './settingsLinkMessage';\n\nexport type OutgoingMessageTransformContext = {\n  settingsLinkBaseUrl: string;\n};\n\nexport type OutgoingMessageTransform = {\n  apply: (children: EditorDocument, context: OutgoingMessageTransformContext) => EditorDocument;\n  shouldApply: (children: EditorDocument, context: OutgoingMessageTransformContext) => boolean;\n};\n\nexport const outgoingMessageTransforms: OutgoingMessageTransform[] = [\n  {\n    apply: (children, context) => rewriteSettingsLinks(children, context.settingsLinkBaseUrl),\n    shouldApply: (children, context) =>\n      hasSettingsLinksToRewrite(children, context.settingsLinkBaseUrl),\n  },\n];\n","import type { IContent, MatrixEvent, Room } from '$types/matrix-sdk';\nimport { getDocumentBeginCommand, type EditorDocument } from '$components/editor/model';\nimport { MsgType } from '$types/matrix-sdk';\nimport type { MatrixClient, RoomMessageEventContent } from '$types/matrix-sdk';\nimport {\n  BlockType,\n  customHtmlEqualsPlainText,\n  getDocumentLinks,\n  getMentions,\n  plainToEditorInput,\n  toMatrixCustomHTML,\n  toPlainText,\n  trimCommand,\n  trimCustomHtml,\n} from '$components/editor';\nimport { sanitizeText } from '$utils/sanitize';\nimport { getMentionContent } from '$utils/room/relations';\nimport type { IReplyDraft } from '$state/room/roomInputDrafts';\nimport { ProfileCatalog } from '$app/persona/catalog';\nimport type { PerMessageProfileMsc4461 } from '$app/persona';\nimport { convertPerMessageProfileToBeeperFormat } from '$app/persona/projection';\nimport { resolvePersonaProxy } from '$app/persona/proxy';\nimport { resolvePersona } from '$app/persona/selection';\nimport * as prefix from '$unstable/prefixes';\nimport { outgoingMessageTransforms } from './outgoingMessageTransforms';\nimport { buildReplacementContent } from './buildReplacementContent';\nimport { Command, SHRUG, TABLEFLIP, UNFLIP } from '$hooks/useCommands';\nimport type { MSC4459ImagePackReference } from '$types/matrix/common';\nimport type { SerializableMap } from '$types/wrapper/SerializableMap';\n\nexport type MessageContent = IContent & Pick<RoomMessageEventContent, 'msgtype' | 'body'>;\n\n/**\n * Branches needing React state (opening a picker, running a command, reacting) are\n * returned as descriptors rather than executed, keeping this module pure.\n */\nexport type OutgoingMessage =\n  | { kind: 'message'; content: MessageContent; latchPersona?: PerMessageProfileMsc4461 }\n  | { kind: 'quickReact'; key: string }\n  | { kind: 'pkCommand'; plainText: string }\n  | { kind: 'command'; command: Command; plainText: string; customHtml: string }\n  | { kind: 'gifSearch'; query: string }\n  | { kind: 'empty' };\n\nexport interface BuildOutgoingMessageDeps {\n  mx: MatrixClient;\n  room: Room;\n  roomId: string;\n  /** userId -> nickname, stripped from the body and replaced with the real display name. */\n  nicknames: Record<string, unknown>;\n  replyEvent: MatrixEvent | undefined;\n  replyDraft: IReplyDraft | undefined;\n  silentReply: boolean;\n  settingsLinkBaseUrl: string;\n  canSendReaction: boolean;\n  pkCompatEnable: boolean;\n  pmpProxyingEnable: boolean;\n  pmpLatchingEnable: boolean;\n  pmpNoFallback: boolean;\n  /** Persona latched by an earlier proxied message in this room. */\n  latchedPersona: PerMessageProfileMsc4461 | undefined;\n  isPKCommand: (plainText: string) => boolean;\n  imagePacksUsed: SerializableMap<string, MSC4459ImagePackReference>;\n}\n\nconst resolveNickname = (\n  room: Room,\n  nicknames: Record<string, unknown>,\n  userId: string\n): string | undefined => {\n  const nick = nicknames[userId];\n  if (typeof nick !== 'string' || nick.length === 0) return undefined;\n  return room.getMember(userId)?.rawDisplayName ?? userId;\n};\n\n// Nicknames are local-only, so they are swapped back to real display names before the\n// body goes out, keeping server-side mention processing correct.\nconst buildNicknameReplacement = (\n  children: EditorDocument,\n  { mx, room, roomId, nicknames, replyEvent }: BuildOutgoingMessageDeps\n): Map<RegExp, string> => {\n  const replacement = new Map<RegExp, string>();\n  const add = (userId: string) => {\n    const displayName = resolveNickname(room, nicknames, userId);\n    if (displayName)\n      replacement.set(new RegExp(`@?${nicknames[userId] as string}`, 'g'), displayName);\n  };\n\n  const senderId = replyEvent?.getSender();\n  if (senderId) add(senderId);\n  getMentions(mx, roomId, { children })?.users?.forEach(add);\n\n  return replacement;\n};\n\nconst stripCommandNode = (children: EditorDocument): EditorDocument => {\n  const firstPara = children[0];\n  if (firstPara?.type === BlockType.Paragraph) {\n    const commandIndex = firstPara.children.findIndex(\n      (token) => !('text' in token) && token.type === BlockType.Command\n    );\n    if (commandIndex !== -1) {\n      return [\n        { ...firstPara, children: firstPara.children.slice(commandIndex + 1) },\n        ...children.slice(1),\n      ];\n    }\n  }\n  return children;\n};\n\nconst applyPerMessageProfileFallback = (\n  content: MessageContent,\n  profile: PerMessageProfileMsc4461,\n  noFallback: boolean\n) => {\n  content[prefix.MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME] =\n    convertPerMessageProfileToBeeperFormat(profile, !noFallback);\n  if (noFallback || profile.displayname.trim() === '') return;\n\n  // Per spec a per-message profile must ship a fallback prefix for clients that ignore it.\n  const pmpPrefix = `${profile.displayname}: `;\n  const bodyWithoutFallback = content.body.startsWith(pmpPrefix)\n    ? content.body.slice(pmpPrefix.length)\n    : content.body;\n\n  const htmlPrefix = `<strong data-mx-profile-fallback>${sanitizeText(profile.displayname)}: </strong>`;\n  if (content.formatted_body && !content.formatted_body.startsWith(htmlPrefix)) {\n    content.formatted_body = htmlPrefix + content.formatted_body;\n  } else {\n    // we don't have a formatted body, but the fallback needs one\n    content.format = 'org.matrix.custom.html';\n    const escapedBody = sanitizeText(bodyWithoutFallback).replaceAll('\\n', '<br/>');\n    content.formatted_body = `${htmlPrefix}${escapedBody}`;\n  }\n\n  // guard against double-prefixing when the fallback is already present\n  if (!content.body.startsWith(pmpPrefix)) content.body = pmpPrefix + content.body;\n};\n\nexport async function buildOutgoingMessage(\n  children: EditorDocument,\n  deps: BuildOutgoingMessageDeps\n): Promise<OutgoingMessage> {\n  const {\n    mx,\n    room,\n    roomId,\n    replyDraft,\n    silentReply,\n    settingsLinkBaseUrl,\n    canSendReaction,\n    pkCompatEnable,\n    pmpProxyingEnable,\n    pmpLatchingEnable,\n    pmpNoFallback,\n    latchedPersona,\n    isPKCommand,\n    imagePacksUsed,\n  } = deps;\n\n  const commandName = getDocumentBeginCommand(children);\n  const nicknameReplacement = buildNicknameReplacement(children, deps);\n  const transformContext = { isMarkdown: true, settingsLinkBaseUrl };\n\n  const runTransforms = (input: EditorDocument): EditorDocument => {\n    let output = input;\n    outgoingMessageTransforms.forEach((transform) => {\n      if (!transform.shouldApply(output, transformContext)) return;\n      output = transform.apply(output, transformContext);\n    });\n    return output;\n  };\n  const forEmote = commandName === Command.Me || commandName === Command.RainbowMe;\n  const serializeHtml = (input: EditorDocument) =>\n    trimCustomHtml(\n      toMatrixCustomHTML(input, {\n        stripNickname: true,\n        nickNameReplacement: nicknameReplacement,\n        forEmote,\n        room,\n      })\n    );\n\n  let serializedChildren = runTransforms(\n    (commandName ? stripCommandNode(children) : children) as EditorDocument\n  );\n  let plainText = toPlainText(serializedChildren, true, true, nicknameReplacement).trim();\n  let customHtml = serializeHtml(serializedChildren);\n  let msgType = MsgType.Text;\n\n  if (canSendReaction && plainText.startsWith('+#')) {\n    return { kind: 'quickReact', key: plainText.substring(2) };\n  }\n  if (pkCompatEnable && isPKCommand(plainText)) {\n    return { kind: 'pkCommand', plainText };\n  }\n  const rawGifCommand =\n    commandName === undefined ? plainText.match(/^\\/gif(?:\\s+(.*))?$/i) : undefined;\n  if (rawGifCommand) return { kind: 'gifSearch', query: rawGifCommand[1] ?? '' };\n\n  if (commandName) {\n    plainText = trimCommand(commandName, plainText);\n    customHtml = trimCommand(commandName, customHtml);\n  }\n  if (commandName === Command.Me) {\n    msgType = MsgType.Emote;\n  } else if (commandName === Command.Notice) {\n    msgType = MsgType.Notice;\n  } else if (commandName === Command.Shrug) {\n    plainText = `${SHRUG} ${plainText}`;\n    customHtml = `${SHRUG} ${customHtml}`;\n  } else if (commandName === Command.TableFlip) {\n    plainText = `${TABLEFLIP} ${plainText}`;\n    customHtml = `${TABLEFLIP} ${customHtml}`;\n  } else if (commandName === Command.UnFlip) {\n    plainText = `${UNFLIP} ${plainText}`;\n    customHtml = `${UNFLIP} ${customHtml}`;\n  } else if (commandName) {\n    if (commandName === 'gif') return { kind: 'gifSearch', query: plainText };\n    return { kind: 'command', command: commandName as Command, plainText, customHtml };\n  }\n\n  if (plainText === '') return { kind: 'empty' };\n\n  // PluralKit-style proxy wrappers must be stripped before building `content`, otherwise\n  // the wrapper itself gets sent verbatim.\n  const catalog = new ProfileCatalog(mx);\n  let proxiedPerMessageProfile: PerMessageProfileMsc4461 | undefined;\n  let proxyStripped = false;\n  if (pmpProxyingEnable) {\n    const proxy = resolvePersonaProxy(\n      await catalog.list({ migrate: false }),\n      toPlainText(serializedChildren, true, false, nicknameReplacement).trim()\n    );\n    if (proxy) {\n      proxiedPerMessageProfile = proxy.persona;\n      const stripped = proxy.body;\n      if (stripped !== undefined) {\n        proxyStripped = true;\n        // Re-run the normal pipeline so a proxied message is parsed like any other.\n        serializedChildren = runTransforms(plainToEditorInput(stripped));\n        plainText = toPlainText(serializedChildren, true, true, nicknameReplacement).trim();\n        customHtml = serializeHtml(serializedChildren);\n      }\n    }\n  }\n\n  const mentionData = getMentions(mx, roomId, { children });\n  if (replyDraft && !silentReply) mentionData.users.add(replyDraft.userId);\n\n  const content: MessageContent = { msgtype: msgType, body: plainText };\n  content['m.mentions'] = getMentionContent(Array.from(mentionData.users), mentionData.room);\n  content[prefix.MATRIX_UNSTABLE_IMAGE_SOURCE_PACK_PROPERTY_NAME] = imagePacksUsed.toJSON();\n  content[prefix.MATRIX_UNSTABLE_EMBEDDED_LINK_PREVIEW_PROPERTY_NAME] = (\n    getDocumentLinks(serializedChildren) ?? []\n  ).map((matched_url) => ({ matched_url }));\n\n  if (replyDraft || !customHtmlEqualsPlainText(customHtml, plainText)) {\n    content.format = 'org.matrix.custom.html';\n    content.formatted_body = customHtml;\n  }\n\n  const [account, roomSelection] = await Promise.all([\n    catalog.getSelection('account'),\n    catalog.getSelection({ roomId }),\n  ]);\n  const perMessageProfile = resolvePersona({\n    proxy: proxiedPerMessageProfile,\n    latched: latchedPersona,\n    room: roomSelection,\n    account,\n    now: Date.now(),\n  });\n  if (perMessageProfile) applyPerMessageProfileFallback(content, perMessageProfile, pmpNoFallback);\n\n  return {\n    kind: 'message',\n    content,\n    // Only a proxy we actually stripped counts as used, so a wrapper we failed to\n    // strip does not latch the persona for the rest of the room.\n    latchPersona: pmpLatchingEnable && proxyStripped ? proxiedPerMessageProfile : undefined,\n  };\n}\n\nexport interface BuildEditReplacementDeps {\n  mx: MatrixClient;\n  room: Room;\n  roomId: string;\n  editingEvent: MatrixEvent;\n  /** Content of the latest edit, so a re-edit builds on the current body. */\n  currentContent: IContent;\n  pmpNoFallback: boolean;\n}\n\n/** Returns undefined when there is nothing to send, which cancels the edit. */\nexport function buildEditReplacement(\n  children: EditorDocument,\n  { mx, room, roomId, editingEvent, currentContent, pmpNoFallback }: BuildEditReplacementDeps\n): IContent | undefined {\n  const plainText = toPlainText(children).trim();\n  if (!plainText) return undefined;\n\n  const eventId = editingEvent.getId();\n  if (!eventId) return undefined;\n\n  const oldContent = editingEvent.getContent();\n  const customHtml = trimCustomHtml(\n    toMatrixCustomHTML(children, {\n      forEmote: oldContent.msgtype === MsgType.Emote,\n      room,\n    })\n  );\n\n  const mentionData = getMentions(mx, roomId, { children });\n  const previousMentions = currentContent['m.mentions'];\n  if (\n    previousMentions &&\n    typeof previousMentions === 'object' &&\n    'user_ids' in previousMentions &&\n    Array.isArray(previousMentions.user_ids)\n  ) {\n    previousMentions.user_ids.forEach((userId) => {\n      if (typeof userId === 'string') mentionData.users.add(userId);\n    });\n  }\n\n  return buildReplacementContent(\n    oldContent,\n    plainText,\n    customHtml,\n    eventId,\n    getMentionContent(Array.from(mentionData.users), mentionData.room),\n    (getDocumentLinks(children) ?? []).map((matched_url) => ({ matched_url })),\n    // An edit belongs to the identity used for the original event, not the currently selected one.\n    currentContent['com.beeper.per_message_profile'] ??\n      oldContent['com.beeper.per_message_profile'],\n    pmpNoFallback\n  );\n}\n","import { createLogger } from '$utils/debug';\nimport { FALLBACK_MIMETYPE, TGS_MIMETYPE } from '$utils/mimeTypes';\nimport { isAndroidTauri } from '$utils/platform';\n\nconst log = createLogger('nativeFilePicker');\n\nconst MIME_TYPES_BY_EXTENSION: Record<string, string> = {\n  aac: 'audio/aac',\n  apng: 'image/apng',\n  avif: 'image/avif',\n  bmp: 'image/bmp',\n  flac: 'audio/flac',\n  gif: 'image/gif',\n  heic: 'image/heic',\n  heif: 'image/heif',\n  json: 'application/json',\n  jpeg: 'image/jpeg',\n  jpg: 'image/jpeg',\n  m4a: 'audio/mp4',\n  md: 'text/markdown',\n  mov: 'video/quicktime',\n  mp3: 'audio/mpeg',\n  mp4: 'video/mp4',\n  m4v: 'video/mp4',\n  oga: 'audio/ogg',\n  ogg: 'audio/ogg',\n  ogv: 'video/ogg',\n  opus: 'audio/opus',\n  pdf: 'application/pdf',\n  png: 'image/png',\n  svg: 'image/svg+xml',\n  tgs: TGS_MIMETYPE,\n  txt: 'text/plain',\n  wav: 'audio/wav',\n  webm: 'video/webm',\n  webp: 'image/webp',\n};\n\nconst MEDIA_MIME_TYPES = ['image/*', 'video/*'];\n\nexport type NativePickerMode = 'media' | 'document';\nexport type NativeFileFailureHandler = (source: string, error: unknown) => void;\n\nconst normalizeSelectedPaths = (selected: unknown): string[] => {\n  if (selected === null || selected === undefined) return [];\n\n  const values = Array.isArray(selected) ? (selected as unknown[]) : [selected];\n  const paths = values.filter(\n    (value): value is string => typeof value === 'string' && value.length > 0\n  );\n  if (paths.length !== values.length) {\n    throw new Error(`Native picker returned unusable entries: ${JSON.stringify(selected)}`);\n  }\n\n  return paths;\n};\n\nconst getFileName = (path: string, index: number): string => {\n  const pathName = path.split(/[\\\\/]/).pop();\n  if (!pathName) return `attachment-${index + 1}`;\n\n  try {\n    return decodeURIComponent(pathName);\n  } catch {\n    return pathName;\n  }\n};\n\nconst getMimeTypeFromName = (fileName: string): string => {\n  const extension = fileName.split('.').pop()?.toLowerCase();\n  return extension ? (MIME_TYPES_BY_EXTENSION[extension] ?? FALLBACK_MIMETYPE) : FALLBACK_MIMETYPE;\n};\n\nconst resolveMimeType = (fileName: string, reportedMimeType?: string): string =>\n  reportedMimeType && reportedMimeType !== FALLBACK_MIMETYPE\n    ? reportedMimeType\n    : getMimeTypeFromName(fileName);\n\nconst isFile = (file: File | undefined): file is File => file !== undefined;\n\nconst pickAndroidFiles = async (\n  pickerMode: NativePickerMode,\n  onFileFailure?: NativeFileFailureHandler\n): Promise<File[]> => {\n  const { AndroidFs } = await import('tauri-plugin-android-fs-api');\n  const uris = await AndroidFs.showOpenFilePicker({\n    pickerType: pickerMode === 'media' ? 'Gallery' : 'FilePicker',\n    mimeTypes: pickerMode === 'media' ? MEDIA_MIME_TYPES : [],\n    multiple: true,\n  });\n  const seenUris = new Set<string>();\n  const uniqueUris = uris.filter(({ uri }) => {\n    if (seenUris.has(uri)) return false;\n    seenUris.add(uri);\n    return true;\n  });\n\n  const files = await Promise.all(\n    uniqueUris.map(async (uri, index): Promise<File | undefined> => {\n      try {\n        const metadata = await AndroidFs.getMetadata(uri);\n        if (metadata.type !== 'File') return undefined;\n\n        const name = metadata.name || `attachment-${index + 1}`;\n        const contents = await AndroidFs.readFile(uri);\n        return new File([contents], name, {\n          type: resolveMimeType(name, metadata.mimeType),\n          lastModified: metadata.lastModified.getTime(),\n        });\n      } catch (error) {\n        onFileFailure?.(uri.uri, error);\n        return undefined;\n      }\n    })\n  );\n\n  return files.filter(isFile);\n};\n\nconst pickIosFiles = async (\n  pickerMode: NativePickerMode,\n  onFileFailure?: NativeFileFailureHandler\n): Promise<File[]> => {\n  const { open } = await import('@tauri-apps/plugin-dialog');\n  const selected = await open({ pickerMode, multiple: true });\n  log.log('picker returned', pickerMode, typeof selected, selected);\n\n  const paths = normalizeSelectedPaths(selected);\n  if (paths.length === 0) {\n    log.warn('picker resolved without any path (cancelled, or a swallowed native failure)');\n    return [];\n  }\n\n  const { readFile, remove } = await import('@tauri-apps/plugin-fs');\n  const files = await Promise.all(\n    paths.map(async (path, index): Promise<File | undefined> => {\n      const name = getFileName(path, index);\n      try {\n        const contents = await readFile(path);\n        return new File([contents], name, { type: getMimeTypeFromName(name) });\n      } catch (error) {\n        onFileFailure?.(path, error);\n        return undefined;\n      } finally {\n        await remove(path).catch((error: unknown) => onFileFailure?.(path, error));\n      }\n    })\n  );\n\n  return files.filter(isFile);\n};\n\nexport const pickNativeFile = async (\n  pickerMode: NativePickerMode,\n  onFileFailure?: NativeFileFailureHandler\n): Promise<File[]> =>\n  isAndroidTauri()\n    ? pickAndroidFiles(pickerMode, onFileFailure)\n    : pickIosFiles(pickerMode, onFileFailure);\n","import type {\n  KeyboardEventHandler,\n  MouseEvent,\n  PointerEvent,\n  ReactElement,\n  RefObject,\n} from 'react';\nimport {\n  forwardRef,\n  Fragment,\n  lazy,\n  Suspense,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n  useMemo,\n} from 'react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\n\nimport { isKeyHotkey } from 'is-hotkey';\nimport type {\n  IContent,\n  MatrixEvent,\n  Room,\n  IEventRelation,\n  RoomMessageEventContent,\n  StickerEventContent,\n  TimelineEvents,\n} from '$types/matrix-sdk';\nimport { MatrixError } from '$types/matrix-sdk';\nimport { EventType, RelationType } from '$types/matrix-sdk';\nimport { M_POLL_START } from 'matrix-js-sdk';\nimport type { RectCords } from 'folds';\nimport {\n  Box,\n  color,\n  config,\n  Dialog,\n  IconButton,\n  Menu,\n  MenuItem,\n  OverlayBackdrop,\n  OverlayCenter,\n  Scroll,\n  Spinner,\n  Text,\n  toRem,\n} from 'folds';\nimport { Overlay, PopOut } from '$components/overlay-stack';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { ProseMirrorEditorController } from '$components/editor/prosemirrorController';\nimport {\n  AutocompletePrefix,\n  useAutocompleteQuery,\n  createEmoticonElement,\n  CustomEditor,\n  customHtmlEqualsPlainText,\n  RoomMentionAutocomplete,\n  toMatrixCustomHTML,\n  toPlainText,\n  trimCustomHtml,\n  UserMentionAutocomplete,\n  EmoticonAutocomplete,\n  ANYWHERE_AUTOCOMPLETE_PREFIXES,\n  BEGINNING_AUTOCOMPLETE_PREFIXES,\n  MarkdownFormattingToolbarBottom,\n  MarkdownFormattingToolbarToggle,\n} from '$components/editor';\nimport { stripMarkdownEscapesForHiddenPreviews } from './message/hiddenLinkPreviews';\nimport { plainToEditorInput } from '$components/editor/input';\nimport type { EditorDocument } from '$components/editor/model';\nimport type { GifData } from '$components/emoji-board';\nimport { EmojiBoard, EmojiBoardTab } from '$components/emoji-board';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport type { TUploadContent } from '$utils/matrix';\nimport {\n  cancelUploadContent,\n  encryptFile,\n  getImageInfo,\n  mxcUrlToHttp,\n  toggleReaction,\n} from '$utils/matrix';\nimport { useTypingStatusUpdater } from '$hooks/useTypingStatusUpdater';\nimport { useFilePicker } from '$hooks/useFilePicker';\nimport { useFilePasteHandler } from '$hooks/useFilePasteHandler';\nimport { useFileDropZone } from '$hooks/useFileDrop';\nimport type { TUploadItem, TUploadMetadata, IReplyDraft } from '$state/room/roomInputDrafts';\nimport {\n  roomIdToMsgDraftAtomFamily,\n  roomIdToReplyDraftAtomFamily,\n  roomIdToUploadItemsAtomFamily,\n  roomUploadAtomFamily,\n} from '$state/room/roomInputDrafts';\nimport { UploadCardRenderer } from '$components/upload-card';\nimport type { UploadBoardImperativeHandlers } from '$components/upload-board';\nimport { UploadBoard, UploadBoardContent, UploadBoardHeader } from '$components/upload-board';\nimport type { Upload, UploadSuccess } from '$state/upload';\nimport { UploadStatus, createUploadFamilyObserverAtom } from '$state/upload';\nimport { loadImageElementFromMediaUrl } from '$utils/dom';\nimport { isImageMimeType, safeUploadFile } from '$utils/mimeTypes';\nimport { useSetting } from '$state/hooks/settings';\nimport type { EditorButtonId } from '$state/settings';\nimport { settingsAtom } from '$state/settings';\nimport { matchesShortcut } from '../../keyboard/shortcuts';\nimport { getEditedEvent, getThreadReplyEvents } from '$utils/room/relations';\nimport { htmlToMarkdown } from '$plugins/markdown';\nimport { Command, useCommands } from '$hooks/useCommands';\nimport { isMobileOrTablet, isMobileTauri } from '$utils/platform';\nimport { Reply, ThreadIndicator } from '$components/message';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useImagePackRooms } from '$hooks/useImagePackRooms';\nimport { useComposingCheck } from '$hooks/useComposingCheck';\nimport { createLogger } from '$utils/debug';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport FocusTrap from 'focus-trap-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport * as Sentry from '@sentry/react';\nimport {\n  delayedEventsSupportedAtom,\n  getScheduledMessageStateKey,\n  roomIdToScheduledTimeAtomFamily,\n  roomIdToEditingScheduledDelayIdAtomFamily,\n  serverMaxDelayMsAtom,\n} from '$state/scheduledMessages';\nimport {\n  sendDelayedMessage,\n  sendDelayedMessageE2EE,\n  computeDelayMs,\n  cancelDelayedEvent,\n} from '$utils/delayedEvents';\nimport { roomScheduleCoordinator } from '$state/room/roomScheduleCoordinator';\nimport { timeHourMinute, timeDayMonthYear, daysToMs } from '$utils/time';\nimport { stopPropagation } from '$utils/keyboard';\n\nimport { usePowerLevelsContext } from '$hooks/usePowerLevels';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { AutocompleteNotice } from '$components/editor/autocomplete/AutocompleteNotice';\nimport { setCurrentlyUsedPerMessageProfileIdForRoom } from '$hooks/usePerMessageProfile';\nimport type { PerMessageProfileMsc4461 } from '$app/persona';\nimport { ProfileCatalog } from '$app/persona/catalog';\nimport { projectPersona } from '$app/persona/projection';\nimport { resolvePersona } from '$app/persona/selection';\nimport {\n  Bell,\n  BellSlash,\n  CaretDown,\n  chipIcon,\n  Clock,\n  composerIcon,\n  dropzoneIcon,\n  File as FileIcon,\n  Gif,\n  ListBullets,\n  MapPinPlusIcon,\n  menuIcon,\n  Microphone,\n  PaperPlaneTilt,\n  PencilSimple,\n  getPhosphorIconSize,\n  PlusCircle,\n  Smiley,\n  Sticker,\n  Stop,\n  X,\n} from '$components/icons/phosphor';\nimport { getSupportedAudioExtension } from '$plugins/voice-recorder-kit/supportedCodec';\nimport { ErrorCode } from '../../cs-errorcode';\nimport { PKitCommandMessageHandler } from '$plugins/pluralkit-handler/PKitCommandMessageHandler';\nimport type { IGenericMSC4459, MSC4459ImagePackReference } from '$types/matrix/common';\nimport {\n  getImagePackReferencesForMxc,\n  getImagePackReferencesForMxcWrappedInMap,\n} from '$utils/msc4459helper';\nimport { ImageUsage } from '$plugins/custom-emoji';\nimport { getPackImageInfo } from '$plugins/custom-emoji/utils';\nimport { SerializableMap } from '$types/wrapper/SerializableMap';\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport * as messageCss from '$features/room/message/styles.css';\nimport { AttachmentContent } from '$components/attachment-sheet/AttachmentContent';\nimport { MobileSwipeDownModal } from '$components/MobileSwipeDownModal';\nimport { SchedulePickerDialog } from './schedule-send';\nimport * as css from './schedule-send/SchedulePickerDialog.css';\nimport {\n  getAudioMsgContent,\n  getFileMsgContent,\n  getImageMsgContent,\n  getVideoMsgContent,\n  getGifMsgContent,\n  buildGalleryContent,\n  getGalleryItemContent,\n} from './msgContent';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { CommandAutocomplete } from './CommandAutocomplete';\nimport type {\n  AudioMessageRecorderHandle,\n  AudioRecordingCompletePayload,\n} from './AudioMessageRecorder';\nimport { AudioMessageRecorder } from './AudioMessageRecorder';\nimport * as prefix from '$unstable/prefixes';\nimport { PollDialog } from './poll-modals';\nimport { PersonaPicker, type PersonaPickerTab } from './persona-picker/PersonaPicker.tsx';\nimport { createComposerController, type ComposerController } from './composerController';\nimport { buildEditReplacement, buildOutgoingMessage } from './composerMessage';\nimport { pickNativeFile } from './nativeFilePicker';\n\nconst LocationDialog = lazy(() =>\n  import('./location-modal').then((module) => ({ default: module.LocationDialog }))\n);\n\n// Returns the event ID of the most recent non-reaction/non-edit event in a thread,\n// falling back to the thread root if no replies exist yet.\nconst getLatestThreadEventId = (room: Room, threadRootId: string): string => {\n  const replies = getThreadReplyEvents(room, threadRootId);\n  return replies.at(-1)?.getId() ?? threadRootId;\n};\n\nexport const getReplyContent = (\n  replyDraft: IReplyDraft | undefined,\n  room?: Room\n): IEventRelation => {\n  if (!replyDraft) return {};\n\n  const relatesTo: IEventRelation = {};\n\n  // If this is a thread relation\n  if (replyDraft.relation?.rel_type === RelationType.Thread) {\n    relatesTo.event_id = replyDraft.relation.event_id;\n    relatesTo.rel_type = RelationType.Thread;\n\n    // If the user explicitly clicked \"reply\" on a message (including the thread root),\n    // we must set is_falling_back=false and target that message directly.\n    // (replyDraft.body being empty means it's just a seeded thread draft)\n    if (replyDraft.body) {\n      // Explicit reply — per spec, is_falling_back must be false\n      relatesTo['m.in_reply_to'] = {\n        event_id: replyDraft.eventId,\n      };\n      relatesTo.is_falling_back = false;\n    } else {\n      // Regular thread message — per spec, include fallback m.in_reply_to pointing to the\n      // most recent thread message so unthreaded clients can display it as a reply chain\n      const threadRootId = replyDraft.relation.event_id ?? replyDraft.eventId;\n      const latestEventId = room ? getLatestThreadEventId(room, threadRootId) : threadRootId;\n      relatesTo['m.in_reply_to'] = {\n        event_id: latestEventId,\n      };\n      relatesTo.is_falling_back = true;\n    }\n  } else {\n    // Regular reply (not in a thread)\n    relatesTo['m.in_reply_to'] = {\n      event_id: replyDraft.eventId,\n    };\n  }\n\n  return relatesTo;\n};\n\nconst log = createLogger('RoomInput');\nconst debugLog = createDebugLogger('RoomInput');\nconst ENCRYPTION_PREPARATION_INTERVAL_MS = 60_000;\ninterface ReplyEventContent {\n  'm.relates_to'?: IEventRelation;\n}\n\nconst createUploadItemKey = () =>\n  globalThis.crypto.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`;\n\ninterface ReplyClaim {\n  epoch: number;\n  snapshot: IReplyDraft;\n  silentReply: boolean;\n}\n\ninterface Submission {\n  children: EditorDocument;\n  epoch: number;\n  replyClaim: ReplyClaim | undefined;\n}\n\ninterface SendContentsOptions {\n  contents: IContent[];\n  submission: Submission;\n  isLive: () => boolean;\n  includeReplyWithText?: boolean;\n  /** Defaults to `m.room.message`. Polls and other non-message events set this. */\n  eventType?: keyof TimelineEvents;\n  onContentSent?: (index: number) => void | Promise<void>;\n}\n\ninterface RoomInputProps {\n  editor: ProseMirrorEditorController;\n  fileDropContainerRef: RefObject<HTMLElement | null>;\n  roomId: string;\n  room: Room;\n  threadRootId?: string;\n  onEditLastMessage?: () => void;\n  editId?: string;\n  onCancelEdit?: () => void;\n}\n\nexport const RoomInput = forwardRef<HTMLDivElement, RoomInputProps>(\n  (\n    {\n      editor,\n      fileDropContainerRef,\n      roomId,\n      room,\n      threadRootId,\n      onEditLastMessage,\n      editId,\n      onCancelEdit,\n    },\n    ref\n  ) => {\n    // When in thread mode, isolate drafts by thread root ID so thread replies\n    // don't clobber the main room draft (and vice versa).\n    const draftKey = threadRootId ?? roomId;\n    const mx = useMatrixClient();\n    const gifProxyUrl = useClientConfig().gifs?.proxyUrl;\n    const useAuthentication = useMediaAuthentication();\n    const [enterForNewline] = useSetting(settingsAtom, 'enterForNewline');\n    const [editorOldAddFile] = useSetting(settingsAtom, 'editorOldAddFile');\n    const [editorGifButton] = useSetting(settingsAtom, 'editorGifButton');\n    const [editorEmojiButton] = useSetting(settingsAtom, 'editorEmojiButton');\n    const [editorStickerButton] = useSetting(settingsAtom, 'editorStickerButton');\n    const [editorMicButton] = useSetting(settingsAtom, 'editorMicButton');\n    const [editorButtonOrder] = useSetting(settingsAtom, 'editorButtonOrder');\n    const [shortcutOverrides] = useSetting(settingsAtom, 'shortcutOverrides');\n\n    const [hideActivity] = useSetting(settingsAtom, 'hideActivity');\n    const [mentionInReplies] = useSetting(settingsAtom, 'mentionInReplies');\n    const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n    const commands = useCommands(mx, room);\n    const imagePacksUsedRef = useRef(new SerializableMap<string, MSC4459ImagePackReference>());\n    /**\n     * handle pluralkit-style messages\n     */\n    const pluralkitCmdMessageHandler = useMemo(\n      () => new PKitCommandMessageHandler(mx, room),\n      [mx, room]\n    );\n\n    const [pkCompatEnable] = useSetting(settingsAtom, 'pkCompat');\n    const [pmpProxyingEnable] = useSetting(settingsAtom, 'pmpProxying');\n    const [pmpLatchingEnable] = useSetting(settingsAtom, 'pmpLatching');\n    const [pmpPickerEnable] = useSetting(settingsAtom, 'pmpPicker');\n    const [pmpNoFallback] = useSetting(settingsAtom, 'pmpNoFallback');\n\n    const [latchedPersona, setLatchedPersona] = useState<PerMessageProfileMsc4461>();\n\n    const emojiBtnRef = useRef<HTMLButtonElement>(null);\n    const gifBtnRef = useRef<HTMLButtonElement>(null);\n    const stickerBtnRef = useRef<HTMLButtonElement>(null);\n    const micBtnRef = useRef<HTMLButtonElement>(null);\n    // Preserve stable list keys across metadata/description replacements without\n    // storing UI-only IDs in the upload draft state.\n    const uploadItemKeysRef = useRef(new WeakMap<TUploadContent, string>());\n    const roomToParents = useAtomValue(roomToParentsAtom);\n    /**\n     * Nickname someone set for another user\n     * this nickname should be treated as private\n     */\n    const nicknames = useAtomValue(nicknamesAtom);\n\n    const powerLevels = usePowerLevelsContext();\n    const creators = useRoomCreators(room);\n    const permissions = useRoomPermissions(creators, powerLevels);\n    const canSendReaction = permissions.event(EventType.Reaction, mx.getSafeUserId());\n\n    const [msgDraft, setMsgDraft] = useAtom(roomIdToMsgDraftAtomFamily(draftKey));\n    const [replyDraft, setReplyDraft] = useAtom(roomIdToReplyDraftAtomFamily(draftKey));\n    const replyDraftRef = useRef(replyDraft);\n    replyDraftRef.current = replyDraft;\n\n    const [uploadBoard, setUploadBoard] = useState(true);\n    const [uploadSending, setUploadSending] = useState(false);\n    const [uploadBusy, setUploadBusy] = useState(false);\n    const [ingestingFiles, setIngestingFiles] = useState(false);\n    const fileIngestionCountRef = useRef(0);\n    const submissionInFlightRef = useRef(false);\n    const composerControllerRef = useRef<ComposerController | undefined>(undefined);\n    composerControllerRef.current ??= createComposerController();\n    // Bumped when this composer goes away, so async work started for a previous\n    // room/thread stops writing to the current one.\n    const draftEpochRef = useRef(0);\n    const mountedRef = useRef(false);\n    const [selectedFiles, setSelectedFiles] = useAtom(roomIdToUploadItemsAtomFamily(draftKey));\n    const selectedFilesRef = useRef(selectedFiles);\n    selectedFilesRef.current = selectedFiles;\n    const uploadItemOverridesRef = useRef(new Map<TUploadContent, Partial<TUploadItem>>());\n    const removedUploadFilesRef = useRef(new WeakSet<TUploadContent>());\n    const isEncrypting = selectedFiles.some((f) => f.encrypting);\n    const sendBusy = uploadSending || isEncrypting || uploadBusy || ingestingFiles;\n    const uploadFamilyObserverAtom = createUploadFamilyObserverAtom(\n      roomUploadAtomFamily,\n      selectedFiles.map((f) => f.file)\n    );\n    const uploadBoardHandlers = useRef<UploadBoardImperativeHandlers | undefined>(undefined);\n    const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n    const isLongPress = useRef(false);\n    const sentOnPointerUpRef = useRef(false);\n    const suppressBlurRefocusRef = useRef(false);\n    const editorRafIdsRef = useRef(new Set<number>());\n    const scheduleEditorRaf = useCallback((callback: () => void) => {\n      const rafId = requestAnimationFrame(() => {\n        editorRafIdsRef.current.delete(rafId);\n        callback();\n      });\n      editorRafIdsRef.current.add(rafId);\n    }, []);\n    useEffect(\n      () => () => {\n        editorRafIdsRef.current.forEach((rafId) => cancelAnimationFrame(rafId));\n        editorRafIdsRef.current.clear();\n      },\n      []\n    );\n    const suppressEditorRefocus = useCallback(() => {\n      suppressBlurRefocusRef.current = true;\n      scheduleEditorRaf(() => {\n        suppressBlurRefocusRef.current = false;\n      });\n    }, [scheduleEditorRaf]);\n\n    const imagePackRooms: Room[] = useImagePackRooms(roomId, roomToParents);\n\n    const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n    const audioRecorderRef = useRef<AudioMessageRecorderHandle>(null);\n    const micHoldStartRef = useRef(0);\n    const micHoldReleaseRef = useRef<(() => void) | null>(null);\n    const recorderActionRef = useRef<'stop' | 'cancel' | undefined>(undefined);\n    const recorderTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n    const scheduleRecorderTimer = useCallback((callback: () => void) => {\n      recorderTimerRef.current = setTimeout(() => {\n        recorderTimerRef.current = undefined;\n        callback();\n      }, 50);\n    }, []);\n    const requestRecorderStop = useCallback(() => {\n      if (recorderActionRef.current) return;\n      recorderActionRef.current = 'stop';\n      audioRecorderRef.current?.stop();\n    }, []);\n    const HOLD_THRESHOLD_MS = 400;\n\n    useEffect(\n      () => () => {\n        micHoldReleaseRef.current?.();\n        clearTimeout(recorderTimerRef.current);\n        recorderActionRef.current = undefined;\n      },\n      []\n    );\n    const [autocompleteQuery, setAutocompleteQuery, handleCloseAutocomplete] =\n      useAutocompleteQuery(editor);\n    const [isQuickTextReact, setQuickTextReact] = useState(false);\n\n    const replyDraftBase = useMemo(\n      () =>\n        threadRootId\n          ? {\n              userId: mx.getUserId() ?? '',\n              eventId: threadRootId,\n              body: '',\n              relation: { rel_type: RelationType.Thread, event_id: threadRootId },\n            }\n          : undefined,\n      [mx, threadRootId]\n    );\n\n    const sendTypingStatus = useTypingStatusUpdater(mx, roomId, { disabled: !!threadRootId });\n\n    useEffect(() => {\n      mountedRef.current = true;\n      const controller = (composerControllerRef.current ??= createComposerController());\n      return () => {\n        mountedRef.current = false;\n        draftEpochRef.current += 1;\n        controller.dispose();\n        composerControllerRef.current = undefined;\n      };\n    }, [draftKey]);\n\n    const getUploadItemKey = useCallback((fileItem: TUploadItem): string => {\n      const existingKey = uploadItemKeysRef.current.get(fileItem.originalFile);\n      if (existingKey) return existingKey;\n\n      const nextKey = createUploadItemKey();\n      uploadItemKeysRef.current.set(fileItem.originalFile, nextKey);\n      return nextKey;\n    }, []);\n\n    const handleFiles = useCallback(\n      async (\n        files: File[],\n        audioMeta?: { waveform: number[]; audioDuration: number },\n        options?: { alreadyInMemory?: boolean }\n      ) => {\n        const epoch = draftEpochRef.current;\n        fileIngestionCountRef.current += 1;\n        setIngestingFiles(true);\n        try {\n          setUploadBoard(true);\n          const safeFiles = await Promise.all(files.map(safeUploadFile));\n          if (epoch !== draftEpochRef.current || !mountedRef.current) return;\n\n          // Eager-read to avoid Android content URI expiry after SAF picker\n          const blobbedFiles =\n            isMobileOrTablet() && !options?.alreadyInMemory\n              ? await Promise.all(\n                  safeFiles.map(async (f) => {\n                    try {\n                      const buf = await f.arrayBuffer();\n                      return new File([buf], f.name, {\n                        type: f.type,\n                        lastModified: f.lastModified,\n                      });\n                    } catch {\n                      return f;\n                    }\n                  })\n                )\n              : safeFiles;\n          if (epoch !== draftEpochRef.current || !mountedRef.current) return;\n          blobbedFiles.forEach((file) => removedUploadFilesRef.current.delete(file));\n\n          const makeMetadata = () => ({\n            markedAsSpoiler: false,\n            waveform: audioMeta?.waveform,\n            audioDuration: audioMeta?.audioDuration,\n          });\n\n          if (room.hasEncryptionStateEvent()) {\n            const placeholders: TUploadItem[] = blobbedFiles.map((f) => ({\n              file: f,\n              originalFile: f,\n              encInfo: undefined,\n              encrypting: true,\n              metadata: makeMetadata(),\n            }));\n            setSelectedFiles({ type: 'PUT', item: placeholders });\n            await Promise.all(\n              placeholders.map(async (placeholder) => {\n                try {\n                  const encryptedFile = await encryptFile(placeholder.originalFile);\n                  if (epoch !== draftEpochRef.current || !mountedRef.current) return;\n                  if (removedUploadFilesRef.current.has(placeholder.originalFile)) return;\n                  const currentItem = selectedFilesRef.current.find(\n                    (item) => item.originalFile === placeholder.originalFile\n                  );\n                  if (!currentItem) return;\n                  const overrides = uploadItemOverridesRef.current.get(placeholder.originalFile);\n                  setSelectedFiles({\n                    type: 'REPLACE',\n                    item: currentItem,\n                    replacement: {\n                      ...currentItem,\n                      ...encryptedFile,\n                      ...overrides,\n                      encrypting: false,\n                      metadata: overrides?.metadata ?? currentItem.metadata,\n                    },\n                  });\n                } catch (encryptError: unknown) {\n                  log.warn('Failed to encrypt file for upload:', encryptError);\n                  if (epoch === draftEpochRef.current && mountedRef.current) {\n                    const currentItem = selectedFilesRef.current.find(\n                      (item) => item.originalFile === placeholder.originalFile\n                    );\n                    if (currentItem) setSelectedFiles({ type: 'DELETE', item: currentItem });\n                  }\n                }\n              })\n            );\n            return;\n          }\n\n          setSelectedFiles({\n            type: 'PUT',\n            item: blobbedFiles.map((f) => ({\n              file: f,\n              originalFile: f,\n              encInfo: undefined,\n              metadata: makeMetadata(),\n            })),\n          });\n        } catch (error: unknown) {\n          log.warn('Failed to prepare files for upload:', error);\n        } finally {\n          fileIngestionCountRef.current -= 1;\n          if (fileIngestionCountRef.current === 0 && mountedRef.current) setIngestingFiles(false);\n        }\n      },\n      [room, setSelectedFiles]\n    );\n    const pickFile = useFilePicker(handleFiles, true);\n    const pickAttachment = useCallback(\n      async (pickerMode: 'media' | 'document', accept: string) => {\n        if (!isMobileTauri()) {\n          await pickFile(accept);\n          return;\n        }\n\n        try {\n          const files = await pickNativeFile(pickerMode, (source, error) => {\n            log.warn('Native attachment file error:', source, error);\n          });\n          if (files.length > 0) await handleFiles(files, undefined, { alreadyInMemory: true });\n        } catch (error) {\n          log.error('Failed to open native attachment picker', { roomId }, error);\n        }\n      },\n      [handleFiles, pickFile, roomId]\n    );\n    const handlePaste = useFilePasteHandler(handleFiles);\n    const dropZoneVisible = useFileDropZone(fileDropContainerRef, handleFiles);\n    const [hasText, setHasText] = useState(false);\n    const lastEncryptionPreparationAt = useRef(0);\n    const detectAutocomplete = useCallback(() => {\n      const quickReactPrefix = editor.getText().slice(0, 2);\n      if (quickReactPrefix === '+#') {\n        setQuickTextReact(true);\n        setAutocompleteQuery(undefined);\n        return;\n      }\n      setQuickTextReact(false);\n\n      const query =\n        editor.getAutocompleteQuery(BEGINNING_AUTOCOMPLETE_PREFIXES, true) ??\n        editor.getAutocompleteQuery(ANYWHERE_AUTOCOMPLETE_PREFIXES);\n\n      setAutocompleteQuery(query);\n    }, [editor, setAutocompleteQuery]);\n\n    const handleEditorChange = useCallback(() => {\n      setHasText(!editor.isEmpty());\n      detectAutocomplete();\n      if (!room.hasEncryptionStateEvent()) return;\n\n      const now = Date.now();\n      if (now - lastEncryptionPreparationAt.current < ENCRYPTION_PREPARATION_INTERVAL_MS) return;\n\n      lastEncryptionPreparationAt.current = now;\n      mx.getCrypto()?.prepareToEncrypt(room);\n    }, [editor, detectAutocomplete, mx, room]);\n    const hasContent = hasText || selectedFiles.length > 0;\n\n    const isComposing = useComposingCheck();\n\n    const queryClient = useQueryClient();\n    const delayedEventsSupported = useAtomValue(delayedEventsSupportedAtom);\n    const scheduledStateKey = getScheduledMessageStateKey(mx.getSafeUserId(), roomId);\n    const [roomScheduledTime, setRoomScheduledTime] = useAtom(\n      roomIdToScheduledTimeAtomFamily(scheduledStateKey)\n    );\n    const [roomEditingScheduledDelayId, setRoomEditingScheduledDelayId] = useAtom(\n      roomIdToEditingScheduledDelayIdAtomFamily(scheduledStateKey)\n    );\n    const scheduledTime = threadRootId ? null : roomScheduledTime;\n    const editingScheduledDelayId = threadRootId ? null : roomEditingScheduledDelayId;\n    const setScheduledTime = useCallback(\n      (value: Date | null) => {\n        if (!threadRootId) setRoomScheduledTime(value);\n      },\n      [setRoomScheduledTime, threadRootId]\n    );\n    const setEditingScheduledDelayId = useCallback(\n      (value: string | null) => {\n        if (!threadRootId) setRoomEditingScheduledDelayId(value);\n      },\n      [setRoomEditingScheduledDelayId, threadRootId]\n    );\n    const [AddMenuAnchor, setAddMenuAnchor] = useState<RectCords>();\n    const [showAttachmentSheet, setShowAttachmentSheet] = useState(false);\n    const attachmentSkipReturnFocusRef = useRef(false);\n    const emojiBoardSkipReturnFocusRef = useRef(true);\n    const [showPollPicker, setShowPollPicker] = useState(false);\n    const [showLocationPicker, setShowLocationPicker] = useState(false);\n    const [scheduleMenuAnchor, setScheduleMenuAnchor] = useState<RectCords>();\n    const [showSchedulePicker, setShowSchedulePicker] = useState(false);\n    const [silentReply, setSilentReply] = useState(!mentionInReplies);\n    // Clears the reply draft up front so it cannot be re-sent, keeping a snapshot to\n    // restore if the send never lands.\n    const claimedReplyEventIdRef = useRef<string | undefined>(undefined);\n    const claimReply = useCallback((): ReplyClaim | undefined => {\n      const currentReply = replyDraftRef.current;\n      if (!currentReply) return undefined;\n\n      const epoch = draftEpochRef.current;\n      claimedReplyEventIdRef.current = currentReply.eventId;\n      replyDraftRef.current = replyDraftBase;\n      setReplyDraft(replyDraftBase);\n      return { epoch, snapshot: structuredClone(currentReply), silentReply };\n    }, [replyDraftBase, setReplyDraft, silentReply]);\n    const restoreReplyClaim = useCallback(\n      (claim: ReplyClaim | undefined) => {\n        if (!claim || claim.epoch !== draftEpochRef.current) return;\n        if (replyDraftRef.current !== replyDraftBase) return;\n        replyDraftRef.current = claim.snapshot;\n        setReplyDraft(claim.snapshot);\n        claimedReplyEventIdRef.current = undefined;\n      },\n      [replyDraftBase, setReplyDraft]\n    );\n    const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n    const setServerMaxDelayMs = useSetAtom(serverMaxDelayMsAtom);\n    const [sendError, setSendError] = useState<string | undefined>();\n    const isEncrypted = room.hasEncryptionStateEvent();\n    const [emojiBoardTab, setEmojiBoardTab] = useState<EmojiBoardTab | undefined>(undefined);\n    const [initialGifSearch, setInitialGifSearch] = useState<string>();\n    const closeEmojiBoard = useCallback(() => {\n      if (isMobileOrTablet()) {\n        const activeElement = document.activeElement;\n        if (activeElement instanceof HTMLElement) activeElement.blur();\n      }\n      setInitialGifSearch(undefined);\n      setEmojiBoardTab(undefined);\n    }, []);\n    const toggleEmojiBoardTab = useCallback((tab: EmojiBoardTab) => {\n      setEmojiBoardTab((prev) => {\n        if (prev !== tab) {\n          if (prev === undefined && isMobileOrTablet()) {\n            const activeElement = document.activeElement;\n            if (activeElement instanceof HTMLElement) activeElement.blur();\n          }\n          return tab;\n        }\n        if (isMobileOrTablet()) {\n          const activeElement = document.activeElement;\n          if (activeElement instanceof HTMLElement) activeElement.blur();\n        }\n        return undefined;\n      });\n    }, []);\n\n    const [personaPickerTab, setPersonaPickerTab] = useState<PersonaPickerTab | undefined>(\n      undefined\n    );\n\n    const [enableMediaGalleries] = useSetting(settingsAtom, 'enableMediaGalleries');\n    const [sendIndividualAttachmentAsCaption] = useSetting(\n      settingsAtom,\n      'sendIndividualAttachmentAsCaption'\n    );\n\n    const replyEvent = replyDraft ? room.findEventById(replyDraft.eventId) : undefined;\n\n    // Seed the reply draft with the thread relation whenever we're in thread\n    // mode (e.g. on first render or when the thread root changes). We use the\n    // current user's ID as userId so that the mention logic skips it.\n    useEffect(() => {\n      if (!threadRootId) return;\n      setReplyDraft((prev) => {\n        if (\n          prev?.relation?.rel_type === RelationType.Thread &&\n          prev.relation.event_id === threadRootId\n        )\n          return prev;\n        return {\n          userId: mx.getUserId() ?? '',\n          eventId: threadRootId,\n          body: '',\n          relation: { rel_type: RelationType.Thread, event_id: threadRootId },\n        };\n      });\n    }, [threadRootId, setReplyDraft, mx]);\n\n    // Rewritten with equal content on unmount, and appending it again would duplicate it.\n    const appliedDraftRef = useRef<string | undefined>(undefined);\n    useEffect(() => {\n      const draft = JSON.stringify(msgDraft);\n      if (appliedDraftRef.current === draft) return;\n      appliedDraftRef.current = draft;\n      editor.appendDocument(msgDraft);\n    }, [editor, msgDraft]);\n\n    const editingStateRef = useRef(false);\n    const preEditDraftRef = useRef<EditorDocument | undefined>(undefined);\n    useEffect(\n      () => () => {\n        if (editingStateRef.current) {\n          setMsgDraft(structuredClone(preEditDraftRef.current ?? []) as EditorDocument);\n        } else if (editor.isEmpty()) {\n          setMsgDraft([]);\n        } else {\n          const parsedDraft = structuredClone(editor.children);\n          setMsgDraft(parsedDraft as EditorDocument);\n        }\n        editor.clear();\n      },\n      [draftKey, editor, setMsgDraft]\n    );\n\n    const editingEvent = editId ? room.findEventById(editId) : undefined;\n    const isMobile = isMobileOrTablet();\n    const [initializedEditId, setInitializedEditId] = useState<string>();\n    const isEditInitializing = isMobile && editId !== undefined && initializedEditId !== editId;\n    const getEditingContent = useCallback(\n      (event: MatrixEvent): IContent => {\n        const eventId = event.getId();\n        const timeline = eventId ? room.getTimelineForEvent(eventId) : undefined;\n        const latestEdit =\n          eventId && timeline\n            ? getEditedEvent(eventId, event, timeline.getTimelineSet())\n            : undefined;\n        return latestEdit?.getContent()['m.new_content'] ?? event.getContent();\n      },\n      [room]\n    );\n\n    const prevEditingEventId = useRef<string | undefined>(undefined);\n    useEffect(() => {\n      if (!isMobile) {\n        editingStateRef.current = false;\n        prevEditingEventId.current = undefined;\n        preEditDraftRef.current = undefined;\n        setInitializedEditId(undefined);\n        return;\n      }\n\n      if (editId !== undefined && !editingEvent) {\n        setInitializedEditId(undefined);\n        onCancelEdit?.();\n        return;\n      }\n\n      if (editingEvent) {\n        editingStateRef.current = true;\n        if (editingEvent.getId() !== prevEditingEventId.current) {\n          if (!prevEditingEventId.current) {\n            preEditDraftRef.current = structuredClone(editor.children);\n          }\n          prevEditingEventId.current = editingEvent.getId();\n\n          const content = getEditingContent(editingEvent);\n          let bodyText = (content.body as string | undefined) ?? '';\n          const customHtml = (content.formatted_body as string | undefined) ?? undefined;\n\n          const rawPmp = content['com.beeper.per_message_profile'];\n          const pmpDisplayname =\n            rawPmp !== null &&\n            typeof rawPmp === 'object' &&\n            'displayname' in rawPmp &&\n            typeof rawPmp.displayname === 'string' &&\n            rawPmp.displayname.length > 0\n              ? (rawPmp.displayname as string)\n              : undefined;\n\n          if (pmpDisplayname && typeof bodyText === 'string') {\n            const bodyPrefix = `${pmpDisplayname}: `;\n            if (bodyText.startsWith(bodyPrefix)) {\n              bodyText = bodyText.slice(bodyPrefix.length);\n            }\n          }\n          const editableHtml = pmpDisplayname\n            ? customHtml?.replace(/^<strong\\s+data-mx-profile-fallback[^>]*>.*?<\\/strong>/, '')\n            : customHtml;\n\n          const mentionOptions = {\n            room,\n            nicknames,\n            mxUserId: mx.getUserId() ?? undefined,\n          };\n\n          const initialValue = plainToEditorInput(\n            editableHtml\n              ? stripMarkdownEscapesForHiddenPreviews(htmlToMarkdown(editableHtml))\n              : typeof bodyText === 'string'\n                ? stripMarkdownEscapesForHiddenPreviews(bodyText)\n                : '',\n            mentionOptions\n          );\n\n          editor.setDocument(initialValue);\n\n          scheduleEditorRaf(() => {\n            try {\n              editor.focus();\n            } catch {\n              // Ignore focus error\n            }\n          });\n        }\n        setInitializedEditId(editId);\n      } else {\n        editingStateRef.current = false;\n        const previousDraft = preEditDraftRef.current;\n        if (prevEditingEventId.current && previousDraft) {\n          editor.setDocument(previousDraft);\n        }\n        preEditDraftRef.current = undefined;\n        if (\n          prevEditingEventId.current &&\n          (!replyDraft?.eventId || replyDraft.eventId === threadRootId)\n        ) {\n          scheduleEditorRaf(() => {\n            try {\n              editor.blur();\n              (document.activeElement as HTMLElement)?.blur();\n            } catch {\n              // Ignore blur error\n            }\n          });\n        }\n        prevEditingEventId.current = undefined;\n        setInitializedEditId(undefined);\n      }\n    }, [\n      editId,\n      editingEvent,\n      editor,\n      getEditingContent,\n      mx,\n      nicknames,\n      room,\n      replyDraft?.eventId,\n      threadRootId,\n      isMobile,\n      setInitializedEditId,\n      onCancelEdit,\n      scheduleEditorRaf,\n    ]);\n\n    useEffect(() => {\n      if (editId && replyDraft?.eventId && replyDraft.eventId !== threadRootId) {\n        if (threadRootId) {\n          setReplyDraft({\n            userId: mx.getUserId() ?? '',\n            eventId: threadRootId,\n            body: '',\n            relation: { rel_type: RelationType.Thread, event_id: threadRootId },\n          });\n        } else {\n          setReplyDraft(undefined);\n        }\n      }\n    }, [editId, threadRootId, setReplyDraft, mx, replyDraft?.eventId]);\n\n    useEffect(() => {\n      if (replyDraft !== undefined) {\n        setSilentReply(replyDraft.userId === mx.getUserId() || !mentionInReplies);\n      }\n    }, [mentionInReplies, mx, replyDraft]);\n\n    const prevReplyEventId = useRef(replyDraft?.eventId);\n    useEffect(() => {\n      const prevId = prevReplyEventId.current;\n      const newId = replyDraft?.eventId;\n\n      if (newId !== prevId) {\n        prevReplyEventId.current = newId;\n\n        if (newId && newId !== threadRootId) {\n          scheduleEditorRaf(() => {\n            try {\n              editor.focus();\n            } catch {\n              // Ignore focus errors\n            }\n          });\n        } else if (\n          !newId &&\n          prevId &&\n          prevId !== threadRootId &&\n          !editId &&\n          prevId !== claimedReplyEventIdRef.current\n        ) {\n          if (!isMobile) return;\n          scheduleEditorRaf(() => {\n            try {\n              editor.blur();\n              (document.activeElement as HTMLElement)?.blur();\n            } catch {\n              // Ignore blur errors\n            }\n          });\n        }\n      }\n    }, [replyDraft?.eventId, threadRootId, editId, isMobile, editor, scheduleEditorRaf]);\n\n    const handleFileMetadata = useCallback(\n      (fileItem: TUploadItem, metadata: TUploadMetadata) => {\n        uploadItemOverridesRef.current.set(fileItem.originalFile, {\n          ...uploadItemOverridesRef.current.get(fileItem.originalFile),\n          metadata,\n        });\n        setSelectedFiles({\n          type: 'REPLACE',\n          item: fileItem,\n          replacement: { ...fileItem, metadata },\n        });\n      },\n      [setSelectedFiles]\n    );\n    const setDesc = useCallback(\n      (fileItem: TUploadItem, body: string, formatted_body: string) => {\n        uploadItemOverridesRef.current.set(fileItem.originalFile, {\n          ...uploadItemOverridesRef.current.get(fileItem.originalFile),\n          body,\n          formatted_body,\n        });\n        setSelectedFiles({\n          type: 'REPLACE',\n          item: fileItem,\n          replacement: { ...fileItem, body, formatted_body },\n        });\n      },\n      [setSelectedFiles]\n    );\n    const handleRemoveUpload = useCallback(\n      (upload: TUploadContent | TUploadContent[]) => {\n        const uploads = Array.isArray(upload) ? upload : [upload];\n        setSelectedFiles({\n          type: 'DELETE',\n          item: selectedFiles.filter((f) => uploads.find((u) => u === f.file)),\n        });\n        uploads.forEach((u) => {\n          removedUploadFilesRef.current.add(u);\n          roomUploadAtomFamily.remove(u);\n          uploadItemOverridesRef.current.delete(u);\n        });\n      },\n      [setSelectedFiles, selectedFiles]\n    );\n\n    const handleAudioRecordingComplete = useCallback(\n      (payload: AudioRecordingCompletePayload) => {\n        recorderActionRef.current = undefined;\n        const extension = getSupportedAudioExtension(payload.audioCodec);\n        const file = new File(\n          [payload.audioBlob],\n          `sable-audio-message-${Date.now()}.${extension}`,\n          {\n            type: payload.audioCodec,\n          }\n        );\n        handleFiles([file], {\n          waveform: payload.waveform,\n          audioDuration: payload.audioLength,\n        });\n        setShowAudioRecorder(false);\n      },\n      [handleFiles]\n    );\n\n    const audioRecorder = showAudioRecorder ? (\n      <AudioMessageRecorder\n        ref={audioRecorderRef}\n        onRequestClose={() => {\n          recorderActionRef.current = undefined;\n          setShowAudioRecorder(false);\n        }}\n        onRecordingComplete={handleAudioRecordingComplete}\n        onAudioLengthUpdate={() => {}}\n        onWaveformUpdate={() => {}}\n      />\n    ) : undefined;\n\n    const handleCancelUpload = (uploads: Upload[]) => {\n      uploads.forEach((upload) => {\n        if (upload.status === UploadStatus.Loading) {\n          cancelUploadContent(mx, upload.promise);\n        }\n      });\n      handleRemoveUpload(uploads.map((upload) => upload.file));\n    };\n\n    // Clears the composer immediately so a slow send cannot be edited or submitted\n    // twice; anything that fails without a local echo is restored afterwards.\n    const takeSubmission = useCallback(\n      ({ clearEditor = true, claimReplyDraft = true } = {}): Submission => {\n        const children = structuredClone(editor.children);\n        const submission: Submission = {\n          children,\n          epoch: draftEpochRef.current,\n          replyClaim: claimReplyDraft ? claimReply() : undefined,\n        };\n        if (clearEditor) {\n          editor.clear();\n          // The draft outlives this component, and a remount re-applies it.\n          setMsgDraft([]);\n          imagePacksUsedRef.current.clear();\n          sendTypingStatus(false);\n        }\n        return submission;\n      },\n      [claimReply, editor, sendTypingStatus, setMsgDraft]\n    );\n    const restoreSubmission = useCallback(\n      (submission: Submission) => {\n        restoreReplyClaim(submission.replyClaim);\n        if (\n          !mountedRef.current ||\n          submission.epoch !== draftEpochRef.current ||\n          !editor.isEmpty()\n        ) {\n          return;\n        }\n        editor.appendDocument(submission.children);\n      },\n      [editor, restoreReplyClaim]\n    );\n\n    const handleSendContents = async ({\n      contents,\n      submission,\n      isLive,\n      includeReplyWithText = false,\n      eventType,\n      onContentSent,\n    }: SendContentsOptions) => {\n      const plainText = toPlainText(submission.children as EditorDocument).trim();\n      const submittedReplyDraft = submission.replyClaim?.snapshot;\n      const submittedSilentReply = submission.replyClaim?.silentReply ?? silentReply;\n\n      const catalog = new ProfileCatalog(mx);\n      const [account, roomSelection] = await Promise.all([\n        catalog.getSelection('account'),\n        catalog.getSelection({ roomId }),\n      ]);\n      const perMessageProfile = resolvePersona({\n        latched: latchedPersona,\n        room: roomSelection,\n        account,\n        now: Date.now(),\n      });\n\n      if (perMessageProfile) {\n        contents.forEach((c) => {\n          c[prefix.MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME] =\n            projectPersona(perMessageProfile);\n        });\n      }\n\n      const replyContent =\n        submittedReplyDraft && (includeReplyWithText || plainText.length === 0)\n          ? getReplyContent(submittedReplyDraft, room)\n          : undefined;\n      if (replyContent && contents.length > 0) {\n        contents[0]!['m.relates_to'] = replyContent;\n        if (!submittedSilentReply && submittedReplyDraft)\n          contents[0]!['m.mentions'] = { ['user_ids']: [submittedReplyDraft.userId] };\n      }\n\n      const invalidate = () => {\n        if (isLive()) queryClient.invalidateQueries({ queryKey: ['delayedEvents', roomId] });\n      };\n      const handleContentSent = async (index: number) => {\n        if (onContentSent && isLive()) await onContentSent(index);\n      };\n\n      if (scheduledTime) {\n        try {\n          const delayMs = computeDelayMs(scheduledTime);\n          await roomScheduleCoordinator.run(mx, roomId, async () => {\n            if (editingScheduledDelayId) {\n              await cancelDelayedEvent(mx, editingScheduledDelayId);\n              if (isLive()) setEditingScheduledDelayId(null);\n            }\n\n            const sendResults = await Promise.allSettled(\n              contents.map(async (content, index) => {\n                const response = isEncrypted\n                  ? await sendDelayedMessageE2EE(\n                      mx,\n                      roomId,\n                      room,\n                      content,\n                      delayMs,\n                      null,\n                      eventType\n                    )\n                  : await sendDelayedMessage(mx, roomId, content, delayMs, null, eventType);\n                await handleContentSent(index);\n                return response;\n              })\n            );\n            const failedSend = sendResults.find(\n              (result): result is PromiseRejectedResult => result.status === 'rejected'\n            );\n            if (failedSend) throw failedSend.reason;\n          });\n\n          invalidate();\n          if (isLive()) {\n            setEditingScheduledDelayId(null);\n            setScheduledTime(null);\n          }\n          return contents.length > 0;\n        } catch (error) {\n          debugLog.error('message', 'Failed to schedule message', {\n            roomId,\n            error: error instanceof Error ? error.message : String(error),\n          });\n          log.error('failed to schedule message', { roomId }, error);\n          throw error;\n        }\n      } else {\n        const sendImmediateContents = async () =>\n          Promise.allSettled(\n            contents.map(async (content, index) => {\n              try {\n                const res = eventType\n                  ? await mx.sendEvent(\n                      roomId,\n                      threadRootId ?? null,\n                      eventType,\n                      content as TimelineEvents[keyof TimelineEvents]\n                    )\n                  : await mx.sendMessage(\n                      roomId,\n                      threadRootId ?? null,\n                      content as RoomMessageEventContent\n                    );\n                await handleContentSent(index);\n                debugLog.info('message', 'Message sent', {\n                  roomId,\n                  eventId: res.event_id,\n                  msgtype: content.msgtype,\n                });\n                return res;\n              } catch (error: unknown) {\n                debugLog.error('message', 'Failed to send message', {\n                  roomId,\n                  error: error instanceof Error ? error.message : String(error),\n                });\n                log.error('failed to send message', { roomId }, error);\n                throw error;\n              }\n            })\n          );\n        let sendResults: PromiseSettledResult<unknown>[] = [];\n        if (editingScheduledDelayId) {\n          let cancellationFailed = false;\n          await roomScheduleCoordinator.run(mx, roomId, async () => {\n            try {\n              await cancelDelayedEvent(mx, editingScheduledDelayId);\n              invalidate();\n              if (isLive()) setEditingScheduledDelayId(null);\n            } catch {\n              cancellationFailed = true;\n              debugLog.error('message', 'Failed to cancel scheduled event before immediate send', {\n                roomId,\n              });\n              return;\n            }\n            sendResults = await sendImmediateContents();\n          });\n          if (cancellationFailed) sendResults = await sendImmediateContents();\n        } else {\n          sendResults = await sendImmediateContents();\n        }\n        const failedSend = sendResults.find(\n          (result): result is PromiseRejectedResult => result.status === 'rejected'\n        );\n        if (failedSend) throw failedSend.reason;\n        return contents.length > 0;\n      }\n    };\n\n    const uploadToContent = async (upload: UploadSuccess) => {\n      const fileItem = selectedFiles.find((f) => f.file === upload.file);\n      if (!fileItem) throw new Error('Broken upload');\n\n      if (isImageMimeType(fileItem.file.type)) {\n        return getImageMsgContent(mx, fileItem, upload.mxc);\n      }\n      if (fileItem.file.type.startsWith('video')) {\n        return getVideoMsgContent(mx, fileItem, upload.mxc);\n      }\n      if (fileItem.file.type.startsWith('audio')) {\n        return getAudioMsgContent(fileItem, upload.mxc);\n      }\n      return getFileMsgContent(fileItem, upload.mxc);\n    };\n\n    // Resolves true when the composer text went out as an attachment caption, meaning\n    // the caller must not send it again.\n    const handleSendUpload = async (\n      uploads: Upload[],\n      submission: Submission,\n      isLive: () => boolean\n    ): Promise<boolean> => {\n      const plainText = toPlainText(submission.children as EditorDocument).trim();\n      const caption = plainText.length > 0 ? plainText : undefined;\n      let customHtml = trimCustomHtml(\n        toMatrixCustomHTML(submission.children as EditorDocument, {\n          stripNickname: true,\n          room,\n        })\n      );\n      const formattedCaption =\n        caption && !customHtmlEqualsPlainText(customHtml, plainText) ? customHtml : undefined;\n\n      if (uploads.length !== selectedFiles.length) throw new Error('Upload not ready');\n      const resolved = await Promise.all(\n        uploads.map(async (upload): Promise<UploadSuccess> => {\n          if (upload.status === UploadStatus.Success) return upload;\n          if (upload.status === UploadStatus.Loading) {\n            const response = await upload.promise;\n            if (!response.content_uri) throw new Error('Upload failed');\n            return { status: UploadStatus.Success, file: upload.file, mxc: response.content_uri };\n          }\n          throw new Error('Upload not ready');\n        })\n      );\n      if (resolved.length === 0) throw new Error('Upload not ready');\n\n      if (selectedFiles.length == 1 && sendIndividualAttachmentAsCaption) {\n        const upload = resolved[0];\n        if (!upload) throw new Error('Broken upload');\n        let content = await uploadToContent(upload);\n\n        content.body = caption ?? '';\n        content.formatted_body = undefined;\n\n        if (formattedCaption) {\n          content.format = 'org.matrix.custom.html';\n          content.formatted_body = formattedCaption;\n        }\n\n        await handleSendContents({\n          contents: [content],\n          submission,\n          isLive,\n          includeReplyWithText: true,\n        });\n        if (isLive()) handleCancelUpload(resolved);\n        return true;\n      }\n      if (selectedFiles.length >= 2 && enableMediaGalleries) {\n        const itemsPromises = resolved.map(async (upload) => {\n          const fileItem = selectedFiles.find((f) => f.file === upload.file);\n          if (!fileItem) throw new Error('Broken upload');\n          return getGalleryItemContent(mx, fileItem, upload.mxc);\n        });\n        const items = await Promise.all(itemsPromises);\n\n        const galleryContent = buildGalleryContent(items, caption, formattedCaption);\n\n        await handleSendContents({\n          contents: [galleryContent],\n          submission,\n          isLive,\n          includeReplyWithText: true,\n        });\n        if (isLive()) handleCancelUpload(resolved);\n        return true;\n      }\n      const contents = await Promise.all(resolved.map(uploadToContent));\n\n      await handleSendContents({\n        contents,\n        submission,\n        isLive,\n        onContentSent: (index) => {\n          const upload = resolved[index];\n          if (upload) handleCancelUpload([upload]);\n        },\n      });\n      return false;\n    };\n    // `submit` is memoized but this closure is not.\n    const handleSendUploadRef = useRef(handleSendUpload);\n    handleSendUploadRef.current = handleSendUpload;\n\n    const handleDialogSendContent = async (\n      content: IContent,\n      eventType?: keyof TimelineEvents\n    ): Promise<void> => {\n      const submission = takeSubmission({ clearEditor: false });\n      await composerControllerRef.current?.enqueue(async (isLive) => {\n        try {\n          await handleSendContents({\n            contents: [content],\n            submission,\n            isLive,\n            includeReplyWithText: true,\n            eventType,\n          });\n        } catch (error) {\n          restoreReplyClaim(submission.replyClaim);\n          throw error;\n        }\n      });\n    };\n\n    const handleQuickReact = useCallback(\n      (key: string, shortcode?: string) => {\n        if (key.length > 0) {\n          const lastMessage = room\n            .getLiveTimeline()\n            .getEvents()\n            .findLast((event) =>\n              (\n                [\n                  EventType.RoomMessage,\n                  EventType.RoomMessageEncrypted,\n                  EventType.Sticker,\n                ] as string[]\n              ).includes(event.getType())\n            );\n          const lastMessageId = lastMessage?.getId();\n\n          if (lastMessageId) {\n            toggleReaction(mx, room, lastMessageId, key, shortcode);\n          }\n        }\n\n        editor.clear();\n        sendTypingStatus(false);\n        handleCloseAutocomplete();\n      },\n      [editor, handleCloseAutocomplete, mx, room, sendTypingStatus]\n    );\n\n    const executeSubmit = useCallback(\n      async (submission: Submission, isLive: () => boolean) => {\n        if (\n          fileIngestionCountRef.current > 0 ||\n          isEditInitializing ||\n          (isMobile && editId !== undefined && !editingEvent)\n        ) {\n          restoreSubmission(submission);\n          return;\n        }\n\n        const submittedReplyDraft = submission.replyClaim?.snapshot;\n        const submittedSilentReply = submission.replyClaim?.silentReply ?? silentReply;\n        if (editingEvent && isMobile) {\n          const content = buildEditReplacement(submission.children as EditorDocument, {\n            mx,\n            room,\n            roomId,\n            editingEvent,\n            currentContent: getEditingContent(editingEvent),\n            pmpNoFallback,\n          });\n          if (!content) {\n            if (isLive()) onCancelEdit?.();\n            return;\n          }\n          await mx.sendMessage(roomId, content as RoomMessageEventContent);\n          if (isLive()) {\n            onCancelEdit?.();\n            sendTypingStatus(false);\n          }\n          return;\n        }\n\n        if (selectedFiles.some((f) => f.encrypting)) {\n          restoreSubmission(submission);\n          return;\n        }\n        if (selectedFiles.length > 0) {\n          const uploads = uploadBoardHandlers.current?.getSendableUploads() ?? [];\n          const sendUpload = handleSendUploadRef.current;\n          setUploadSending(true);\n          try {\n            if (await sendUpload(uploads, submission, isLive)) return;\n          } catch (error: unknown) {\n            log.error('failed to send attachments', { roomId }, error);\n            if (isLive()) {\n              setSendError('Failed to send attachments. Please try again.');\n            }\n            restoreSubmission(submission);\n            return;\n          } finally {\n            if (isLive()) setUploadSending(false);\n          }\n        }\n\n        const outgoing = await buildOutgoingMessage(submission.children as EditorDocument, {\n          mx,\n          room,\n          roomId,\n          nicknames,\n          replyEvent,\n          replyDraft: submittedReplyDraft,\n          silentReply: submittedSilentReply,\n          settingsLinkBaseUrl,\n          canSendReaction,\n          pkCompatEnable,\n          pmpProxyingEnable,\n          pmpLatchingEnable,\n          pmpNoFallback,\n          latchedPersona,\n          isPKCommand: (text) => PKitCommandMessageHandler.isPKCommand(text),\n          imagePacksUsed: imagePacksUsedRef.current,\n        });\n\n        if (outgoing.kind === 'empty') return;\n        if (outgoing.kind === 'quickReact') {\n          handleQuickReact(outgoing.key);\n          return;\n        }\n        if (outgoing.kind === 'pkCommand') {\n          await pluralkitCmdMessageHandler.handleMessage(outgoing.plainText);\n          return;\n        }\n        if (outgoing.kind === 'gifSearch') {\n          restoreReplyClaim(submission.replyClaim);\n          if (isMobileOrTablet()) {\n            const activeElement = document.activeElement;\n            if (activeElement instanceof HTMLElement) activeElement.blur();\n          }\n          setInitialGifSearch(outgoing.query);\n          setEmojiBoardTab(EmojiBoardTab.Gif);\n          return;\n        }\n        if (outgoing.kind === 'command') {\n          const { command, plainText, customHtml } = outgoing;\n          if (command === Command.Poll) {\n            restoreReplyClaim(submission.replyClaim);\n            setShowPollPicker(true);\n          } else if (command === Command.Location && plainText.trim().length === 0) {\n            restoreReplyClaim(submission.replyClaim);\n            setShowLocationPicker(true);\n          } else commands[command as Command]?.exe(plainText, customHtml);\n          return;\n        }\n\n        const { content } = outgoing;\n        if (outgoing.latchPersona) {\n          await setCurrentlyUsedPerMessageProfileIdForRoom(mx, roomId, outgoing.latchPersona.id);\n          if (isLive()) setLatchedPersona(outgoing.latchPersona);\n        }\n        if (submittedReplyDraft) {\n          content['m.relates_to'] = getReplyContent(submittedReplyDraft, room);\n        }\n        const invalidate = () => {\n          if (isLive()) {\n            queryClient.invalidateQueries({ queryKey: ['delayedEvents', roomId] });\n          }\n        };\n\n        if (scheduledTime) {\n          try {\n            const delayMs = computeDelayMs(scheduledTime);\n            await roomScheduleCoordinator.run(mx, roomId, async () => {\n              if (editingScheduledDelayId) {\n                await cancelDelayedEvent(mx, editingScheduledDelayId);\n                if (isLive()) setEditingScheduledDelayId(null);\n              }\n              if (isEncrypted) {\n                await sendDelayedMessageE2EE(mx, roomId, room, content, delayMs);\n              } else {\n                await sendDelayedMessage(mx, roomId, content as RoomMessageEventContent, delayMs);\n              }\n            });\n            invalidate();\n            if (isLive()) {\n              setSendError(undefined);\n              setEditingScheduledDelayId(null);\n              setScheduledTime(null);\n            }\n          } catch (e: unknown) {\n            // A scheduled send leaves no local echo, so hand the message back.\n            restoreSubmission(submission);\n            if (!isLive()) return;\n            if (\n              e instanceof MatrixError &&\n              (e.errcode === ErrorCode.M_MAX_DELAY_EXCEEDED ||\n                e.data?.['org.matrix.msc4140.errcode'] === 'M_MAX_DELAY_EXCEEDED')\n            ) {\n              const maxDelay =\n                (e.data as { max_delay?: number })?.max_delay ??\n                e.data?.['org.matrix.msc4140.max_delay'];\n              if (typeof maxDelay === 'number') setServerMaxDelayMs(maxDelay);\n              const maxDelayDays = maxDelay / daysToMs(1);\n              setSendError(\n                `Scheduled time exceeds the maximum delay allowed by this server. Please choose an earlier time. The Maximum Delay is of ${maxDelayDays} day${maxDelayDays > 1 ? 's' : ''}.`\n              );\n            } else {\n              setSendError('Failed to schedule message. Please try again.');\n            }\n          }\n        } else if (editingScheduledDelayId) {\n          const scheduledDelayId = editingScheduledDelayId;\n          try {\n            await roomScheduleCoordinator.run(mx, roomId, async () => {\n              await cancelDelayedEvent(mx, scheduledDelayId);\n              if (isLive()) setEditingScheduledDelayId(null);\n              debugLog.info('message', 'Sending message after cancelling scheduled event', {\n                roomId,\n                scheduledDelayId,\n              });\n              const res = await mx.sendMessage(\n                roomId,\n                threadRootId ?? null,\n                content as RoomMessageEventContent\n              );\n              debugLog.info('message', 'Message sent successfully', {\n                roomId,\n                eventId: res.event_id,\n              });\n            });\n            invalidate();\n          } catch (error) {\n            debugLog.error('message', 'Failed to send message after cancelling scheduled event', {\n              roomId,\n              error: error instanceof Error ? error.message : String(error),\n            });\n            // The scheduled copy may still exist, so don't drop the user's text.\n            restoreSubmission(submission);\n            if (isLive()) setSendError('Failed to reschedule message. Please try again.');\n          }\n        } else {\n          const msgSendStart = performance.now();\n          debugLog.info('message', 'Sending message', {\n            roomId,\n            msgtype: content.msgtype,\n          });\n          try {\n            const res = await Sentry.startSpan(\n              {\n                name: 'message.send',\n                op: 'matrix.message',\n                attributes: { encrypted: String(isEncrypted) },\n              },\n              () => mx.sendMessage(roomId, threadRootId ?? null, content as RoomMessageEventContent)\n            );\n            debugLog.info('message', 'Message sent successfully', {\n              roomId,\n              eventId: res.event_id,\n            });\n            Sentry.metrics.distribution(\n              'sable.message.send_latency_ms',\n              performance.now() - msgSendStart,\n              { attributes: { encrypted: String(isEncrypted) } }\n            );\n          } catch (error: unknown) {\n            debugLog.error('message', 'Failed to send message', {\n              roomId,\n              error: error instanceof Error ? error.message : String(error),\n            });\n            Sentry.metrics.count('sable.message.send_error', 1, {\n              attributes: { encrypted: String(isEncrypted) },\n            });\n            log.error('failed to send message', { roomId }, error);\n            // The failed send stays in the timeline as a local echo the user can retry,\n            // so the composer is intentionally left empty here.\n          }\n        }\n      },\n      [\n        replyEvent,\n        mx,\n        roomId,\n        canSendReaction,\n        pkCompatEnable,\n        silentReply,\n        pmpProxyingEnable,\n        scheduledTime,\n        editingScheduledDelayId,\n        nicknames,\n        room,\n        handleQuickReact,\n        pluralkitCmdMessageHandler,\n        commands,\n        sendTypingStatus,\n        queryClient,\n        threadRootId,\n        settingsLinkBaseUrl,\n        isEncrypted,\n        setEditingScheduledDelayId,\n        setScheduledTime,\n        setServerMaxDelayMs,\n        selectedFiles,\n        editingEvent,\n        getEditingContent,\n        onCancelEdit,\n        restoreReplyClaim,\n        restoreSubmission,\n        isMobile,\n        editId,\n        isEditInitializing,\n        pmpLatchingEnable,\n        pmpNoFallback,\n        latchedPersona,\n      ]\n    );\n\n    const submit = useCallback(() => {\n      // A mobile edit replaces an existing event, so it owns neither the draft nor the reply.\n      const isMobileEdit = Boolean(editingEvent && isMobile);\n      const duplicateTapWouldResend = selectedFilesRef.current.length > 0 || isMobileEdit;\n      if (duplicateTapWouldResend) {\n        if (submissionInFlightRef.current) return Promise.resolve(undefined);\n        submissionInFlightRef.current = true;\n      }\n      const submission = takeSubmission({\n        clearEditor: !isMobileEdit,\n        claimReplyDraft: !isMobileEdit,\n      });\n      const queued =\n        composerControllerRef.current?.enqueue((isLive) => executeSubmit(submission, isLive)) ??\n        Promise.resolve(undefined);\n      return queued.finally(() => {\n        if (duplicateTapWouldResend) submissionInFlightRef.current = false;\n      });\n    }, [editingEvent, executeSubmit, isMobile, takeSubmission]);\n\n    const handleKeyDown: KeyboardEventHandler = useCallback(\n      (evt) => {\n        const autocompleteMenu = document.querySelector('[data-autocomplete-menu]');\n        const isMenuVisible = !!(autocompleteQuery && autocompleteMenu);\n\n        if (isMenuVisible) {\n          if (isKeyHotkey('arrowdown', evt)) {\n            evt.preventDefault();\n            autocompleteMenu.dispatchEvent(\n              new CustomEvent('autocomplete-navigate', { detail: { direction: 1 } })\n            );\n            return;\n          }\n          if (isKeyHotkey('arrowup', evt)) {\n            evt.preventDefault();\n            autocompleteMenu.dispatchEvent(\n              new CustomEvent('autocomplete-navigate', { detail: { direction: -1 } })\n            );\n            return;\n          }\n\n          if ((isKeyHotkey('enter', evt) || isKeyHotkey('tab', evt)) && !isComposing(evt)) {\n            const selectedItem =\n              autocompleteMenu.querySelector<HTMLButtonElement>('button[data-selected=\"true\"]') ??\n              autocompleteMenu.querySelector<HTMLButtonElement>('button');\n\n            if (selectedItem) {\n              evt.preventDefault();\n              selectedItem.click();\n              return;\n            }\n          }\n        }\n\n        if (isKeyHotkey('arrowup', evt) && editor.isEmpty()) {\n          if (editor.isSelectionAtStart()) {\n            evt.preventDefault();\n            onEditLastMessage?.();\n            return;\n          }\n        }\n\n        if (\n          (isKeyHotkey('mod+enter', evt) || (!enterForNewline && isKeyHotkey('enter', evt))) &&\n          !isComposing(evt)\n        ) {\n          evt.preventDefault();\n          submit().catch((error) => {\n            log.error('submit failed', { roomId }, error);\n          });\n          return;\n        }\n        if (isKeyHotkey('escape', evt)) {\n          evt.preventDefault();\n          if (editingEvent && isMobileOrTablet()) {\n            onCancelEdit?.();\n            editor.clear();\n            return;\n          }\n          if (showAudioRecorder) {\n            audioRecorderRef.current?.cancel();\n            return;\n          }\n          if (autocompleteQuery) {\n            setAutocompleteQuery(undefined);\n            return;\n          }\n          setReplyDraft(undefined);\n        }\n\n        if (matchesShortcut('composer.openStickerPicker', evt, shortcutOverrides)) {\n          evt.preventDefault();\n          setEmojiBoardTab(EmojiBoardTab.Sticker);\n        }\n      },\n      [\n        submit,\n        roomId,\n        setReplyDraft,\n        enterForNewline,\n        autocompleteQuery,\n        setAutocompleteQuery,\n        isComposing,\n        showAudioRecorder,\n        editor,\n        onEditLastMessage,\n        setEmojiBoardTab,\n        shortcutOverrides,\n        editingEvent,\n        onCancelEdit,\n      ]\n    );\n\n    const handleKeyUp: KeyboardEventHandler = useCallback(\n      (evt) => {\n        if (isKeyHotkey('escape', evt)) {\n          evt.preventDefault();\n          return;\n        }\n\n        if (!hideActivity) {\n          sendTypingStatus(!editor.isEmpty());\n        }\n\n        detectAutocomplete();\n      },\n      [editor, sendTypingStatus, hideActivity, detectAutocomplete]\n    );\n\n    const handleEmoticonSelect = (key: string, shortcode: string) => {\n      const emoticonEl = createEmoticonElement(key, shortcode);\n      if (autocompleteQuery) {\n        editor.insertInline(emoticonEl, autocompleteQuery.from, autocompleteQuery.to);\n      } else {\n        editor.insertInline(emoticonEl);\n      }\n      if (!imagePacksUsedRef.current.has(key)) {\n        const imgPkRef = getImagePackReferencesForMxc(key, mx, ImageUsage.Emoticon, room);\n        if (imgPkRef?.room_id && imgPkRef?.shortcode) imagePacksUsedRef.current.set(key, imgPkRef);\n      }\n      editor.insertText(' ');\n      handleCloseAutocomplete();\n    };\n\n    const executeStickerSelect = async (mxc: string, label: string, submission: Submission) => {\n      const replySnapshot = submission.replyClaim?.snapshot;\n      const silentReplySnapshot = submission.replyClaim?.silentReply ?? silentReply;\n      // Packs declare their own info, so sending does not need the file. Measuring it instead made\n      // the send fail outright whenever the media fetch did.\n      let info = getPackImageInfo(mx, room, ImageUsage.Sticker, mxc);\n\n      if (!info) {\n        const stickerUrl = mxcUrlToHttp(mx, mxc, useAuthentication);\n        if (stickerUrl) {\n          try {\n            const { blob, image } = await loadImageElementFromMediaUrl(stickerUrl);\n            info = getImageInfo(image, blob);\n          } catch (error) {\n            log.error('failed to measure sticker, sending without info', { mxc }, error);\n          }\n        }\n      }\n\n      const content: StickerEventContent & ReplyEventContent & IContent & IGenericMSC4459 = {\n        body: label,\n        url: mxc,\n        info: info ?? {},\n      };\n\n      // add the image pack reference\n      content[prefix.MATRIX_UNSTABLE_IMAGE_SOURCE_PACK_PROPERTY_NAME] =\n        getImagePackReferencesForMxcWrappedInMap(mxc, mx, ImageUsage.Sticker, room);\n\n      const catalog = new ProfileCatalog(mx);\n      const [account, roomSelection] = await Promise.all([\n        catalog.getSelection('account'),\n        catalog.getSelection({ roomId }),\n      ]);\n      const perMessageProfile = resolvePersona({\n        latched: latchedPersona,\n        room: roomSelection,\n        account,\n        now: Date.now(),\n      });\n\n      if (perMessageProfile) {\n        content[prefix.MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME] =\n          projectPersona(perMessageProfile);\n      }\n      content[prefix.MATRIX_UNSTABLE_IMAGE_SOURCE_PACK_PROPERTY_NAME] =\n        getImagePackReferencesForMxcWrappedInMap(mxc, mx, ImageUsage.Sticker, room);\n\n      if (replySnapshot) {\n        content['m.relates_to'] = getReplyContent(replySnapshot, room);\n        if (!silentReplySnapshot) content['m.mentions'] = { ['user_ids']: [replySnapshot.userId] };\n      }\n      await mx.sendEvent(roomId, EventType.Sticker, content);\n    };\n\n    const handleStickerSelect = (mxc: string, _shortcode: string, label: string) => {\n      const submission = takeSubmission({ clearEditor: false });\n      return composerControllerRef.current?.enqueue(async () => {\n        try {\n          await executeStickerSelect(mxc, label, submission);\n        } catch (error) {\n          log.error('failed to send sticker', { roomId }, error);\n          restoreReplyClaim(submission.replyClaim);\n        }\n      });\n    };\n\n    const handleGifSelect = (gif: GifData, spoiler?: boolean) => {\n      const submission = takeSubmission({ clearEditor: false });\n      return composerControllerRef.current?.enqueue(async (isLive) => {\n        try {\n          const content = await getGifMsgContent(gif, {\n            proxyUrl: gifProxyUrl,\n            spoiler,\n          });\n          if (!content) throw new Error('Unsendable GIF content');\n\n          const sent = await handleSendContents({ contents: [content], submission, isLive });\n          // When the editor has text, the reply is not attached to the GIF, so hand the\n          // claim back for the follow-up message to carry it.\n          if (\n            sent &&\n            submission.replyClaim &&\n            toPlainText(submission.children as EditorDocument).trim().length > 0\n          )\n            restoreReplyClaim(submission.replyClaim);\n          return sent;\n        } catch (error) {\n          log.error('failed to send gif', { roomId }, error);\n          restoreReplyClaim(submission.replyClaim);\n          return false;\n        }\n      });\n    };\n\n    return (\n      <div ref={ref}>\n        <Overlay\n          open={dropZoneVisible}\n          backdrop={<OverlayBackdrop />}\n          style={{ pointerEvents: 'none' }}\n        >\n          <OverlayCenter>\n            <Dialog variant=\"Primary\">\n              <Box\n                direction=\"Column\"\n                justifyContent=\"Center\"\n                alignItems=\"Center\"\n                gap=\"500\"\n                style={{ padding: toRem(60) }}\n              >\n                {dropzoneIcon(FileIcon)}\n                <Text size=\"H4\" align=\"Center\">\n                  {`Drop Files in \"${room?.name || 'Room'}\"`}\n                </Text>\n                <Text align=\"Center\">Drag and drop files here or click for selection dialog</Text>\n              </Box>\n            </Dialog>\n          </OverlayCenter>\n        </Overlay>\n        {autocompleteQuery?.prefix === AutocompletePrefix.RoomMention && (\n          <RoomMentionAutocomplete\n            roomId={roomId}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n          />\n        )}\n        {autocompleteQuery?.prefix === AutocompletePrefix.UserMention && (\n          <UserMentionAutocomplete\n            room={room}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n          />\n        )}\n        {autocompleteQuery?.prefix === AutocompletePrefix.Emoticon && (\n          <EmoticonAutocomplete\n            imagePackRooms={imagePackRooms}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n            onEmoticonSelected={handleEmoticonSelect}\n          />\n        )}\n        {autocompleteQuery?.prefix === AutocompletePrefix.Reaction &&\n          (canSendReaction ? (\n            <EmoticonAutocomplete\n              title={`React with :${autocompleteQuery!.text}`}\n              imagePackRooms={imagePackRooms}\n              controller={editor}\n              query={autocompleteQuery!}\n              requestClose={handleCloseAutocomplete}\n              onEmoticonSelected={handleQuickReact}\n            />\n          ) : (\n            <AutocompleteNotice>\n              You do not have permission to send reactions in this room\n            </AutocompleteNotice>\n          ))}\n        {autocompleteQuery?.prefix === AutocompletePrefix.Command && (\n          <CommandAutocomplete\n            room={room}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n          />\n        )}\n        {isQuickTextReact &&\n          (canSendReaction ? (\n            <AutocompleteNotice>Sending as text reaction to the latest message</AutocompleteNotice>\n          ) : (\n            <AutocompleteNotice>\n              You do not have permission to send reactions in this room\n            </AutocompleteNotice>\n          ))}\n        <CustomEditor\n          editableName=\"RoomInput\"\n          editor={editor}\n          placeholder=\"Send a message...\"\n          enterKeyHint={enterForNewline ? 'enter' : 'send'}\n          suppressBlurRefocusRef={suppressBlurRefocusRef}\n          onKeyDown={handleKeyDown}\n          onKeyUp={handleKeyUp}\n          onChange={handleEditorChange}\n          onPaste={handlePaste}\n          responsiveAfter={audioRecorder}\n          forceMultilineLayout={showAudioRecorder}\n          top={\n            <>\n              {selectedFiles.length > 0 && (\n                <UploadBoard\n                  header={\n                    <UploadBoardHeader\n                      open={uploadBoard}\n                      onToggle={() => setUploadBoard(!uploadBoard)}\n                      uploadFamilyObserverAtom={uploadFamilyObserverAtom}\n                      onBusyChange={setUploadBusy}\n                      imperativeHandlerRef={uploadBoardHandlers}\n                      onCancel={handleCancelUpload}\n                    />\n                  }\n                >\n                  {uploadBoard && (\n                    <Scroll\n                      direction=\"Horizontal\"\n                      size=\"300\"\n                      hideTrack\n                      visibility=\"Hover\"\n                      data-gestures=\"scroll\"\n                    >\n                      <UploadBoardContent>\n                        {Array.from(selectedFiles)\n                          .toReversed()\n                          .map((fileItem) => (\n                            <UploadCardRenderer\n                              key={getUploadItemKey(fileItem)}\n                              isEncrypted={!!fileItem.encInfo}\n                              fileItem={fileItem}\n                              setMetadata={handleFileMetadata}\n                              onRemove={handleRemoveUpload}\n                              setDesc={setDesc}\n                              roomId={roomId}\n                              hideCaption={\n                                selectedFiles.length == 1 && sendIndividualAttachmentAsCaption\n                              }\n                            />\n                          ))}\n                      </UploadBoardContent>\n                    </Scroll>\n                  )}\n                </UploadBoard>\n              )}\n              {scheduledTime && (\n                <div>\n                  <Box\n                    alignItems=\"Center\"\n                    gap=\"300\"\n                    style={{\n                      padding: `${config.space.S200} ${config.space.S300} 0`,\n                    }}\n                  >\n                    <IconButton\n                      onClick={() => {\n                        setScheduledTime(null);\n                        setEditingScheduledDelayId(null);\n                        setSendError(undefined);\n                      }}\n                      variant=\"SurfaceVariant\"\n                      size=\"300\"\n                      radii=\"300\"\n                      title=\"schedule message send\"\n                    >\n                      {chipIcon(X)}\n                    </IconButton>\n                    <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\">\n                      {menuIcon(Clock)}\n                      <Text size=\"T300\">\n                        Scheduled for {timeDayMonthYear(scheduledTime.getTime())} at{' '}\n                        {timeHourMinute(scheduledTime.getTime(), hour24Clock)}\n                      </Text>\n                    </Box>\n                  </Box>\n                </div>\n              )}\n              {sendError && (\n                <div>\n                  <Box\n                    alignItems=\"Center\"\n                    gap=\"300\"\n                    style={{ padding: `${config.space.S200} ${config.space.S300} 0` }}\n                  >\n                    <Text style={{ color: color.Critical.Main }} size=\"T300\">\n                      {sendError}\n                    </Text>\n                  </Box>\n                </div>\n              )}\n              {editingEvent && isMobileOrTablet() && (\n                <div>\n                  <Box\n                    alignItems=\"Center\"\n                    gap=\"300\"\n                    style={{\n                      padding: `${config.space.S200} ${config.space.S300} 0`,\n                    }}\n                  >\n                    <IconButton\n                      onClick={() => {\n                        onCancelEdit?.();\n                        editor.clear();\n                      }}\n                      variant=\"SurfaceVariant\"\n                      style={{ background: 'transparent' }}\n                      size=\"300\"\n                      radii=\"300\"\n                      aria-label=\"Cancel editing\"\n                      title=\"Cancel editing\"\n                    >\n                      {chipIcon(X)}\n                    </IconButton>\n                    <Box\n                      direction=\"Row\"\n                      gap=\"200\"\n                      alignItems=\"Center\"\n                      grow=\"Yes\"\n                      style={{ minWidth: 0 }}\n                    >\n                      {menuIcon(PencilSimple)}\n                      <Text size=\"T300\" truncate>\n                        Editing message: {editingEvent.getContent().body as string}\n                      </Text>\n                    </Box>\n                  </Box>\n                </div>\n              )}\n              {replyDraft && (!threadRootId || replyDraft.body) && (\n                <div>\n                  <Box\n                    alignItems=\"Center\"\n                    gap=\"300\"\n                    style={{\n                      padding: `${config.space.S200} ${config.space.S300} 0`,\n                    }}\n                  >\n                    <IconButton\n                      onClick={() => {\n                        if (threadRootId) {\n                          setReplyDraft({\n                            userId: mx.getUserId() ?? '',\n                            eventId: threadRootId,\n                            body: '',\n                            relation: {\n                              rel_type: RelationType.Thread,\n                              event_id: threadRootId,\n                            },\n                          });\n                        } else {\n                          setReplyDraft(undefined);\n                        }\n                      }}\n                      variant=\"SurfaceVariant\"\n                      style={{ background: 'transparent' }}\n                      size=\"300\"\n                      radii=\"300\"\n                      aria-label=\"Cancel reply\"\n                      title=\"Cancel reply\"\n                    >\n                      {chipIcon(X)}\n                    </IconButton>\n                    <Box\n                      direction=\"Row\"\n                      gap=\"200\"\n                      alignItems=\"Center\"\n                      grow=\"Yes\"\n                      style={{ minWidth: 0 }}\n                    >\n                      <Box\n                        direction=\"Row\"\n                        gap=\"200\"\n                        alignItems=\"Center\"\n                        grow=\"Yes\"\n                        style={{ minWidth: 0 }}\n                      >\n                        {replyDraft.relation?.rel_type === RelationType.Thread && !threadRootId && (\n                          <ThreadIndicator />\n                        )}\n                        <Reply room={room} replyEventId={replyDraft.eventId} />\n                      </Box>\n                      <IconButton\n                        variant=\"SurfaceVariant\"\n                        size=\"300\"\n                        radii=\"300\"\n                        style={{ background: 'transparent' }}\n                        title={\n                          silentReply ? 'Unmute reply notifications' : 'Mute reply notifications'\n                        }\n                        aria-pressed={silentReply}\n                        aria-label={\n                          silentReply ? 'Unmute reply notifications' : 'Mute reply notifications'\n                        }\n                        onClick={() => setSilentReply(!silentReply)}\n                      >\n                        {!silentReply && composerIcon(Bell)}\n                        {silentReply && composerIcon(BellSlash)}\n                      </IconButton>\n                    </Box>\n                  </Box>\n                </div>\n              )}\n            </>\n          }\n          before={\n            <>\n              {isMobileOrTablet() ? (\n                <>\n                  <IconButton\n                    onClick={() => {\n                      attachmentSkipReturnFocusRef.current = true;\n                      const activeElement = document.activeElement;\n                      if (activeElement instanceof HTMLElement) activeElement.blur();\n                      setShowAttachmentSheet(true);\n                    }}\n                    onPointerDown={suppressEditorRefocus}\n                    variant=\"SurfaceVariant\"\n                    size=\"300\"\n                    radii=\"300\"\n                    style={{ backgroundColor: 'transparent' }}\n                    title=\"Add\"\n                    aria-label=\"Add new Item\"\n                  >\n                    {composerIcon(PlusCircle)}\n                  </IconButton>\n                  {showAttachmentSheet && (\n                    <MobileSwipeDownModal\n                      requestClose={() => setShowAttachmentSheet(false)}\n                      containerRef={fileDropContainerRef}\n                      focusTrap\n                      dialogLabel=\"Share\"\n                      skipReturnFocusRef={attachmentSkipReturnFocusRef}\n                    >\n                      {() => (\n                        <AttachmentContent\n                          onPickPhotos={() => {\n                            void pickAttachment('media', 'image/*,video/*,.tgs');\n                          }}\n                          onPickFile={() => {\n                            void pickAttachment('document', '*');\n                          }}\n                          onPickPoll={() => {\n                            setShowPollPicker(true);\n                          }}\n                          onPickLocation={() => {\n                            setShowLocationPicker(true);\n                          }}\n                          skipReturnFocusRef={attachmentSkipReturnFocusRef}\n                        />\n                      )}\n                    </MobileSwipeDownModal>\n                  )}\n                </>\n              ) : (\n                <>\n                  <PopOut\n                    anchor={AddMenuAnchor}\n                    position=\"Top\"\n                    align=\"Start\"\n                    offset={5}\n                    content={\n                      <FocusTrap\n                        focusTrapOptions={{\n                          initialFocus: false,\n                          onDeactivate: () => setAddMenuAnchor(undefined),\n                          clickOutsideDeactivates: true,\n                          escapeDeactivates: stopPropagation,\n                        }}\n                      >\n                        <Menu>\n                          <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                            <MenuItem\n                              size=\"300\"\n                              radii=\"300\"\n                              onClick={() => {\n                                setAddMenuAnchor(undefined);\n                                setShowPollPicker(true);\n                              }}\n                              before={menuIcon(ListBullets)}\n                            >\n                              <Text size=\"B300\">Create Poll</Text>\n                            </MenuItem>\n                            <MenuItem\n                              size=\"300\"\n                              radii=\"300\"\n                              onClick={() => {\n                                setAddMenuAnchor(undefined);\n                                setShowLocationPicker(true);\n                              }}\n                              before={menuIcon(MapPinPlusIcon)}\n                            >\n                              <Text size=\"B300\">Add Location</Text>\n                            </MenuItem>\n                            <MenuItem\n                              size=\"300\"\n                              radii=\"300\"\n                              onClick={() => {\n                                pickFile('*');\n                                setAddMenuAnchor(undefined);\n                              }}\n                              before={menuIcon(PlusCircle)}\n                            >\n                              <Text size=\"B300\">Add File</Text>\n                            </MenuItem>\n                          </Box>\n                        </Menu>\n                      </FocusTrap>\n                    }\n                  />\n                  <IconButton\n                    onClick={(evt) =>\n                      editorOldAddFile\n                        ? pickFile('*')\n                        : setAddMenuAnchor(evt.currentTarget.getBoundingClientRect())\n                    }\n                    onPointerDown={suppressEditorRefocus}\n                    variant=\"SurfaceVariant\"\n                    size=\"300\"\n                    radii=\"300\"\n                    style={{ backgroundColor: 'transparent' }}\n                    title={editorOldAddFile ? 'Upload File' : 'Add'}\n                    aria-label={editorOldAddFile ? 'Upload and attach a File' : 'Add new Item'}\n                  >\n                    {composerIcon(PlusCircle)}\n                  </IconButton>\n                </>\n              )}\n              {pmpPickerEnable && (isMobileOrTablet() ? !editingEvent : true) && (\n                <PersonaPicker\n                  tab={personaPickerTab}\n                  mx={mx}\n                  roomId={roomId}\n                  suppressEditorRefocus={suppressEditorRefocus}\n                  onTabChange={setPersonaPickerTab}\n                  latchedPersona={latchedPersona}\n                />\n              )}\n            </>\n          }\n          after={\n            <>\n              <UseStateProvider initial={undefined}>\n                {() => {\n                  const emojiBoard = (\n                    <EmojiBoard\n                      tab={emojiBoardTab}\n                      onTabChange={setEmojiBoardTab}\n                      imagePackRooms={imagePackRooms}\n                      returnFocusOnDeactivate={false}\n                      isFullWidth={isMobileOrTablet()}\n                      sheet={isMobileOrTablet()}\n                      onEmojiSelect={handleEmoticonSelect}\n                      onCustomEmojiSelect={handleEmoticonSelect}\n                      onStickerSelect={handleStickerSelect}\n                      onGifSelect={handleGifSelect}\n                      initialGifSearch={initialGifSearch}\n                      requestClose={closeEmojiBoard}\n                    />\n                  );\n                  // Mobile has no room for three triggers next to text.\n                  const onlyEmojiTrigger = isMobile && hasText;\n                  const triggers = (\n                    <>\n                      {editorButtonOrder.map((id) => {\n                        let button: ReactElement | null = null;\n                        if (id === 'gif' && editorGifButton && !onlyEmojiTrigger) {\n                          button = (\n                            <IconButton\n                              ref={gifBtnRef}\n                              aria-pressed={emojiBoardTab === EmojiBoardTab.Gif}\n                              onClick={() => toggleEmojiBoardTab(EmojiBoardTab.Gif)}\n                              onPointerDown={suppressEditorRefocus}\n                              variant=\"SurfaceVariant\"\n                              size=\"300\"\n                              radii=\"300\"\n                              style={{ backgroundColor: 'transparent' }}\n                              title=\"open gif picker\"\n                              aria-label=\"Open gif picker\"\n                            >\n                              {composerIcon(Gif, {\n                                weight: emojiBoardTab === EmojiBoardTab.Gif ? 'fill' : 'regular',\n                              })}\n                            </IconButton>\n                          );\n                        } else if (id === 'sticker' && editorStickerButton && !onlyEmojiTrigger) {\n                          button = (\n                            <IconButton\n                              ref={stickerBtnRef}\n                              aria-pressed={emojiBoardTab === EmojiBoardTab.Sticker}\n                              onClick={() => toggleEmojiBoardTab(EmojiBoardTab.Sticker)}\n                              onPointerDown={suppressEditorRefocus}\n                              variant=\"SurfaceVariant\"\n                              size=\"300\"\n                              radii=\"300\"\n                              style={{ backgroundColor: 'transparent' }}\n                              title=\"open sticker picker\"\n                              aria-label=\"Open sticker picker\"\n                            >\n                              {composerIcon(Sticker, {\n                                weight:\n                                  emojiBoardTab === EmojiBoardTab.Sticker ? 'fill' : 'regular',\n                              })}\n                            </IconButton>\n                          );\n                        } else if (id === 'emoji' && editorEmojiButton) {\n                          button = (\n                            <IconButton\n                              ref={emojiBtnRef}\n                              aria-pressed={emojiBoardTab === EmojiBoardTab.Emoji}\n                              onClick={() => toggleEmojiBoardTab(EmojiBoardTab.Emoji)}\n                              onPointerDown={suppressEditorRefocus}\n                              variant=\"SurfaceVariant\"\n                              size=\"300\"\n                              radii=\"300\"\n                              style={{ backgroundColor: 'transparent' }}\n                              title=\"open emoji board\"\n                              aria-label=\"Open emoji board\"\n                            >\n                              {composerIcon(Smiley, {\n                                weight: emojiBoardTab === EmojiBoardTab.Emoji ? 'fill' : 'regular',\n                              })}\n                            </IconButton>\n                          );\n                        }\n                        return <Fragment key={id}>{button}</Fragment>;\n                      })}\n                    </>\n                  );\n                  if (isMobileOrTablet()) {\n                    return (\n                      <>\n                        {triggers}\n                        {emojiBoardTab !== undefined && (\n                          <MobileSwipeDownModal\n                            requestClose={closeEmojiBoard}\n                            focusTrap\n                            dialogLabel=\"Emoji picker\"\n                            sheetClassName={messageCss.MessageMobileOptionsContainerPicker}\n                            skipReturnFocusRef={emojiBoardSkipReturnFocusRef}\n                          >\n                            {() => emojiBoard}\n                          </MobileSwipeDownModal>\n                        )}\n                      </>\n                    );\n                  }\n                  return (\n                    <PopOut\n                      offset={16}\n                      alignOffset={-44}\n                      position=\"Top\"\n                      align=\"End\"\n                      anchor={(() => {\n                        if (emojiBoardTab === undefined) return undefined;\n                        const buttonRefs: Record<\n                          EditorButtonId,\n                          RefObject<HTMLButtonElement | null>\n                        > = {\n                          gif: gifBtnRef,\n                          sticker: stickerBtnRef,\n                          emoji: emojiBtnRef,\n                        };\n                        for (let i = editorButtonOrder.length - 1; i >= 0; i--) {\n                          const id = editorButtonOrder[i];\n                          if (!id) continue;\n                          const btnRef = buttonRefs[id];\n                          if (btnRef?.current) {\n                            return btnRef.current.getBoundingClientRect();\n                          }\n                        }\n                        return undefined;\n                      })()}\n                      content={emojiBoard}\n                    >\n                      {triggers}\n                    </PopOut>\n                  );\n                }}\n              </UseStateProvider>\n\n              <MarkdownFormattingToolbarToggle variant=\"SurfaceVariant\" />\n\n              <IconButton\n                ref={micBtnRef}\n                variant={\n                  showAudioRecorder ? 'Critical' : scheduledTime ? 'Primary' : 'SurfaceVariant'\n                }\n                size=\"300\"\n                radii={hasContent || showAudioRecorder || !editorMicButton ? '0' : '300'}\n                title={\n                  showAudioRecorder\n                    ? 'Stop recording'\n                    : hasContent || !editorMicButton\n                      ? 'Send Message'\n                      : 'Record audio message'\n                }\n                aria-label={\n                  showAudioRecorder\n                    ? 'Stop recording'\n                    : hasContent || !editorMicButton\n                      ? 'Send your composed Message'\n                      : 'Record audio message'\n                }\n                style={{ backgroundColor: 'transparent' }}\n                aria-pressed={!hasContent && editorMicButton ? showAudioRecorder : undefined}\n                onClick={() => {\n                  if (showAudioRecorder) {\n                    requestRecorderStop();\n                    return;\n                  }\n                  if (hasContent) {\n                    if (isLongPress.current) {\n                      isLongPress.current = false;\n                      return;\n                    }\n                    if (sentOnPointerUpRef.current) return;\n                    submit().catch((error) => log.error('submit failed', { roomId }, error));\n                    return;\n                  }\n                  if (!editorMicButton) return;\n                  if (isMobileOrTablet()) return;\n                  recorderActionRef.current = undefined;\n                  setShowAudioRecorder(true);\n                }}\n                onMouseDown={(e: MouseEvent) => {\n                  if (hasContent) e.preventDefault();\n                }}\n                onPointerDown={() => {\n                  sentOnPointerUpRef.current = false;\n                  if (showAudioRecorder) return;\n                  if (hasContent) {\n                    isLongPress.current = false;\n                    if (isMobileOrTablet() && delayedEventsSupported && !threadRootId) {\n                      longPressTimer.current = setTimeout(() => {\n                        isLongPress.current = true;\n                        setShowSchedulePicker(true);\n                      }, 1000);\n                    }\n                    return;\n                  }\n                  if (!editorMicButton) return;\n                  if (!isMobileOrTablet()) return;\n                  recorderActionRef.current = undefined;\n                  micHoldStartRef.current = Date.now();\n                  setShowAudioRecorder(true);\n\n                  function discardRecording() {\n                    if (recorderActionRef.current) return;\n                    recorderActionRef.current = 'cancel';\n                    releaseListeners();\n                    scheduleRecorderTimer(() => {\n                      audioRecorderRef.current?.cancel();\n                    });\n                  }\n                  function onUp() {\n                    if (recorderActionRef.current) return;\n                    const held = Date.now() - micHoldStartRef.current;\n                    if (held >= HOLD_THRESHOLD_MS) {\n                      recorderActionRef.current = 'stop';\n                      releaseListeners();\n                      scheduleRecorderTimer(() => {\n                        audioRecorderRef.current?.stop();\n                      });\n                    } else {\n                      discardRecording();\n                    }\n                  }\n                  function releaseListeners() {\n                    micHoldReleaseRef.current = null;\n                    window.removeEventListener('pointerup', onUp);\n                    window.removeEventListener('pointercancel', discardRecording);\n                  }\n                  micHoldReleaseRef.current = releaseListeners;\n                  window.addEventListener('pointerup', onUp);\n                  window.addEventListener('pointercancel', discardRecording);\n                }}\n                onPointerUp={(evt: PointerEvent<HTMLButtonElement>) => {\n                  if (longPressTimer.current !== null) {\n                    clearTimeout(longPressTimer.current);\n                    longPressTimer.current = null;\n                  }\n                  // iOS drops the synthesized click when the page mutates during a tap.\n                  if (evt.pointerType === 'mouse') return;\n                  if (showAudioRecorder || !hasContent || isLongPress.current) return;\n                  // Touch implicitly captures the pointer, so a release off the button lands here too.\n                  const rect = evt.currentTarget.getBoundingClientRect();\n                  if (\n                    evt.clientX < rect.left ||\n                    evt.clientX > rect.right ||\n                    evt.clientY < rect.top ||\n                    evt.clientY > rect.bottom\n                  ) {\n                    return;\n                  }\n                  sentOnPointerUpRef.current = true;\n                  submit().catch((error) => log.error('submit failed', { roomId }, error));\n                }}\n                onPointerCancel={() => {\n                  if (longPressTimer.current !== null) {\n                    clearTimeout(longPressTimer.current);\n                    longPressTimer.current = null;\n                  }\n                }}\n                disabled={sendBusy && !showAudioRecorder}\n                className={\n                  hasContent && delayedEventsSupported && !threadRootId\n                    ? css.SplitSendButton\n                    : undefined\n                }\n              >\n                {showAudioRecorder ? (\n                  <Stop\n                    size={getPhosphorIconSize('toolbar')}\n                    weight=\"fill\"\n                    style={{ color: color.Critical.Main }}\n                  />\n                ) : sendBusy ? (\n                  <Spinner size=\"300\" variant=\"Secondary\" />\n                ) : hasContent || !editorMicButton ? (\n                  scheduledTime ? (\n                    composerIcon(Clock)\n                  ) : (\n                    composerIcon(PaperPlaneTilt)\n                  )\n                ) : (\n                  composerIcon(Microphone)\n                )}\n              </IconButton>\n              <PopOut\n                anchor={scheduleMenuAnchor}\n                position=\"Top\"\n                align=\"End\"\n                offset={5}\n                content={\n                  <FocusTrap\n                    focusTrapOptions={{\n                      initialFocus: false,\n                      onDeactivate: () => setScheduleMenuAnchor(undefined),\n                      clickOutsideDeactivates: true,\n                      escapeDeactivates: stopPropagation,\n                    }}\n                  >\n                    <Menu>\n                      <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                        <MenuItem\n                          size=\"300\"\n                          radii=\"300\"\n                          onClick={() => {\n                            setScheduleMenuAnchor(undefined);\n                            submit();\n                          }}\n                          before={menuIcon(PaperPlaneTilt)}\n                        >\n                          <Text size=\"B300\">Send Now</Text>\n                        </MenuItem>\n                        <MenuItem\n                          size=\"300\"\n                          radii=\"300\"\n                          onClick={() => {\n                            setScheduleMenuAnchor(undefined);\n                            setShowSchedulePicker(true);\n                          }}\n                          before={menuIcon(Clock)}\n                        >\n                          <Text size=\"B300\">Schedule Send</Text>\n                        </MenuItem>\n                      </Box>\n                    </Menu>\n                  </FocusTrap>\n                }\n              />\n              {delayedEventsSupported && !isMobileOrTablet() && !threadRootId && (\n                <IconButton\n                  onClick={(evt: MouseEvent<HTMLButtonElement>) => {\n                    setScheduleMenuAnchor(evt.currentTarget.getBoundingClientRect());\n                  }}\n                  title=\"Schedule Message\"\n                  aria-label=\"Schedule message send\"\n                  variant={scheduledTime ? 'Primary' : 'SurfaceVariant'}\n                  style={{ backgroundColor: 'transparent' }}\n                  size=\"300\"\n                  radii=\"0\"\n                  className={css.SplitChevronButton}\n                >\n                  {chipIcon(CaretDown)}\n                </IconButton>\n              )}\n            </>\n          }\n          bottom={<MarkdownFormattingToolbarBottom controller={editor} />}\n        />\n        {showSchedulePicker && !threadRootId && (\n          <SchedulePickerDialog\n            initialTime={scheduledTime?.getTime()}\n            showEncryptionWarning={isEncrypted}\n            onCancel={() => setShowSchedulePicker(false)}\n            onSubmit={(date) => {\n              setScheduledTime(date);\n              setShowSchedulePicker(false);\n              setSendError(undefined);\n            }}\n          />\n        )}\n        {showPollPicker && (\n          <PollDialog\n            onCancel={() => setShowPollPicker(false)}\n            onSubmit={(content) =>\n              handleDialogSendContent(content, M_POLL_START.name as keyof TimelineEvents)\n            }\n          />\n        )}\n        {showLocationPicker && (\n          <Suspense fallback={null}>\n            <LocationDialog\n              onCancel={() => setShowLocationPicker(false)}\n              room={room}\n              onSubmit={handleDialogSendContent}\n            />\n          </Suspense>\n        )}\n      </div>\n    );\n  }\n);\n","import type { ComponentProps } from 'react';\nimport { Box, as } from 'folds';\nimport classNames from 'classnames';\n\nimport * as css from './RoomInputPlaceholder.css';\n\nexport const RoomInputPlaceholder = as<'div', ComponentProps<typeof Box>>(\n  ({ className, ...props }, ref) => (\n    <Box className={classNames(css.RoomInputPlaceholder, className)} {...props} ref={ref} />\n  )\n);\n","import { useCallback } from 'react';\nimport { Box, Text } from 'folds';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { AsyncError } from '$components/AsyncError';\n\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { getViaServers } from '$plugins/via-servers';\nimport { RoomInputPlaceholder } from './RoomInputPlaceholder';\nimport * as css from './RoomTombstone.css';\nimport { KnownMembership } from '$types/matrix-sdk';\nimport { Button } from '$components/button';\n\ntype RoomTombstoneProps = { roomId: string; body?: string; replacementRoomId: string };\nexport function RoomTombstone({ roomId, body, replacementRoomId }: RoomTombstoneProps) {\n  const mx = useMatrixClient();\n  const { navigateRoom } = useRoomNavigate();\n\n  const [joinState, handleJoin] = useAsyncCallback(\n    useCallback(() => {\n      const currentRoom = mx.getRoom(roomId);\n      const via = currentRoom ? getViaServers(currentRoom) : [];\n      return mx.joinRoom(replacementRoomId, {\n        viaServers: via,\n      });\n    }, [mx, roomId, replacementRoomId])\n  );\n  const replacementRoom = mx.getRoom(replacementRoomId);\n\n  const handleOpen = () => {\n    if (replacementRoom) navigateRoom(replacementRoom.roomId);\n    if (joinState.status === AsyncStatus.Success) navigateRoom(joinState.data.roomId);\n  };\n\n  return (\n    <RoomInputPlaceholder alignItems=\"Center\" gap=\"600\" className={css.RoomTombstone}>\n      <Box direction=\"Column\" grow=\"Yes\">\n        <Text size=\"T400\">{body || 'This room has been replaced and is no longer active.'}</Text>\n        <AsyncError state={joinState} />\n      </Box>\n      <Box shrink=\"No\">\n        {replacementRoom?.getMyMembership() === KnownMembership.Join ||\n        joinState.status === AsyncStatus.Success ? (\n          <Button onClick={handleOpen} size=\"300\" variant=\"Success\" fill=\"Solid\" radii=\"300\">\n            <Text size=\"B300\">Open New Room</Text>\n          </Button>\n        ) : (\n          <Button\n            loading={joinState.status === AsyncStatus.Loading}\n            spinnerSize=\"100\"\n            spinnerVariant=\"Primary\"\n            spinnerFill=\"Solid\"\n            size=\"300\"\n            variant=\"Primary\"\n            fill=\"Solid\"\n            radii=\"300\"\n            onClick={handleJoin}\n          >\n            <Text size=\"B300\">Join New Room</Text>\n          </Button>\n        )}\n      </Box>\n    </RoomInputPlaceholder>\n  );\n}\n","import { Box, IconButton, Text, as, toRem } from 'folds';\nimport { chipIcon, X } from '$components/icons/phosphor';\nimport type { Room } from '$types/matrix-sdk';\nimport classNames from 'classnames';\nimport { useSetAtom, useAtomValue } from 'jotai';\nimport { roomIdToTypingMembersAtom } from '$state/typingMembers';\nimport { TypingIndicator } from '$components/typing-indicator';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRoomTypingMember } from '$hooks/useRoomTypingMembers';\nimport { nicknamesAtom } from '$state/nicknames';\nimport * as css from './RoomViewTyping.css';\n\ntype RoomViewTypingProps = {\n  room: Room;\n};\nexport const RoomViewTyping = as<'div', RoomViewTypingProps>(\n  ({ className, room, ...props }, ref) => {\n    const setTypingMembers = useSetAtom(roomIdToTypingMembersAtom);\n    const mx = useMatrixClient();\n    const typingMembers = useRoomTypingMember(room.roomId);\n    const nicknames = useAtomValue(nicknamesAtom);\n\n    const typingNames = typingMembers\n      .filter((receipt) => receipt.userId !== mx.getUserId())\n      .map(\n        (receipt) =>\n          getMemberDisplayName(room, receipt.userId, nicknames) ?? getMxIdLocalPart(receipt.userId)\n      )\n      .toReversed();\n\n    if (typingNames.length === 0) {\n      return null;\n    }\n\n    const handleDropAll = () => {\n      // some homeserver does not timeout typing status\n      // we have given option so user can drop their typing status\n      typingMembers.forEach((receipt) =>\n        setTypingMembers({\n          type: 'DELETE',\n          roomId: room.roomId,\n          userId: receipt.userId,\n        })\n      );\n    };\n\n    return (\n      <Box\n        className={classNames(css.RoomViewTyping, className)}\n        alignItems=\"Center\"\n        gap=\"400\"\n        shrink=\"No\"\n        {...props}\n        ref={ref}\n      >\n        <TypingIndicator />\n        <Text className={css.TypingText} size=\"T300\" truncate>\n          {typingNames.length === 1 && (\n            <>\n              <b>{typingNames[0]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {' is typing...'}\n              </Text>\n            </>\n          )}\n          {typingNames.length === 2 && (\n            <>\n              <b>{typingNames[0]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {' and '}\n              </Text>\n              <b>{typingNames[1]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {' are typing...'}\n              </Text>\n            </>\n          )}\n          {typingNames.length === 3 && (\n            <>\n              <b>{typingNames[0]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {', '}\n              </Text>\n              <b>{typingNames[1]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {' and '}\n              </Text>\n              <b>{typingNames[2]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {' are typing...'}\n              </Text>\n            </>\n          )}\n          {typingNames.length > 3 && (\n            <>\n              <b>{typingNames[0]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {', '}\n              </Text>\n              <b>{typingNames[1]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {', '}\n              </Text>\n              <b>{typingNames[2]}</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {' and '}\n              </Text>\n              <b>{typingNames.length - 3} others</b>\n              <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                {' are typing...'}\n              </Text>\n            </>\n          )}\n        </Text>\n        <IconButton\n          title=\"Drop Typing Status\"\n          size=\"300\"\n          radii=\"Pill\"\n          onClick={handleDropAll}\n          style={{ padding: toRem(2) }}\n        >\n          {chipIcon(X)}\n        </IconButton>\n      </Box>\n    );\n  }\n);\n","\"use client\";\n\nimport { forwardRef as e, memo as t, useEffect as o, useImperativeHandle as n, useLayoutEffect as r, useMemo as i, useReducer as s, useRef as l } from \"react\";\n\nimport { jsx as c } from \"react/jsx-runtime\";\n\nimport { flushSync as f } from \"react-dom\";\n\nvar {min: u, max: d, abs: a, floor: h} = Math, g = (e, t, o) => u(o, d(t, e)), p = e => [ ...e ].sort((e, t) => e - t), v = \"function\" == typeof queueMicrotask ? queueMicrotask : e => {\n    Promise.resolve().then(e);\n}, m = () => {\n    let e;\n    return [ new Promise(t => {\n        e = t;\n    }), e ];\n}, _ = e => {\n    let t;\n    return () => (e && (t = e(), e = void 0), t);\n}, w = (e, t, o) => {\n    const n = o ? \"unshift\" : \"push\";\n    for (let o = 0; o < t; o++) e[n](-1);\n    return e;\n}, S = (e, t) => {\n    const o = e.t[t];\n    return -1 === o ? e.o : o;\n}, $ = (e, t, o) => {\n    const n = -1 === e.t[t];\n    return e.t[t] = o, e.i = u(t, e.i), n;\n}, z = (e, t) => {\n    if (!e.l) return 0;\n    if (e.i >= t) return e.u[t];\n    e.i < 0 && (e.u[0] = 0, e.i = 0);\n    let o = e.i, n = e.u[o];\n    for (;o < t; ) n += S(e, o), e.u[++o] = n;\n    return e.i = t, n;\n}, b = (e, t, o = 0, n = e.l - 1) => {\n    let r = o;\n    for (;o <= n; ) {\n        const i = h((o + n) / 2);\n        z(e, i) <= t ? (r = i, o = i + 1) : n = i - 1;\n    }\n    return g(r, 0, e.l - 1);\n}, y = (e, t, o) => {\n    const n = t - e.l;\n    return e.i = o ? -1 : u(t - 1, e.i), e.l = t, n > 0 ? (w(e.u, n), w(e.t, n, o), \n    e.o * n) : (e.u.splice(n), (o ? e.t.splice(0, -n) : e.t.splice(n)).reduce((t, o) => t - (-1 === o ? e.o : o), 0));\n}, x = \"undefined\" != typeof window, I = e => e.documentElement, k = e => e.ownerDocument, R = e => e.defaultView, T = /*#__PURE__*/ _(() => !!/iP(hone|od|ad)/.test(navigator.userAgent) || \"MacIntel\" === navigator.platform && navigator.maxTouchPoints > 0), C = /*#__PURE__*/ _(() => \"scrollBehavior\" in I(document).style), M = e => d(e.h(), e.p()), O = (e, t = 40, o = 0, n, r = !1) => {\n    let i = !!o, s = 1, l = 0, c = 0, f = 0, h = 0, g = 0, v = 0, m = 0, _ = 0, x = null, I = [ 0, i ? d(o - 1, 0) : -1 ], k = 0, R = !1;\n    const C = ((e, t, o) => ({\n        o: t,\n        t: o ? w(o.slice(0, u(e, o.length)), d(0, e - o.length)) : w([], e),\n        l: e,\n        i: -1,\n        u: w([], e + 1)\n    }))(e, n ? n[1] : t, n && n[0]), M = /* @__PURE__ */ new Set, O = () => f - c, E = () => O() + g + h, H = (e, t) => ((e, t, o, n) => {\n        if (n = u(n, e.l - 1), z(e, n) <= t) {\n            const r = b(e, o, n);\n            return [ b(e, t, n, r), r ];\n        }\n        {\n            const r = b(e, t, void 0, n);\n            return [ r, b(e, o, r) ];\n        }\n    })(C, e, t, I[0]), W = () => z(C, C.l), B = (e, t) => {\n        const o = z(C, e) - g;\n        return t ? W() - o - J(e) : o;\n    }, J = e => S(C, e), A = (e, t = -1) => C.t[e] === t, L = e => {\n        e && (T() && 0 !== m || x && 1 === _ ? g += e : h += e);\n    };\n    return {\n        v: () => {\n            M.clear();\n        },\n        m: () => s,\n        _: () => (e => [ e.t.slice(), e.o ])(C),\n        S: (e = 200) => {\n            if (!R || i) return I;\n            let t, o;\n            if (v) [t, o] = I; else {\n                let n = d(0, E()), i = n + l;\n                r || (e = d(0, e), 1 !== m && (n -= e), 2 !== m && (i += e)), [t, o] = I = H(d(0, n), d(0, i)), \n                x && (t = u(t, x[0]), o = d(o, x[1]));\n            }\n            return [ d(t, 0), u(o, C.l - 1) ];\n        },\n        $: e => b(C, e - c),\n        I: A,\n        k: B,\n        R: J,\n        T: () => C.l,\n        C: () => f,\n        M: () => 0 !== m,\n        p: () => l,\n        O: () => c,\n        h: W,\n        H: () => (v = h, h = 0, [ v, 2 === _ ]),\n        W: (e, t) => {\n            const o = [ e, t ];\n            return M.add(o), () => {\n                M.delete(o);\n            };\n        },\n        B: (e, t) => {\n            let o, n, u = 0;\n            switch (e) {\n              case 1:\n                {\n                    if (t === f && 0 === _) break;\n                    const e = v;\n                    v = 0;\n                    const o = t - f, r = a(o);\n                    e && r < a(e) + 1 || 0 !== _ || (m = o < 0 ? 2 : 1), i && (i = !1), f = t, u = 4;\n                    const s = O();\n                    s >= -l && s <= W() && (u += 1, n = r > l);\n                    break;\n                }\n\n              case 2:\n                u = 8, 0 !== m && (o = !0, u += 1), m = 0, _ = 0, x = null;\n                break;\n\n              case 3:\n                {\n                    const e = t.filter(([e, t]) => !A(e, t));\n                    if (!e.length) break;\n                    L(e.reduce((e, [t, o]) => {\n                        let n;\n                        if (2 === _) n = !0; else if (x && 1 === _) n = t < x[0]; else {\n                            const e = O(), o = B(t), r = J(t);\n                            n = 1 !== m && 0 === _ ? o + r <= e : o < e && o + r < e + l;\n                        }\n                        return n && (e += o - J(t)), e;\n                    }, 0));\n                    for (const [t, o] of e) {\n                        const e = J(t), n = $(C, t, o);\n                        r && (k += n ? o : o - e);\n                    }\n                    r && l && k > l && (L(((e, t) => {\n                        let o = 0;\n                        const n = [];\n                        e.t.forEach((e, r) => {\n                            -1 !== e && (n.push(e), r < t && o++);\n                        }), e.i = -1;\n                        const r = p(n), i = r.length, s = i / 2 | 0, l = i % 2 == 0 ? (r[s - 1] + r[s]) / 2 : r[s], c = e.o;\n                        return ((e.o = l) - c) * d(t - o, 0);\n                    })(C, b(C, E()))), r = !1), u = 3, n = !0;\n                    break;\n                }\n\n              case 4:\n                l !== t && (l || (R = n = !0), l = t, u = 3);\n                break;\n\n              case 5:\n                t[1] ? (L(y(C, t[0], !0)), _ = 2, u = 1) : (y(C, t[0]), u = 1);\n                break;\n\n              case 6:\n                c = t;\n                break;\n\n              case 7:\n                _ = 1;\n                break;\n\n              case 8:\n                x = H(t, t + l), u = 1;\n            }\n            u && (s = 1 + (2147483647 & s), o && g && (h += g, g = 0), M.forEach(([e, t]) => {\n                u & e && t(n);\n            }));\n        }\n    };\n}, E = setTimeout, H = (e, t) => t ? -e : e, W = (e, t, o, n, r, i) => {\n    const s = Date.now;\n    let l = 0, c = !1, f = !1, u = !1, d = !1;\n    const a = (() => {\n        let t;\n        const o = () => {\n            null != t && clearTimeout(t);\n        }, n = () => {\n            o(), t = E(() => {\n                t = null, (() => {\n                    if (c || f) return c = !1, void a();\n                    u = !1, e.B(2);\n                })();\n            }, 150);\n        };\n        return n.J = o, n;\n    })(), h = () => {\n        l = s(), u && (d = !0), i && e.B(6, i()), e.B(1, n()), a();\n    }, g = t => {\n        if (c || !e.M() || t.ctrlKey) return;\n        const n = s() - l;\n        150 > n && 50 < n && (o ? t.deltaX : t.deltaY) && (c = !0);\n    }, p = () => {\n        f = !0, u = d = !1;\n    }, v = () => {\n        f = !1, T() && (u = !0);\n    };\n    return t.addEventListener(\"scroll\", h), t.addEventListener(\"wheel\", g, {\n        passive: !0\n    }), t.addEventListener(\"touchstart\", p, {\n        passive: !0\n    }), t.addEventListener(\"touchend\", v, {\n        passive: !0\n    }), {\n        A: () => {\n            t.removeEventListener(\"scroll\", h), t.removeEventListener(\"wheel\", g), t.removeEventListener(\"touchstart\", p), \n            t.removeEventListener(\"touchend\", v), a.J();\n        },\n        L: () => {\n            const [t, o] = e.H();\n            t && (r(t, o, d), d = !1, o && e.p() > e.h() && e.B(1, n()));\n        }\n    };\n}, B = (e, t, o) => {\n    let n;\n    return [ async (r, i) => {\n        if (!await t()) return;\n        n && n();\n        const s = () => {\n            const [t, o] = m();\n            return n = () => {\n                o(!1);\n            }, e.p() && E(n, 150), [ t, e.W(2, () => {\n                o(!0);\n            }) ];\n        };\n        if (i && C()) e.B(8, r()), v(async () => {\n            for (;;) {\n                let t = !0;\n                for (let [o, n] = e.S(); o <= n; o++) if (e.I(o)) {\n                    t = !1;\n                    break;\n                }\n                if (t) break;\n                const [o, n] = s();\n                try {\n                    if (!await o) return;\n                } finally {\n                    n();\n                }\n            }\n            e.B(7), o(r(), i);\n        }); else for (;;) {\n            const [t, n] = s();\n            try {\n                if (e.B(7), o(r()), !await t) return;\n            } finally {\n                n();\n            }\n        }\n    }, () => {\n        n && n();\n    } ];\n}, J = (e, t) => {\n    let o, n, r = m(), i = !1;\n    const s = t ? \"scrollLeft\" : \"scrollTop\", l = t ? \"overflowX\" : \"overflowY\", [c, f] = B(e, () => r[0], (e, n) => {\n        e = H(e, i), n ? o.scrollTo({\n            [t ? \"left\" : \"top\"]: e,\n            behavior: \"smooth\"\n        }) : o[s] = e;\n    });\n    return {\n        N(c, u) {\n            o = u, t && (i = \"rtl\" === getComputedStyle(u).direction), n = W(e, u, t, () => H(u[s], i), (t, o, n) => {\n                if (n) {\n                    const e = u.style, t = e[l];\n                    e[l] = \"hidden\", E(() => {\n                        e[l] = t;\n                    });\n                }\n                u[s] = H(e.C() + t, i), o && f();\n            }), r[1](!0);\n        },\n        v() {\n            n && n.A(), r[1](!1), r = m();\n        },\n        P: () => i,\n        V(e) {\n            c(() => e);\n        },\n        X(t) {\n            t += e.C(), c(() => t);\n        },\n        Y(t, {align: o, smooth: n, offset: r = 0} = {}) {\n            if (t = g(t, 0, e.T() - 1), \"nearest\" === o) {\n                const n = e.k(t), r = e.C();\n                if (n < r) o = \"start\"; else {\n                    if (!(n + e.R(t) > r + e.p())) return;\n                    o = \"end\";\n                }\n            }\n            c(() => r + e.O() + e.k(t) + (\"end\" === o ? e.R(t) - e.p() : \"center\" === o ? (e.R(t) - e.p()) / 2 : 0), n);\n        },\n        q: () => {\n            n && n.L();\n        }\n    };\n}, A = (e, t) => {\n    let o, n, r = m(), i = !1;\n    const s = t ? \"left\" : \"top\", [l] = B(e, () => r[0], (e, t) => {\n        e = H(e, i);\n        const n = R(k(o));\n        t ? n.scroll({\n            [s]: e,\n            behavior: \"smooth\"\n        }) : n.scroll({\n            [s]: e\n        });\n    }), c = (e, t, o, n, r = 0) => {\n        const s = n ? \"offsetLeft\" : \"offsetTop\", l = r + (n && i ? o.innerWidth - e[s] - e.offsetWidth : e[s]), f = e.offsetParent;\n        return e !== t && f ? c(f, t, o, n, l) : l;\n    };\n    return {\n        N(l) {\n            o = l;\n            const f = t ? \"scrollX\" : \"scrollY\", u = k(l), d = R(u);\n            t && (i = \"rtl\" === getComputedStyle(I(u)).direction), n = W(e, d, t, () => H(d[f], i), (t, o) => {\n                o ? d.scroll({\n                    [s]: H(e.C() + t, i)\n                }) : d.scrollBy({\n                    [s]: H(t, i)\n                });\n            }, () => c(l, u.body, d, t)), r[1](!0);\n        },\n        v() {\n            n && n.A(), o = void 0, r[1](!1), r = m();\n        },\n        P: () => i,\n        q: () => {\n            n && n.L();\n        },\n        Y(n, {align: r, smooth: i, offset: s = 0} = {}) {\n            if (!o) return;\n            if (n = g(n, 0, e.T() - 1), \"nearest\" === r) {\n                const t = e.k(n), o = e.C();\n                if (t < o) r = \"start\"; else {\n                    if (!(t + e.R(n) > o + e.p())) return;\n                    r = \"end\";\n                }\n            }\n            const f = k(o), u = R(f), d = I(f), a = () => e.p() - (t ? d.clientWidth : d.clientHeight);\n            l(() => s + c(o, f.body, u, t) + e.k(n) + (\"end\" === r ? e.R(n) - (e.p() - a()) : \"center\" === r ? (e.R(n) - (e.p() - a())) / 2 : 0), i);\n        }\n    };\n}, L = (e, t) => {\n    const o = J(e, !1), n = J(t, !0);\n    return {\n        N(e, t) {\n            o.N(e, t), n.N(e, t);\n        },\n        v() {\n            o.v(), n.v();\n        },\n        P: n.P,\n        V(e, t) {\n            null != e && o.V(e), null != t && n.V(t);\n        },\n        X(e, t) {\n            null != e && o.X(e), null != t && n.X(t);\n        },\n        Y(e, t) {\n            null != e && o.Y(e), null != t && n.Y(t);\n        },\n        q() {\n            o.q(), n.q();\n        }\n    };\n}, N = e => {\n    let t;\n    return {\n        j(o) {\n            (t || (t = new (R(k(o)).ResizeObserver)(e))).observe(o);\n        },\n        D(e) {\n            t.unobserve(e);\n        },\n        A() {\n            t && t.disconnect();\n        }\n    };\n}, P = (e, t) => {\n    let o;\n    const n = t ? \"width\" : \"height\", r = /* @__PURE__ */ new WeakMap, i = N(t => {\n        const i = [];\n        for (const {target: s, contentRect: l} of t) if (s.offsetParent) if (s === o) e.B(4, l[n]); else {\n            const e = r.get(s);\n            null != e && i.push([ e, l[n] ]);\n        }\n        i.length && e.B(3, i);\n    });\n    return {\n        G(e) {\n            i.j(o = e);\n        },\n        U: (e, t) => (r.set(e, t), i.j(e), () => {\n            r.delete(e), i.D(e);\n        }),\n        v: i.A\n    };\n}, V = (e, t) => {\n    const o = t ? \"width\" : \"height\", n = t ? \"innerWidth\" : \"innerHeight\", r = /* @__PURE__ */ new WeakMap, i = N(t => {\n        const n = [];\n        for (const {target: e, contentRect: i} of t) {\n            if (!e.offsetParent) continue;\n            const t = r.get(e);\n            null != t && n.push([ t, i[o] ]);\n        }\n        n.length && e.B(3, n);\n    });\n    let s;\n    return {\n        G(t) {\n            const o = R(k(t)), r = () => {\n                e.B(4, o[n]);\n            };\n            o.addEventListener(\"resize\", r), v(r), s = () => {\n                o.removeEventListener(\"resize\", r);\n            };\n        },\n        U: (e, t) => (r.set(e, t), i.j(e), () => {\n            r.delete(e), i.D(e);\n        }),\n        v() {\n            s && s(), i.A();\n        }\n    };\n}, X = (e, t) => {\n    let o;\n    const n = /* @__PURE__ */ new WeakMap, r = /* @__PURE__ */ new Set, i = /* @__PURE__ */ new Set, s = /* @__PURE__ */ new Map, l = (e, t) => `${e}-${t}`, c = N(c => {\n        const f = /* @__PURE__ */ new Set, u = /* @__PURE__ */ new Set;\n        for (const {target: r, contentRect: {width: i, height: d}} of c) if (r.offsetParent) if (r === o) e.B(4, d), \n        t.B(4, i); else {\n            const e = n.get(r);\n            if (e) {\n                const [t, o] = e, n = l(t, o), r = s.get(n);\n                let c, a;\n                r ? (r[0] !== d && (c = !0), r[1] !== i && (a = !0)) : c = a = !0, c && f.add(t), \n                a && u.add(o), (c || a) && s.set(n, [ d, i ]);\n            }\n        }\n        if (f.size) {\n            const t = [];\n            f.forEach(e => {\n                let o = 0;\n                i.forEach(t => {\n                    const n = s.get(l(e, t));\n                    n && (o = d(o, n[0]));\n                }), o && t.push([ e, o ]);\n            }), e.B(3, t);\n        }\n        if (u.size) {\n            const e = [];\n            u.forEach(t => {\n                let o = 0;\n                r.forEach(e => {\n                    const n = s.get(l(e, t));\n                    n && (o = d(o, n[1]));\n                }), o && e.push([ t, o ]);\n            }), t.B(3, e);\n        }\n    });\n    return {\n        G(e) {\n            c.j(o = e);\n        },\n        U: (e, t, o) => (n.set(e, [ t, o ]), r.add(t), i.add(o), c.j(e), () => {\n            n.delete(e), c.D(e);\n        }),\n        F(o) {\n            for (const [t] of o) for (let o = 0; o < e.T(); o++) s.delete(l(o, t));\n            t.B(3, o);\n        },\n        K(o) {\n            for (const [e] of o) for (let o = 0; o < t.T(); o++) s.delete(l(e, o));\n            e.B(3, o);\n        },\n        v: c.A\n    };\n}, Y = x ? r : o, q = \"current\", j = (e, t) => {\n    if (Array.isArray(e)) for (const o of e) j(o, t); else null == e || \"boolean\" == typeof e || t.push(e);\n}, D = (e, t) => {\n    const o = e.key;\n    return null != o ? o : \"_\" + t;\n}, G = e => {\n    const t = l(null);\n    return t.current || (t.current = e());\n}, U = e => {\n    const t = l(e);\n    return Y(() => {\n        t[q] = e;\n    }, [ e ]), t;\n}, F = /*#__PURE__*/ t(({Z: e, ee: t, te: o, oe: n, ne: r, re: s, ie: f, se: u}) => {\n    const d = l(null);\n    Y(() => t(d[q], o), [ o ]);\n    const a = i(() => {\n        const e = {\n            contain: \"layout style\",\n            position: r && u ? void 0 : \"absolute\",\n            [f ? \"height\" : \"width\"]: \"100%\",\n            [f ? \"top\" : \"left\"]: 0,\n            [f ? \"left\" : \"top\"]: n,\n            visibility: !r || u ? void 0 : \"hidden\"\n        };\n        return f && (e.display = \"inline-flex\"), e;\n    }, [ n, r, u, f ]);\n    /* @__PURE__ */\n    return c(s, \"string\" == typeof s ? {\n        ref: d,\n        style: a,\n        children: e\n    } : {\n        ref: d,\n        style: a,\n        index: o,\n        children: e\n    });\n}), K = (e, t) => i(() => {\n    if (\"function\" == typeof e) return [ o => e(t[o], o), t.length ];\n    const o = (e => {\n        const t = [];\n        return j(e, t), t;\n    })(e);\n    return [ e => o[e], o.length ];\n}, [ e, t ]), Q = /*#__PURE__*/ e(({children: e, data: t, bufferSize: o, itemSize: r, shift: i, horizontal: u, keepMounted: d, cache: a, startMargin: h = 0, ssrCount: g, as: m = \"div\", item: _ = \"div\", scrollRef: w, onScroll: S, onScrollEnd: $}, z) => {\n    const [b, y] = K(e, t), x = l(null), I = l(!!g), k = U(S), R = U($), [T, C, E, H] = G(() => {\n        const e = !!u, t = O(y, r, g, a, !r);\n        return [ t, P(t, e), J(t, e), e ];\n    });\n    y !== T.T() && T.B(5, [ y, i ]), h !== T.O() && T.B(6, h);\n    const [W, B] = s(T.m, void 0, T.m), A = T.M(), L = T.h(), N = E.P(), V = [], X = e => {\n        const t = b(e);\n        /* @__PURE__ */\n        return c(F, {\n            ee: C.U,\n            te: e,\n            oe: T.k(e, N),\n            ne: T.I(e),\n            re: _,\n            Z: t,\n            ie: H,\n            se: I[q]\n        }, D(t, e));\n    };\n    if (Y(() => {\n        I[q] = !1, T.W(1, e => {\n            e ? f(B) : B();\n        }), T.W(4, () => {\n            k.current && k.current(T.C());\n        }), T.W(8, () => {\n            R.current && R.current();\n        });\n        const e = x[q], t = t => {\n            C.G(t), E.N(e, t);\n        };\n        return w ? v(() => {\n            w.current && t(w[q]);\n        }) : t(e.parentElement), () => {\n            T.v(), C.v(), E.v();\n        };\n    }, []), Y(() => {\n        E.q();\n    }, [ W ]), n(z, () => ({\n        get cache() {\n            return T._();\n        },\n        get scrollOffset() {\n            return T.C();\n        },\n        get scrollSize() {\n            return M(T);\n        },\n        get viewportSize() {\n            return T.p();\n        },\n        findItemIndex: T.$,\n        getItemOffset: T.k,\n        getItemSize: T.R,\n        scrollToIndex: E.Y,\n        scrollTo: E.V,\n        scrollBy: E.X\n    }), []), d) {\n        const e = new Set(d);\n        for (let [t, n] = T.S(o); t <= n; t++) e.add(t);\n        p([ ...e ]).forEach(e => {\n            V.push(X(e));\n        });\n    } else for (let [e, t] = T.S(o); e <= t; e++) V.push(X(e));\n    /* @__PURE__ */\n    return c(m, {\n        ref: x,\n        style: {\n            contain: \"size style\",\n            overflowAnchor: \"none\",\n            flex: \"none\",\n            position: \"relative\",\n            width: H ? L : \"100%\",\n            height: H ? \"100%\" : L,\n            pointerEvents: A ? \"none\" : void 0\n        },\n        children: V\n    });\n}), Z = /*#__PURE__*/ e(({children: e, data: t, bufferSize: o, itemSize: n, shift: r, horizontal: i, keepMounted: s, cache: l, ssrCount: f, item: u, onScroll: d, onScrollEnd: a, style: h, ...g}, p) => /* @__PURE__ */ c(\"div\", {\n    ...g,\n    style: {\n        display: i ? \"inline-block\" : \"block\",\n        [i ? \"overflowX\" : \"overflowY\"]: \"auto\",\n        contain: \"strict\",\n        width: \"100%\",\n        height: \"100%\",\n        ...h\n    },\n    children: /* @__PURE__ */ c(Q, {\n        ref: p,\n        data: t,\n        bufferSize: o,\n        itemSize: n,\n        shift: r,\n        horizontal: i,\n        keepMounted: s,\n        cache: l,\n        ssrCount: f,\n        item: u,\n        onScroll: d,\n        onScrollEnd: a,\n        children: e\n    })\n})), ee = /*#__PURE__*/ e(({children: e, data: t, bufferSize: o, itemSize: r, shift: i, horizontal: u, cache: d, ssrCount: a, as: h = \"div\", item: g = \"div\", onScroll: p, onScrollEnd: v}, m) => {\n    const [_, w] = K(e, t), S = l(null), $ = U(p), z = U(v), b = l(!!a), [y, x, I, k] = G(() => {\n        const e = !!u, t = O(w, r, a, d, !r);\n        return [ t, V(t, e), A(t, e), e ];\n    });\n    w !== y.T() && y.B(5, [ w, i ]);\n    const [R, T] = s(y.m, void 0, y.m), C = y.M(), M = y.h(), E = I.P(), H = [];\n    Y(() => {\n        b[q] = !1, y.W(1, e => {\n            e ? f(T) : T();\n        }), y.W(4, () => {\n            $.current && $.current();\n        }), y.W(8, () => {\n            z.current && z.current();\n        });\n        const e = S[q];\n        return x.G(e), I.N(e), () => {\n            y.v(), x.v(), I.v();\n        };\n    }, []), Y(() => {\n        I.q();\n    }, [ R ]), n(m, () => ({\n        get cache() {\n            return y._();\n        },\n        get scrollOffset() {\n            return y.C();\n        },\n        get viewportSize() {\n            return y.p();\n        },\n        findItemIndex: y.$,\n        getItemOffset: y.k,\n        getItemSize: y.R,\n        scrollToIndex: I.Y\n    }), []);\n    for (let [e, t] = y.S(o); e <= t; e++) {\n        const t = _(e);\n        H.push(/* @__PURE__ */ c(F, {\n            ee: x.U,\n            te: e,\n            oe: y.k(e, E),\n            ne: y.I(e),\n            re: g,\n            Z: t,\n            ie: k,\n            se: b[q]\n        }, D(t, e)));\n    }\n    /* @__PURE__ */\n    return c(h, {\n        ref: S,\n        style: {\n            contain: \"size style\",\n            overflowAnchor: \"none\",\n            flex: \"none\",\n            position: \"relative\",\n            width: k ? M : \"100%\",\n            height: k ? \"100%\" : M,\n            pointerEvents: C ? \"none\" : void 0\n        },\n        children: H\n    });\n}), te = (e, t) => `${e}-${t}`, oe = /*#__PURE__*/ t(({Z: e, ee: t, le: o, ce: n, fe: r, ue: s, de: f, ae: u, ne: d, he: a}) => {\n    const h = l(null);\n    return Y(() => t.U(h[q], o, n), [ n, o ]), /* @__PURE__ */ c(a, {\n        ref: h,\n        style: i(() => ({\n            contain: \"layout style\",\n            display: \"grid\",\n            position: \"absolute\",\n            top: r,\n            left: s,\n            visibility: d ? \"hidden\" : void 0,\n            minHeight: f,\n            minWidth: u\n        }), [ r, s, u, f, d ]),\n        children: e\n    });\n}), ne = /*#__PURE__*/ e(({children: e, row: t, col: o, cellHeight: r = 40, cellWidth: u = 100, bufferSize: d, ssrRowCount: a, ssrColCount: h, item: g = \"div\", domRef: p, onScroll: v, onScrollEnd: m, style: _, ...w}, S) => {\n    const [$, z, b, y] = G(() => {\n        const e = O(t, r, a), n = O(o, u, h);\n        return [ e, n, X(e, n), L(e, n) ];\n    });\n    t !== $.T() && $.B(5, [ t ]), o !== z.T() && z.B(5, [ o ]);\n    const [x, I] = s($.m, void 0, $.m), [k, R] = s(z.m, void 0, z.m), T = $.M(), C = z.M(), E = M($), H = M(z), W = l(null), B = U(v), J = U(m);\n    Y(() => {\n        $.W(1, e => {\n            e ? f(I) : I();\n        }), z.W(1, e => {\n            e ? f(R) : R();\n        }), $.W(4, () => {\n            B.current && B.current($.C());\n        }), $.W(8, () => {\n            J.current && J.current();\n        });\n        const e = W[q], t = e.parentElement;\n        return b.G(t), y.N(e, t), () => {\n            $.v(), z.v(), b.v(), y.v();\n        };\n    }, []), Y(() => {\n        y.q();\n    }, [ x, k ]), n(S, () => ({\n        get scrollTop() {\n            return $.C();\n        },\n        get scrollLeft() {\n            return z.C();\n        },\n        get scrollHeight() {\n            return M($);\n        },\n        get scrollWidth() {\n            return M(z);\n        },\n        get viewportHeight() {\n            return $.p();\n        },\n        get viewportWidth() {\n            return z.p();\n        },\n        findRowIndex: $.$,\n        findColIndex: z.$,\n        getRowOffset: $.k,\n        getColOffset: z.k,\n        getRowSize: $.R,\n        getColSize: z.R,\n        resizeCols(e) {\n            b.F(e);\n        },\n        resizeRows(e) {\n            b.K(e);\n        },\n        scrollToIndex: y.Y,\n        scrollTo: y.V,\n        scrollBy: y.X\n    }), []);\n    const A = i(() => {\n        const t = /* @__PURE__ */ new Map;\n        return (o, n) => {\n            let r = t.get(te(o, n));\n            return r || t.set(te(o, n), r = e({\n                rowIndex: o,\n                colIndex: n\n            })), r;\n        };\n    }, [ e ]), N = y.P(), [P, V] = $.S(d), [j, D] = z.S(d), F = [];\n    for (let e = P; e <= V; e++) for (let t = j; t <= D; t++) F.push(/* @__PURE__ */ c(oe, {\n        ee: b,\n        le: e,\n        ce: t,\n        fe: $.k(e),\n        ue: z.k(t, N),\n        de: $.R(e),\n        ae: z.R(t),\n        ne: $.I(e) || z.I(t),\n        he: g,\n        Z: A(e, t)\n    }, te(e, t)));\n    /* @__PURE__ */\n    return c(\"div\", {\n        ref: p,\n        ...w,\n        style: {\n            overflow: \"auto\",\n            contain: \"strict\",\n            width: \"100%\",\n            height: \"100%\",\n            ..._\n        },\n        children: /* @__PURE__ */ c(\"div\", {\n            ref: W,\n            style: {\n                contain: \"size style\",\n                overflowAnchor: \"none\",\n                flex: \"none\",\n                position: \"relative\",\n                width: H,\n                height: E,\n                pointerEvents: T || C ? \"none\" : void 0\n            },\n            children: F\n        })\n    });\n});\n\nexport { Z as VList, Q as Virtualizer, ee as WindowVirtualizer, ne as experimental_VGrid };\n//# sourceMappingURL=index.js.map","import { useCallback, useEffect, useState } from 'react';\nimport { Avatar, Box, Button, Spinner, Text, as } from 'folds';\nimport type { Room } from '$types/matrix-sdk';\nimport { useAtomValue } from 'jotai';\nimport type { IRoomCreateContent } from '$types/matrix/room';\n\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { getStateEvent } from '$utils/room/hierarchy';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { getMxIdLocalPart, mxcUrlToHttp, removeRoomIdFromMDirect } from '$utils/matrix';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { timeDayMonthYear, timeHourMinute } from '$utils/time';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { nameInitials } from '$utils/common';\nimport { useRoomAvatar, useRoomName, useRoomTopic } from '$hooks/useRoomMeta';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { RoomAvatar } from '$components/room-avatar';\nimport { InviteUserPrompt } from '$components/invite-user-prompt';\nimport { InfoCard } from '$components/info-card';\nimport { userFallbackIcon } from '$components/icons/phosphor';\nimport { DirectInvitePrompt } from '$components/direct-invite-prompt';\nimport { EventType, KnownMembership } from '$types/matrix-sdk';\n\ntype RoomIntroProps = {\n  room: Room;\n};\n\nexport const RoomIntro = as<'div', RoomIntroProps>(({ room, ...props }, ref) => {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const { navigateRoom } = useRoomNavigate();\n  const mDirects = useAtomValue(mDirectAtom);\n  const nicknames = useAtomValue(nicknamesAtom);\n  const isDirectConversation = mDirects.has(room.roomId);\n  const [invitePrompt, setInvitePrompt] = useState(false);\n  const [directInvitePrompt, setDirectInvitePrompt] = useState(false);\n\n  const createEvent = getStateEvent(room, EventType.RoomCreate);\n  const avatarMxc = useRoomAvatar(room, mDirects.has(room.roomId));\n  const name = useRoomName(room);\n  const topic = useRoomTopic(room);\n  const avatarHttpUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication) : undefined;\n\n  const createContent = createEvent?.getContent<IRoomCreateContent>();\n  const ts = createEvent?.getTs();\n  const creatorId = createEvent?.getSender();\n  const creatorName =\n    creatorId && (getMemberDisplayName(room, creatorId, nicknames) ?? getMxIdLocalPart(creatorId));\n  const prevRoomId = createContent?.predecessor?.room_id;\n\n  const [prevRoomState, joinPrevRoom] = useAsyncCallback(\n    useCallback(async (roomId: string) => mx.joinRoom(roomId), [mx])\n  );\n\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n\n  const handleInvite = () => {\n    if (isDirectConversation) {\n      setDirectInvitePrompt(true);\n      return;\n    }\n    setInvitePrompt(true);\n  };\n\n  const handleInviteDirect = () => {\n    setDirectInvitePrompt(false);\n    setInvitePrompt(true);\n  };\n\n  const [convertState, convertToRoom] = useAsyncCallback<void, Error, []>(\n    useCallback(async () => {\n      await removeRoomIdFromMDirect(mx, room.roomId);\n    }, [mx, room.roomId])\n  );\n\n  const handleConvertAndInvite = () => {\n    if (convertState.status === AsyncStatus.Loading) return;\n    convertToRoom().catch(() => {});\n  };\n\n  useEffect(() => {\n    if (convertState.status === AsyncStatus.Success) {\n      setDirectInvitePrompt(false);\n      setInvitePrompt(true);\n    }\n  }, [convertState.status]);\n\n  return (\n    <Box direction=\"Column\" grow=\"Yes\" gap=\"500\" {...props} ref={ref}>\n      <Box>\n        <Avatar size=\"500\">\n          <RoomAvatar\n            roomId={room.roomId}\n            src={avatarHttpUrl ?? undefined}\n            alt={name}\n            renderFallback={() => <Text size=\"H2\">{nameInitials(name)}</Text>}\n          />\n        </Avatar>\n      </Box>\n      <Box direction=\"Column\" gap=\"300\">\n        <Box direction=\"Column\" gap=\"100\">\n          <Text size=\"H3\" priority=\"500\">\n            {name}\n          </Text>\n          <Text size=\"T400\" priority=\"400\">\n            {typeof topic === 'string' ? topic : 'This is the beginning of conversation.'}\n          </Text>\n          {creatorName && ts && (\n            <Text size=\"T200\" priority=\"300\">\n              {'Created by '}\n              <b>@{creatorName}</b>\n              {` on ${timeDayMonthYear(ts)} ${timeHourMinute(ts, hour24Clock)}`}\n            </Text>\n          )}\n          {isDirectConversation && (\n            <InfoCard\n              variant=\"Primary\"\n              before={userFallbackIcon('md')}\n              beforeAlign=\"Center\"\n              description=\"This is a direct message\"\n              after={\n                <Button onClick={handleInvite} variant=\"Secondary\" size=\"300\" radii=\"300\">\n                  <Text size=\"B300\">Invite another Member</Text>\n                </Button>\n              }\n            />\n          )}\n        </Box>\n        <Box gap=\"200\" wrap=\"Wrap\">\n          {!isDirectConversation && (\n            <Button onClick={handleInvite} variant=\"Secondary\" size=\"300\" radii=\"300\">\n              <Text size=\"B300\">Invite another Member</Text>\n            </Button>\n          )}\n          {typeof prevRoomId === 'string' &&\n            (mx.getRoom(prevRoomId)?.getMyMembership() === KnownMembership.Join ? (\n              <Button\n                onClick={() => navigateRoom(prevRoomId, createContent?.predecessor?.event_id)}\n                variant=\"Success\"\n                size=\"300\"\n                fill=\"Soft\"\n                radii=\"300\"\n              >\n                <Text size=\"B300\">Open Old Room</Text>\n              </Button>\n            ) : (\n              <Button\n                onClick={() => {\n                  joinPrevRoom(prevRoomId);\n                }}\n                variant=\"Secondary\"\n                size=\"300\"\n                fill=\"Soft\"\n                radii=\"300\"\n                disabled={prevRoomState.status === AsyncStatus.Loading}\n                after={\n                  prevRoomState.status === AsyncStatus.Loading ? (\n                    <Spinner\n                      size=\"50\"\n                      variant=\"Secondary\"\n                      fill=\"Soft\"\n                      style={{ background: 'transparent' }}\n                    />\n                  ) : undefined\n                }\n              >\n                <Text size=\"B300\">Join Old Room</Text>\n              </Button>\n            ))}\n        </Box>\n        {invitePrompt && (\n          <InviteUserPrompt room={room} requestClose={() => setInvitePrompt(false)} />\n        )}\n        {directInvitePrompt && (\n          <DirectInvitePrompt\n            onCancel={() => setDirectInvitePrompt(false)}\n            onInviteDirect={handleInviteDirect}\n            onConvertAndInvite={handleConvertAndInvite}\n            converting={convertState.status === AsyncStatus.Loading}\n            convertError={\n              convertState.status === AsyncStatus.Error ? convertState.error.message : undefined\n            }\n          />\n        )}\n      </Box>\n    </Box>\n  );\n});\n","import { useEffect } from 'react';\nimport { isWindowFocused, subscribeWindowFocus } from '$utils/dom';\n\nexport const useDocumentFocusChange = (onChange: (focus: boolean) => void) => {\n  useEffect(() => {\n    let localFocus = isWindowFocused();\n\n    const handleFocus = () => {\n      const focus = isWindowFocused();\n      if (focus === localFocus) return;\n      localFocus = focus;\n      onChange(localFocus);\n    };\n\n    document.addEventListener('focusin', handleFocus);\n    document.addEventListener('focusout', handleFocus);\n    const unsubscribe = subscribeWindowFocus(handleFocus);\n    return () => {\n      document.removeEventListener('focusin', handleFocus);\n      document.removeEventListener('focusout', handleFocus);\n      unsubscribe();\n    };\n  }, [onChange]);\n};\n","import { useEffect, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { getCanonicalAliasRoomId, isRoomAlias } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\n\ntype AliasResolutionState = {\n  alias: string;\n  roomId?: string;\n};\n\nexport type ResolvedRoomId = {\n  roomId?: string;\n  resolving: boolean;\n};\n\n/** Resolve aliases even when the room is not present in the local sync store yet. */\nexport const useResolvedRoomIdOrAlias = (roomIdOrAlias?: string): ResolvedRoomId => {\n  const mx = useMatrixClient();\n  const localRoomId =\n    roomIdOrAlias && isRoomAlias(roomIdOrAlias)\n      ? getCanonicalAliasRoomId(mx, roomIdOrAlias)\n      : roomIdOrAlias;\n  const [aliasResolution, setAliasResolution] = useState<AliasResolutionState>();\n\n  useEffect(() => {\n    if (!roomIdOrAlias || !isRoomAlias(roomIdOrAlias) || localRoomId) return undefined;\n    if (aliasResolution?.alias === roomIdOrAlias) return undefined;\n\n    let cancelled = false;\n    void mx\n      .getRoomIdForAlias(roomIdOrAlias)\n      .then(({ room_id: resolvedRoomId }) => {\n        if (!cancelled) setAliasResolution({ alias: roomIdOrAlias, roomId: resolvedRoomId });\n      })\n      .catch(() => {\n        if (!cancelled) setAliasResolution({ alias: roomIdOrAlias });\n      });\n\n    return () => {\n      cancelled = true;\n    };\n  }, [aliasResolution?.alias, localRoomId, mx, roomIdOrAlias]);\n\n  if (localRoomId) return { roomId: localRoomId, resolving: false };\n  if (!roomIdOrAlias || !isRoomAlias(roomIdOrAlias)) {\n    return { roomId: roomIdOrAlias, resolving: false };\n  }\n  if (aliasResolution?.alias === roomIdOrAlias) {\n    return { roomId: aliasResolution.roomId, resolving: false };\n  }\n  return { resolving: true };\n};\n\nexport const useResolvedSelectedSpace = (): ResolvedRoomId => {\n  const { spaceIdOrAlias: encodedSpaceIdOrAlias } = useParams();\n  const spaceIdOrAlias = encodedSpaceIdOrAlias && decodeURIComponent(encodedSpaceIdOrAlias);\n  return useResolvedRoomIdOrAlias(spaceIdOrAlias);\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { matchPath, useLocation } from 'react-router';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useAccountDataCallback } from '$hooks/useAccountDataCallback';\nimport { getSlidingSyncManager } from '$client/initMatrix';\nimport { useResolvedRoomIdOrAlias } from '$hooks/router/useResolvedRoomId';\nimport { useSpaces } from '$state/hooks/roomList';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { getGlobalImagePackRoomIds } from '$plugins/custom-emoji';\nimport { ClientEvent } from '$types/matrix-sdk';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\nimport {\n  DIRECT_ROOM_PATH,\n  DIRECT_ROOM_FORUM_PATH,\n  HOME_ROOM_PATH,\n  HOME_ROOM_FORUM_PATH,\n  SPACE_LOBBY_PATH,\n  SPACE_PATH,\n  SPACE_ROOM_PATH,\n  SPACE_ROOM_FORUM_PATH,\n  SPACE_SEARCH_PATH,\n} from '$pages/paths';\nimport { isRoomAlias, isRoomId } from '$utils/matrix';\n\ntype RouteRoomRefs = {\n  roomIdOrAlias?: string;\n  spaceIdOrAlias?: string;\n};\n\nconst decodeRoomRef = (value: string | undefined): string | undefined => {\n  if (!value) return undefined;\n  const decoded = decodeURIComponent(value);\n  return isRoomId(decoded) || isRoomAlias(decoded) ? decoded : undefined;\n};\n\nconst getRouteRoomRefs = (pathname: string): RouteRoomRefs => {\n  const homeRoomMatch =\n    matchPath(HOME_ROOM_FORUM_PATH, pathname) ?? matchPath(HOME_ROOM_PATH, pathname);\n  const directRoomMatch =\n    matchPath(DIRECT_ROOM_FORUM_PATH, pathname) ?? matchPath(DIRECT_ROOM_PATH, pathname);\n  const nonSpaceRoomMatch = homeRoomMatch ?? directRoomMatch;\n  if (nonSpaceRoomMatch) {\n    return { roomIdOrAlias: decodeRoomRef(nonSpaceRoomMatch.params.roomIdOrAlias) };\n  }\n\n  const spaceRoomMatch =\n    matchPath(SPACE_ROOM_FORUM_PATH, pathname) ?? matchPath(SPACE_ROOM_PATH, pathname);\n  if (spaceRoomMatch) {\n    return {\n      roomIdOrAlias: decodeRoomRef(spaceRoomMatch.params.roomIdOrAlias),\n      spaceIdOrAlias: decodeRoomRef(spaceRoomMatch.params.spaceIdOrAlias),\n    };\n  }\n\n  const spaceMatch =\n    matchPath(SPACE_LOBBY_PATH, pathname) ??\n    matchPath(SPACE_SEARCH_PATH, pathname) ??\n    matchPath(SPACE_PATH, pathname);\n  return { spaceIdOrAlias: decodeRoomRef(spaceMatch?.params.spaceIdOrAlias) };\n};\n\nconst useAvailableSlidingSyncManager = () => {\n  const mx = useMatrixClient();\n  const [manager, setManager] = useState(() => getSlidingSyncManager(mx));\n\n  useEffect(() => {\n    if (manager) return undefined;\n\n    const checkForManager = () => {\n      const nextManager = getSlidingSyncManager(mx);\n      if (nextManager) setManager(nextManager);\n    };\n\n    const retryId = globalThis.setTimeout(checkForManager, 0);\n    mx.on(ClientEvent.Sync, checkForManager);\n    return () => {\n      globalThis.clearTimeout(retryId);\n      mx.removeListener(ClientEvent.Sync, checkForManager);\n    };\n  }, [manager, mx]);\n\n  return manager;\n};\n\nconst useSlidingSyncRouteRooms = (): void => {\n  const manager = useAvailableSlidingSyncManager();\n  const { pathname } = useLocation();\n  const { roomIdOrAlias, spaceIdOrAlias } = getRouteRoomRefs(pathname);\n  const { roomId, resolving: resolvingRoom } = useResolvedRoomIdOrAlias(roomIdOrAlias);\n  const { roomId: spaceId, resolving: resolvingSpace } = useResolvedRoomIdOrAlias(spaceIdOrAlias);\n\n  useEffect(() => {\n    if (!manager || resolvingRoom || resolvingSpace) return undefined;\n\n    const activeRoomIds = [...new Set([spaceId, roomId].filter(Boolean))] as string[];\n    manager.setActiveRoomSubscriptions(activeRoomIds);\n\n    return undefined;\n  }, [manager, resolvingRoom, resolvingSpace, roomId, spaceId]);\n\n  useEffect(() => {\n    if (!manager) return undefined;\n    return () => manager.setActiveRoomSubscriptions([]);\n  }, [manager]);\n};\n\nconst useSlidingSyncSpaceSubscriptions = (): void => {\n  const manager = useAvailableSlidingSyncManager();\n  const mx = useMatrixClient();\n  const spaces = useSpaces(mx, allRoomsAtom);\n\n  useEffect(() => {\n    if (!manager) return undefined;\n    manager.setSpaceSubscriptions(spaces);\n    return undefined;\n  }, [manager, spaces]);\n};\n\n// Subscribe pack rooms before the emoji board first opens so their\n// pack state is already available.\nconst useSlidingSyncImagePackSubscriptions = (): void => {\n  const manager = useAvailableSlidingSyncManager();\n  const mx = useMatrixClient();\n\n  useEffect(() => {\n    if (!manager) return undefined;\n    manager.setImagePackSubscriptions(getGlobalImagePackRoomIds(mx));\n    return undefined;\n  }, [manager, mx]);\n\n  useAccountDataCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (\n          mEvent.getType() === (CustomAccountDataEvent.ImagePackRooms as string) ||\n          mEvent.getType() === (CustomAccountDataEvent.PoniesEmoteRooms as string)\n        ) {\n          manager?.setImagePackSubscriptions(getGlobalImagePackRoomIds(mx));\n        }\n      },\n      [manager, mx]\n    )\n  );\n};\n\nexport const useSlidingSyncRoomLoading = (roomId: string): boolean => {\n  const manager = useAvailableSlidingSyncManager();\n  const [loading, setLoading] = useState(() => manager?.isRoomSubscriptionLoading(roomId) ?? false);\n\n  useEffect(() => {\n    if (!manager) {\n      setLoading(false);\n      return undefined;\n    }\n\n    return manager.onRoomSubscriptionStatus(roomId, setLoading);\n  }, [manager, roomId]);\n\n  return loading;\n};\n\nexport const useSlidingSyncActiveRoom = (): void => {\n  useSlidingSyncRouteRooms();\n  useSlidingSyncSpaceSubscriptions();\n  useSlidingSyncImagePackSubscriptions();\n};\n","import type { EventTimeline, MatrixEvent, Room } from '$types/matrix-sdk';\nimport { Direction } from '$types/matrix-sdk';\nimport { roomHaveNotification, roomHaveUnread } from '$utils/room/unread';\n\nexport const PAGINATION_LIMIT = 60;\n\nexport const getLiveTimeline = (room: Room): EventTimeline =>\n  room.getUnfilteredTimelineSet().getLiveTimeline();\n\n/** True when `eventId` is the newest event the live timeline holds. */\nexport const isNewestLiveEvent = (room: Room, eventId: string): boolean => {\n  const events = getLiveTimeline(room).getEvents?.() ?? [];\n  return events[events.length - 1]?.getId?.() === eventId;\n};\n\nexport const getEventTimeline = (room: Room, eventId: string): EventTimeline | undefined => {\n  const timelineSet = room.getUnfilteredTimelineSet();\n  return timelineSet.getTimelineForEvent(eventId) ?? undefined;\n};\n\n/** Resolves against the displayed chain's own set, which for a jump is not the room's. */\nexport const getDisplayedEventTimeline = (\n  linkedTimelines: EventTimeline[],\n  eventId: string\n): EventTimeline | undefined =>\n  linkedTimelines[0]?.getTimelineSet().getTimelineForEvent(eventId) ?? undefined;\n\nexport const getFirstLinkedTimeline = (\n  timeline: EventTimeline,\n  direction: Direction\n): EventTimeline => {\n  let current = timeline;\n  while (current.getNeighbouringTimeline(direction)) {\n    current = current.getNeighbouringTimeline(direction)!;\n  }\n  return current;\n};\n\nexport const getLinkedTimelines = (timeline: EventTimeline): EventTimeline[] => {\n  const result: EventTimeline[] = [];\n  let current: EventTimeline | null = getFirstLinkedTimeline(timeline, Direction.Backward);\n  while (current) {\n    result.push(current);\n    current = current.getNeighbouringTimeline(Direction.Forward);\n  }\n  return result;\n};\n\nconst timelineToEventsCount = (t: EventTimeline) => {\n  if (!t) return 0;\n  const events = t.getEvents();\n  return events ? events.length : 0;\n};\n\nexport const getTimelinesEventsCount = (timelines: EventTimeline[]): number => {\n  const timelineEventCountReducer = (count: number, tm: EventTimeline) =>\n    count + timelineToEventsCount(tm);\n  return (timelines || [])\n    .filter(Boolean)\n    .reduce((accumulator, element) => timelineEventCountReducer(accumulator, element), 0);\n};\n\nexport const getEventIdAbsoluteIndex = (\n  timelines: EventTimeline[],\n  eventTimeline: EventTimeline,\n  eventId: string\n): number | undefined => {\n  const timelineIndex = timelines.indexOf(eventTimeline);\n  if (timelineIndex === -1) return undefined;\n\n  const currentEvents = eventTimeline.getEvents();\n  if (!currentEvents) return undefined;\n\n  const eventIndex = currentEvents.findIndex((evt: MatrixEvent) => evt.getId() === eventId);\n  if (eventIndex === -1) return undefined;\n\n  const baseIndex = timelines.slice(0, timelineIndex).reduce((accValue, timeline) => {\n    const evs = timeline.getEvents();\n    return (evs ? evs.length : 0) + accValue;\n  }, 0);\n\n  return baseIndex + eventIndex;\n};\n\nexport const getInitialTimeline = (room: Room) => {\n  const linkedTimelines = getLinkedTimelines(getLiveTimeline(room));\n  const evLength = getTimelinesEventsCount(linkedTimelines);\n  return {\n    linkedTimelines,\n    range: {\n      start: Math.max(evLength - PAGINATION_LIMIT, 0),\n      end: evLength,\n    },\n  };\n};\n\nexport const getEmptyTimeline = () => ({\n  range: { start: 0, end: 0 },\n  linkedTimelines: [],\n});\n\nexport const getRoomUnreadInfo = (room: Room, scrollTo = false) => {\n  if (!roomHaveNotification(room) && !roomHaveUnread(room.client, room)) return undefined;\n\n  const readUptoEventId = room.getEventReadUpTo(room.client.getUserId() ?? '');\n  if (!readUptoEventId) return undefined;\n\n  const evtTimeline = getEventTimeline(room, readUptoEventId);\n\n  if (!evtTimeline) {\n    return {\n      readUptoEventId,\n      inLiveTimeline: false,\n      scrollTo,\n    };\n  }\n\n  const latestTimeline = getFirstLinkedTimeline(evtTimeline, Direction.Forward);\n  return {\n    readUptoEventId,\n    inLiveTimeline: latestTimeline === room.getLiveTimeline(),\n    scrollTo,\n  };\n};\n","import type { Dispatch, SetStateAction } from 'react';\nimport {\n  startTransition,\n  useState,\n  useMemo,\n  useCallback,\n  useRef,\n  useEffect,\n  useLayoutEffect,\n} from 'react';\nimport to from 'await-to-js';\nimport * as Sentry from '@sentry/react';\nimport type {\n  MatrixClient,\n  Room,\n  MatrixEvent,\n  EventTimeline,\n  EventTimelineSetHandlerMap,\n  IRoomTimelineData,\n  RoomEventHandlerMap,\n} from '$types/matrix-sdk';\nimport {\n  Direction,\n  EventTimelineSet,\n  MatrixEventEvent,\n  RoomEvent,\n  RelationType,\n  ThreadEvent,\n} from '$types/matrix-sdk';\n\nimport { useAlive } from '$hooks/useAlive';\nimport { useMatrixEvent } from '$hooks/useMatrixEvent';\nimport { markAsRead } from '$utils/notifications';\nimport {\n  getInitialTimeline,\n  getLinkedTimelines,\n  getTimelinesEventsCount,\n  getEventIdAbsoluteIndex,\n  getLiveTimeline,\n  getRoomUnreadInfo,\n  isNewestLiveEvent,\n  PAGINATION_LIMIT,\n} from '$utils/timeline';\nimport { isWindowFocused } from '$utils/dom';\nimport { isThreadRelationEvent } from '$utils/room/relations';\n\nconst EVENT_TIMELINE_LOAD_TIMEOUT_MS = 12000;\n\nconst JUMP_CONTEXT_LIMIT = 20;\n\ntype PaginationStatus = 'idle' | 'loading';\n\ntype TimelineState = {\n  linkedTimelines: EventTimeline[];\n};\n\nconst withTimeout = async <T>(promise: Promise<T>, timeoutMs: number): Promise<T> =>\n  new Promise<T>((resolve, reject) => {\n    const timeoutId = globalThis.setTimeout(() => {\n      reject(new Error('Timed out loading event timeline'));\n    }, timeoutMs);\n\n    promise\n      .then((value) => {\n        globalThis.clearTimeout(timeoutId);\n        resolve(value);\n      })\n      .catch((error) => {\n        globalThis.clearTimeout(timeoutId);\n        reject(error);\n      });\n  });\n\nconst useEventTimelineLoader = (\n  mx: MatrixClient,\n  onLoad: (eventId: string, requestId: number, linkedTimelines: EventTimeline[]) => void,\n  onError: (eventId: string, requestId: number, err: Error | null) => void\n) =>\n  useCallback(\n    async (eventId: string, requestId: number, timelineSet: EventTimelineSet) =>\n      Sentry.startSpan({ name: 'timeline.jump_load', op: 'matrix.timeline' }, async () => {\n        try {\n          const jumpLoadStart = performance.now();\n\n          const [err, replyEvtTimeline] = await to(\n            withTimeout(\n              (async () => {\n                const loadedTimeline = await mx.getEventTimeline(timelineSet, eventId);\n                if (!loadedTimeline || loadedTimeline.getTimelineSet() !== timelineSet) {\n                  return loadedTimeline;\n                }\n\n                const [[backwardError], [forwardError]] = await Promise.all([\n                  to(\n                    mx.paginateEventTimeline(loadedTimeline, {\n                      backwards: true,\n                      limit: JUMP_CONTEXT_LIMIT,\n                    })\n                  ),\n                  to(\n                    mx.paginateEventTimeline(loadedTimeline, {\n                      backwards: false,\n                      limit: JUMP_CONTEXT_LIMIT,\n                    })\n                  ),\n                ]);\n                if (backwardError) throw backwardError;\n                if (forwardError) throw forwardError;\n                return loadedTimeline;\n              })(),\n              EVENT_TIMELINE_LOAD_TIMEOUT_MS\n            )\n          );\n          if (!replyEvtTimeline) {\n            onError(eventId, requestId, err ?? null);\n            return;\n          }\n          if (replyEvtTimeline.getTimelineSet() !== timelineSet) {\n            onError(eventId, requestId, null);\n            return;\n          }\n          const linkedTimelines = getLinkedTimelines(replyEvtTimeline);\n\n          if (getEventIdAbsoluteIndex(linkedTimelines, replyEvtTimeline, eventId) === undefined) {\n            onError(eventId, requestId, err ?? null);\n            return;\n          }\n\n          Sentry.metrics.distribution(\n            'sable.timeline.jump_load_ms',\n            performance.now() - jumpLoadStart\n          );\n          onLoad(eventId, requestId, linkedTimelines);\n        } catch (err) {\n          onError(eventId, requestId, err instanceof Error ? err : null);\n        }\n      }),\n    [mx, onLoad, onError]\n  );\n\nconst MAX_AUTO_CONTINUATIONS = 3;\n\nexport const countVisibleAmongNewest = (\n  linkedTimelines: EventTimeline[],\n  count: number,\n  backwards: boolean,\n  isEventVisible: (mEvent: MatrixEvent, timelineSet: EventTimelineSet) => boolean\n): number => {\n  let remaining = count;\n  let visible = 0;\n\n  if (backwards) {\n    for (const timeline of linkedTimelines) {\n      const events = timeline.getEvents() ?? [];\n      const timelineSet = timeline.getTimelineSet();\n      for (let i = 0; i < events.length && remaining > 0; i += 1) {\n        const mEvent = events[i];\n        remaining -= 1;\n        if (mEvent && isEventVisible(mEvent, timelineSet)) visible += 1;\n      }\n      if (remaining === 0) break;\n    }\n    return visible;\n  }\n\n  for (let t = linkedTimelines.length - 1; t >= 0 && remaining > 0; t -= 1) {\n    const timeline = linkedTimelines[t];\n    const events = timeline?.getEvents() ?? [];\n    const timelineSet = timeline?.getTimelineSet();\n    for (let i = events.length - 1; i >= 0 && remaining > 0; i -= 1) {\n      const mEvent = events[i];\n      remaining -= 1;\n      if (mEvent && timelineSet && isEventVisible(mEvent, timelineSet)) visible += 1;\n    }\n  }\n  return visible;\n};\n\nconst isFocusedWindowTimeline = (room: Room, timeline: EventTimeline): boolean =>\n  timeline.getTimelineSet() !== room.getUnfilteredTimelineSet();\n\nconst useTimelinePagination = (\n  mx: MatrixClient,\n  room: Room,\n  timeline: TimelineState,\n  setTimeline: Dispatch<SetStateAction<TimelineState>>,\n  limit: number,\n  isEventVisible?: (mEvent: MatrixEvent, timelineSet: EventTimelineSet) => boolean,\n  onFocusedForwardExhausted?: () => void\n) => {\n  const timelineRef = useRef(timeline);\n  timelineRef.current = timeline;\n  const alive = useAlive();\n  const [backwardStatus, setBackwardStatus] = useState<PaginationStatus>('idle');\n  const [forwardStatus, setForwardStatus] = useState<PaginationStatus>('idle');\n  // Kept apart from the status so a failure surfaces without latching the gate: both\n  // retry paths only fire from 'idle', so folding failure into the status strands the\n  // timeline behind Retry for the rest of the room visit.\n  const [backwardError, setBackwardError] = useState(false);\n  const [forwardError, setForwardError] = useState(false);\n\n  const fetchingRef = useRef({ backward: false, forward: false });\n  const paginate = useMemo(() => {\n    const recalibratePagination = (linkedTimelines: EventTimeline[]) => {\n      const topTimeline = linkedTimelines[0];\n      if (!topTimeline) return;\n      const newLTimelines = getLinkedTimelines(topTimeline);\n      startTransition(() => setTimeline(() => ({ linkedTimelines: newLTimelines })));\n    };\n\n    const edgeTimeline = (lTimelines: EventTimeline[], backwards: boolean) =>\n      backwards ? lTimelines[0] : lTimelines.at(-1);\n\n    return async (backwards: boolean, autoContinue = false) => {\n      const directionKey = backwards ? 'backward' : 'forward';\n      if (fetchingRef.current[directionKey]) return;\n\n      const direction = backwards ? Direction.Backward : Direction.Forward;\n      const initialTimelines = timelineRef.current.linkedTimelines;\n      const initialTimeline = edgeTimeline(initialTimelines, backwards);\n      if (!initialTimeline) return;\n\n      if (\n        !initialTimeline.getPaginationToken(direction) &&\n        getTimelinesEventsCount(initialTimelines) !==\n          getTimelinesEventsCount(getLinkedTimelines(initialTimeline))\n      ) {\n        recalibratePagination(initialTimelines);\n        return;\n      }\n\n      fetchingRef.current[directionKey] = true;\n      const setStatus = backwards ? setBackwardStatus : setForwardStatus;\n      const setFailed = backwards ? setBackwardError : setForwardError;\n      if (alive()) {\n        setStatus('loading');\n        setFailed(false);\n      }\n\n      let failed = false;\n\n      try {\n        const maxAttempts = autoContinue ? MAX_AUTO_CONTINUATIONS : 0;\n        for (let attempt = 0; attempt <= maxAttempts; attempt += 1) {\n          const lTimelines = timelineRef.current.linkedTimelines;\n          const timelineToPaginate = edgeTimeline(lTimelines, backwards);\n          if (!timelineToPaginate) return;\n          if (typeof timelineToPaginate.getPaginationToken(direction) !== 'string') return;\n\n          const countBefore = getTimelinesEventsCount(lTimelines);\n\n          const [err, hasMore] = await to(\n            mx.paginateEventTimeline(timelineToPaginate, { backwards, limit })\n          );\n\n          if (err) {\n            failed = true;\n            return;\n          }\n          if (!alive()) return;\n\n          if (!backwards && !hasMore && isFocusedWindowTimeline(room, timelineToPaginate)) {\n            onFocusedForwardExhausted?.();\n            return;\n          }\n\n          const freshLTimelines = timelineRef.current.linkedTimelines;\n          const firstTimeline = freshLTimelines[0];\n          if (!firstTimeline) return;\n          recalibratePagination(freshLTimelines);\n\n          const rebuiltTimelines = getLinkedTimelines(firstTimeline);\n          const fetched = getTimelinesEventsCount(rebuiltTimelines) - countBefore;\n          if (fetched <= 0) return;\n\n          const visibleFetched = isEventVisible\n            ? countVisibleAmongNewest(rebuiltTimelines, fetched, backwards, isEventVisible)\n            : fetched;\n          if (visibleFetched >= 5) return;\n        }\n      } finally {\n        fetchingRef.current[directionKey] = false;\n        if (alive()) {\n          setStatus('idle');\n          if (failed) setFailed(true);\n        }\n      }\n    };\n  }, [\n    mx,\n    room,\n    alive,\n    setTimeline,\n    limit,\n    setBackwardStatus,\n    setForwardStatus,\n    isEventVisible,\n    onFocusedForwardExhausted,\n  ]);\n\n  return { paginate, backwardStatus, forwardStatus, backwardError, forwardError };\n};\n\nconst useLiveEventArrive = (\n  room: Room,\n  onArrive: (\n    mEvent: MatrixEvent,\n    isLive: boolean,\n    timeline?: EventTimeline,\n    prepended?: boolean\n  ) => void\n) => {\n  const onArriveRef = useRef(onArrive);\n  onArriveRef.current = onArrive;\n\n  useEffect(() => {\n    const handleTimelineEvent: EventTimelineSetHandlerMap[RoomEvent.Timeline] = (\n      mEvent: MatrixEvent,\n      eventRoom: Room | undefined,\n      toStartOfTimeline: boolean | undefined,\n      removed: boolean,\n      data: IRoomTimelineData\n    ) => {\n      if (eventRoom?.roomId !== room.roomId) return;\n\n      if (data.timeline?.getTimelineSet() !== room.getUnfilteredTimelineSet()) return;\n\n      onArriveRef.current(\n        mEvent,\n        data.liveEvent === true && !toStartOfTimeline && !removed,\n        data.timeline,\n        toStartOfTimeline === true && !removed\n      );\n    };\n    const handleRedaction: RoomEventHandlerMap[RoomEvent.Redaction] = (\n      mEvent: MatrixEvent,\n      eventRoom: Room | undefined\n    ) => {\n      if (eventRoom?.roomId !== room.roomId) return;\n      onArriveRef.current(mEvent, false);\n    };\n\n    room.on(RoomEvent.Timeline, handleTimelineEvent);\n    room.on(RoomEvent.Redaction, handleRedaction);\n    return () => {\n      room.removeListener(RoomEvent.Timeline, handleTimelineEvent);\n      room.removeListener(RoomEvent.Redaction, handleRedaction);\n    };\n  }, [room]);\n};\n\nconst useRelationUpdate = (room: Room, onRelation: () => void) => {\n  const onRelationRef = useRef(onRelation);\n  onRelationRef.current = onRelation;\n\n  const handleTimelineEvent = useCallback(\n    (\n      mEvent: MatrixEvent,\n      eventRoom: Room | undefined,\n      _toStartOfTimeline: boolean | undefined,\n      _removed: boolean,\n      data: IRoomTimelineData\n    ) => {\n      if (eventRoom?.roomId !== room.roomId || data.liveEvent) return;\n      if (mEvent.getRelation()?.rel_type === RelationType.Replace) {\n        onRelationRef.current();\n      }\n    },\n    [room]\n  );\n\n  useMatrixEvent(room, RoomEvent.Timeline, handleTimelineEvent);\n};\n\nconst useLiveTimelineRefresh = (room: Room, onRefresh: () => void) => {\n  const onRefreshRef = useRef(onRefresh);\n  onRefreshRef.current = onRefresh;\n\n  useEffect(() => {\n    const handleTimelineRefresh: RoomEventHandlerMap[RoomEvent.TimelineRefresh] = (r: Room) => {\n      if (r.roomId !== room.roomId) return;\n      onRefreshRef.current();\n    };\n    const handleTimelineReset: EventTimelineSetHandlerMap[RoomEvent.TimelineReset] = () => {\n      onRefreshRef.current();\n    };\n    const unfilteredTimelineSet = room.getUnfilteredTimelineSet();\n\n    room.on(RoomEvent.TimelineRefresh, handleTimelineRefresh);\n    unfilteredTimelineSet.on(RoomEvent.TimelineReset, handleTimelineReset);\n    return () => {\n      room.removeListener(RoomEvent.TimelineRefresh, handleTimelineRefresh);\n      unfilteredTimelineSet.removeListener(RoomEvent.TimelineReset, handleTimelineReset);\n    };\n  }, [room]);\n};\n\nconst useThreadUpdate = (room: Room, onUpdate: () => void) => {\n  const onUpdateRef = useRef(onUpdate);\n  onUpdateRef.current = onUpdate;\n\n  useEffect(() => {\n    const handler = () => onUpdateRef.current();\n    room.on(ThreadEvent.New, handler);\n    room.on(ThreadEvent.Update, handler);\n    room.on(ThreadEvent.NewReply, handler);\n    return () => {\n      room.removeListener(ThreadEvent.New, handler);\n      room.removeListener(ThreadEvent.Update, handler);\n      room.removeListener(ThreadEvent.NewReply, handler);\n    };\n  }, [room]);\n};\n\nexport interface UseTimelineSyncOptions {\n  room: Room;\n  mx: MatrixClient;\n  eventId?: string;\n  isAtBottom: boolean;\n  isAtBottomRef: React.MutableRefObject<boolean>;\n  scrollToBottom: (behavior?: 'instant' | 'smooth') => void;\n  unreadInfo: ReturnType<typeof getRoomUnreadInfo>;\n  setUnreadInfo: Dispatch<SetStateAction<ReturnType<typeof getRoomUnreadInfo>>>;\n  hideReadsRef: React.MutableRefObject<boolean>;\n  readUptoEventIdRef: React.MutableRefObject<string | undefined>;\n  isInactivePanelRef: React.MutableRefObject<boolean>;\n  isEventVisible?: (mEvent: MatrixEvent, timelineSet: EventTimelineSet) => boolean;\n  onJumpError?: () => void;\n  onReturnToLive?: () => void;\n}\n\nexport type TimelineFocusItem = {\n  eventId: string;\n  scrollTo: boolean;\n  highlight: boolean;\n};\n\nexport function useTimelineSync({\n  room,\n  mx,\n  eventId,\n  isAtBottom,\n  isAtBottomRef,\n  scrollToBottom,\n  unreadInfo,\n  setUnreadInfo,\n  hideReadsRef,\n  readUptoEventIdRef,\n  isInactivePanelRef,\n  isEventVisible,\n  onJumpError,\n  onReturnToLive,\n}: UseTimelineSyncOptions) {\n  const alive = useAlive();\n\n  const [liveTimeline, setLiveTimeline] = useState<TimelineState>(() => ({\n    linkedTimelines: getInitialTimeline(room).linkedTimelines,\n  }));\n  const [focusedTimeline, setFocusedTimeline] = useState<TimelineState>();\n  const timeline = focusedTimeline ?? liveTimeline;\n\n  const [focusItem, setFocusItem] = useState<TimelineFocusItem>();\n  const [jumpFailedFor, setJumpFailedFor] = useState<string | undefined>();\n  const jumpFailed = jumpFailedFor !== undefined && jumpFailedFor === eventId;\n\n  const resetAutoScrollPendingRef = useRef(false);\n  const pendingAutoScrollBehaviorRef = useRef<'instant' | 'smooth' | undefined>(undefined);\n\n  const eventsLength = getTimelinesEventsCount(timeline.linkedTimelines);\n  const liveTimelineLinked = focusedTimeline === undefined;\n\n  const canPaginateBack =\n    typeof timeline.linkedTimelines[0]?.getPaginationToken(Direction.Backward) === 'string';\n\n  const canPaginateForward =\n    typeof timeline.linkedTimelines.at(-1)?.getPaginationToken(Direction.Forward) === 'string';\n\n  const atLiveEndRef = useRef(liveTimelineLinked);\n  atLiveEndRef.current = liveTimelineLinked;\n\n  const focusedTimelineRef = useRef(focusedTimeline);\n  const linkedTimelinesRef = useRef(timeline.linkedTimelines);\n  const readChain = (linkedTimelines: EventTimeline[]) => {\n    linkedTimelinesRef.current = linkedTimelines;\n  };\n  readChain(timeline.linkedTimelines);\n\n  const applyLiveTimeline = useCallback(\n    (linkedTimelines: EventTimeline[]) => {\n      setLiveTimeline({ linkedTimelines });\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [room]\n  );\n  const applyFocusedTimeline = useCallback(\n    (linkedTimelines: EventTimeline[]) => {\n      focusedTimelineRef.current = { linkedTimelines };\n      readChain(linkedTimelines);\n      setFocusedTimeline({ linkedTimelines });\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [room]\n  );\n  const setActiveTimeline = useCallback<Dispatch<SetStateAction<TimelineState>>>((action) => {\n    if (focusedTimelineRef.current) {\n      setFocusedTimeline((current) =>\n        current ? (typeof action === 'function' ? action(current) : action) : current\n      );\n      return;\n    }\n    setLiveTimeline(action);\n  }, []);\n\n  const jumpRequestIdRef = useRef(0);\n  const inFlightJumpRef = useRef<{ eventId: string; requestId: number } | undefined>(undefined);\n  const isStaleJumpOutcome = useCallback(\n    (requestId: number): boolean => {\n      if (alive() && requestId === jumpRequestIdRef.current) return false;\n      if (inFlightJumpRef.current?.requestId === requestId) inFlightJumpRef.current = undefined;\n      return true;\n    },\n    [alive]\n  );\n  const cancelEventTimelineLoad = useCallback(() => {\n    jumpRequestIdRef.current += 1;\n    inFlightJumpRef.current = undefined;\n  }, []);\n  useLayoutEffect(() => {\n    return () => {\n      jumpRequestIdRef.current += 1;\n      inFlightJumpRef.current = undefined;\n    };\n  }, [room, eventId]);\n\n  const loadEventTimelineRequest = useEventTimelineLoader(\n    mx,\n    useCallback(\n      (evtId, requestId, lTimelines) => {\n        if (isStaleJumpOutcome(requestId)) return;\n        inFlightJumpRef.current = undefined;\n\n        setJumpFailedFor(undefined);\n        applyFocusedTimeline(lTimelines);\n\n        setFocusItem({\n          eventId: evtId,\n          scrollTo: true,\n          highlight: evtId !== readUptoEventIdRef.current,\n        });\n      },\n      [applyFocusedTimeline, isStaleJumpOutcome, readUptoEventIdRef]\n    ),\n    useCallback(\n      (evtId: string, requestId: number) => {\n        if (isStaleJumpOutcome(requestId)) return;\n        inFlightJumpRef.current = undefined;\n        focusedTimelineRef.current = undefined;\n        setFocusedTimeline(undefined);\n        applyLiveTimeline(getInitialTimeline(room).linkedTimelines);\n        setJumpFailedFor(evtId);\n        scrollToBottom('instant');\n        onJumpError?.();\n      },\n      [applyLiveTimeline, isStaleJumpOutcome, onJumpError, room, scrollToBottom]\n    )\n  );\n  const loadEventTimeline = useCallback(\n    (evtId: string) => {\n      jumpRequestIdRef.current += 1;\n      inFlightJumpRef.current = { eventId: evtId, requestId: jumpRequestIdRef.current };\n\n      if (isNewestLiveEvent(room, evtId)) {\n        const liveLinkedTimelines = getInitialTimeline(room).linkedTimelines;\n        inFlightJumpRef.current = undefined;\n        setJumpFailedFor(undefined);\n        applyLiveTimeline(liveLinkedTimelines);\n        focusedTimelineRef.current = undefined;\n        setFocusedTimeline(undefined);\n        setFocusItem({ eventId: evtId, scrollTo: true, highlight: false });\n        return Promise.resolve();\n      }\n\n      const focusedTimelineSet = new EventTimelineSet(\n        room,\n        { timelineSupport: true, pendingEvents: false },\n        mx\n      );\n      return loadEventTimelineRequest(evtId, jumpRequestIdRef.current, focusedTimelineSet);\n    },\n    [applyLiveTimeline, loadEventTimelineRequest, mx, room]\n  );\n\n  const focusLiveTimeline = useCallback(() => {\n    cancelEventTimelineLoad();\n    focusedTimelineRef.current = undefined;\n    setFocusedTimeline(undefined);\n    setFocusItem(undefined);\n    setJumpFailedFor(undefined);\n    applyLiveTimeline(getInitialTimeline(room).linkedTimelines);\n  }, [applyLiveTimeline, cancelEventTimelineLoad, room]);\n\n  const {\n    paginate: handleTimelinePagination,\n    backwardStatus,\n    forwardStatus,\n    backwardError,\n    forwardError,\n  } = useTimelinePagination(\n    mx,\n    room,\n    timeline,\n    setActiveTimeline,\n    PAGINATION_LIMIT,\n    isEventVisible,\n    focusLiveTimeline\n  );\n\n  const lastScrolledAtEventsLengthRef = useRef(eventsLength);\n\n  const eventsLengthRef = useRef(eventsLength);\n  eventsLengthRef.current = eventsLength;\n\n  const redactInFocusedWindow = useCallback(\n    (redactionEvent: MatrixEvent) => {\n      const targetId = redactionEvent.event.redacts;\n      const timelineSet = linkedTimelinesRef.current[0]?.getTimelineSet();\n      if (!targetId || !timelineSet || timelineSet === room.getUnfilteredTimelineSet()) return;\n      const target = timelineSet.findEventById(targetId);\n      if (!target || target.isRedacted()) return;\n      target.makeRedacted(redactionEvent, room);\n    },\n    [room]\n  );\n\n  useLiveEventArrive(\n    room,\n    useCallback(\n      (mEvt: MatrixEvent, isLive: boolean, evtTimeline?: EventTimeline) => {\n        if (mEvt.isRedaction()) redactInFocusedWindow(mEvt);\n\n        const isDisplayedTimeline =\n          evtTimeline === undefined || linkedTimelinesRef.current.includes(evtTimeline);\n        if (isDisplayedTimeline) {\n          setActiveTimeline((ct) => ({ ...ct }));\n        }\n\n        if (!isLive) return;\n\n        const { threadRootId } = mEvt;\n        if (threadRootId !== undefined && isThreadRelationEvent(mEvt, threadRootId)) return;\n\n        if (\n          mEvt.getSender() === mx.getUserId() &&\n          mEvt.isSending() &&\n          !mEvt.isRelation() &&\n          !mEvt.isRedaction() &&\n          (!isAtBottomRef.current || !atLiveEndRef.current)\n        ) {\n          resetAutoScrollPendingRef.current = true;\n          pendingAutoScrollBehaviorRef.current = 'instant';\n          focusLiveTimeline();\n          onReturnToLive?.();\n          return;\n        }\n\n        if (isAtBottomRef.current && atLiveEndRef.current) {\n          if (\n            isWindowFocused() &&\n            !isInactivePanelRef.current &&\n            (!unreadInfo?.readUptoEventId || mEvt.getSender() === mx.getUserId())\n          ) {\n            requestAnimationFrame(() => markAsRead(mx, mEvt.getRoomId()!, hideReadsRef.current));\n          }\n\n          if (!isWindowFocused() && !unreadInfo) {\n            setUnreadInfo(getRoomUnreadInfo(room));\n          }\n\n          pendingAutoScrollBehaviorRef.current =\n            mEvt.getSender() === mx.getUserId() || !isWindowFocused() ? 'instant' : 'smooth';\n\n          return;\n        }\n\n        if (!unreadInfo) {\n          setUnreadInfo(getRoomUnreadInfo(room));\n        }\n      },\n      [\n        mx,\n        room,\n        isAtBottomRef,\n        unreadInfo,\n        setUnreadInfo,\n        hideReadsRef,\n        isInactivePanelRef,\n        setActiveTimeline,\n        focusLiveTimeline,\n        redactInFocusedWindow,\n        onReturnToLive,\n      ]\n    )\n  );\n\n  const handleLocalEchoUpdated = useCallback(\n    (_mEvent: MatrixEvent, eventRoom: Room | undefined) => {\n      if (eventRoom?.roomId !== room.roomId) return;\n      setActiveTimeline((ct) => ({ ...ct }));\n    },\n    [room, setActiveTimeline]\n  );\n\n  useMatrixEvent(room, RoomEvent.LocalEchoUpdated, handleLocalEchoUpdated);\n\n  const decryptedFrameRef = useRef<number | undefined>(undefined);\n  const handleDecrypted = useCallback(\n    (mEvent: MatrixEvent) => {\n      if (mEvent.getRoomId() !== room.roomId) return;\n      if (decryptedFrameRef.current !== undefined) return;\n      decryptedFrameRef.current = requestAnimationFrame(() => {\n        decryptedFrameRef.current = undefined;\n        if (!alive()) return;\n        setActiveTimeline((ct) => ({ ...ct }));\n      });\n    },\n    [alive, room, setActiveTimeline]\n  );\n\n  useEffect(\n    () => () => {\n      if (decryptedFrameRef.current !== undefined) {\n        cancelAnimationFrame(decryptedFrameRef.current);\n      }\n    },\n    []\n  );\n\n  useMatrixEvent(mx, MatrixEventEvent.Decrypted, handleDecrypted);\n\n  useLiveTimelineRefresh(\n    room,\n    useCallback(() => {\n      if (focusedTimelineRef.current || inFlightJumpRef.current) return;\n      applyLiveTimeline(getInitialTimeline(room).linkedTimelines);\n      if (eventId) {\n        void loadEventTimeline(eventId);\n        return;\n      }\n      const wasAtBottom = isAtBottomRef.current;\n      resetAutoScrollPendingRef.current = wasAtBottom;\n      if (wasAtBottom) {\n        scrollToBottom('instant');\n      }\n    }, [applyLiveTimeline, eventId, isAtBottomRef, loadEventTimeline, room, scrollToBottom])\n  );\n\n  useRelationUpdate(\n    room,\n    useCallback(() => {\n      setActiveTimeline((ct) => ({ ...ct }));\n    }, [setActiveTimeline])\n  );\n\n  useThreadUpdate(\n    room,\n    useCallback(() => {\n      setActiveTimeline((ct) => ({ ...ct }));\n    }, [setActiveTimeline])\n  );\n\n  useEffect(() => {\n    const resetAutoScrollPending = resetAutoScrollPendingRef.current;\n    if (resetAutoScrollPending) resetAutoScrollPendingRef.current = false;\n\n    const behavior = pendingAutoScrollBehaviorRef.current ?? 'instant';\n    pendingAutoScrollBehaviorRef.current = undefined;\n\n    if (\n      !(isAtBottom || resetAutoScrollPending) ||\n      (!liveTimelineLinked && !resetAutoScrollPending) ||\n      eventsLength === 0\n    ) {\n      lastScrolledAtEventsLengthRef.current = eventsLength;\n      return;\n    }\n\n    if (eventsLength <= lastScrolledAtEventsLengthRef.current && !resetAutoScrollPending) return;\n\n    lastScrolledAtEventsLengthRef.current = eventsLength;\n    scrollToBottom(behavior);\n  }, [isAtBottom, liveTimelineLinked, eventsLength, scrollToBottom]);\n\n  useEffect(() => {\n    if (eventId) return;\n    if (timeline.linkedTimelines.length > 0) return;\n    if (getLiveTimeline(room).getEvents().length === 0) return;\n    applyLiveTimeline(getInitialTimeline(room).linkedTimelines);\n  }, [applyLiveTimeline, eventId, room, timeline.linkedTimelines.length]);\n\n  const prevRoomIdRef = useRef(room.roomId);\n  useEffect(() => {\n    if (prevRoomIdRef.current === room.roomId) return;\n    prevRoomIdRef.current = room.roomId;\n    focusedTimelineRef.current = undefined;\n    setFocusedTimeline(undefined);\n    applyLiveTimeline(getInitialTimeline(room).linkedTimelines);\n  }, [applyLiveTimeline, room]);\n\n  return {\n    timeline,\n    eventsLength,\n    liveTimelineLinked,\n    canPaginateBack,\n    canPaginateForward,\n    backwardStatus,\n    forwardStatus,\n    backwardError,\n    forwardError,\n    handleTimelinePagination,\n    loadEventTimeline,\n    cancelEventTimelineLoad,\n    focusLiveTimeline,\n    focusItem,\n    setFocusItem,\n    jumpFailed,\n  };\n}\n","import type { MouseEventHandler } from 'react';\nimport { useCallback } from 'react';\nimport type { MatrixClient, Room, MatrixEvent } from '$types/matrix-sdk';\nimport type { UserProfile } from '$hooks/useUserProfile';\nimport { EventStatus, RelationType } from '$types/matrix-sdk';\n\nimport { getMxIdLocalPart, toggleReaction } from '$utils/matrix';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { extractReplyDraftBody, resolveReplyDraftTarget } from '$utils/room/relations';\nimport { createMentionElement } from '$components/editor';\nimport type { ProseMirrorEditorController } from '$components/editor/prosemirrorController';\nimport * as prefix from '$unstable/prefixes';\nimport type { Persona } from '$hooks/usePerMessageProfile';\nimport { convertBeeperFormatToOurPerMessageProfile } from '$hooks/usePerMessageProfile';\n\n/**\n * The profile popup reads name, avatar and the identity fields off the room\n * member, so the cached copies would shadow fresher state event data.\n */\nexport const buildCachedProfilePayload = (cachedData: UserProfile | undefined) => {\n  const cleanExtended = cachedData?.extended ? { ...cachedData.extended } : undefined;\n\n  if (cleanExtended) {\n    delete cleanExtended[prefix.MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_SABLE_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_COMMET_UNSTABLE_PROFILE_BIO_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_COMMET_UNSTABLE_PROFILE_STATUS_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_UNSTABLE_PROFILE_TIMEZONE_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_STABLE_PROFILE_TIMEZONE_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_UNSTABLE_PROFILE_BANNER_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_DARK_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_LIGHT_PROPERTY_NAME];\n    delete cleanExtended.avatar_url;\n    delete cleanExtended.displayname;\n    delete cleanExtended[prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_CAT_PROPERTY_NAME];\n    delete cleanExtended[prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_CAT_PROPERTY_NAME];\n  }\n\n  return {\n    pronouns: cachedData?.pronouns,\n    bio: cachedData?.bio,\n    timezone: cachedData?.timezone,\n    extended: cleanExtended,\n  };\n};\n\nexport interface UseTimelineActionsOptions {\n  room: Room;\n  mx: MatrixClient;\n  editor: ProseMirrorEditorController;\n  nicknames: Record<string, string>;\n  getGlobalProfile: (userId: string) => UserProfile | undefined;\n  spaceId?: string;\n  openUserRoomProfile: (\n    roomId: string,\n    spaceId: string | undefined,\n    userId: string,\n    pmp: Persona | undefined,\n    rect: DOMRect,\n    undefinedArg?: undefined,\n    options?: unknown\n  ) => void;\n  activeReplyId?: string;\n  /** Distinguishes a real reply draft from the seeded base-thread draft, which has body ''. */\n  activeReplyBody?: string;\n  setReplyDraft: (draft: unknown) => void;\n  /** Set when these actions drive a thread drawer rather than the room timeline. */\n  threadRootId?: string;\n  openThreadId?: string;\n  setOpenThread: (threadId: string | undefined) => void;\n  handleEdit: (editId?: string) => void;\n  handleOpenEvent: (eventId: string) => void;\n}\n\nexport function useTimelineActions({\n  room,\n  mx,\n  editor,\n  nicknames,\n  getGlobalProfile,\n  spaceId,\n  openUserRoomProfile,\n  activeReplyId,\n  activeReplyBody,\n  setReplyDraft,\n  threadRootId,\n  openThreadId,\n  setOpenThread,\n  handleEdit,\n  handleOpenEvent,\n}: UseTimelineActionsOptions) {\n  const handleOpenReply: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      const targetId = evt.currentTarget.getAttribute('data-event-id');\n      if (!targetId) return;\n      handleOpenEvent(targetId);\n    },\n    [handleOpenEvent]\n  );\n\n  const handleUserClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      const userId = evt.currentTarget.getAttribute('data-user-id');\n      if (!userId) return;\n\n      const messageId = evt.currentTarget.getAttribute('data-parent-message-id');\n      let perMessageProfile;\n      if (messageId) {\n        const pmp = room.findEventById(messageId)?.getContent()[\n          prefix.MATRIX_UNSTABLE_PER_MESSAGE_PROFILE_PROPERTY_NAME\n        ];\n        if (pmp) {\n          perMessageProfile = convertBeeperFormatToOurPerMessageProfile(pmp);\n        }\n      }\n\n      openUserRoomProfile(\n        room.roomId,\n        spaceId,\n        userId,\n        perMessageProfile,\n        evt.currentTarget.getBoundingClientRect(),\n        undefined,\n        buildCachedProfilePayload(getGlobalProfile(userId))\n      );\n    },\n    [room, spaceId, openUserRoomProfile, getGlobalProfile]\n  );\n\n  const handleUsernameClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      const userId = evt.currentTarget.getAttribute('data-user-id');\n      if (!userId) return;\n\n      const name =\n        getMemberDisplayName(room, userId, nicknames) ?? getMxIdLocalPart(userId) ?? userId;\n\n      editor.insertInline(\n        createMentionElement(\n          userId,\n          name.startsWith('@') ? name : `@${name}`,\n          userId === mx.getUserId()\n        )\n      );\n      editor.insertText(' ');\n      editor.focus();\n    },\n    [mx, room, editor, nicknames]\n  );\n\n  const triggerReply = useCallback(\n    (replyId: string, startThread = false) => {\n      const resolved = resolveReplyDraftTarget(room, replyId);\n      if (!resolved) return;\n\n      const { eventId: draftEventId, replyEvt } = resolved;\n\n      // In a thread the seeded base draft already targets the root with an empty\n      // body, so matching on the id alone would make the root unrepliable.\n      if (activeReplyId === draftEventId && activeReplyBody !== '') {\n        setReplyDraft(\n          threadRootId\n            ? {\n                userId: mx.getUserId() ?? '',\n                eventId: threadRootId,\n                body: '',\n                relation: { rel_type: RelationType.Thread, event_id: threadRootId },\n              }\n            : undefined\n        );\n        return;\n      }\n\n      const timelineSet = room.getUnfilteredTimelineSet();\n      const { body, formattedBody } = extractReplyDraftBody(replyEvt, timelineSet);\n\n      const { 'm.relates_to': relation } = startThread\n        ? { 'm.relates_to': { rel_type: RelationType.Thread, event_id: draftEventId } }\n        : replyEvt.getWireContent();\n\n      const senderId = replyEvt.getSender();\n\n      if (senderId) {\n        setReplyDraft({\n          userId: senderId,\n          eventId: draftEventId,\n          body,\n          formattedBody,\n          relation,\n        });\n      }\n    },\n    [room, setReplyDraft, activeReplyId, activeReplyBody, threadRootId, mx]\n  );\n\n  const handleReplyClick = useCallback(\n    (evt: React.MouseEvent<HTMLButtonElement>, startThread = false) => {\n      const replyId = evt.currentTarget.getAttribute('data-event-id');\n      if (!replyId) {\n        setReplyDraft(undefined);\n        return;\n      }\n      if (startThread) {\n        const rootEvent = room.findEventById(replyId);\n        if (rootEvent && !room.getThread(replyId)) {\n          room.createThread(replyId, rootEvent, [], false);\n        }\n        setOpenThread(openThreadId === replyId ? undefined : replyId);\n        return;\n      }\n      triggerReply(replyId, false);\n    },\n    [triggerReply, setReplyDraft, setOpenThread, openThreadId, room]\n  );\n\n  const handleReactionToggle = useCallback(\n    (targetEventId: string, key: string, shortcode?: string) => {\n      // Thread reactions live in the thread's own timeline set; without it the\n      // existing reaction is never found and un-reacting sends a second one.\n      const threadTimelineSet = threadRootId\n        ? room.getThread(threadRootId)?.timelineSet\n        : undefined;\n      toggleReaction(mx, room, targetEventId, key, shortcode, threadTimelineSet);\n    },\n    [mx, room, threadRootId]\n  );\n\n  const handleResend = useCallback(\n    (mEvent: MatrixEvent) => {\n      if (mEvent.getAssociatedStatus() !== EventStatus.NOT_SENT) return;\n      mx.resendEvent(mEvent, room).catch(() => undefined);\n    },\n    [mx, room]\n  );\n\n  const handleDeleteFailedSend = useCallback(\n    (mEvent: MatrixEvent) => {\n      if (mEvent.getAssociatedStatus() !== EventStatus.NOT_SENT) return;\n      mx.cancelPendingEvent(mEvent);\n    },\n    [mx]\n  );\n\n  return {\n    handleOpenReply,\n    handleUserClick,\n    handleUsernameClick,\n    handleReplyClick,\n    handleReactionToggle,\n    handleResend,\n    handleDeleteFailedSend,\n    handleEdit,\n    setOpenThread,\n  };\n}\n","import { useMemo, useRef } from 'react';\nimport type { MatrixEvent, EventStatus, EventTimelineSet, EventTimeline } from '$types/matrix-sdk';\nimport { EventType } from '$types/matrix-sdk';\nimport {\n  isMembershipChanged,\n  isThreadRelationEvent,\n  isEditEvent,\n  isReactionEvent,\n  isRedactableMessageType,\n  shouldShowRedactionTimelineEvent,\n  getRedactionTargetEvent,\n  collectRelationReactionEvents,\n  collectRelationEditEvents,\n  getEditedEvent,\n  getEventReactions,\n} from '$utils/room/relations';\nimport { inSameDay, minuteDifference } from '$utils/time';\nimport type { ResolvedHiddenEventSettings } from '$state/hooks/settings';\nimport { M_POLL_START } from 'matrix-js-sdk';\n\nexport interface UseProcessedTimelineOptions {\n  items: number[];\n  linkedTimelines: EventTimeline[];\n  ignoredUsersSet: Set<string>;\n  hiddenEvents: ResolvedHiddenEventSettings;\n  mxUserId: string | null;\n  readUptoEventId: string | undefined;\n  hideMembershipEvents: boolean;\n  hideNickAvatarEvents: boolean;\n  isReadOnly: boolean;\n  hideMemberInReadOnly: boolean;\n  /**\n   * When true, skip the filter that removes events whose `threadRootId` points\n   * to a different event.  Required when processing a thread's own timeline\n   * where every reply legitimately has `threadRootId` set to the root.\n   */\n  skipThreadFilter?: boolean;\n}\n\nexport interface ProcessedEvent {\n  id: string;\n  itemIndex: number;\n  mEvent: MatrixEvent;\n  isRedacted: boolean;\n  timelineSet: EventTimelineSet;\n  eventSender: string | null;\n  collapsed: boolean;\n  willRenderNewDivider: boolean;\n  willRenderDayDivider: boolean;\n  editId: string | undefined;\n  reactionsKey: string;\n  content: unknown;\n  // MatrixEvent status changes in place, so include it in row memoization.\n  sendStatus: EventStatus | null;\n}\n\n/** Raw timeline indices for skipped events (reactions, edits, …) have no row; walk backward to a visible one. */\nexport function getProcessedRowIndexForRawTimelineIndex(\n  processedEvents: ProcessedEvent[],\n  startRawIndex: number\n): { rowIndex: number; focusRawIndex: number } | undefined {\n  if (startRawIndex < 0) return undefined;\n  let bestRowIndex = -1;\n  let bestRawIndex = -1;\n  for (let rowIndex = 0; rowIndex < processedEvents.length; rowIndex += 1) {\n    const rawIndex = processedEvents[rowIndex]?.itemIndex ?? -1;\n    if (rawIndex >= 0 && rawIndex <= startRawIndex && rawIndex > bestRawIndex) {\n      bestRowIndex = rowIndex;\n      bestRawIndex = rawIndex;\n    }\n  }\n  return bestRowIndex >= 0 ? { rowIndex: bestRowIndex, focusRawIndex: bestRawIndex } : undefined;\n}\n\nconst MESSAGE_EVENT_TYPES = new Set<string>([\n  EventType.RoomMessage,\n  EventType.Sticker,\n  EventType.RoomMessageEncrypted,\n]);\n\nexport const STANDARD_RENDERED_EVENT_TYPES = new Set<string>([\n  EventType.RoomMessage,\n  // getType() reports this until decryption resolves the real type.\n  EventType.RoomMessageEncrypted,\n  EventType.Sticker,\n  M_POLL_START.name,\n  EventType.RoomMember,\n  EventType.RoomName,\n  EventType.RoomTopic,\n  EventType.RoomAvatar,\n  EventType.GroupCallMemberPrefix,\n]);\n\nconst normalizeMessageType = (t: string): string =>\n  t === (EventType.RoomMessageEncrypted as string) ? EventType.RoomMessage : t;\n\nconst isMessageRow = (mEvent: MatrixEvent): boolean =>\n  MESSAGE_EVENT_TYPES.has(mEvent.getType()) && !isEditEvent(mEvent);\n\nconst getPmpId = (ev: MatrixEvent): string | null =>\n  ev.getContent()?.['com.beeper.per_message_profile']?.id ?? null;\n\ntype ProcessedEventDraft = Omit<\n  ProcessedEvent,\n  | 'collapsed'\n  | 'willRenderNewDivider'\n  | 'willRenderDayDivider'\n  | 'editId'\n  | 'reactionsKey'\n  | 'content'\n  | 'sendStatus'\n>;\n\nconst getTimelineTimestamp = (mEvent: MatrixEvent): number =>\n  Number.isFinite(mEvent.localTimestamp) ? mEvent.localTimestamp : mEvent.getTs();\n\ntype TimelineEventEntry = {\n  mEvent: MatrixEvent;\n  timelineSet: EventTimelineSet;\n  isRedacted: boolean;\n  id: string | undefined;\n  ts: number;\n  // Decryption rewrites a MatrixEvent in place, so identity alone does not prove a cached\n  // row still matches it. Undefined for unencrypted events.\n  clearType: string | undefined;\n  clearContent: unknown;\n  sendStatus: EventStatus | null;\n};\n\nconst flattenTimelineEvents = (linkedTimelines: EventTimeline[]): TimelineEventEntry[] => {\n  const entries: TimelineEventEntry[] = [];\n  linkedTimelines.forEach((timeline) => {\n    const timelineSet = timeline.getTimelineSet();\n    timeline.getEvents().forEach((mEvent) => {\n      const encrypted = mEvent.isEncrypted();\n      entries.push({\n        mEvent,\n        timelineSet,\n        isRedacted: mEvent.isRedacted(),\n        id: mEvent.getId(),\n        ts: mEvent.getTs(),\n        clearType: encrypted ? mEvent.getType() : undefined,\n        clearContent: encrypted ? mEvent.getContent() : undefined,\n        sendStatus: mEvent.getAssociatedStatus(),\n      });\n    });\n  });\n  return entries;\n};\n\nconst isCachedEntryCurrent = (\n  cached: TimelineEventEntry,\n  current: TimelineEventEntry | undefined\n): boolean =>\n  cached.mEvent === current?.mEvent &&\n  cached.id === current.id &&\n  cached.ts === current.ts &&\n  cached.isRedacted === current.isRedacted &&\n  cached.clearType === current.clearType &&\n  cached.clearContent === current.clearContent &&\n  cached.sendStatus === current.sendStatus;\n\nconst computeCollapseAndDividers = (\n  drafts: ProcessedEventDraft[],\n  mxUserId: string | null,\n  readUptoEventId: string | undefined,\n  // Row that already carries the divider. Drafts hold only rendered rows, so a\n  // receipt anchored on a filtered event is unresolvable from `drafts` alone.\n  carriedDividerId: string | undefined\n): ProcessedEvent[] => {\n  let prevEvent: MatrixEvent | undefined;\n  let isPrevRendered = false;\n  let newDivider = false;\n  let dayDivider = false;\n  let dividerPlaced = false;\n\n  return drafts.map((draft) => {\n    const { mEvent, eventSender } = draft;\n    const type = mEvent.getType();\n\n    if (!newDivider && !dividerPlaced && readUptoEventId) {\n      const prevId = prevEvent ? prevEvent.getId() : undefined;\n      newDivider = prevId === readUptoEventId || draft.id === carriedDividerId;\n    }\n\n    if (!dayDivider) {\n      dayDivider = prevEvent ? !inSameDay(prevEvent.getTs(), mEvent.getTs()) : false;\n    }\n\n    const isMessageEvent = isMessageRow(mEvent);\n\n    let collapsed = false;\n    if (isPrevRendered && !dayDivider && prevEvent !== undefined) {\n      if (isMessageEvent) {\n        const withinTimeThreshold = minuteDifference(prevEvent.getTs(), mEvent.getTs()) < 2;\n        const senderMatch = prevEvent.getSender() === eventSender;\n        const typeMatch = normalizeMessageType(prevEvent.getType()) === normalizeMessageType(type);\n        const dividerOk = !newDivider || eventSender === mxUserId;\n\n        collapsed =\n          dividerOk &&\n          isMessageRow(prevEvent) &&\n          senderMatch &&\n          typeMatch &&\n          withinTimeThreshold &&\n          getPmpId(prevEvent) === getPmpId(mEvent);\n      } else {\n        collapsed = !isMessageRow(prevEvent);\n      }\n    }\n\n    const willRenderNewDivider = newDivider && eventSender !== mxUserId;\n    const willRenderDayDivider = dayDivider;\n\n    prevEvent = mEvent;\n    isPrevRendered = true;\n    if (willRenderNewDivider) {\n      newDivider = false;\n      dividerPlaced = true;\n    }\n    if (willRenderDayDivider) dayDivider = false;\n\n    const editId = getEditedEvent(draft.id, mEvent, draft.timelineSet)?.getId();\n    const reactions = getEventReactions(draft.timelineSet, draft.id)?.getSortedAnnotationsByKey();\n    const reactionsKey = reactions ? reactions.map((r) => `${r[0]}:${r[1].size}`).join(',') : '';\n    const content = mEvent.getContent();\n\n    return {\n      ...draft,\n      collapsed,\n      willRenderNewDivider,\n      willRenderDayDivider,\n      editId,\n      reactionsKey,\n      content,\n      sendStatus: mEvent.getAssociatedStatus(),\n    };\n  });\n};\n\nconst mergeDraftsAndExtras = (\n  result: ProcessedEvent[],\n  extras: {\n    mEvent: MatrixEvent;\n    timelineSet: EventTimelineSet;\n    parentId: string;\n    itemIndex?: number;\n  }[]\n): ProcessedEventDraft[] => {\n  const resultDrafts = result.map(\n    ({ collapsed: _c, willRenderNewDivider: _n, willRenderDayDivider: _d, ...draft }) => draft\n  );\n\n  const extraDrafts = extras.map(({ mEvent, timelineSet, parentId, itemIndex = -1 }) => ({\n    draft: {\n      id: mEvent.getId()!,\n      itemIndex,\n      mEvent,\n      isRedacted: mEvent.isRedacted(),\n      timelineSet,\n      eventSender: mEvent.getSender() ?? null,\n    },\n    parentId,\n    timelineTs: getTimelineTimestamp(mEvent),\n  }));\n  const indexedExtraDrafts = extraDrafts.filter((extra) => extra.draft.itemIndex >= 0);\n  const fetchedExtraDrafts = extraDrafts\n    .filter((extra) => extra.draft.itemIndex < 0)\n    .toSorted((a, b) => a.timelineTs - b.timelineTs);\n\n  const buckets: ProcessedEventDraft[][] = Array.from(\n    { length: resultDrafts.length + 1 },\n    () => []\n  );\n  let timelineOrderIndex: { itemIndex: number; bucket: number }[] | undefined;\n\n  const bucketByTimelineOrder = (itemIndex: number): number => {\n    if (itemIndex < 0) return resultDrafts.length;\n    if (!timelineOrderIndex) {\n      timelineOrderIndex = resultDrafts\n        .flatMap((draft, index) =>\n          draft.itemIndex < 0 ? [] : [{ itemIndex: draft.itemIndex, bucket: index + 1 }]\n        )\n        .toSorted((a, b) => a.itemIndex - b.itemIndex);\n\n      let maxBucket = 0;\n      for (const entry of timelineOrderIndex) {\n        maxBucket = Math.max(maxBucket, entry.bucket);\n        entry.bucket = maxBucket;\n      }\n    }\n\n    let low = 0;\n    let high = timelineOrderIndex.length;\n    while (low < high) {\n      const mid = low + Math.floor((high - low) / 2);\n      if (timelineOrderIndex[mid]!.itemIndex <= itemIndex) low = mid + 1;\n      else high = mid;\n    }\n    return low === 0 ? 0 : timelineOrderIndex[low - 1]!.bucket;\n  };\n\n  for (const extra of indexedExtraDrafts) {\n    buckets[bucketByTimelineOrder(extra.draft.itemIndex)]!.push(extra.draft);\n  }\n\n  const mergedDrafts: ProcessedEventDraft[] = [...buckets[0]!];\n  for (let i = 0; i < resultDrafts.length; i += 1) {\n    mergedDrafts.push(resultDrafts[i]!);\n    mergedDrafts.push(...buckets[i + 1]!);\n  }\n\n  for (const extra of fetchedExtraDrafts) {\n    const parentIdx = mergedDrafts.findIndex((draft) => draft.id === extra.parentId);\n    if (parentIdx < 0) {\n      mergedDrafts.push(extra.draft);\n      continue;\n    }\n\n    let insertionIdx = mergedDrafts.length;\n    for (let i = parentIdx + 1; i < mergedDrafts.length; i += 1) {\n      if (getTimelineTimestamp(mergedDrafts[i]!.mEvent) > extra.timelineTs) {\n        insertionIdx = i;\n        break;\n      }\n    }\n    mergedDrafts.splice(insertionIdx, 0, extra.draft);\n  }\n\n  return mergedDrafts;\n};\n\nconst mergeRelationReactions = (\n  result: ProcessedEvent[],\n  linkedTimelines: EventTimeline[],\n  ignoredUsersSet: Set<string>,\n  hiddenEventReactions: boolean,\n  hiddenEventReactionTombstone: boolean,\n  hideMemberInReadOnly: boolean,\n  isReadOnly: boolean,\n  mxUserId: string | null,\n  readUptoEventId: string | undefined\n): ProcessedEvent[] => {\n  if (hideMemberInReadOnly && isReadOnly) return result;\n\n  const existingIds = new Set(result.map((event) => event.id));\n  const baseDrafts: ProcessedEvent[] = [];\n  const inlineExtras: {\n    mEvent: MatrixEvent;\n    timelineSet: EventTimelineSet;\n    parentId: string;\n    itemIndex: number;\n  }[] = [];\n\n  for (const draft of result) {\n    if (isReactionEvent(draft.mEvent)) {\n      const relation = draft.mEvent.getRelation();\n      const parentId = relation?.event_id;\n      if (parentId) {\n        inlineExtras.push({\n          mEvent: draft.mEvent,\n          timelineSet: draft.timelineSet,\n          parentId,\n          itemIndex: draft.itemIndex,\n        });\n        continue;\n      }\n    }\n    baseDrafts.push(draft);\n  }\n\n  const extras = collectRelationReactionEvents(\n    linkedTimelines,\n    existingIds,\n    ignoredUsersSet,\n    hiddenEventReactions,\n    hiddenEventReactionTombstone\n  );\n\n  const allExtras = [...inlineExtras, ...extras];\n  if (allExtras.length === 0) return baseDrafts;\n\n  const mergedDrafts = mergeDraftsAndExtras(baseDrafts, allExtras);\n\n  return computeCollapseAndDividers(\n    mergedDrafts,\n    mxUserId,\n    readUptoEventId,\n    result.find((event) => event.willRenderNewDivider)?.id\n  );\n};\n\nconst mergeRelationEdits = (\n  result: ProcessedEvent[],\n  linkedTimelines: EventTimeline[],\n  ignoredUsersSet: Set<string>,\n  hiddenEventEdits: boolean,\n  mxUserId: string | null,\n  readUptoEventId: string | undefined\n): ProcessedEvent[] => {\n  const existingIds = new Set(result.map((event) => event.id));\n  const baseDrafts: ProcessedEvent[] = [];\n  const inlineExtras: {\n    mEvent: MatrixEvent;\n    timelineSet: EventTimelineSet;\n    parentId: string;\n    itemIndex: number;\n  }[] = [];\n\n  for (const draft of result) {\n    if (isEditEvent(draft.mEvent)) {\n      const relation = draft.mEvent.getRelation();\n      const parentId = relation?.event_id;\n      if (parentId) {\n        inlineExtras.push({\n          mEvent: draft.mEvent,\n          timelineSet: draft.timelineSet,\n          parentId,\n          itemIndex: draft.itemIndex,\n        });\n        continue;\n      }\n    }\n    baseDrafts.push(draft);\n  }\n\n  const extras = collectRelationEditEvents(\n    linkedTimelines,\n    existingIds,\n    ignoredUsersSet,\n    hiddenEventEdits\n  );\n\n  const allExtras = [...inlineExtras, ...extras];\n  if (allExtras.length === 0) return baseDrafts;\n\n  const mergedDrafts = mergeDraftsAndExtras(baseDrafts, allExtras);\n\n  return computeCollapseAndDividers(\n    mergedDrafts,\n    mxUserId,\n    readUptoEventId,\n    result.find((event) => event.willRenderNewDivider)?.id\n  );\n};\n\ntype TimelineProcessingState = {\n  prevEvent?: MatrixEvent;\n  prevIteratedEventId?: string;\n  seenEventIds: Set<string>;\n  isPrevRendered: boolean;\n  newDivider: boolean;\n  dayDivider: boolean;\n};\n\ntype TimelineProcessingOptions = Omit<\n  UseProcessedTimelineOptions,\n  'items' | 'linkedTimelines' | 'hiddenEvents'\n> &\n  ResolvedHiddenEventSettings;\n\nconst emptyProcessingState = (): TimelineProcessingState => ({\n  seenEventIds: new Set(),\n  isPrevRendered: false,\n  newDivider: false,\n  dayDivider: false,\n});\n\nconst processTimelineItems = (\n  items: number[],\n  timelineEvents: TimelineEventEntry[],\n  options: TimelineProcessingOptions,\n  initialState: TimelineProcessingState = emptyProcessingState()\n): { result: ProcessedEvent[]; state: TimelineProcessingState } => {\n  const {\n    ignoredUsersSet,\n    showHiddenEvents,\n    showTombstoneEvents,\n    hiddenEventEdits,\n    hiddenEventRedactionTimeline,\n    hiddenEventReactions,\n    hiddenEventReactionTombstone,\n    hiddenEventReactionRedactionTimeline,\n    hiddenEventOther,\n    mxUserId,\n    readUptoEventId,\n    hideMembershipEvents,\n    hideNickAvatarEvents,\n    isReadOnly,\n    hideMemberInReadOnly,\n    skipThreadFilter,\n  } = options;\n  const state = { ...initialState, seenEventIds: new Set(initialState.seenEventIds) };\n  const result: ProcessedEvent[] = [];\n\n  for (const item of items) {\n    const entry = timelineEvents[item];\n    if (!entry) continue;\n    const { mEvent, timelineSet, isRedacted } = entry;\n    const { threadRootId } = mEvent;\n    const mEventId = mEvent.getId();\n    if (!mEventId) continue;\n    if (state.seenEventIds.has(mEventId)) continue;\n    state.seenEventIds.add(mEventId);\n\n    if (!state.newDivider && readUptoEventId) {\n      state.newDivider = state.prevIteratedEventId === readUptoEventId;\n    }\n    state.prevIteratedEventId = mEventId;\n\n    const eventSender = mEvent.getSender() ?? null;\n    if (eventSender && ignoredUsersSet.has(eventSender)) continue;\n\n    const type = mEvent.getType();\n    const isEdit = isEditEvent(mEvent);\n    const isReaction = isReactionEvent(mEvent);\n    const isRedactionEvt = mEvent.isRedaction();\n\n    if (hideMemberInReadOnly && isReadOnly) {\n      if (isReaction) continue;\n      if (\n        isRedactionEvt &&\n        getRedactionTargetEvent(timelineSet, mEvent)?.getType() === (EventType.Reaction as string)\n      ) {\n        continue;\n      }\n    }\n\n    if (isRedacted) {\n      const showMessageTombstone = showTombstoneEvents && isRedactableMessageType(type);\n      const showReactionTombstone = hiddenEventReactionTombstone && isReaction;\n      if (!showMessageTombstone && !showReactionTombstone) continue;\n    }\n\n    if (type === 'm.room.member') {\n      const membershipChanged = isMembershipChanged(mEvent);\n      if (hideMemberInReadOnly && isReadOnly) continue;\n      if (membershipChanged && hideMembershipEvents) continue;\n      if (!membershipChanged && hideNickAvatarEvents) continue;\n    }\n\n    const allowSpecificHiddenEvent =\n      (isEdit && hiddenEventEdits) ||\n      (isReaction && !isRedacted && hiddenEventReactions) ||\n      (isReaction && isRedacted && hiddenEventReactionTombstone) ||\n      (isRedactionEvt &&\n        shouldShowRedactionTimelineEvent(\n          mEvent,\n          timelineSet,\n          hiddenEventRedactionTimeline,\n          hiddenEventReactionRedactionTimeline\n        ));\n\n    if (!(showHiddenEvents && hiddenEventOther)) {\n      const isStandardRendered = STANDARD_RENDERED_EVENT_TYPES.has(type);\n      if (!isStandardRendered && !allowSpecificHiddenEvent) {\n        continue;\n      }\n    }\n\n    if (\n      !skipThreadFilter &&\n      threadRootId !== undefined &&\n      threadRootId !== mEventId &&\n      isThreadRelationEvent(mEvent, threadRootId)\n    ) {\n      continue;\n    }\n\n    if (isEdit && !hiddenEventEdits) continue;\n    if (isReaction) {\n      if (isRedacted) {\n        if (!hiddenEventReactionTombstone) continue;\n      } else if (!hiddenEventReactions) {\n        continue;\n      }\n    }\n    if (\n      isRedactionEvt &&\n      !shouldShowRedactionTimelineEvent(\n        mEvent,\n        timelineSet,\n        hiddenEventRedactionTimeline,\n        hiddenEventReactionRedactionTimeline\n      )\n    ) {\n      continue;\n    }\n\n    if (!state.dayDivider) {\n      state.dayDivider = state.prevEvent\n        ? !inSameDay(state.prevEvent.getTs(), mEvent.getTs())\n        : false;\n    }\n\n    const isMessageEvent = isMessageRow(mEvent);\n    let collapsed = false;\n    if (state.isPrevRendered && !state.dayDivider && state.prevEvent !== undefined) {\n      if (isMessageEvent) {\n        const withinTimeThreshold = minuteDifference(state.prevEvent.getTs(), mEvent.getTs()) < 2;\n        const senderMatch = state.prevEvent.getSender() === eventSender;\n        const typeMatch =\n          normalizeMessageType(state.prevEvent.getType()) === normalizeMessageType(type);\n        const dividerOk = !state.newDivider || eventSender === mxUserId;\n        collapsed =\n          dividerOk &&\n          isMessageRow(state.prevEvent) &&\n          senderMatch &&\n          typeMatch &&\n          withinTimeThreshold &&\n          getPmpId(state.prevEvent) === getPmpId(mEvent);\n      } else {\n        collapsed = !isMessageRow(state.prevEvent);\n      }\n    }\n\n    const willRenderNewDivider = state.newDivider && eventSender !== mxUserId;\n    const willRenderDayDivider = state.dayDivider;\n    result.push({\n      id: mEventId,\n      itemIndex: item,\n      mEvent,\n      isRedacted,\n      timelineSet,\n      eventSender,\n      collapsed,\n      willRenderNewDivider,\n      willRenderDayDivider,\n      editId: getEditedEvent(mEventId, mEvent, timelineSet)?.getId(),\n      reactionsKey:\n        getEventReactions(timelineSet, mEventId)\n          ?.getSortedAnnotationsByKey()\n          ?.map((r) => `${r[0]}:${r[1].size}`)\n          .join(',') ?? '',\n      content: mEvent.getContent(),\n      sendStatus: mEvent.getAssociatedStatus(),\n    });\n\n    state.prevEvent = mEvent;\n    state.isPrevRendered = true;\n    if (willRenderNewDivider) state.newDivider = false;\n    if (willRenderDayDivider) state.dayDivider = false;\n  }\n\n  return { result, state };\n};\n\ntype ProcessingCache = {\n  timelineEvents: TimelineEventEntry[];\n  itemsLength: number;\n  optionValues: unknown[];\n  state: TimelineProcessingState;\n  result: ProcessedEvent[];\n};\n\nexport function useProcessedTimeline({\n  items,\n  linkedTimelines,\n  ignoredUsersSet,\n  hiddenEvents,\n  mxUserId,\n  readUptoEventId,\n  hideMembershipEvents,\n  hideNickAvatarEvents,\n  isReadOnly,\n  hideMemberInReadOnly,\n  skipThreadFilter,\n}: UseProcessedTimelineOptions): ProcessedEvent[] {\n  const {\n    showHiddenEvents,\n    showTombstoneEvents,\n    hiddenEventEdits,\n    hiddenEventRedactionTimeline,\n    hiddenEventReactions,\n    hiddenEventReactionTombstone,\n    hiddenEventReactionRedactionTimeline,\n    hiddenEventOther,\n  } = hiddenEvents;\n  const cacheRef = useRef<ProcessingCache | undefined>(undefined);\n\n  return useMemo(() => {\n    const timelineEvents = flattenTimelineEvents(linkedTimelines);\n    const processingOptions: TimelineProcessingOptions = {\n      ignoredUsersSet,\n      showHiddenEvents,\n      showTombstoneEvents,\n      hiddenEventEdits,\n      hiddenEventRedactionTimeline,\n      hiddenEventReactions,\n      hiddenEventReactionTombstone,\n      hiddenEventReactionRedactionTimeline,\n      hiddenEventOther,\n      mxUserId,\n      readUptoEventId,\n      hideMembershipEvents,\n      hideNickAvatarEvents,\n      isReadOnly,\n      hideMemberInReadOnly,\n      skipThreadFilter,\n    };\n    const optionValues = [\n      ignoredUsersSet,\n      showHiddenEvents,\n      showTombstoneEvents,\n      hiddenEventEdits,\n      hiddenEventRedactionTimeline,\n      hiddenEventReactions,\n      hiddenEventReactionTombstone,\n      hiddenEventReactionRedactionTimeline,\n      hiddenEventOther,\n      mxUserId,\n      readUptoEventId,\n      hideMembershipEvents,\n      hideNickAvatarEvents,\n      isReadOnly,\n      hideMemberInReadOnly,\n      skipThreadFilter,\n    ];\n    const previous = cacheRef.current;\n    const appendedEntries = previous\n      ? timelineEvents.slice(previous.itemsLength).map(({ mEvent }) => mEvent)\n      : [];\n    const optionsUnchanged =\n      previous?.optionValues.length === optionValues.length &&\n      previous.optionValues.every((value, index) => Object.is(value, optionValues[index]));\n    const isAppendOnly =\n      previous !== undefined &&\n      optionsUnchanged &&\n      !hiddenEventEdits &&\n      !hiddenEventReactions &&\n      !hiddenEventReactionTombstone &&\n      items.length === timelineEvents.length &&\n      previous.itemsLength === previous.timelineEvents.length &&\n      items.length > previous.itemsLength &&\n      items.every((item, index) => item === index) &&\n      // Cached rows are reused verbatim, so anchoring on the first and last event\n      // alone would accept a run that both inserted and removed within the prefix.\n      previous.timelineEvents.every((entry, index) =>\n        isCachedEntryCurrent(entry, timelineEvents[index])\n      ) &&\n      (appendedEntries.length === 0 ||\n        (previous.timelineEvents.at(-1)?.mEvent.getTs() ?? 0) <=\n          (appendedEntries[0]?.getTs() ?? 0)) &&\n      appendedEntries.every(\n        (mEvent, index) =>\n          !mEvent.getRelation() &&\n          !mEvent.isRedaction() &&\n          !mEvent.isRedacted() &&\n          (index === 0 || (appendedEntries[index - 1]?.getTs() ?? 0) <= mEvent.getTs())\n      );\n\n    if (isAppendOnly) {\n      const appendedItems = items.slice(previous.itemsLength);\n      const appended = processTimelineItems(\n        appendedItems,\n        timelineEvents,\n        processingOptions,\n        previous.state\n      );\n      const result = [...previous.result, ...appended.result];\n      cacheRef.current = {\n        timelineEvents,\n        itemsLength: items.length,\n        optionValues,\n        state: appended.state,\n        result,\n      };\n      return result;\n    }\n\n    const processed = processTimelineItems(items, timelineEvents, processingOptions);\n    const result = mergeRelationEdits(\n      mergeRelationReactions(\n        processed.result,\n        linkedTimelines,\n        ignoredUsersSet,\n        hiddenEventReactions,\n        hiddenEventReactionTombstone,\n        hideMemberInReadOnly,\n        isReadOnly,\n        mxUserId,\n        readUptoEventId\n      ),\n      linkedTimelines,\n      ignoredUsersSet,\n      hiddenEventEdits,\n      mxUserId,\n      readUptoEventId\n    );\n    cacheRef.current = {\n      timelineEvents,\n      itemsLength: items.length,\n      optionValues,\n      state: processed.state,\n      result,\n    };\n    return result;\n  }, [\n    items,\n    linkedTimelines,\n    ignoredUsersSet,\n    showHiddenEvents,\n    showTombstoneEvents,\n    hiddenEventEdits,\n    hiddenEventRedactionTimeline,\n    hiddenEventReactions,\n    hiddenEventReactionTombstone,\n    hiddenEventReactionRedactionTimeline,\n    hiddenEventOther,\n    mxUserId,\n    readUptoEventId,\n    hideMembershipEvents,\n    hideNickAvatarEvents,\n    isReadOnly,\n    hideMemberInReadOnly,\n    skipThreadFilter,\n  ]);\n}\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAtomValue } from 'jotai';\nimport type {\n  IThreadBundledRelationship,\n  MatrixClient,\n  MatrixEvent,\n  Room,\n  PushProcessor,\n  EventTimelineSet,\n} from '$types/matrix-sdk';\nimport type { IImageContent } from '$types/matrix/common';\nimport { NotificationCountType, RoomEvent, ThreadEvent, EventType } from '$types/matrix-sdk';\n\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport type { Opts as LinkifyOpts } from 'linkifyjs';\nimport { Box, Chip, Avatar, Text, config, toRem } from 'folds';\nimport {\n  Code,\n  Hash,\n  menuIcon,\n  PencilSimple,\n  Phone,\n  PhoneDisconnect,\n  PushPin,\n  PushPinSlash,\n  Smiley,\n  timelineIcon,\n  Trash,\n} from '$components/icons/phosphor';\nimport type { ResolvedHiddenEventSettings } from '$state/hooks/settings';\nimport { MessageLayout, type MessageSpacing } from '$state/settings';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport type { useGetMemberPowerTag } from '$hooks/useMemberPowerTag';\nimport type { useMemberEventParser } from '$hooks/useMemberEventParser';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useMatrixEventRenderer } from '$hooks/useMatrixEventRenderer';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport {\n  EventContent,\n  ImageContent,\n  InlineTextDiff,\n  MessageNotDecryptedContent,\n  MSticker,\n  RedactedContent,\n  RedactedReactionContent,\n  Reply,\n  ReactionKeyInline,\n  Time,\n} from '$components/message';\nimport { Image as MediaImage } from '$components/media';\nimport { ImageViewer } from '$components/image-viewer';\nimport { RenderMessageContent } from '$components/RenderMessageContent';\nimport { ClientSideHoverFreeze } from '$components/ClientSideHoverFreeze';\nimport { UserAvatar } from '$components/user-avatar';\nimport type { GetContentCallback } from '$types/matrix/room';\n\nimport { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport {\n  getMemberDisplayName,\n  getTimelineSenderDisplayName,\n  getMemberAvatarMxc,\n} from '$utils/room/display';\nimport {\n  getEditedEvent,\n  getEditChain,\n  getEditDiffBodies,\n  getEditTargetId,\n  getEventReactions,\n  getPreviousEditId,\n  getRedactionTargetEvent,\n  getRedactionTargetId,\n  getReactionKey,\n  getReactionShortcode,\n  getReactionAnnotationTargetId,\n  getRedactionReason,\n  isEditEvent,\n  isMembershipChanged,\n  isThreadRelationEvent,\n  reactionOrEditEvent,\n} from '$utils/room/relations';\nimport { getLinkedTimelines, getLiveTimeline } from '$utils/timeline';\nimport * as customHtmlCss from '$styles/CustomHtml.css';\nimport { UnreadBadge, UnreadBadgeCenter } from '$components/unread-badge';\nimport type { ForwardedMessageProps } from '$features/room/message';\nimport { EncryptedContent, Message, Reactions } from '$features/room/message';\nimport type { TimelineFocusItem } from '$hooks/timeline/useTimelineSync';\n\nimport { useSableCosmetics } from '$hooks/useSableCosmetics';\nimport { useRoomMemberHydration } from '$hooks/useRoomMemberHydration';\nimport { M_POLL_START } from 'matrix-js-sdk';\nimport type { Persona } from '$app/persona';\n\nfunction DecoratedUser({ room, userId, userName, pmp }: DecoratedUserProps) {\n  const { color, font } = useSableCosmetics(userId, room ?? ({} as Room));\n\n  const openUserRoomProfile = useOpenUserRoomProfile();\n  const handleUserClick: MouseEventHandler = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      openUserRoomProfile(\n        room.roomId,\n        undefined,\n        userId,\n        pmp,\n        evt.currentTarget.getBoundingClientRect()\n      );\n    },\n    [room, userId, openUserRoomProfile, pmp]\n  );\n\n  return (\n    <Text as=\"a\" onClick={handleUserClick} truncate>\n      <b style={{ color, font }}>{userName ?? userId} </b>\n    </Text>\n  );\n}\n\ntype DecoratedUserProps = {\n  room: Room;\n  userId: string;\n  userName?: string;\n  pmp?: Persona;\n};\n\ntype ThreadReplyChipProps = {\n  room: Room;\n  mEventId: string;\n  openThreadId: string | undefined;\n  onToggle: () => void;\n};\n\nfunction ThreadReplyChip({\n  room,\n  mEventId,\n  openThreadId,\n  onToggle,\n}: Readonly<ThreadReplyChipProps>) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const nicknames = useAtomValue(nicknamesAtom);\n  const cachedProfiles = useAtomValue(profilesCacheAtom);\n\n  const [counter, forceUpdate] = useState(0);\n\n  const thread = room.getThread(mEventId);\n\n  useEffect(() => {\n    if (!thread) return () => {};\n    const onUpdate = () => forceUpdate((n) => n + 1);\n    thread.on(ThreadEvent.NewReply, onUpdate);\n    thread.on(ThreadEvent.Update, onUpdate);\n    room.on(RoomEvent.Redaction, onUpdate);\n    return () => {\n      thread.off(ThreadEvent.NewReply, onUpdate);\n      thread.off(ThreadEvent.Update, onUpdate);\n      room.off(RoomEvent.Redaction, onUpdate);\n    };\n  }, [room, thread]);\n\n  const replyEvents = useMemo(() => {\n    // `counter` is a cache-busting key. Touch it so the dependency is explicit.\n    void counter;\n    // With threadSupport:true, reply events live in thread.timelineSet not the main room timeline.\n    // Prefer thread.events when available so avatars and preview text are populated.\n    if (thread) {\n      const fromThread = thread.events.filter(\n        (ev) =>\n          ev.getId() !== mEventId && !reactionOrEditEvent(ev) && isThreadRelationEvent(ev, mEventId)\n      );\n      if (fromThread.length > 0) return fromThread;\n    }\n    const linkedTimelines = getLinkedTimelines(getLiveTimeline(room));\n    return linkedTimelines\n      .flatMap((tl) => tl.getEvents())\n      .filter(\n        (ev) =>\n          ev.getId() !== mEventId && !reactionOrEditEvent(ev) && isThreadRelationEvent(ev, mEventId)\n      );\n  }, [room, mEventId, thread, counter]);\n\n  const latestSenderId = replyEvents.at(-1)?.getSender() ?? '';\n  useRoomMemberHydration(room, latestSenderId);\n\n  if (!thread) return null;\n\n  // Prefer the server-authoritative bundled count. thread.length only reflects\n  // events fetched into the local timeline, which can be much lower than the\n  // true total before the thread drawer is first opened and paginated.\n  const bundledCount =\n    thread.rootEvent?.getServerAggregatedRelation<IThreadBundledRelationship>('m.thread')?.count;\n  const replyCount = bundledCount ?? thread.length ?? 0;\n  if (replyCount === 0) return null;\n\n  const uniqueSenders: string[] = [];\n  const seen = new Set<string>();\n  replyEvents.forEach((ev) => {\n    const s = ev.getSender();\n    if (s && !seen.has(s)) {\n      seen.add(s);\n      uniqueSenders.push(s);\n    }\n  });\n\n  const latestReply = replyEvents.at(-1);\n  let latestBody = '';\n  if (latestReply) {\n    latestBody = (latestReply.getContent()?.body as string | undefined) ?? '';\n  }\n\n  const latestSenderName =\n    getMemberDisplayName(room, latestSenderId, nicknames) ??\n    cachedProfiles[latestSenderId]?.displayName ??\n    getMxIdLocalPart(latestSenderId) ??\n    latestSenderId;\n\n  const isOpen = openThreadId === mEventId;\n\n  const unreadTotal = room.getThreadUnreadNotificationCount(mEventId, NotificationCountType.Total);\n  const unreadHighlight = room.getThreadUnreadNotificationCount(\n    mEventId,\n    NotificationCountType.Highlight\n  );\n\n  return (\n    <Chip\n      size=\"400\"\n      variant={isOpen ? 'Primary' : 'SurfaceVariant'}\n      radii=\"300\"\n      before={\n        uniqueSenders.length > 0 ? (\n          <Box alignItems=\"Center\" style={{ gap: 0 }}>\n            {uniqueSenders.slice(0, 3).map((senderId, index) => {\n              const avatarMxc = getMemberAvatarMxc(room, senderId);\n              const avatarUrl = avatarMxc\n                ? (mxcUrlToHttp(mx, avatarMxc, useAuthentication, 20, 20, 'crop') ?? undefined)\n                : undefined;\n              const displayName =\n                getMemberDisplayName(room, senderId, nicknames) ??\n                getMxIdLocalPart(senderId) ??\n                senderId;\n              return (\n                <Avatar key={senderId} size=\"200\" style={{ marginLeft: index > 0 ? '-4px' : 0 }}>\n                  <UserAvatar\n                    userId={senderId}\n                    src={avatarUrl}\n                    alt={displayName}\n                    renderFallback={() => (\n                      <span\n                        style={{\n                          fontSize: '10px',\n                          fontWeight: 'bold',\n                          lineHeight: 1,\n                        }}\n                      >\n                        {displayName[0]?.toUpperCase() ?? '?'}\n                      </span>\n                    )}\n                  />\n                </Avatar>\n              );\n            })}\n          </Box>\n        ) : undefined\n      }\n      onClick={onToggle}\n      style={{ marginTop: config.space.S200 }}\n    >\n      <Text size=\"T300\" style={{ whiteSpace: 'nowrap' }}>\n        {replyCount}&nbsp;{replyCount === 1 ? 'reply' : 'replies'}\n      </Text>\n      {latestBody && (\n        <Text\n          size=\"T300\"\n          style={{\n            opacity: 0.7,\n            overflow: 'hidden',\n            textOverflow: 'ellipsis',\n            whiteSpace: 'nowrap',\n            maxWidth: toRem(180),\n          }}\n        >\n          &nbsp;·&nbsp;{latestSenderName}:&nbsp;{latestBody.slice(0, 60)}\n        </Text>\n      )}\n      {unreadTotal > 0 && (\n        <UnreadBadgeCenter>\n          <UnreadBadge highlight={unreadHighlight > 0} count={unreadTotal} />\n        </UnreadBadgeCenter>\n      )}\n    </Chip>\n  );\n}\nconst isFocusHighlighted = (focusItem: TimelineFocusItem | undefined, mEventId: string) =>\n  focusItem?.eventId === mEventId && focusItem.highlight;\n\nexport interface TimelineEventRendererOptions {\n  room: Room;\n  mx: MatrixClient;\n  pushProcessor: PushProcessor;\n  nicknames: Record<string, string>;\n  getProfile: (userId: string) => { displayName?: string } | undefined;\n  imagePackRooms: Room[];\n  settings: {\n    messageLayout: MessageLayout;\n    messageSpacing: MessageSpacing;\n    hideReads: boolean;\n    showDeveloperTools: boolean;\n    hour24Clock: boolean;\n    dateFormatString: string;\n    mediaAutoLoad: boolean;\n    showUrlPreview: boolean;\n    showBundledPreview: boolean;\n    showClientUrlPreview: boolean;\n    showMaps?: boolean;\n    autoplayStickers: boolean;\n    hideMemberInReadOnly: boolean;\n    isReadOnly: boolean;\n    hideMembershipEvents: boolean;\n    hideNickAvatarEvents: boolean;\n    hiddenEvents: ResolvedHiddenEventSettings;\n    hideThreadChip?: boolean;\n  };\n  state: {\n    focusItem?: TimelineFocusItem;\n    editId?: string;\n    activeReplyId?: string;\n    openThreadId?: string;\n    suppressMark?: boolean;\n  };\n  permissions: {\n    canRedact: boolean;\n    canDeleteOwn: boolean;\n    canSendReaction: boolean;\n    canPinEvent: boolean;\n  };\n  callbacks: {\n    onUserClick: MouseEventHandler<HTMLButtonElement>;\n    onUsernameClick: MouseEventHandler<HTMLButtonElement>;\n    onReplyClick: (evt: React.MouseEvent<HTMLButtonElement>, startThread?: boolean) => void;\n    onReactionToggle: (targetEventId: string, key: string, shortcode?: string) => void;\n    onEditId: (editId?: string) => void;\n    onResend: (mEvent: MatrixEvent) => void;\n    onDeleteFailedSend: (mEvent: MatrixEvent) => void;\n    setOpenThread: (threadId: string | undefined) => void;\n    handleOpenReply: MouseEventHandler<HTMLButtonElement>;\n    onOpenMedia?: (mEvent: MatrixEvent) => boolean;\n  };\n  utils: {\n    htmlReactParserOptions: HTMLReactParserOptions;\n    linkifyOpts: LinkifyOpts;\n    getMemberPowerTag: ReturnType<typeof useGetMemberPowerTag>;\n    parseMemberEvent: ReturnType<typeof useMemberEventParser>;\n  };\n}\n\nexport function useTimelineEventRenderer({\n  room,\n  mx,\n  pushProcessor,\n  nicknames,\n  getProfile,\n  imagePackRooms,\n  settings: {\n    messageLayout,\n    messageSpacing,\n    hideReads,\n    showDeveloperTools,\n    hour24Clock,\n    dateFormatString,\n    mediaAutoLoad,\n    showBundledPreview,\n    showUrlPreview,\n    showClientUrlPreview,\n    showMaps,\n    autoplayStickers,\n    hideMemberInReadOnly,\n    isReadOnly,\n    hideMembershipEvents,\n    hideNickAvatarEvents,\n    hiddenEvents,\n    hideThreadChip,\n  },\n  state: { focusItem, editId, activeReplyId, openThreadId, suppressMark },\n  permissions: { canRedact, canDeleteOwn, canSendReaction, canPinEvent },\n  callbacks: {\n    onUserClick,\n    onUsernameClick,\n    onReplyClick,\n    onReactionToggle,\n    onEditId,\n    onResend,\n    onDeleteFailedSend,\n    setOpenThread,\n    handleOpenReply,\n    onOpenMedia,\n  },\n  utils: { htmlReactParserOptions, linkifyOpts, getMemberPowerTag, parseMemberEvent },\n}: TimelineEventRendererOptions) {\n  const { t } = useTranslation();\n  const {\n    hiddenEventEdits,\n    hiddenEventRedactionTimeline,\n    hiddenEventReactions,\n    hiddenEventReactionTombstone,\n    hiddenEventReactionRedactionTimeline,\n    hiddenEventOther,\n  } = hiddenEvents;\n  const useAuthentication = useMediaAuthentication();\n\n  const getSenderDisplayName = (userId: string): string =>\n    getTimelineSenderDisplayName(room, userId, nicknames, getProfile(userId)?.displayName);\n\n  function deriveCommonRenderState(\n    mEventId: string,\n    mEvent: MatrixEvent,\n    item: number,\n    timelineSet: EventTimelineSet,\n    markedVariant: 'suppress' | 'plain' = 'suppress'\n  ) {\n    const highlighted = isFocusHighlighted(focusItem, mEventId);\n    const marked =\n      markedVariant === 'plain'\n        ? activeReplyId === mEventId\n        : activeReplyId === mEventId && !suppressMark;\n    const senderId = mEvent.getSender() ?? '';\n    const senderName = getSenderDisplayName(senderId);\n    const timeJSX = (\n      <Time\n        ts={mEvent.getTs()}\n        compact={messageLayout === MessageLayout.Compact}\n        hour24Clock={hour24Clock}\n        dateFormatString={dateFormatString}\n      />\n    );\n    const reactionRelations = getEventReactions(timelineSet, mEventId);\n    const annotations = reactionRelations?.getSortedAnnotationsByKey();\n    const reactions = annotations?.filter((annotation) => annotation[1].size > 0);\n    const hasReactions = reactions && reactions.length > 0;\n\n    return { highlighted, marked, senderId, senderName, timeJSX, reactionRelations, hasReactions };\n  }\n\n  function deriveFallbackCommonRenderState(\n    mEventId: string,\n    mEvent: MatrixEvent,\n    item: number,\n    timelineSet: EventTimelineSet\n  ) {\n    const highlighted = isFocusHighlighted(focusItem, mEventId);\n    const marked = activeReplyId === mEventId && !suppressMark;\n    const senderId = mEvent.getSender() ?? '';\n    const senderName = getSenderDisplayName(senderId);\n    const timeJSX = (\n      <Time\n        ts={mEvent.getTs()}\n        compact={messageLayout === MessageLayout.Compact}\n        hour24Clock={hour24Clock}\n        dateFormatString={dateFormatString}\n      />\n    );\n    const reactionRelations = getEventReactions(timelineSet, mEventId);\n    const reactions = reactionRelations?.getSortedAnnotationsByKey();\n    const hasReactions = reactions && reactions.length > 0;\n\n    return { highlighted, marked, senderId, senderName, timeJSX, reactionRelations, hasReactions };\n  }\n\n  function renderThreadChip(mEventId: string, mEvent: MatrixEvent) {\n    if (hideThreadChip) return null;\n    if (!(room.getThread(mEventId) || mEvent.threadRootId)) return null;\n    return (\n      <ThreadReplyChip\n        room={room}\n        mEventId={mEventId}\n        openThreadId={openThreadId}\n        onToggle={() => setOpenThread(openThreadId === mEventId ? undefined : mEventId)}\n      />\n    );\n  }\n\n  function renderReactionsBar(\n    mEventId: string,\n    reactionRelations: ReturnType<typeof getEventReactions>,\n    hasReactions: boolean | undefined | null,\n    threadChip: React.ReactNode,\n    useReactionsGuard: boolean\n  ) {\n    if (!reactionRelations && !threadChip) return undefined;\n    return (\n      <>\n        {reactionRelations && (useReactionsGuard ? hasReactions : true) && (\n          <Reactions\n            style={{ marginTop: config.space.S200 }}\n            room={room}\n            relations={reactionRelations}\n            mEventId={mEventId}\n            canSendReaction={canSendReaction}\n            canDeleteOwn={canDeleteOwn}\n            imagePackRooms={imagePackRooms}\n            onReactionToggle={onReactionToggle}\n          />\n        )}\n        {threadChip}\n      </>\n    );\n  }\n\n  const renderEditTimelineEvent = (\n    mEventId: string,\n    mEvent: MatrixEvent,\n    item: number,\n    timelineSet: EventTimelineSet,\n    collapse: boolean\n  ) => {\n    if (!hiddenEventEdits) return null;\n\n    const highlighted = isFocusHighlighted(focusItem, mEventId);\n    const marked = activeReplyId === mEventId && suppressMark !== true;\n    const senderId = mEvent.getSender() ?? '';\n    const senderName = getSenderDisplayName(senderId);\n    const editTargetId = getEditTargetId(mEvent);\n    const chain = editTargetId && getEditChain(timelineSet, editTargetId, mEvent.getType(), room);\n    const previousEditId = chain ? getPreviousEditId(mEvent, chain) : undefined;\n    const replyEventId = previousEditId ?? editTargetId;\n    const { oldBody, newBody } = getEditDiffBodies(mEvent, timelineSet, room);\n    const canShowDiff =\n      typeof oldBody === 'string' && typeof newBody === 'string' && oldBody !== newBody;\n\n    const timeJSX = (\n      <Time\n        ts={mEvent.getTs()}\n        compact={messageLayout === MessageLayout.Compact}\n        hour24Clock={hour24Clock}\n        dateFormatString={dateFormatString}\n      />\n    );\n\n    const targetReply =\n      typeof replyEventId === 'string' ? (\n        <Reply\n          style={{ opacity: '80%' }}\n          room={room}\n          timelineSet={timelineSet}\n          replyEventId={replyEventId}\n          previewBodyOverride={oldBody}\n          onClick={handleOpenReply}\n        />\n      ) : null;\n\n    const reactionRelations = getEventReactions(timelineSet, mEventId);\n    const annotations = reactionRelations?.getSortedAnnotationsByKey();\n    const reactions = annotations?.filter((annotation) => annotation[1].size > 0);\n    const hasReactions = reactions && reactions.length > 0;\n\n    return (\n      <Message\n        key={mEventId}\n        data-message-item={item}\n        data-message-id={mEventId}\n        room={room}\n        mEvent={mEvent}\n        messageSpacing={messageSpacing}\n        highlight={highlighted}\n        isMarked={marked}\n        edit={editId === mEventId}\n        canSendReaction={canSendReaction}\n        canPinEvent={canPinEvent}\n        imagePackRooms={imagePackRooms}\n        relations={hasReactions ? reactionRelations : undefined}\n        onUserClick={onUserClick}\n        onUsernameClick={onUsernameClick}\n        onReplyClick={onReplyClick}\n        onReactionToggle={onReactionToggle}\n        senderId={senderId}\n        senderDisplayName={senderName}\n        sendStatus={mEvent.getAssociatedStatus()}\n        collapse={collapse}\n        activeReplyId={activeReplyId}\n        reactions={renderReactionsBar(\n          mEventId,\n          reactionRelations,\n          hasReactions,\n          renderThreadChip(mEventId, mEvent),\n          false\n        )}\n        hideReadReceipts={hideReads}\n        showDeveloperTools={showDeveloperTools}\n        memberPowerTag={getMemberPowerTag(senderId)}\n        hour24Clock={hour24Clock}\n        dateFormatString={dateFormatString}\n      >\n        <EventContent\n          messageLayout={messageLayout}\n          time={timeJSX}\n          icon={timelineIcon(PencilSimple)}\n          content={\n            <Box grow=\"Yes\" direction=\"Column\">\n              {targetReply}\n              <Text size=\"T300\" priority=\"300\">\n                <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                {canShowDiff ? ' edited a message:' : ' edited a message'}\n              </Text>\n              {canShowDiff && <InlineTextDiff oldText={oldBody} newText={newBody} />}\n            </Box>\n          }\n        />\n      </Message>\n    );\n  };\n\n  return useMatrixEventRenderer<[string, MatrixEvent, number, EventTimelineSet, boolean]>(\n    {\n      [EventType.RoomMessage]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        if (isEditEvent(mEvent)) {\n          return renderEditTimelineEvent(mEventId, mEvent, item, timelineSet, collapse);\n        }\n\n        const { replyEventId: rawReplyEventId, threadRootId } = mEvent;\n        const isThreadRel = isThreadRelationEvent(mEvent, threadRootId);\n        const actualThreadRootId = isThreadRel ? threadRootId : undefined;\n        const explicitInReplyTo = mEvent.getWireContent()?.['m.relates_to']?.['m.in_reply_to']\n          ?.event_id as unknown;\n        const threadReplyTargetId =\n          isThreadRel && typeof explicitInReplyTo === 'string' ? explicitInReplyTo : undefined;\n        // In the thread drawer (hideThreadChip=true), suppress reply headers for events\n        // that only have m.in_reply_to as a non-thread-client fallback (is_falling_back: true).\n        const replyEventId =\n          hideThreadChip && mEvent.getWireContent()?.['m.relates_to']?.is_falling_back\n            ? undefined\n            : (threadReplyTargetId ?? rawReplyEventId);\n\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName: senderDisplayName,\n          reactionRelations,\n\n          hasReactions,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n        const pushActions = pushProcessor.actionsForEvent(mEvent);\n        let notifyHighlight: 'silent' | 'loud' | undefined;\n        if (pushActions?.notify && pushActions.tweaks?.highlight) {\n          notifyHighlight = pushActions.tweaks?.sound ? 'loud' : 'silent';\n        }\n\n        const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet);\n        let editedNewContent: unknown;\n        if (editedEvent) {\n          editedNewContent = editedEvent.getContent()['m.new_content'];\n        }\n\n        const baseContent = mEvent.getContent() || {};\n        const safeContent =\n          Object.keys(baseContent).length > 0 ? baseContent : mEvent.getOriginalContent();\n        const isContentEmpty = Object.keys(safeContent).length === 0;\n\n        const getContent = (() => editedNewContent ?? safeContent) as GetContentCallback;\n\n        const forwardContent = safeContent['moe.sable.message.forward'] as\n          | {\n              original_timestamp?: unknown;\n              original_room_id?: string;\n              original_event_id?: string;\n              original_event_private?: boolean;\n            }\n          | undefined;\n\n        const messageForwardedProps: ForwardedMessageProps | undefined = forwardContent\n          ? {\n              isForwarded: true,\n              originalTimestamp:\n                typeof forwardContent.original_timestamp === 'number'\n                  ? forwardContent.original_timestamp\n                  : mEvent.getTs(),\n              originalRoomId: forwardContent.original_room_id ?? room.roomId,\n              originalEventId: forwardContent.original_event_id ?? '',\n              originalEventPrivate: forwardContent.original_event_private ?? false,\n            }\n          : undefined;\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            messageLayout={messageLayout}\n            highlight={highlighted}\n            isMarked={marked}\n            notifyHighlight={notifyHighlight}\n            edit={editId === mEventId}\n            canDelete={canRedact || (canDeleteOwn && senderId === mx.getUserId())}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderDisplayName}\n            messageForwardedProps={messageForwardedProps}\n            sendStatus={mEvent.getAssociatedStatus()}\n            onResend={onResend}\n            onDeleteFailedSend={onDeleteFailedSend}\n            onEditId={onEditId}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reply={\n              replyEventId && (\n                <Reply\n                  room={room}\n                  timelineSet={timelineSet}\n                  replyEventId={replyEventId}\n                  threadRootId={hideThreadChip ? undefined : actualThreadRootId}\n                  mentions={baseContent['m.mentions']}\n                  onClick={handleOpenReply}\n                />\n              )\n            }\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            {mEvent.isRedacted() || isContentEmpty ? (\n              <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n            ) : (\n              <RenderMessageContent\n                displayName={senderDisplayName}\n                msgType={((editedNewContent ?? safeContent) as { msgtype?: string }).msgtype ?? ''}\n                ts={mEvent.getTs()}\n                edited={!!editedEvent}\n                getContent={getContent}\n                mediaAutoLoad={mediaAutoLoad}\n                urlPreview={showUrlPreview}\n                bundledPreview={showBundledPreview}\n                clientUrlPreview={showClientUrlPreview}\n                showMaps={showMaps}\n                htmlReactParserOptions={htmlReactParserOptions}\n                linkifyOpts={linkifyOpts}\n                outlineAttachment={messageLayout === MessageLayout.Bubble}\n                mx={mx}\n                room={room}\n                onOpenMedia={onOpenMedia}\n              />\n            )}\n          </Message>\n        );\n      },\n      [EventType.RoomMessageEncrypted]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        if (isEditEvent(mEvent)) {\n          return renderEditTimelineEvent(mEventId, mEvent, item, timelineSet, collapse);\n        }\n\n        const { replyEventId: rawReplyEventId, threadRootId } = mEvent;\n        const isThreadRel = isThreadRelationEvent(mEvent, threadRootId);\n        const actualThreadRootId = isThreadRel ? threadRootId : undefined;\n        const explicitInReplyTo = mEvent.getWireContent()?.['m.relates_to']?.['m.in_reply_to']\n          ?.event_id as unknown;\n        const threadReplyTargetId =\n          isThreadRel && typeof explicitInReplyTo === 'string' ? explicitInReplyTo : undefined;\n        const replyEventId =\n          hideThreadChip && mEvent.getWireContent()?.['m.relates_to']?.is_falling_back\n            ? undefined\n            : (threadReplyTargetId ?? rawReplyEventId);\n\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName: senderDisplayName,\n          reactionRelations,\n\n          hasReactions,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n        const pushActions = pushProcessor.actionsForEvent(mEvent);\n        let notifyHighlight: 'silent' | 'loud' | undefined;\n        if (pushActions?.notify && pushActions.tweaks?.highlight) {\n          notifyHighlight = pushActions.tweaks?.sound ? 'loud' : 'silent';\n        }\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            messageLayout={messageLayout}\n            highlight={highlighted}\n            isMarked={marked}\n            notifyHighlight={notifyHighlight}\n            edit={editId === mEventId}\n            canDelete={canRedact || (canDeleteOwn && senderId === mx.getUserId())}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            onEditId={onEditId}\n            senderId={senderId}\n            activeReplyId={activeReplyId}\n            senderDisplayName={senderDisplayName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            onResend={onResend}\n            collapse={collapse}\n            onDeleteFailedSend={onDeleteFailedSend}\n            reply={\n              replyEventId && (\n                <Reply\n                  room={room}\n                  timelineSet={timelineSet}\n                  replyEventId={replyEventId}\n                  threadRootId={hideThreadChip ? undefined : actualThreadRootId}\n                  onClick={handleOpenReply}\n                />\n              )\n            }\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EncryptedContent mEvent={mEvent}>\n              {() => {\n                if (mEvent.isRedacted()) return <RedactedContent />;\n                const type = mEvent.getType();\n                if (type === (EventType.Sticker as string))\n                  return (\n                    <MSticker\n                      content={mEvent.getContent() as unknown as IImageContent}\n                      renderImageContent={(props) => (\n                        <ImageContent\n                          {...props}\n                          onOpenViewer={() => onOpenMedia?.(mEvent) ?? false}\n                          autoPlay={mediaAutoLoad}\n                          renderImage={(p) => {\n                            if (!autoplayStickers && p.src) {\n                              return (\n                                <ClientSideHoverFreeze src={p.src}>\n                                  <MediaImage {...p} disablePixelation loading=\"lazy\" />\n                                </ClientSideHoverFreeze>\n                              );\n                            }\n                            return <MediaImage {...p} disablePixelation loading=\"lazy\" />;\n                          }}\n                          renderViewer={(p) => <ImageViewer {...p} />}\n                        />\n                      )}\n                    />\n                  );\n                if (type === (EventType.RoomMessage as string) || type === M_POLL_START.name) {\n                  const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet);\n                  let editedNewContent: unknown;\n                  if (editedEvent) {\n                    editedNewContent = editedEvent.getContent()['m.new_content'];\n                  }\n\n                  const baseContent = mEvent.getContent() || {};\n                  const safeContent =\n                    Object.keys(baseContent).length > 0 ? baseContent : mEvent.getOriginalContent();\n\n                  const getContent = (() => editedNewContent ?? safeContent) as GetContentCallback;\n\n                  return (\n                    <RenderMessageContent\n                      displayName={senderDisplayName}\n                      msgType={\n                        (\n                          (editedNewContent ?? safeContent) as {\n                            msgtype?: string;\n                          }\n                        ).msgtype ?? ''\n                      }\n                      ts={mEvent.getTs()}\n                      edited={!!editedEvent}\n                      getContent={getContent}\n                      mediaAutoLoad={mediaAutoLoad}\n                      bundledPreview={showBundledPreview}\n                      urlPreview={showUrlPreview}\n                      clientUrlPreview={showClientUrlPreview}\n                      htmlReactParserOptions={htmlReactParserOptions}\n                      linkifyOpts={linkifyOpts}\n                      outlineAttachment={messageLayout === MessageLayout.Bubble}\n                      mEvent={mEvent}\n                      mx={mx}\n                      room={room}\n                      onOpenMedia={onOpenMedia}\n                    />\n                  );\n                }\n                return (\n                  <Text>\n                    <MessageNotDecryptedContent />\n                  </Text>\n                );\n              }}\n            </EncryptedContent>\n          </Message>\n        );\n      },\n      [EventType.Sticker]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        const { replyEventId: rawReplyEventId, threadRootId } = mEvent;\n        const isThreadRel = isThreadRelationEvent(mEvent, threadRootId);\n        const actualThreadRootId = isThreadRel ? threadRootId : undefined;\n        const explicitInReplyTo = mEvent.getWireContent()?.['m.relates_to']?.['m.in_reply_to']\n          ?.event_id as unknown;\n        const threadReplyTargetId =\n          isThreadRel && typeof explicitInReplyTo === 'string' ? explicitInReplyTo : undefined;\n        const replyEventId =\n          hideThreadChip && mEvent.getWireContent()?.['m.relates_to']?.is_falling_back\n            ? undefined\n            : (threadReplyTargetId ?? rawReplyEventId);\n\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName: senderDisplayName,\n          reactionRelations,\n          hasReactions,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n        const content = mEvent.getContent() ?? {};\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            messageLayout={messageLayout}\n            highlight={highlighted}\n            isMarked={marked}\n            canDelete={canRedact || (canDeleteOwn && senderId === mx.getUserId())}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            activeReplyId={activeReplyId}\n            senderDisplayName={senderDisplayName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            onResend={onResend}\n            onDeleteFailedSend={onDeleteFailedSend}\n            collapse={collapse}\n            reply={\n              replyEventId && (\n                <Reply\n                  room={room}\n                  timelineSet={timelineSet}\n                  replyEventId={replyEventId}\n                  threadRootId={hideThreadChip ? undefined : actualThreadRootId}\n                  mentions={content['m.mentions']}\n                  onClick={handleOpenReply}\n                />\n              )\n            }\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            {mEvent.isRedacted() ? (\n              <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n            ) : (\n              <MSticker\n                content={mEvent.getContent() as unknown as IImageContent}\n                renderImageContent={(props) => (\n                  <ImageContent\n                    {...props}\n                    onOpenViewer={() => onOpenMedia?.(mEvent) ?? false}\n                    autoPlay={mediaAutoLoad}\n                    renderImage={(p) => {\n                      if (!autoplayStickers && p.src) {\n                        return (\n                          <ClientSideHoverFreeze src={p.src}>\n                            <MediaImage {...p} disablePixelation loading=\"lazy\" />\n                          </ClientSideHoverFreeze>\n                        );\n                      }\n                      return <MediaImage {...p} disablePixelation loading=\"lazy\" />;\n                    }}\n                    renderViewer={(p) => <ImageViewer {...p} />}\n                  />\n                )}\n              />\n            )}\n          </Message>\n        );\n      },\n      [M_POLL_START.name]: (mEventId, mEvent, item, timelineSet) => {\n        const { replyEventId: rawReplyEventId, threadRootId } = mEvent;\n        const isThreadRel = isThreadRelationEvent(mEvent, threadRootId);\n        const actualThreadRootId = isThreadRel ? threadRootId : undefined;\n        const explicitInReplyTo = mEvent.getWireContent()?.['m.relates_to']?.['m.in_reply_to']\n          ?.event_id as unknown;\n        const threadReplyTargetId =\n          isThreadRel && typeof explicitInReplyTo === 'string' ? explicitInReplyTo : undefined;\n        // In the thread drawer (hideThreadChip=true), suppress reply headers for events\n        // that only have m.in_reply_to as a non-thread-client fallback (is_falling_back: true).\n        const replyEventId =\n          hideThreadChip && mEvent.getWireContent()?.['m.relates_to']?.is_falling_back\n            ? undefined\n            : (threadReplyTargetId ?? rawReplyEventId);\n\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName: senderDisplayName,\n          reactionRelations,\n\n          hasReactions,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n        const pushActions = pushProcessor.actionsForEvent(mEvent);\n        let notifyHighlight: 'silent' | 'loud' | undefined;\n        if (pushActions?.notify && pushActions.tweaks?.highlight) {\n          notifyHighlight = pushActions.tweaks?.sound ? 'loud' : 'silent';\n        }\n\n        const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet);\n        let editedNewContent: unknown;\n        if (editedEvent) {\n          editedNewContent = editedEvent.getContent()['m.new_content'];\n        }\n\n        const baseContent = mEvent.getContent() || {};\n        const safeContent =\n          Object.keys(baseContent).length > 0 ? baseContent : mEvent.getOriginalContent();\n        const isContentEmpty = Object.keys(safeContent).length === 0;\n\n        const getContent = (() => editedNewContent ?? safeContent) as GetContentCallback;\n\n        const forwardContent = safeContent['moe.sable.message.forward'] as\n          | {\n              original_timestamp?: unknown;\n              original_room_id?: string;\n              original_event_id?: string;\n              original_event_private?: boolean;\n            }\n          | undefined;\n\n        const messageForwardedProps: ForwardedMessageProps | undefined = forwardContent\n          ? {\n              isForwarded: true,\n              originalTimestamp:\n                typeof forwardContent.original_timestamp === 'number'\n                  ? forwardContent.original_timestamp\n                  : mEvent.getTs(),\n              originalRoomId: forwardContent.original_room_id ?? room.roomId,\n              originalEventId: forwardContent.original_event_id ?? '',\n              originalEventPrivate: forwardContent.original_event_private ?? false,\n            }\n          : undefined;\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            messageLayout={messageLayout}\n            highlight={highlighted}\n            isMarked={marked}\n            notifyHighlight={notifyHighlight}\n            edit={editId === mEventId}\n            canDelete={canRedact || (canDeleteOwn && senderId === mx.getUserId())}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderDisplayName}\n            messageForwardedProps={messageForwardedProps}\n            sendStatus={mEvent.getAssociatedStatus()}\n            onResend={onResend}\n            onDeleteFailedSend={onDeleteFailedSend}\n            onEditId={onEditId}\n            collapse={false}\n            activeReplyId={activeReplyId}\n            reply={\n              replyEventId && (\n                <Reply\n                  room={room}\n                  timelineSet={timelineSet}\n                  replyEventId={replyEventId}\n                  threadRootId={hideThreadChip ? undefined : actualThreadRootId}\n                  mentions={baseContent['m.mentions']}\n                  onClick={handleOpenReply}\n                />\n              )\n            }\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            {mEvent.isRedacted() || isContentEmpty ? (\n              <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n            ) : (\n              <RenderMessageContent\n                displayName={senderDisplayName}\n                msgType={((editedNewContent ?? safeContent) as { msgtype?: string }).msgtype ?? ''}\n                ts={mEvent.getTs()}\n                edited={!!editedEvent}\n                getContent={getContent}\n                mediaAutoLoad={mediaAutoLoad}\n                urlPreview={showUrlPreview}\n                bundledPreview={showBundledPreview}\n                clientUrlPreview={showClientUrlPreview}\n                htmlReactParserOptions={htmlReactParserOptions}\n                linkifyOpts={linkifyOpts}\n                outlineAttachment={messageLayout === MessageLayout.Bubble}\n                mEvent={mEvent}\n                mx={mx}\n                room={room}\n                onOpenMedia={onOpenMedia}\n              />\n            )}\n          </Message>\n        );\n      },\n      [EventType.RoomMember]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        const membershipChanged = isMembershipChanged(mEvent);\n        if (hideMemberInReadOnly && isReadOnly) return null;\n        if (membershipChanged && hideMembershipEvents) return null;\n        if (!membershipChanged && hideNickAvatarEvents) return null;\n\n        const isRedacted = mEvent.isRedacted();\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName,\n          reactionRelations,\n\n          hasReactions,\n          timeJSX,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n        const parsed = isRedacted ? null : parseMemberEvent(mEvent);\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            highlight={highlighted}\n            isMarked={marked}\n            edit={editId === mEventId}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EventContent\n              messageLayout={messageLayout}\n              time={timeJSX}\n              icon={parsed?.icon ?? timelineIcon(Trash)}\n              content={\n                isRedacted ? (\n                  <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n                ) : (\n                  <Text size=\"T300\" priority=\"300\">\n                    <Box direction=\"Row\" style={{ flexWrap: 'wrap', columnGap: toRem(6) }}>\n                      {parsed?.body}\n                    </Box>\n                  </Text>\n                )\n              }\n            />\n          </Message>\n        );\n      },\n      [EventType.RoomName]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        const isRedacted = mEvent.isRedacted();\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName,\n          reactionRelations,\n          hasReactions,\n          timeJSX,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            highlight={highlighted}\n            isMarked={marked}\n            edit={editId === mEventId}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EventContent\n              messageLayout={messageLayout}\n              time={timeJSX}\n              icon={isRedacted ? timelineIcon(Trash) : timelineIcon(Hash)}\n              content={\n                isRedacted ? (\n                  <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n                ) : (\n                  <Box grow=\"Yes\" direction=\"Column\">\n                    <Text size=\"T300\" priority=\"300\">\n                      <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                      {t('Organisms.RoomCommon.changed_room_name')}\n                    </Text>\n                  </Box>\n                )\n              }\n            />\n          </Message>\n        );\n      },\n      [EventType.RoomTopic]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        const isRedacted = mEvent.isRedacted();\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName,\n          reactionRelations,\n          hasReactions,\n          timeJSX,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            highlight={highlighted}\n            isMarked={marked}\n            edit={editId === mEventId}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EventContent\n              messageLayout={messageLayout}\n              time={timeJSX}\n              icon={isRedacted ? timelineIcon(Trash) : timelineIcon(Hash)}\n              content={\n                isRedacted ? (\n                  <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n                ) : (\n                  <Box grow=\"Yes\" direction=\"Column\">\n                    <Text size=\"T300\" priority=\"300\">\n                      <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                      {' changed room topic'}\n                    </Text>\n                  </Box>\n                )\n              }\n            />\n          </Message>\n        );\n      },\n      [EventType.RoomAvatar]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        const isRedacted = mEvent.isRedacted();\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName,\n          reactionRelations,\n          hasReactions,\n          timeJSX,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            highlight={highlighted}\n            isMarked={marked}\n            edit={editId === mEventId}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EventContent\n              messageLayout={messageLayout}\n              time={timeJSX}\n              icon={isRedacted ? timelineIcon(Trash) : timelineIcon(Hash)}\n              content={\n                isRedacted ? (\n                  <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n                ) : (\n                  <Box grow=\"Yes\" direction=\"Column\">\n                    <Text size=\"T300\" priority=\"300\">\n                      <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                      {' changed room avatar'}\n                    </Text>\n                  </Box>\n                )\n              }\n            />\n          </Message>\n        );\n      },\n      [EventType.GroupCallMemberPrefix]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        const isRedacted = mEvent.isRedacted();\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName,\n          reactionRelations,\n          hasReactions,\n          timeJSX,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n        const content = mEvent.getContent() as Record<string, unknown>;\n        const prevContent = mEvent.getPrevContent();\n\n        const callJoined = content.application;\n        if (callJoined && 'application' in prevContent) {\n          return null;\n        }\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            highlight={highlighted}\n            isMarked={marked}\n            edit={editId === mEventId}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EventContent\n              messageLayout={messageLayout}\n              time={timeJSX}\n              icon={\n                isRedacted\n                  ? timelineIcon(Trash)\n                  : callJoined\n                    ? timelineIcon(Phone)\n                    : timelineIcon(PhoneDisconnect)\n              }\n              content={\n                isRedacted ? (\n                  <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n                ) : (\n                  <Box grow=\"Yes\" direction=\"Column\">\n                    <Text size=\"T300\" priority=\"300\">\n                      <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                      {callJoined ? ' joined the call' : ' ended the call'}\n                    </Text>\n                  </Box>\n                )\n              }\n            />\n          </Message>\n        );\n      },\n      [EventType.Reaction]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        if (hideMemberInReadOnly && isReadOnly) return null;\n\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName,\n          reactionRelations,\n          hasReactions,\n          timeJSX,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet, 'plain');\n        const targetId = getReactionAnnotationTargetId(mEvent) ?? mEvent.getRelation()?.event_id;\n\n        const targetReply =\n          typeof targetId === 'string' ? (\n            <Reply\n              style={{ opacity: '80%' }}\n              room={room}\n              timelineSet={timelineSet}\n              replyEventId={targetId}\n              onClick={handleOpenReply}\n            />\n          ) : null;\n\n        if (mEvent.isRedacted()) {\n          if (!hiddenEventReactionTombstone) return null;\n          const reactionKey = getReactionKey(mEvent);\n          const reactionShortcode = getReactionShortcode(mEvent);\n          const removalReason = getRedactionReason(mEvent);\n\n          return (\n            <Message\n              key={mEventId}\n              data-message-item={item}\n              data-message-id={mEventId}\n              room={room}\n              mEvent={mEvent}\n              messageSpacing={messageSpacing}\n              highlight={highlighted}\n              isMarked={marked}\n              edit={editId === mEventId}\n              canSendReaction={canSendReaction}\n              canPinEvent={canPinEvent}\n              imagePackRooms={imagePackRooms}\n              relations={hasReactions ? reactionRelations : undefined}\n              onUserClick={onUserClick}\n              onUsernameClick={onUsernameClick}\n              onReplyClick={onReplyClick}\n              onReactionToggle={onReactionToggle}\n              senderId={senderId}\n              senderDisplayName={senderName}\n              sendStatus={mEvent.getAssociatedStatus()}\n              collapse={collapse}\n              activeReplyId={activeReplyId}\n              reactions={renderReactionsBar(\n                mEventId,\n                reactionRelations,\n                hasReactions,\n                renderThreadChip(mEventId, mEvent),\n                false\n              )}\n              hideReadReceipts={hideReads}\n              showDeveloperTools={showDeveloperTools}\n              memberPowerTag={getMemberPowerTag(senderId)}\n              hour24Clock={hour24Clock}\n              dateFormatString={dateFormatString}\n            >\n              <EventContent\n                messageLayout={messageLayout}\n                time={timeJSX}\n                icon={timelineIcon(Trash)}\n                content={\n                  <Box grow=\"Yes\" direction=\"Column\">\n                    {targetReply}\n                    <RedactedReactionContent\n                      reactionKey={reactionKey}\n                      shortcode={reactionShortcode}\n                      mx={mx}\n                      useAuthentication={useAuthentication}\n                      reason={removalReason}\n                    />\n                  </Box>\n                }\n              />\n            </Message>\n          );\n        }\n\n        if (!hiddenEventReactions) return null;\n\n        const reactionKey = getReactionKey(mEvent) ?? mEvent.getRelation()?.key ?? '';\n        const reactionShortcode = getReactionShortcode(mEvent);\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            highlight={highlighted}\n            isMarked={marked}\n            edit={editId === mEventId}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EventContent\n              messageLayout={messageLayout}\n              time={timeJSX}\n              icon={timelineIcon(Smiley)}\n              content={\n                <Box grow=\"Yes\" direction=\"Column\">\n                  {targetReply}\n                  <Text size=\"T300\" priority=\"300\">\n                    <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                    {' reacted with '}\n                    <ReactionKeyInline\n                      mx={mx}\n                      reactionKey={reactionKey}\n                      shortcode={reactionShortcode}\n                      useAuthentication={useAuthentication}\n                    />\n                  </Text>\n                </Box>\n              }\n            />\n          </Message>\n        );\n      },\n      [EventType.RoomRedaction]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        const target = getRedactionTargetEvent(timelineSet, mEvent);\n        const isReactionRedaction = target?.getType() === (EventType.Reaction as string);\n        if (isReactionRedaction) {\n          if (hideMemberInReadOnly && isReadOnly) return null;\n          if (!hiddenEventReactionRedactionTimeline) return null;\n        } else if (!hiddenEventRedactionTimeline) {\n          return null;\n        }\n\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName,\n          reactionRelations,\n          hasReactions,\n          timeJSX,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet, 'plain');\n        const targetId = getRedactionTargetId(mEvent);\n\n        const targetReply = targetId ? (\n          <Reply\n            style={{ opacity: '80%' }}\n            room={room}\n            timelineSet={timelineSet}\n            replyEventId={targetId}\n            onClick={handleOpenReply}\n          />\n        ) : null;\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            highlight={highlighted}\n            isMarked={marked}\n            edit={editId === mEventId}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EventContent\n              messageLayout={messageLayout}\n              time={timeJSX}\n              icon={timelineIcon(Trash)}\n              content={\n                <Box grow=\"Yes\" direction=\"Column\">\n                  {targetReply}\n                  <Text size=\"T300\" priority=\"300\">\n                    <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                    {isReactionRedaction ? ' redacted a reaction' : ' redacted a message'}\n                  </Text>\n                </Box>\n              }\n            />\n          </Message>\n        );\n      },\n      [EventType.RoomPinnedEvents]: (mEventId, mEvent, item, timelineSet, collapse) => {\n        if (!hiddenEventOther) return null;\n        const isRedacted = mEvent.isRedacted();\n        const {\n          highlighted,\n          marked,\n          senderId,\n          senderName,\n          reactionRelations,\n          hasReactions,\n          timeJSX,\n        } = deriveCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n        const { pinned } = mEvent.getContent();\n        const prevPinned = mEvent.getPrevContent().pinned;\n        const pinsAdded = prevPinned\n          ? pinned?.filter((x: string) => !prevPinned.includes(x))\n          : pinned?.filter((x: string) => x.length > 0);\n        const pinsRemoved =\n          (prevPinned && pinned && prevPinned.filter((x: string) => !pinned.includes(x))) || [];\n\n        const pinPreviewIds = (pinsAdded ?? []).concat(...(pinsRemoved ?? []));\n        const pinnedSet = new Set(pinned ?? []);\n\n        return (\n          <Message\n            key={mEventId}\n            data-message-item={item}\n            data-message-id={mEventId}\n            room={room}\n            mEvent={mEvent}\n            messageSpacing={messageSpacing}\n            highlight={highlighted}\n            isMarked={marked}\n            edit={editId === mEventId}\n            canSendReaction={canSendReaction}\n            canPinEvent={canPinEvent}\n            imagePackRooms={imagePackRooms}\n            relations={hasReactions ? reactionRelations : undefined}\n            onUserClick={onUserClick}\n            onUsernameClick={onUsernameClick}\n            onReplyClick={onReplyClick}\n            onReactionToggle={onReactionToggle}\n            senderId={senderId}\n            senderDisplayName={senderName}\n            sendStatus={mEvent.getAssociatedStatus()}\n            collapse={collapse}\n            activeReplyId={activeReplyId}\n            reactions={renderReactionsBar(\n              mEventId,\n              reactionRelations,\n              hasReactions,\n              renderThreadChip(mEventId, mEvent),\n              true\n            )}\n            hideReadReceipts={hideReads}\n            showDeveloperTools={showDeveloperTools}\n            memberPowerTag={getMemberPowerTag(senderId)}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n          >\n            <EventContent\n              messageLayout={messageLayout}\n              time={timeJSX}\n              icon={isRedacted ? timelineIcon(Trash) : timelineIcon(PushPin)}\n              content={\n                isRedacted ? (\n                  <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n                ) : (\n                  <Box grow=\"Yes\" direction=\"Column\">\n                    <Text size=\"T300\" priority=\"300\">\n                      <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                      {(pinsAdded?.length > 0 &&\n                        `pinned ${pinsAdded.length} message${pinsAdded.length > 1 ? 's' : ''}`) ||\n                        ''}\n                      {(pinsAdded?.length > 0 && pinsRemoved?.length > 0 && ` and `) || ''}\n                      {(pinsRemoved?.length > 0 &&\n                        `unpinned ${pinsRemoved.length} message${\n                          pinsRemoved.length > 1 ? 's' : ''\n                        }`) ||\n                        ''}\n                      {((!pinsAdded || pinsAdded.length <= 0) &&\n                        (!pinsRemoved || pinsRemoved.length <= 0) &&\n                        `has not changed the pins`) ||\n                        `:`}\n                    </Text>\n                    {pinPreviewIds.length > 0 &&\n                      pinPreviewIds\n                        .slice(0, 4)\n                        .map((x: string) => (\n                          <Reply\n                            key={x}\n                            style={{ opacity: '80%' }}\n                            room={room}\n                            replyEventId={x}\n                            onClick={handleOpenReply}\n                            replyIcon={<>{menuIcon(pinnedSet.has(x) ? PushPin : PushPinSlash)}</>}\n                          />\n                        ))}\n                  </Box>\n                )\n              }\n            />\n          </Message>\n        );\n      },\n    },\n    (mEventId, mEvent, item, timelineSet, collapse) => {\n      if (!hiddenEventOther) return null;\n      const isRedacted = mEvent.isRedacted();\n      const {\n        highlighted,\n        marked,\n        senderId,\n        senderName,\n        timeJSX,\n        reactionRelations,\n        hasReactions,\n      } = deriveFallbackCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n      return (\n        <Message\n          key={mEventId}\n          data-message-item={item}\n          data-message-id={mEventId}\n          room={room}\n          mEvent={mEvent}\n          messageSpacing={messageSpacing}\n          highlight={highlighted}\n          isMarked={marked}\n          edit={editId === mEventId}\n          canSendReaction={canSendReaction}\n          canPinEvent={canPinEvent}\n          imagePackRooms={imagePackRooms}\n          relations={hasReactions ? reactionRelations : undefined}\n          onUserClick={onUserClick}\n          onUsernameClick={onUsernameClick}\n          onReplyClick={onReplyClick}\n          onReactionToggle={onReactionToggle}\n          senderId={senderId}\n          senderDisplayName={senderName}\n          sendStatus={mEvent.getAssociatedStatus()}\n          collapse={collapse}\n          activeReplyId={activeReplyId}\n          reactions={renderReactionsBar(\n            mEventId,\n            reactionRelations,\n            hasReactions,\n            renderThreadChip(mEventId, mEvent),\n            false\n          )}\n          hideReadReceipts={hideReads}\n          showDeveloperTools={showDeveloperTools}\n          memberPowerTag={getMemberPowerTag(senderId)}\n          hour24Clock={hour24Clock}\n          dateFormatString={dateFormatString}\n        >\n          <EventContent\n            messageLayout={messageLayout}\n            time={timeJSX}\n            icon={isRedacted ? timelineIcon(Trash) : timelineIcon(Code)}\n            content={\n              isRedacted ? (\n                <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n              ) : (\n                <Box grow=\"Yes\" direction=\"Column\">\n                  <Text size=\"T300\" priority=\"300\">\n                    <DecoratedUser userId={senderId} userName={senderName} room={room} />\n                    {' sent '}\n                    <code className={customHtmlCss.Code}>{mEvent.getType()}</code>\n                    {' state event'}\n                  </Text>\n                </Box>\n              )\n            }\n          />\n        </Message>\n      );\n    },\n    (mEventId, mEvent, item, timelineSet, collapse) => {\n      if (!hiddenEventOther) return null;\n      if (Object.keys(mEvent.getContent()).length === 0) return null;\n      if (mEvent.getRelation()) return null;\n      if (mEvent.isRedaction()) return null;\n\n      const {\n        highlighted,\n        marked,\n        senderId,\n        senderName,\n        timeJSX,\n        reactionRelations,\n        hasReactions,\n      } = deriveFallbackCommonRenderState(mEventId, mEvent, item, timelineSet);\n\n      return (\n        <Message\n          key={mEventId}\n          data-message-item={item}\n          data-message-id={mEventId}\n          room={room}\n          mEvent={mEvent}\n          messageSpacing={messageSpacing}\n          highlight={highlighted}\n          isMarked={marked}\n          edit={editId === mEventId}\n          canSendReaction={canSendReaction}\n          canPinEvent={canPinEvent}\n          imagePackRooms={imagePackRooms}\n          relations={hasReactions ? reactionRelations : undefined}\n          onUserClick={onUserClick}\n          onUsernameClick={onUsernameClick}\n          onReplyClick={onReplyClick}\n          onReactionToggle={onReactionToggle}\n          senderId={senderId}\n          senderDisplayName={senderName}\n          sendStatus={mEvent.getAssociatedStatus()}\n          collapse={collapse}\n          activeReplyId={activeReplyId}\n          reactions={renderReactionsBar(\n            mEventId,\n            reactionRelations,\n            hasReactions,\n            renderThreadChip(mEventId, mEvent),\n            false\n          )}\n          hideReadReceipts={hideReads}\n          showDeveloperTools={showDeveloperTools}\n          memberPowerTag={getMemberPowerTag(senderId)}\n          hour24Clock={hour24Clock}\n          dateFormatString={dateFormatString}\n        >\n          <EventContent\n            messageLayout={messageLayout}\n            time={timeJSX}\n            icon={timelineIcon(Code)}\n            content={\n              <Box grow=\"Yes\" direction=\"Column\">\n                <Text size=\"T300\" priority=\"300\">\n                  <b>{senderName}</b>\n                  {' sent '}\n                  <code className={customHtmlCss.Code}>{mEvent.getType()}</code>\n                  {' event'}\n                </Text>\n              </Box>\n            }\n          />\n        </Message>\n      );\n    }\n  );\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Chip, Spinner, Text } from 'folds';\nimport type { EncryptedAttachmentInfo } from 'browser-encrypt-attachment';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { useCreateObjectURL } from '$hooks/useObjectURL';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport type { IImageInfo } from '$types/matrix/common';\nimport {\n  decryptFile,\n  downloadEncryptedMedia,\n  mxcUrlToHttp,\n  rewriteAuthenticatedMediaUrl,\n} from '$utils/matrix';\nimport { prepareLoopbackImageSource } from '$utils/mediaUrl';\nimport { FALLBACK_MIMETYPE } from '$utils/mimeTypes';\nimport { setMediaEncryption } from '$utils/tauriMediaEncryption';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { timeDayMonthYear, timeHourMinute, today, yesterday } from '$utils/time';\nimport { ImageViewer } from './ImageViewer';\n\nexport type RoomMediaItem = {\n  eventId: string;\n  body: string;\n  filename?: string;\n  url: string;\n  info?: IImageInfo;\n  mimeType?: string;\n  encInfo?: EncryptedAttachmentInfo;\n  sender?: string;\n  timestamp?: number;\n};\n\ntype RoomMediaViewerProps = {\n  items: RoomMediaItem[];\n  selectedEventId: string;\n  requestClose: () => void;\n  selectEvent: (eventId: string) => void;\n};\n\ntype ResolvedMedia = { item: RoomMediaItem; src: string };\n\nconst formatSentAt = (ts: number | undefined, hour24Clock: boolean): string | undefined => {\n  if (ts === undefined) return undefined;\n  const time = timeHourMinute(ts, hour24Clock);\n  if (today(ts)) return `Today at ${time}`;\n  if (yesterday(ts)) return `Yesterday at ${time}`;\n  return `${timeDayMonthYear(ts)} at ${time}`;\n};\n\nfunction ResolvedRoomMedia({\n  item,\n  requestClose,\n  onPrevious,\n  onNext,\n}: {\n  item: RoomMediaItem;\n  requestClose: () => void;\n  onPrevious?: () => void;\n  onNext?: () => void;\n}) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const createObjectURL = useCreateObjectURL();\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n  const rawMediaUrl = useMemo(\n    () => (item.url.startsWith('http') ? item.url : mxcUrlToHttp(mx, item.url, useAuthentication)),\n    [item.url, mx, useAuthentication]\n  );\n  const tauri = isTauri();\n  // Tauri resolves the source inside the effect instead.\n  const resolvedMediaUrl = useRenderableMediaUrl(\n    item.encInfo || tauri ? undefined : (rawMediaUrl ?? undefined)\n  );\n\n  const [resolved, setResolved] = useState<ResolvedMedia>();\n  const [error, setError] = useState<Error>();\n  const [retryToken, setRetryToken] = useState(0);\n  const requestRef = useRef(0);\n\n  useEffect(() => {\n    requestRef.current += 1;\n    const request = requestRef.current;\n    setError(undefined);\n    const resolve = async () => {\n      const { encInfo, mimeType } = item;\n      if (encInfo) {\n        if (!rawMediaUrl) throw new Error('Invalid media URL');\n        if (tauri) {\n          await setMediaEncryption(rawMediaUrl, encInfo, mimeType ?? FALLBACK_MIMETYPE);\n          return rewriteAuthenticatedMediaUrl(rawMediaUrl)!;\n        }\n        return createObjectURL(\n          downloadEncryptedMedia(rawMediaUrl, (buffer) =>\n            decryptFile(buffer, mimeType ?? FALLBACK_MIMETYPE, encInfo)\n          )\n        );\n      }\n      if (tauri && rawMediaUrl) return prepareLoopbackImageSource(rawMediaUrl);\n      return resolvedMediaUrl ?? rawMediaUrl ?? item.url;\n    };\n\n    resolve()\n      .then((src) => {\n        if (requestRef.current !== request) return;\n        setResolved((prev) => (prev?.item === item && prev.src === src ? prev : { item, src }));\n      })\n      .catch((err) => {\n        if (requestRef.current !== request) return;\n        setError(err instanceof Error ? err : new Error('Failed to load media'));\n      });\n  }, [item, rawMediaUrl, resolvedMediaUrl, tauri, createObjectURL, retryToken]);\n\n  const loading = !error && resolved?.item.eventId !== item.eventId;\n  const showingResolved = resolved?.item.eventId === item.eventId;\n\n  return (\n    <>\n      {resolved && showingResolved && !error && (\n        <ImageViewer\n          alt={resolved.item.body}\n          filename={resolved.item.filename}\n          src={resolved.src}\n          info={resolved.item.info}\n          sender={resolved.item.sender}\n          sentAt={formatSentAt(resolved.item.timestamp, hour24Clock)}\n          requestClose={requestClose}\n          onPrevious={onPrevious}\n          onNext={onNext}\n          getDownloadBlob={\n            item.encInfo && rawMediaUrl\n              ? () =>\n                  downloadEncryptedMedia(rawMediaUrl, (buffer) =>\n                    decryptFile(buffer, item.mimeType ?? FALLBACK_MIMETYPE, item.encInfo!)\n                  )\n              : undefined\n          }\n        />\n      )}\n      {loading && (\n        <Box\n          grow=\"Yes\"\n          alignItems=\"Center\"\n          justifyContent=\"Center\"\n          style={resolved ? { position: 'absolute', inset: 0, background: '#0009' } : undefined}\n        >\n          <Spinner variant=\"Secondary\" size=\"400\" />\n        </Box>\n      )}\n      {error && (\n        <Box\n          grow=\"Yes\"\n          alignItems=\"Center\"\n          justifyContent=\"Center\"\n          direction=\"Column\"\n          gap=\"200\"\n          style={\n            resolved\n              ? { position: 'absolute', inset: 0, background: '#000c' }\n              : { background: '#000' }\n          }\n        >\n          <Text size=\"T300\" style={{ color: '#fff' }}>\n            Failed to load media\n          </Text>\n          <Chip\n            as=\"button\"\n            variant=\"Primary\"\n            radii=\"300\"\n            outlined\n            onClick={() => setRetryToken((token) => token + 1)}\n          >\n            <Text size=\"B300\">Retry</Text>\n          </Chip>\n        </Box>\n      )}\n    </>\n  );\n}\n\nexport function RoomMediaViewer({\n  items,\n  selectedEventId,\n  requestClose,\n  selectEvent,\n}: RoomMediaViewerProps) {\n  const selectedIndex = items.findIndex((mediaItem) => mediaItem.eventId === selectedEventId);\n  const item = items[selectedIndex];\n\n  useEffect(() => {\n    if (!item) requestClose();\n  }, [item, requestClose]);\n\n  if (!item) return null;\n\n  return (\n    <ModalOverlay\n      open\n      requestClose={requestClose}\n      mobile=\"fullscreen\"\n      background=\"#000\"\n      respectSafeArea={false}\n    >\n      <ResolvedRoomMedia\n        item={item}\n        requestClose={requestClose}\n        onPrevious={\n          selectedIndex > 0 ? () => selectEvent(items[selectedIndex - 1]!.eventId) : undefined\n        }\n        onNext={\n          selectedIndex < items.length - 1\n            ? () => selectEvent(items[selectedIndex + 1]!.eventId)\n            : undefined\n        }\n      />\n    </ModalOverlay>\n  );\n}\n","import { useMemo } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport { EventType } from '$types/matrix-sdk';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport type { Opts as LinkifyOpts } from 'linkifyjs';\nimport {\n  factoryRenderLinkifyWithMention,\n  getReactCustomHtmlParser,\n  LINKIFY_OPTS,\n  makeMentionCustomProps,\n  renderMatrixMention,\n} from '$plugins/react-custom-html-parser';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport { useMentionClickHandler } from '$hooks/useMentionClickHandler';\nimport { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler';\nimport { useRoomAbbreviationsContext } from '$hooks/useRoomAbbreviations';\nimport { buildAbbrReplaceTextNode } from '$components/message/RenderBody';\nimport { usePowerLevelsContext } from '$hooks/usePowerLevels';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { useGetMemberPowerTag } from '$hooks/useMemberPowerTag';\nimport { useMemberEventParser } from '$hooks/useMemberEventParser';\nimport type { ResolvedHiddenEventSettings } from '$state/hooks/settings';\nimport { useHiddenEventSettings, useSetting } from '$state/hooks/settings';\nimport { settingsAtom, type MessageLayout, type MessageSpacing } from '$state/settings';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { useAtomValue } from 'jotai';\n\nexport interface TimelineRendererSettings {\n  messageLayout: MessageLayout;\n  messageSpacing: MessageSpacing;\n  hideReads: boolean;\n  showDeveloperTools: boolean;\n  hour24Clock: boolean;\n  dateFormatString: string;\n  mediaAutoLoad: boolean;\n  showBundledPreview: boolean;\n  showUrlPreview: boolean;\n  showClientUrlPreview: boolean;\n  showMaps: boolean;\n  autoplayStickers: boolean;\n  hideMemberInReadOnly: boolean;\n  isReadOnly: boolean;\n  hideMembershipEvents: boolean;\n  hideNickAvatarEvents: boolean;\n  hiddenEvents: ResolvedHiddenEventSettings;\n  // Not included by default — callers that need these add them on top:\n  // hideThreadChip?: boolean;\n}\n\nexport interface TimelineRendererPermissions {\n  canRedact: boolean;\n  canDeleteOwn: boolean;\n  canSendReaction: boolean;\n  canPinEvent: boolean;\n  isReadOnly: boolean;\n  getMemberPowerTag: ReturnType<typeof useGetMemberPowerTag>;\n  parseMemberEvent: ReturnType<typeof useMemberEventParser>;\n}\n\nexport interface TimelineRendererContextValue {\n  settings: TimelineRendererSettings;\n  linkifyOpts: LinkifyOpts;\n  htmlReactParserOptions: HTMLReactParserOptions;\n  permissions: TimelineRendererPermissions;\n}\n\nexport function useTimelineRendererContext(room: Room): TimelineRendererContextValue {\n  const mx = useMatrixClient();\n  const nicknames = useAtomValue(nicknamesAtom);\n\n  // Raw settings reads — same set in both RoomTimeline and ThreadDrawer\n  const [messageLayout] = useSetting(settingsAtom, 'messageLayout');\n  const [messageSpacing] = useSetting(settingsAtom, 'messageSpacing');\n  const [hideReads] = useSetting(settingsAtom, 'hideReads');\n  const [showDeveloperTools] = useSetting(settingsAtom, 'developerTools');\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n  const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n  const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad');\n  const [showBundledPreview] = useSetting(settingsAtom, 'bundledPreview');\n  const [urlPreview] = useSetting(settingsAtom, 'urlPreview');\n  const [encUrlPreview] = useSetting(settingsAtom, 'encUrlPreview');\n  const [clientUrlPreview] = useSetting(settingsAtom, 'clientUrlPreview');\n  const [encClientUrlPreview] = useSetting(settingsAtom, 'encClientUrlPreview');\n  const [autoplayStickers] = useSetting(settingsAtom, 'autoplayStickers');\n  const [autoplayEmojis] = useSetting(settingsAtom, 'autoplayEmojis');\n  const [incomingInlineImagesDefaultHeight] = useSetting(\n    settingsAtom,\n    'incomingInlineImagesDefaultHeight'\n  );\n  const [incomingInlineImagesMaxHeight] = useSetting(settingsAtom, 'incomingInlineImagesMaxHeight');\n  const [hideMemberInReadOnly] = useSetting(settingsAtom, 'hideMembershipInReadOnly');\n  const [hideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents');\n  const [hideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents');\n  const [showInteractiveMap] = useSetting(settingsAtom, 'showInteractiveMap');\n  const [showEncInteractiveMap] = useSetting(settingsAtom, 'showEncInteractiveMap');\n  const hiddenEvents = useHiddenEventSettings(settingsAtom);\n\n  // Derived settings\n  const showMaps = room.hasEncryptionStateEvent() ? showEncInteractiveMap : showInteractiveMap;\n  const showUrlPreview = room.hasEncryptionStateEvent() ? encUrlPreview : urlPreview;\n  const showClientUrlPreview = room.hasEncryptionStateEvent()\n    ? clientUrlPreview && encClientUrlPreview\n    : clientUrlPreview;\n\n  // Power levels & permissions\n  const powerLevels = usePowerLevelsContext();\n  const creators = useRoomCreators(room);\n  const permissions = useRoomPermissions(creators, powerLevels);\n  const canRedact = permissions.action('redact', mx.getSafeUserId());\n  const canDeleteOwn = permissions.event(EventType.RoomRedaction, mx.getSafeUserId());\n  const canSendReaction = permissions.event(EventType.Reaction, mx.getSafeUserId());\n  const canPinEvent = permissions.stateEvent(EventType.RoomPinnedEvents, mx.getSafeUserId());\n  const isReadOnly = !permissions.message(room.hasEncryptionStateEvent(), mx.getSafeUserId());\n  const getMemberPowerTag = useGetMemberPowerTag(room, creators, powerLevels);\n  const parseMemberEvent = useMemberEventParser();\n\n  // linkifyOpts\n  const mentionClickHandler = useMentionClickHandler(room.roomId);\n  const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n\n  const linkifyOpts = useMemo<LinkifyOpts>(\n    () => ({\n      ...LINKIFY_OPTS,\n      render: factoryRenderLinkifyWithMention(\n        settingsLinkBaseUrl,\n        (href) =>\n          renderMatrixMention(\n            mx,\n            room.roomId,\n            href,\n            makeMentionCustomProps(mentionClickHandler),\n            nicknames\n          ),\n        mentionClickHandler\n      ),\n    }),\n    [mx, room.roomId, mentionClickHandler, nicknames, settingsLinkBaseUrl]\n  );\n\n  // htmlReactParserOptions\n  const useAuthentication = useMediaAuthentication();\n  const spoilerClickHandler = useSpoilerClickHandler();\n  const abbrMap = useRoomAbbreviationsContext();\n\n  const htmlReactParserOptions = useMemo<HTMLReactParserOptions>(\n    () =>\n      getReactCustomHtmlParser(mx, room.roomId, {\n        settingsLinkBaseUrl,\n        linkifyOpts,\n        useAuthentication,\n        handleSpoilerClick: spoilerClickHandler,\n        handleMentionClick: mentionClickHandler,\n        nicknames,\n        autoplayEmojis,\n        incomingInlineImagesDefaultHeight,\n        incomingInlineImagesMaxHeight,\n        replaceTextNode: buildAbbrReplaceTextNode(abbrMap, linkifyOpts),\n      }),\n    [\n      mx,\n      room.roomId,\n      linkifyOpts,\n      autoplayEmojis,\n      incomingInlineImagesDefaultHeight,\n      incomingInlineImagesMaxHeight,\n      mentionClickHandler,\n      nicknames,\n      useAuthentication,\n      spoilerClickHandler,\n      settingsLinkBaseUrl,\n      abbrMap,\n    ]\n  );\n\n  const settings = useMemo(\n    () => ({\n      messageLayout,\n      messageSpacing,\n      hideReads,\n      showDeveloperTools,\n      hour24Clock,\n      dateFormatString,\n      mediaAutoLoad,\n      showBundledPreview,\n      showUrlPreview,\n      showClientUrlPreview,\n      showMaps,\n      autoplayStickers,\n      hideMemberInReadOnly,\n      isReadOnly,\n      hideMembershipEvents,\n      hideNickAvatarEvents,\n      hiddenEvents,\n    }),\n    [\n      messageLayout,\n      messageSpacing,\n      hideReads,\n      showDeveloperTools,\n      hour24Clock,\n      dateFormatString,\n      mediaAutoLoad,\n      showBundledPreview,\n      showUrlPreview,\n      showClientUrlPreview,\n      showMaps,\n      autoplayStickers,\n      hideMemberInReadOnly,\n      isReadOnly,\n      hideMembershipEvents,\n      hideNickAvatarEvents,\n      hiddenEvents,\n    ]\n  );\n\n  return {\n    settings,\n    linkifyOpts,\n    htmlReactParserOptions,\n    permissions: {\n      canRedact,\n      canDeleteOwn,\n      canSendReaction,\n      canPinEvent,\n      isReadOnly,\n      getMemberPowerTag,\n      parseMemberEvent,\n    },\n  };\n}\n","import type { MutableRefObject } from 'react';\nimport { useCallback, useRef } from 'react';\nimport type { MatrixClient, MatrixEvent } from '$types/matrix-sdk';\nimport { MsgType } from '$types/matrix-sdk';\nimport { prefetchUrlPreview } from '$components/url-preview';\nimport { testMatrixTo } from '$plugins/matrix-to';\nimport { testMatrixUri } from '$plugins/matrix-uri';\nimport type { ProcessedEvent } from './useProcessedTimeline';\n\n// Rows of runway ahead of the rendered window for a preview to resolve in.\nconst PREFETCH_ROWS = 40;\n\n// A whole pass at once saturates the per-host cap and delays the nearest rows; six matches it.\nconst MAX_IN_FLIGHT = 6;\n\nconst LINK_REGEX = /https?:\\/\\/[^\\s<>\"')\\]]+/g;\n\nconst PREVIEWABLE_MSGTYPES = new Set<string>([MsgType.Text, MsgType.Notice, MsgType.Emote]);\n\nexport const previewableLinks = (mEvent: MatrixEvent): string[] => {\n  const content = mEvent.getContent();\n  if (!PREVIEWABLE_MSGTYPES.has(content.msgtype ?? '')) return [];\n  const body = typeof content.body === 'string' ? content.body : '';\n  const links = body.match(LINK_REGEX);\n  if (!links) return [];\n  return links.filter((url) => !testMatrixTo(url) && !testMatrixUri(url));\n};\n\n/** Row indices around the rendered window, nearest to it first. */\nexport const rowsByDistance = (\n  startIndex: number,\n  endIndex: number,\n  rowCount: number,\n  reach: number\n): number[] => {\n  const indices: number[] = [];\n  for (let step = 1; step <= reach; step += 1) {\n    const above = startIndex - step;\n    const below = endIndex + step;\n    if (above >= 0) indices.push(above);\n    if (below < rowCount) indices.push(below);\n  }\n  return indices;\n};\n\nexport const useUrlPreviewPrefetch = (\n  mx: MatrixClient,\n  enabled: boolean,\n  eventsRef: MutableRefObject<ProcessedEvent[]>\n) => {\n  const lastRangeRef = useRef('');\n  const queueRef = useRef<{ url: string; ts: number }[]>([]);\n  const queuedRef = useRef(new Set<string>());\n  const inFlightRef = useRef(0);\n\n  const pump = useCallback(() => {\n    while (inFlightRef.current < MAX_IN_FLIGHT) {\n      const next = queueRef.current.shift();\n      if (!next) return;\n      queuedRef.current.delete(next.url);\n      inFlightRef.current += 1;\n      prefetchUrlPreview(mx, next.url, next.ts).finally(() => {\n        inFlightRef.current -= 1;\n        pump();\n      });\n    }\n  }, [mx]);\n\n  return useCallback(\n    (startIndex: number, endIndex: number) => {\n      if (!enabled) return;\n      const events = eventsRef.current;\n      // Row count is in the key so a page prepended without the reader moving still runs.\n      const key = `${startIndex}:${endIndex}:${events.length}`;\n      if (key === lastRangeRef.current) return;\n      lastRangeRef.current = key;\n\n      queueRef.current = [];\n      queuedRef.current.clear();\n\n      for (const index of rowsByDistance(startIndex, endIndex, events.length, PREFETCH_ROWS)) {\n        const mEvent = events[index]?.mEvent;\n        if (!mEvent) continue;\n        const ts = mEvent.getTs();\n        for (const url of previewableLinks(mEvent)) {\n          if (queuedRef.current.has(url)) continue;\n          queuedRef.current.add(url);\n          queueRef.current.push({ url, ts });\n        }\n      }\n      pump();\n    },\n    [enabled, eventsRef, pump]\n  );\n};\n","import type { ReactNode } from 'react';\nimport {\n  Fragment,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n  memo,\n} from 'react';\nimport type { ProseMirrorEditorController } from '$components/editor/prosemirrorController';\nimport { useAtomValue, useSetAtom, useStore } from 'jotai';\nimport type { Room, MatrixEvent, EventTimelineSet } from '$types/matrix-sdk';\nimport { Direction, EventTimeline, EventType, MsgType, RoomEvent } from '$types/matrix-sdk';\nimport classNames from 'classnames';\nimport type { VListHandle } from 'virtua';\nimport { VList } from 'virtua';\nimport type { ContainerColor } from 'folds';\nimport { as, Box, Chip, Line, Text, Badge, color, config, toRem, Spinner } from 'folds';\nimport { ArrowDown, ChatTeardropDots, Checks, chipIcon } from '$components/icons/phosphor';\nimport { MessageBase, CompactPlaceholder, DefaultPlaceholder } from '$components/message';\nimport { RoomIntro } from '$components/room-intro';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMatrixEvent } from '$hooks/useMatrixEvent';\nimport { ScreenSize, useScreenSizeOptionally } from '$hooks/useScreenSize';\nimport { useAlive } from '$hooks/useAlive';\nimport { useMessageEdit } from '$hooks/useMessageEdit';\nimport { useDocumentFocusChange } from '$hooks/useDocumentFocusChange';\nimport { useIsInactivePanel } from '$hooks/useRoom';\nimport { markAsRead } from '$utils/notifications';\nimport { isWindowFocused } from '$utils/dom';\nimport { today, yesterday, timeDayMonthYear } from '$utils/time';\nimport {\n  unwrapRelationJumpTarget,\n  isEditEvent,\n  isReactionEvent,\n  isRedactableMessageType,\n  isMembershipChanged,\n  isThreadRelationEvent,\n  getRedactionTargetEvent,\n  shouldShowRedactionTimelineEvent,\n} from '$utils/room/relations';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { useSlidingSyncRoomLoading } from '$hooks/useSlidingSyncActiveRoom';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { showToast } from '$state/toast';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { useIgnoredUsers } from '$hooks/useIgnoredUsers';\nimport { useImagePackRooms } from '$hooks/useImagePackRooms';\nimport { settingsAtom, MessageLayout, type MessageSpacing } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { roomIdToReplyDraftAtomFamily } from '$state/room/roomInputDrafts';\nimport { roomIdToOpenThreadAtomFamily } from '$state/room/roomToOpenThread';\nimport {\n  getRoomUnreadInfo,\n  getEventTimeline,\n  getDisplayedEventTimeline,\n  getFirstLinkedTimeline,\n  getEventIdAbsoluteIndex,\n  isNewestLiveEvent,\n} from '$utils/timeline';\nimport { useTimelineSync } from '$hooks/timeline/useTimelineSync';\nimport { useTimelineActions } from '$hooks/timeline/useTimelineActions';\nimport {\n  useProcessedTimeline,\n  getProcessedRowIndexForRawTimelineIndex,\n  STANDARD_RENDERED_EVENT_TYPES,\n  type ProcessedEvent,\n} from '$hooks/timeline/useProcessedTimeline';\nimport { useTimelineEventRenderer } from '$hooks/timeline/useTimelineEventRenderer';\nimport { RoomMediaViewer } from '$components/image-viewer/RoomMediaViewer';\nimport type { RoomMediaItem } from '$components/image-viewer/RoomMediaViewer';\nimport type { IImageContent } from '$types/matrix/common';\nimport { useTimelineRendererContext } from '$hooks/timeline/useTimelineRendererContext';\nimport { useUrlPreviewPrefetch } from '$hooks/timeline/useUrlPreviewPrefetch';\nimport { TimelineScrollingProvider, useScrollActivity } from '$hooks/useTimelineScrollActivity';\nimport * as css from './RoomTimeline.css';\nimport type { Persona } from '$app/persona';\n\nconst MAX_VIEWPORT_FILL_PAGINATIONS = 5;\nconst VIRTUA_SCROLL_SETTLE_MS = 200;\nconst FOCUSED_PAGINATION_EDGE_PX = 64;\nconst SCROLL_KEYS = new Set(['PageUp', 'PageDown', 'Home', 'End', 'ArrowUp', 'ArrowDown', ' ']);\n\nconst TimelineFloat = as<'div', css.TimelineFloatVariants>(\n  ({ position, className, ...props }, ref) => (\n    <Box\n      className={classNames(css.TimelineFloat({ position }), className)}\n      justifyContent=\"Center\"\n      alignItems=\"Center\"\n      gap=\"200\"\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nconst TimelineDivider = as<'div', { variant?: ContainerColor | 'Inherit' }>(\n  ({ variant, children, ...props }, ref) => (\n    <Box gap=\"100\" justifyContent=\"Center\" alignItems=\"Center\" {...props} ref={ref}>\n      <Line style={{ flexGrow: 1 }} variant={variant} size=\"300\" />\n      {children}\n      <Line style={{ flexGrow: 1 }} variant={variant} size=\"300\" />\n    </Box>\n  )\n);\n\nconst getDayDividerText = (ts: number) => {\n  if (today(ts)) return 'Today';\n  if (yesterday(ts)) return 'Yesterday';\n  return timeDayMonthYear(ts);\n};\n\nconst focusItemAffectsEvent = (focusItem: unknown, eventData: ProcessedEvent | undefined) => {\n  if (!focusItem || typeof focusItem !== 'object' || !eventData) return false;\n  const focusEventId = 'eventId' in focusItem ? focusItem.eventId : undefined;\n  return typeof focusEventId === 'string' && focusEventId === eventData.id;\n};\n\nconst eventIdAffectsEvent = (eventId: string | null | undefined, eventData?: ProcessedEvent) =>\n  typeof eventId === 'string' && eventId === eventData?.id;\n\nconst shallowEqual = (prev: Record<string, unknown>, next: Record<string, unknown>) => {\n  if (prev === next) return true;\n  if (Object.keys(prev).length !== Object.keys(next).length) return false;\n  for (const key in prev) {\n    if (prev[key] !== next[key]) return false;\n  }\n  return true;\n};\n\nconst MemoizedTimelineItem = memo(\n  function MemoizedTimelineItem({\n    eventData,\n    index,\n    showLoadingPlaceholders,\n    canPaginateBack,\n    backPaginationJSX,\n    room,\n    messageLayout,\n    messageSpacing,\n    renderMatrixEvent,\n  }: {\n    eventData: ProcessedEvent | undefined;\n    index: number;\n    showLoadingPlaceholders: boolean;\n    canPaginateBack: boolean;\n    backPaginationJSX: ReactNode | undefined;\n    room: Room;\n    messageLayout: MessageLayout;\n    messageSpacing: MessageSpacing;\n    settings: Record<string, unknown>;\n    permissions: Record<string, unknown>;\n    renderMatrixEvent: ReturnType<typeof useTimelineEventRenderer>;\n    focusItem: unknown;\n    editId: string | undefined;\n    activeReplyId: string | undefined | null;\n    openThreadId: string | undefined;\n  }) {\n    if (showLoadingPlaceholders) {\n      return (\n        <MessageBase key={`placeholder-${index}`}>\n          {messageLayout === MessageLayout.Compact ? (\n            <CompactPlaceholder />\n          ) : (\n            <DefaultPlaceholder />\n          )}\n        </MessageBase>\n      );\n    }\n\n    if (!eventData) {\n      if (index === 0 && !canPaginateBack) {\n        return (\n          <Fragment key=\"intro-and-first\">\n            {backPaginationJSX}\n            <div\n              style={{\n                padding: `${config.space.S700} ${config.space.S400} ${config.space.S600} ${messageLayout === MessageLayout.Compact ? config.space.S400 : toRem(64)}`,\n              }}\n            >\n              <RoomIntro room={room} />\n            </div>\n          </Fragment>\n        );\n      }\n      if (index === 0) return <Fragment key=\"first\">{backPaginationJSX}</Fragment>;\n      return <Fragment key={index} />;\n    }\n\n    const renderedEvent = renderMatrixEvent(\n      eventData.mEvent.getType(),\n      typeof eventData.mEvent.getStateKey() === 'string',\n      eventData.id,\n      eventData.mEvent,\n      eventData.itemIndex,\n      eventData.timelineSet,\n      eventData.collapsed\n    );\n\n    const showDividers = renderedEvent !== null;\n\n    const dividers = showDividers ? (\n      <>\n        {eventData.willRenderDayDivider && (\n          <MessageBase space={messageSpacing}>\n            <TimelineDivider variant=\"Surface\">\n              <Badge as=\"span\" size=\"500\" variant=\"Secondary\" fill=\"None\" radii=\"300\">\n                <Text size=\"L400\">{getDayDividerText(eventData.mEvent.getTs())}</Text>\n              </Badge>\n            </TimelineDivider>\n          </MessageBase>\n        )}\n        {eventData.willRenderNewDivider && (\n          <MessageBase space={messageSpacing}>\n            <TimelineDivider style={{ color: color.Success.Main }} variant=\"Inherit\">\n              <Badge as=\"span\" size=\"500\" variant=\"Success\" fill=\"Solid\" radii=\"300\">\n                <Text size=\"L400\">New Messages</Text>\n              </Badge>\n            </TimelineDivider>\n          </MessageBase>\n        )}\n      </>\n    ) : null;\n\n    if (index === 0) {\n      return (\n        <Fragment key=\"first-item-block\">\n          {!canPaginateBack && (\n            <div\n              style={{\n                padding: `${config.space.S700} ${config.space.S400} ${config.space.S600} ${messageLayout === MessageLayout.Compact ? config.space.S400 : toRem(64)}`,\n              }}\n            >\n              <RoomIntro room={room} />\n            </div>\n          )}\n          {backPaginationJSX}\n          {dividers}\n          {renderedEvent}\n        </Fragment>\n      );\n    }\n\n    return (\n      <Fragment key={eventData.id}>\n        {dividers}\n        {renderedEvent}\n      </Fragment>\n    );\n  },\n  (prev, next) => {\n    if (prev.index !== next.index) return false;\n    if (prev.showLoadingPlaceholders !== next.showLoadingPlaceholders) return false;\n    if (prev.canPaginateBack !== next.canPaginateBack) return false;\n    if (prev.room !== next.room) return false;\n    if (prev.messageLayout !== next.messageLayout) return false;\n    if (prev.messageSpacing !== next.messageSpacing) return false;\n    if (prev.renderMatrixEvent !== next.renderMatrixEvent) return false;\n\n    // Shallow compare settings and permissions since both hold primitive toggles\n    if (!shallowEqual(prev.settings, next.settings)) return false;\n    if (!shallowEqual(prev.permissions, next.permissions)) return false;\n\n    if (\n      prev.focusItem !== next.focusItem &&\n      (focusItemAffectsEvent(prev.focusItem, prev.eventData) ||\n        focusItemAffectsEvent(next.focusItem, next.eventData))\n    )\n      return false;\n    if (\n      prev.editId !== next.editId &&\n      (eventIdAffectsEvent(prev.editId, prev.eventData) ||\n        eventIdAffectsEvent(next.editId, next.eventData))\n    )\n      return false;\n    if (\n      prev.activeReplyId !== next.activeReplyId &&\n      (eventIdAffectsEvent(prev.activeReplyId, prev.eventData) ||\n        eventIdAffectsEvent(next.activeReplyId, next.eventData))\n    )\n      return false;\n    if (\n      prev.openThreadId !== next.openThreadId &&\n      (eventIdAffectsEvent(prev.openThreadId, prev.eventData) ||\n        eventIdAffectsEvent(next.openThreadId, next.eventData))\n    )\n      return false;\n\n    if (prev.index === 0 && prev.backPaginationJSX !== next.backPaginationJSX) return false;\n\n    if (prev.eventData === next.eventData) return true;\n    if (!prev.eventData || !next.eventData) return false;\n\n    return (\n      prev.eventData.id === next.eventData.id &&\n      // A filtered mid-timeline insert shifts this without changing `index`.\n      prev.eventData.itemIndex === next.eventData.itemIndex &&\n      prev.eventData.isRedacted === next.eventData.isRedacted &&\n      prev.eventData.collapsed === next.eventData.collapsed &&\n      prev.eventData.willRenderNewDivider === next.eventData.willRenderNewDivider &&\n      prev.eventData.willRenderDayDivider === next.eventData.willRenderDayDivider &&\n      prev.eventData.mEvent === next.eventData.mEvent &&\n      prev.eventData.eventSender === next.eventData.eventSender &&\n      prev.eventData.editId === next.eventData.editId &&\n      prev.eventData.reactionsKey === next.eventData.reactionsKey &&\n      prev.eventData.content === next.eventData.content &&\n      prev.eventData.sendStatus === next.eventData.sendStatus\n    );\n  }\n);\nexport type RoomTimelineProps = {\n  room: Room;\n  eventId?: string;\n  editor: ProseMirrorEditorController;\n  onEditorReset?: () => void;\n  onEditLastMessageRef?: React.MutableRefObject<(() => void) | undefined>;\n  editId?: string;\n  onEditId?: (editId?: string) => void;\n};\n\nconst getRoomMediaItem = (\n  mEvent: MatrixEvent,\n  room: Room,\n  nicknames?: Record<string, string>\n): RoomMediaItem | undefined => {\n  if (mEvent.isRedacted()) return undefined;\n\n  const content = mEvent.getContent() as IImageContent;\n  const isImage = content.msgtype === MsgType.Image || mEvent.getType() === 'm.sticker';\n  const url = content.file?.url ?? content.url;\n  const eventId = mEvent.getId();\n\n  if (!isImage || typeof url !== 'string' || !eventId) return undefined;\n\n  const senderId = mEvent.getSender();\n\n  return {\n    eventId,\n    body: content.body ?? content.filename ?? 'Image',\n    filename: content.filename,\n    url,\n    info: content.info,\n    mimeType: content.info?.mimetype,\n    encInfo: content.file,\n    sender: senderId ? (getMemberDisplayName(room, senderId, nicknames) ?? senderId) : undefined,\n    timestamp: mEvent.getTs(),\n  };\n};\n\nexport function RoomTimeline({\n  room,\n  eventId,\n  editor,\n  onEditorReset,\n  onEditLastMessageRef,\n  editId: propsEditId,\n  onEditId: propsOnEditId,\n}: Readonly<RoomTimelineProps>) {\n  const mx = useMatrixClient();\n  const isMobile = useScreenSizeOptionally() === ScreenSize.Mobile;\n  const alive = useAlive();\n  const roomSyncLoading = useSlidingSyncRoomLoading(room.roomId);\n\n  const internalEdit = useMessageEdit(editor, { onReset: onEditorReset, alive });\n  const editId = propsOnEditId ? propsEditId : internalEdit.editId;\n  const handleEdit = propsOnEditId ?? internalEdit.handleEdit;\n  const { navigateRoom } = useRoomNavigate();\n  const isInactivePanel = useIsInactivePanel();\n  const isInactivePanelRef = useRef(isInactivePanel);\n  isInactivePanelRef.current = isInactivePanel;\n\n  // Shared renderer context — replaces 17+ inline useSetting calls, linkifyOpts,\n  // htmlReactParserOptions, and the permissions block that were duplicated with\n  // ThreadDrawer character-for-character.\n  const rendererCtx = useTimelineRendererContext(room);\n\n  // RoomTimeline keeps these 3 extra settings inline:\n  //   - hideMembershipEvents & hideNickAvatarEvents → already in rendererCtx.settings\n  //   - reducedMotion → used only for scroll logic, NOT passed to the event renderer\n  const [reducedMotion] = useSetting(settingsAtom, 'reducedMotion');\n\n  // Destructure what we need from the shared context\n  const {\n    settings,\n    linkifyOpts,\n    htmlReactParserOptions,\n    permissions: {\n      canRedact,\n      canDeleteOwn,\n      canSendReaction,\n      canPinEvent,\n      isReadOnly,\n      getMemberPowerTag,\n      parseMemberEvent,\n    },\n  } = rendererCtx;\n\n  const hiddenEvents = settings.hiddenEvents;\n  const messageLayout = settings.messageLayout;\n  const messageSpacing = settings.messageSpacing;\n  const hideReads = settings.hideReads;\n  const hideMembershipEvents = settings.hideMembershipEvents;\n  const hideNickAvatarEvents = settings.hideNickAvatarEvents;\n  const hideMemberInReadOnly = settings.hideMemberInReadOnly;\n\n  const nicknames = useAtomValue(nicknamesAtom);\n  const jotaiStore = useStore();\n  const getGlobalProfile = useCallback(\n    (userId: string) => jotaiStore.get(profilesCacheAtom)[userId],\n    [jotaiStore]\n  );\n  const ignoredUsersList = useIgnoredUsers();\n  const ignoredUsersSet = useMemo(() => new Set(ignoredUsersList), [ignoredUsersList]);\n\n  const [unreadInfo, setUnreadInfo] = useState(() => getRoomUnreadInfo(room, true));\n  const unreadScrollToRef = useRef(unreadInfo?.scrollTo === true);\n  unreadScrollToRef.current = unreadInfo?.scrollTo === true;\n\n  const readUptoEventIdRef = useRef<string | undefined>(undefined);\n  if (unreadInfo) readUptoEventIdRef.current = unreadInfo.readUptoEventId;\n  const hideReadsRef = useRef(hideReads);\n  hideReadsRef.current = hideReads;\n\n  const scrollAnchorRef = useRef<string | undefined>(undefined);\n  const messageListRef = useRef<HTMLDivElement>(null);\n\n  const openUserRoomProfile = useOpenUserRoomProfile();\n  const optionalSpace = useSpaceOptionally();\n  const roomParents = useAtomValue(roomToParentsAtom);\n  const imagePackRooms = useImagePackRooms(room.roomId, roomParents);\n  const pushProcessor = mx.pushProcessor;\n\n  const replyDraftAtom = useMemo(() => roomIdToReplyDraftAtomFamily(room.roomId), [room.roomId]);\n  const activeReplyDraft = useAtomValue(replyDraftAtom);\n  const setReplyDraft = useSetAtom(replyDraftAtom);\n  const activeReplyId = activeReplyDraft?.eventId;\n\n  const openThreadAtom = useMemo(() => roomIdToOpenThreadAtomFamily(room.roomId), [room.roomId]);\n  const openThreadId = useAtomValue(openThreadAtom);\n  const setOpenThread = useSetAtom(openThreadAtom);\n\n  const vListRef = useRef<VListHandle>(null);\n  const { isScrolling: isTimelineScrolling, notifyScroll } = useScrollActivity();\n  const [atBottomState, setAtBottomState] = useState(true);\n  const atBottomRef = useRef(atBottomState);\n  const setAtBottom = useCallback((val: boolean) => {\n    setAtBottomState(val);\n    atBottomRef.current = val;\n  }, []);\n\n  const syncAtBottom = useCallback(\n    (offset?: number) => {\n      const v = vListRef.current;\n      if (!v) return;\n      const scrollTop = offset ?? v.scrollOffset;\n      let isNowAtBottom = v.scrollSize - scrollTop - v.viewportSize < 100;\n      if (isNowAtBottom && !atBottomRef.current && timelineSyncRef.current.focusItem) {\n        isNowAtBottom = false;\n      }\n      if (isNowAtBottom !== atBottomRef.current) setAtBottom(isNowAtBottom);\n    },\n    [setAtBottom]\n  );\n\n  const [topSpacerHeight, setTopSpacerHeight] = useState(0);\n\n  const topSpacerHeightRef = useRef(0);\n  const mountScrollWindowRef = useRef<number>(Date.now() + 3000);\n  const hasInitialScrolledRef = useRef(false);\n  const initialScrollTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const initialScrollCancelledRef = useRef(false);\n  const hasUserScrollIntentRef = useRef(false);\n  const focusedPaginationIntentRef = useRef<'backward' | 'forward' | undefined>(undefined);\n  const touchStartYRef = useRef<number | undefined>(undefined);\n  const pendingReadyRef = useRef(false);\n  const currentRoomIdRef = useRef(room.roomId);\n\n  const [isReady, setIsReady] = useState(false);\n\n  if (currentRoomIdRef.current !== room.roomId) {\n    hasInitialScrolledRef.current = false;\n    mountScrollWindowRef.current = Date.now() + 3000;\n    currentRoomIdRef.current = room.roomId;\n    initialScrollCancelledRef.current = false;\n    hasUserScrollIntentRef.current = false;\n    focusedPaginationIntentRef.current = undefined;\n    touchStartYRef.current = undefined;\n    pendingReadyRef.current = false;\n    if (initialScrollTimerRef.current !== undefined) {\n      clearTimeout(initialScrollTimerRef.current);\n      initialScrollTimerRef.current = undefined;\n    }\n    setIsReady(false);\n  }\n\n  const processedEventsRef = useRef<ProcessedEvent[]>([]);\n  const timelineSyncRef = useRef<typeof timelineSync>(null as unknown as typeof timelineSync);\n\n  const scrollElRef = useRef<HTMLElement | null>(null);\n  const [scrollElementVersion, setScrollElementVersion] = useState(0);\n\n  const scrollToBottom = useCallback(\n    (behavior: 'instant' | 'smooth' = 'instant') => {\n      const v = vListRef.current;\n      const lastIndex = processedEventsRef.current.length - 1;\n      if (!v || lastIndex < 0) return;\n\n      const scrollEl = scrollElRef.current;\n      let offset = 0;\n      if (scrollEl) {\n        const target = v.getItemOffset(lastIndex) + v.getItemSize(lastIndex) - v.viewportSize;\n        offset = Math.max(0, scrollEl.scrollHeight - scrollEl.clientHeight - target);\n      }\n\n      v.scrollToIndex(lastIndex, {\n        align: 'end',\n        offset,\n        smooth: behavior === 'smooth' && !reducedMotion,\n      });\n    },\n    [reducedMotion]\n  );\n\n  useLayoutEffect(() => {\n    const messageListEl = messageListRef.current;\n    if (!messageListEl) return () => {};\n\n    const resolveScrollElement = () => {\n      const scrollEl = messageListEl.firstElementChild;\n      const nextScrollEl = scrollEl instanceof HTMLElement ? scrollEl : null;\n      if (nextScrollEl === scrollElRef.current) return;\n      scrollElRef.current = nextScrollEl;\n      setScrollElementVersion((version) => version + 1);\n    };\n\n    resolveScrollElement();\n    const observer = new MutationObserver(resolveScrollElement);\n    observer.observe(messageListEl, { childList: true });\n    return () => observer.disconnect();\n  }, []);\n\n  const jumpToEvent = useCallback(\n    (id: string) => {\n      setAtBottom(false);\n      scrollAnchorRef.current = id;\n      void timelineSyncRef.current.loadEventTimeline(id);\n    },\n    [setAtBottom]\n  );\n  const handleJumpError = useCallback(() => {\n    scrollAnchorRef.current = undefined;\n    setAtBottom(true);\n    showToast('Unable to load this message.');\n  }, [setAtBottom]);\n  const handleReturnToLive = useCallback(() => {\n    scrollAnchorRef.current = undefined;\n    if (eventId) navigateRoom(room.roomId, undefined, { replace: true });\n    setAtBottom(true);\n  }, [eventId, navigateRoom, room.roomId, setAtBottom]);\n\n  const timelineSync = useTimelineSync({\n    room,\n    mx,\n    eventId,\n    isAtBottom: atBottomState,\n    isAtBottomRef: atBottomRef,\n    scrollToBottom,\n    unreadInfo,\n    setUnreadInfo,\n    hideReadsRef,\n    readUptoEventIdRef,\n    isInactivePanelRef,\n    onJumpError: handleJumpError,\n    onReturnToLive: handleReturnToLive,\n    isEventVisible: useCallback(\n      (mEvent: MatrixEvent, timelineSet: EventTimelineSet) => {\n        const sender = mEvent.getSender();\n        if (sender && ignoredUsersSet.has(sender)) return false;\n\n        const type = mEvent.getType();\n        const isEdit = isEditEvent(mEvent);\n        const isReaction = isReactionEvent(mEvent);\n        const isRedactionEvt = mEvent.isRedaction();\n\n        if (hideMemberInReadOnly && isReadOnly) {\n          if (isReaction) return false;\n          if (\n            isRedactionEvt &&\n            getRedactionTargetEvent(timelineSet, mEvent)?.getType() ===\n              (EventType.Reaction as string)\n          ) {\n            return false;\n          }\n        }\n\n        if (mEvent.isRedacted()) {\n          const showMessageTombstone =\n            hiddenEvents.showTombstoneEvents && isRedactableMessageType(type);\n          const showReactionTombstone = hiddenEvents.hiddenEventReactionTombstone && isReaction;\n          if (!showMessageTombstone && !showReactionTombstone) return false;\n        }\n\n        if (type === 'm.room.member') {\n          const membershipChanged = isMembershipChanged(mEvent);\n          if (hideMemberInReadOnly && isReadOnly) return false;\n          if (membershipChanged && hideMembershipEvents) return false;\n          if (!membershipChanged && hideNickAvatarEvents) return false;\n        }\n\n        const allowSpecificHiddenEvent =\n          (isEdit && hiddenEvents.hiddenEventEdits) ||\n          (isReaction && !mEvent.isRedacted() && hiddenEvents.hiddenEventReactions) ||\n          (isReaction && mEvent.isRedacted() && hiddenEvents.hiddenEventReactionTombstone) ||\n          (isRedactionEvt &&\n            shouldShowRedactionTimelineEvent(\n              mEvent,\n              timelineSet,\n              hiddenEvents.hiddenEventRedactionTimeline,\n              hiddenEvents.hiddenEventReactionRedactionTimeline\n            ));\n\n        if (!(hiddenEvents.showHiddenEvents && hiddenEvents.hiddenEventOther)) {\n          const isStandardRendered = STANDARD_RENDERED_EVENT_TYPES.has(type);\n          if (!isStandardRendered && !allowSpecificHiddenEvent) {\n            return false;\n          }\n        }\n\n        const threadRootId = mEvent.threadRootId;\n        if (\n          threadRootId !== undefined &&\n          threadRootId !== mEvent.getId() &&\n          isThreadRelationEvent(mEvent, threadRootId)\n        ) {\n          return false;\n        }\n\n        if (isEdit && !hiddenEvents.hiddenEventEdits) return false;\n        if (isReaction) {\n          if (mEvent.isRedacted()) {\n            if (!hiddenEvents.hiddenEventReactionTombstone) return false;\n          } else if (!hiddenEvents.hiddenEventReactions) {\n            return false;\n          }\n        }\n        if (\n          isRedactionEvt &&\n          !shouldShowRedactionTimelineEvent(\n            mEvent,\n            timelineSet,\n            hiddenEvents.hiddenEventRedactionTimeline,\n            hiddenEvents.hiddenEventReactionRedactionTimeline\n          )\n        ) {\n          return false;\n        }\n\n        return true;\n      },\n      [\n        hiddenEvents,\n        hideMemberInReadOnly,\n        isReadOnly,\n        hideMembershipEvents,\n        hideNickAvatarEvents,\n        ignoredUsersSet,\n      ]\n    ),\n  });\n\n  timelineSyncRef.current = timelineSync;\n  const focusLiveTimeline = timelineSync.focusLiveTimeline;\n\n  const eventsLengthRef = useRef(timelineSync.eventsLength);\n  eventsLengthRef.current = timelineSync.eventsLength;\n\n  const canPaginateBackRef = useRef(timelineSync.canPaginateBack);\n  canPaginateBackRef.current = timelineSync.canPaginateBack;\n  const viewportFillCountRef = useRef(0);\n\n  const liveTimelineLinkedRef = useRef(timelineSync.liveTimelineLinked);\n  liveTimelineLinkedRef.current = timelineSync.liveTimelineLinked;\n\n  const backwardStatusRef = useRef(timelineSync.backwardStatus);\n  backwardStatusRef.current = timelineSync.backwardStatus;\n\n  const forwardStatusRef = useRef(timelineSync.forwardStatus);\n  forwardStatusRef.current = timelineSync.forwardStatus;\n\n  const canPaginateForwardRef = useRef(timelineSync.canPaginateForward);\n  canPaginateForwardRef.current = timelineSync.canPaginateForward;\n\n  const scrollOwner: 'live' | 'event' =\n    eventId !== undefined ||\n    timelineSync.focusItem !== undefined ||\n    !timelineSync.liveTimelineLinked\n      ? 'event'\n      : 'live';\n  const scrollOwnerRef = useRef(scrollOwner);\n  scrollOwnerRef.current = scrollOwner;\n\n  const resolveFocusRowIndex = useCallback((focusEventId: string): number | undefined => {\n    const events = processedEventsRef.current;\n    const rowIndex = events.findIndex((e) => e.id === focusEventId);\n    if (rowIndex >= 0) return rowIndex;\n\n    const linkedTimelines = timelineSyncRef.current.timeline.linkedTimelines;\n    const evtTimeline = getDisplayedEventTimeline(linkedTimelines, focusEventId);\n    if (!evtTimeline) return undefined;\n    const rawIndex = getEventIdAbsoluteIndex(linkedTimelines, evtTimeline, focusEventId);\n    if (rawIndex === undefined) return undefined;\n    return getProcessedRowIndexForRawTimelineIndex(events, rawIndex)?.rowIndex;\n  }, []);\n\n  const restoreScrollAnchor = useCallback(() => {\n    const anchorId = scrollAnchorRef.current;\n    if (!anchorId) return;\n    const index = resolveFocusRowIndex(anchorId);\n    if (index !== undefined) vListRef.current?.scrollToIndex(index, { align: 'center' });\n  }, [resolveFocusRowIndex]);\n\n  const restoreScrollPosition = useCallback(() => {\n    if (scrollAnchorRef.current !== undefined) {\n      restoreScrollAnchor();\n      return;\n    }\n    if (atBottomRef.current && processedEventsRef.current.length > 0) scrollToBottom();\n  }, [restoreScrollAnchor, scrollToBottom]);\n\n  useLayoutEffect(() => {\n    if (!eventId) return;\n    if (initialScrollTimerRef.current !== undefined) {\n      clearTimeout(initialScrollTimerRef.current);\n      initialScrollTimerRef.current = undefined;\n    }\n    pendingReadyRef.current = false;\n  }, [eventId]);\n\n  useLayoutEffect(() => {\n    if (\n      scrollOwner === 'live' &&\n      !hasInitialScrolledRef.current &&\n      timelineSync.eventsLength > 0 &&\n      timelineSync.liveTimelineLinked &&\n      vListRef.current\n    ) {\n      initialScrollCancelledRef.current = false;\n      scrollToBottom();\n      initialScrollTimerRef.current = setTimeout(() => {\n        initialScrollTimerRef.current = undefined;\n        if (initialScrollCancelledRef.current) return;\n        if (unreadScrollToRef.current) {\n          setIsReady(true);\n          return;\n        }\n        if (processedEventsRef.current.length > 0) {\n          scrollToBottom();\n          requestAnimationFrame(() => {\n            if (initialScrollCancelledRef.current) return;\n            if (processedEventsRef.current.length > 0) {\n              scrollToBottom();\n              setIsReady(true);\n            } else {\n              pendingReadyRef.current = true;\n            }\n          });\n        } else {\n          pendingReadyRef.current = true;\n        }\n      }, 80);\n      hasInitialScrolledRef.current = true;\n    }\n  }, [\n    timelineSync.eventsLength,\n    timelineSync.liveTimelineLinked,\n    scrollOwner,\n    room.roomId,\n    scrollToBottom,\n  ]);\n\n  useEffect(\n    () => () => {\n      if (initialScrollTimerRef.current !== undefined) clearTimeout(initialScrollTimerRef.current);\n    },\n    []\n  );\n\n  useLayoutEffect(() => {\n    if (!isReady) return;\n    if (timelineSync.eventsLength > 0) return;\n    setIsReady(false);\n    hasInitialScrolledRef.current = false;\n  }, [isReady, timelineSync.eventsLength]);\n\n  const recalcTopSpacer = useCallback(() => {\n    const v = vListRef.current;\n    if (!v) return;\n    const prev = topSpacerHeightRef.current;\n\n    const newH = Math.max(0, v.viewportSize - v.scrollSize + prev);\n    if (Math.abs(prev - newH) > 2) {\n      topSpacerHeightRef.current = newH;\n      setTopSpacerHeight(newH);\n      if (prev > 0 && newH === 0 && processedEventsRef.current.length > 0) {\n        requestAnimationFrame(restoreScrollPosition);\n      }\n    }\n  }, [restoreScrollPosition]);\n\n  useLayoutEffect(() => {\n    const id = requestAnimationFrame(recalcTopSpacer);\n    return () => cancelAnimationFrame(id);\n  }, [recalcTopSpacer, timelineSync.eventsLength]);\n\n  const prevBackwardStatusRef = useRef(timelineSync.backwardStatus);\n  const wasAtBottomBeforePaginationRef = useRef(false);\n\n  useLayoutEffect(() => {\n    const prev = prevBackwardStatusRef.current;\n    prevBackwardStatusRef.current = timelineSync.backwardStatus;\n    if (timelineSync.backwardStatus === 'loading') {\n      wasAtBottomBeforePaginationRef.current = atBottomRef.current;\n    } else if (\n      prev === 'loading' &&\n      timelineSync.backwardStatus === 'idle' &&\n      !timelineSync.backwardError\n    ) {\n      if (scrollOwnerRef.current === 'event' && scrollAnchorRef.current !== undefined) {\n        restoreScrollAnchor();\n      } else if (wasAtBottomBeforePaginationRef.current) scrollToBottom();\n    }\n  }, [\n    timelineSync.backwardStatus,\n    timelineSync.backwardError,\n    restoreScrollAnchor,\n    scrollToBottom,\n  ]);\n\n  useEffect(() => {\n    if (!timelineSync.focusItem?.scrollTo || !vListRef.current) return;\n    const processedIndex = resolveFocusRowIndex(timelineSync.focusItem.eventId);\n    if (processedIndex === undefined) return;\n\n    const landedId = processedEventsRef.current[processedIndex]?.id;\n    const isLiveEnd =\n      landedId === timelineSync.focusItem.eventId &&\n      isNewestLiveEvent(room, timelineSync.focusItem.eventId) &&\n      getEventTimeline(room, timelineSync.focusItem.eventId) === room.getLiveTimeline() &&\n      timelineSync.liveTimelineLinked &&\n      processedIndex === processedEventsRef.current.length - 1;\n    if (isLiveEnd) {\n      scrollAnchorRef.current = undefined;\n      setAtBottom(true);\n      scrollToBottom();\n      if (eventId === timelineSync.focusItem.eventId) {\n        navigateRoom(room.roomId, undefined, { replace: true });\n      }\n      timelineSyncRef.current.setFocusItem(undefined);\n      return;\n    }\n\n    scrollAnchorRef.current = landedId ?? timelineSync.focusItem.eventId;\n    if (landedId && landedId !== timelineSync.focusItem.eventId) {\n      timelineSyncRef.current.setFocusItem((prev) =>\n        prev ? { ...prev, eventId: landedId, scrollTo: true } : undefined\n      );\n    }\n    vListRef.current.scrollToIndex(processedIndex, { align: 'center' });\n    const replayId = setTimeout(() => {\n      if (timelineSyncRef.current.focusItem?.scrollTo) restoreScrollAnchor();\n    }, VIRTUA_SCROLL_SETTLE_MS);\n    return () => clearTimeout(replayId);\n  }, [\n    timelineSync.focusItem,\n    timelineSync.eventsLength,\n    timelineSync.liveTimelineLinked,\n    eventId,\n    navigateRoom,\n    resolveFocusRowIndex,\n    room,\n    restoreScrollAnchor,\n    scrollToBottom,\n    setAtBottom,\n  ]);\n\n  useEffect(() => {\n    if (!timelineSync.focusItem) return undefined;\n    const timeoutId = setTimeout(() => {\n      timelineSyncRef.current.setFocusItem(undefined);\n    }, 2000);\n    return () => clearTimeout(timeoutId);\n  }, [timelineSync.focusItem]);\n\n  useEffect(() => {\n    if (timelineSync.focusItem || timelineSync.jumpFailed) {\n      setIsReady(true);\n    }\n  }, [timelineSync.focusItem, timelineSync.jumpFailed]);\n\n  useEffect(() => {\n    if (!eventId) return;\n    if (!timelineSyncRef.current.jumpFailed) setIsReady(false);\n    jumpToEvent(eventId);\n  }, [eventId, room, jumpToEvent]);\n\n  const previousEventIdRef = useRef(eventId);\n  useEffect(() => {\n    const previousEventId = previousEventIdRef.current;\n    previousEventIdRef.current = eventId;\n    if (previousEventId === undefined || eventId !== undefined) return;\n\n    scrollAnchorRef.current = undefined;\n    focusLiveTimeline();\n    setAtBottom(true);\n  }, [eventId, focusLiveTimeline, setAtBottom]);\n\n  useEffect(() => {\n    if (eventId) return;\n    if (isReady) return;\n    const { readUptoEventId, inLiveTimeline, scrollTo } = unreadInfo ?? {};\n    if (readUptoEventId && inLiveTimeline && scrollTo) {\n      const evtTimeline = getEventTimeline(room, readUptoEventId);\n      const absoluteIndex = evtTimeline\n        ? getEventIdAbsoluteIndex(\n            timelineSync.timeline.linkedTimelines,\n            evtTimeline,\n            readUptoEventId\n          )\n        : undefined;\n\n      if (absoluteIndex !== undefined) {\n        const rows = processedEventsRef.current;\n        const exactRow = rows.findIndex((e) => e.id === readUptoEventId);\n        const processedIndex =\n          exactRow >= 0\n            ? exactRow\n            : getProcessedRowIndexForRawTimelineIndex(rows, absoluteIndex)?.rowIndex;\n        if (processedIndex !== undefined && vListRef.current) {\n          vListRef.current.scrollToIndex(processedIndex, { align: 'start' });\n          setAtBottom(false);\n        }\n        unreadScrollToRef.current = false;\n        setUnreadInfo((prev) => (prev ? { ...prev, scrollTo: false } : prev));\n      }\n    }\n  }, [room, unreadInfo, timelineSync.timeline.linkedTimelines, eventId, isReady, setAtBottom]);\n\n  useEffect(() => {\n    const el = messageListRef.current;\n    if (!el) return () => {};\n\n    const contentEl = scrollElRef.current?.firstElementChild;\n    let contentObserver: ResizeObserver | undefined;\n    if (contentEl) {\n      contentObserver = new ResizeObserver(() => {\n        if (scrollOwnerRef.current === 'live' && atBottomRef.current) scrollToBottom();\n        syncAtBottom();\n      });\n      contentObserver.observe(contentEl);\n    }\n\n    const observer = new ResizeObserver(() => {\n      if (scrollOwnerRef.current === 'live' && atBottomRef.current) scrollToBottom();\n      syncAtBottom();\n    });\n\n    observer.observe(el);\n    return () => {\n      observer.disconnect();\n      contentObserver?.disconnect();\n    };\n  }, [scrollElementVersion, scrollToBottom, syncAtBottom]);\n\n  const actions = useTimelineActions({\n    room,\n    mx,\n    editor,\n    nicknames,\n    getGlobalProfile,\n    spaceId: optionalSpace?.roomId,\n    openUserRoomProfile: openUserRoomProfile as unknown as (\n      roomId: string,\n      spaceId: string | undefined,\n      userId: string,\n      pmp: Persona | undefined,\n      rect: DOMRect,\n      undefinedArg?: undefined,\n      options?: unknown\n    ) => void,\n    activeReplyId,\n    setReplyDraft: setReplyDraft as unknown as (draft: unknown) => void,\n    openThreadId,\n    setOpenThread: setOpenThread as unknown as (threadId: string | undefined) => void,\n    handleEdit,\n    handleOpenEvent: (id) => {\n      const anchorId = unwrapRelationJumpTarget(room, id);\n      let resolvedId = anchorId;\n      let processedIndex = resolveFocusRowIndex(anchorId);\n      if (processedIndex === undefined && anchorId !== id) {\n        resolvedId = id;\n        processedIndex = resolveFocusRowIndex(id);\n      }\n\n      if (processedIndex !== undefined) {\n        timelineSync.cancelEventTimelineLoad();\n        setAtBottom(false);\n        if (vListRef.current) {\n          vListRef.current.scrollToIndex(processedIndex, { align: 'center' });\n        }\n        const landedId = processedEventsRef.current[processedIndex]?.id ?? resolvedId;\n        scrollAnchorRef.current = landedId;\n        timelineSync.setFocusItem({ eventId: landedId, scrollTo: false, highlight: true });\n      } else {\n        jumpToEvent(anchorId);\n      }\n    },\n  });\n\n  // renderMatrixEvent keeps a stable identity and reads these through a ref, so\n  // the row memo has to compare them itself to notice a power-level change.\n  const rowPermissions = { canRedact, canDeleteOwn, canSendReaction, canPinEvent };\n\n  const [selectedMediaEventId, setSelectedMediaEventId] = useState<string>();\n  const [roomMedia, setRoomMedia] = useState<RoomMediaItem[]>([]);\n  const openRoomMedia = useCallback(\n    (mEvent: MatrixEvent) => {\n      const mediaEventId = mEvent.getId();\n      if (!isMobile || !mediaEventId || !getRoomMediaItem(mEvent, room, nicknames)) return false;\n      setRoomMedia(\n        timelineSyncRef.current.timeline.linkedTimelines.flatMap((timeline) =>\n          timeline.getEvents().flatMap((timelineEvent) => {\n            const item = getRoomMediaItem(timelineEvent, room, nicknames);\n            return item ? [item] : [];\n          })\n        )\n      );\n      setSelectedMediaEventId(mediaEventId);\n      return true;\n    },\n    [isMobile, room, nicknames]\n  );\n\n  const renderMatrixEvent = useTimelineEventRenderer({\n    room,\n    mx,\n    pushProcessor,\n    nicknames,\n    getProfile: getGlobalProfile,\n    imagePackRooms,\n    settings,\n    state: { focusItem: timelineSync.focusItem, editId, activeReplyId, openThreadId },\n    permissions: rowPermissions,\n    callbacks: {\n      onUserClick: actions.handleUserClick,\n      onUsernameClick: actions.handleUsernameClick,\n      onReplyClick: actions.handleReplyClick,\n      onReactionToggle: actions.handleReactionToggle,\n      onEditId: actions.handleEdit,\n      onResend: actions.handleResend,\n      onDeleteFailedSend: actions.handleDeleteFailedSend,\n      setOpenThread: actions.setOpenThread,\n      handleOpenReply: actions.handleOpenReply,\n      onOpenMedia: openRoomMedia,\n    },\n    utils: { htmlReactParserOptions, linkifyOpts, getMemberPowerTag, parseMemberEvent },\n  });\n\n  const tryAutoMarkAsRead = useCallback(() => {\n    if (isInactivePanel) return; // Don't clear unread while room is behind the list\n    if (!atBottomRef.current) return;\n    if (!readUptoEventIdRef.current) {\n      requestAnimationFrame(() => markAsRead(mx, room.roomId, hideReads));\n      return;\n    }\n    const evtTimeline = getEventTimeline(room, readUptoEventIdRef.current);\n    const latestTimeline = evtTimeline && getFirstLinkedTimeline(evtTimeline, Direction.Forward);\n    if (latestTimeline === room.getLiveTimeline()) {\n      requestAnimationFrame(() => markAsRead(mx, room.roomId, hideReads));\n    }\n  }, [mx, room, hideReads, isInactivePanel]);\n\n  useDocumentFocusChange(\n    useCallback(\n      (inFocus) => {\n        if (inFocus) {\n          if (atBottomState && timelineSync.liveTimelineLinked) tryAutoMarkAsRead();\n          return;\n        }\n        // Re-anchor the divider at the last read when tabbing out while caught up.\n        if (atBottomState && timelineSync.liveTimelineLinked) {\n          readUptoEventIdRef.current = undefined;\n          setUnreadInfo(undefined);\n        }\n      },\n      [tryAutoMarkAsRead, atBottomState, timelineSync.liveTimelineLinked, setUnreadInfo]\n    )\n  );\n\n  // Reading elsewhere clears the room list badge, so clear the in-room marker too.\n  useMatrixEvent(\n    room,\n    RoomEvent.Receipt,\n    useCallback(\n      (mEvent: MatrixEvent) => {\n        const myUserId = mx.getUserId();\n        if (!myUserId) return;\n        const content =\n          mEvent.getContent<Record<string, Record<string, Record<string, unknown>>>>();\n        const isMyReceipt = Object.values(content).some((byType) =>\n          Object.values(byType ?? {}).some((byUser) => myUserId in (byUser ?? {}))\n        );\n        // Re-anchoring on a partial remote read would move the divider mid-read.\n        if (!isMyReceipt || getRoomUnreadInfo(room)) return;\n        readUptoEventIdRef.current = undefined;\n        setUnreadInfo(undefined);\n      },\n      [mx, room]\n    )\n  );\n\n  useEffect(() => {\n    if (atBottomState && isWindowFocused() && timelineSync.liveTimelineLinked) tryAutoMarkAsRead();\n  }, [\n    atBottomState,\n    timelineSync.liveTimelineLinked,\n    tryAutoMarkAsRead,\n    timelineSync.eventsLength,\n  ]);\n\n  useEffect(() => {\n    const messageListEl = messageListRef.current;\n    if (!messageListEl) return () => {};\n    const setFocusedPaginationIntent = (direction: 'backward' | 'forward') => {\n      hasUserScrollIntentRef.current = true;\n      scrollAnchorRef.current = undefined;\n      if (eventId === undefined && !timelineSyncRef.current.focusItem) return;\n      focusedPaginationIntentRef.current = direction;\n    };\n    const recordWheelIntent = (evt: WheelEvent) => {\n      if (evt.deltaY === 0) return;\n      setFocusedPaginationIntent(evt.deltaY < 0 ? 'backward' : 'forward');\n    };\n    const recordKeyIntent = (evt: KeyboardEvent) => {\n      if (!SCROLL_KEYS.has(evt.key)) return;\n      if (evt.key === 'Home' || evt.key === 'PageUp' || evt.key === 'ArrowUp') {\n        setFocusedPaginationIntent('backward');\n      } else if (evt.key === 'End' || evt.key === 'PageDown' || evt.key === 'ArrowDown') {\n        setFocusedPaginationIntent('forward');\n      } else {\n        setFocusedPaginationIntent(evt.shiftKey ? 'backward' : 'forward');\n      }\n    };\n    const recordTouchStart = (evt: TouchEvent) => {\n      touchStartYRef.current = evt.touches[0]?.clientY;\n    };\n    const recordTouchIntent = (evt: TouchEvent) => {\n      const startY = touchStartYRef.current;\n      const currentY = evt.touches[0]?.clientY;\n      if (startY === undefined || currentY === undefined || startY === currentY) return;\n      setFocusedPaginationIntent(currentY < startY ? 'forward' : 'backward');\n      touchStartYRef.current = currentY;\n    };\n    messageListEl.addEventListener('wheel', recordWheelIntent, { passive: true });\n    messageListEl.addEventListener('keydown', recordKeyIntent);\n    messageListEl.addEventListener('touchstart', recordTouchStart, { passive: true });\n    messageListEl.addEventListener('touchmove', recordTouchIntent, { passive: true });\n    return () => {\n      messageListEl.removeEventListener('wheel', recordWheelIntent);\n      messageListEl.removeEventListener('keydown', recordKeyIntent);\n      messageListEl.removeEventListener('touchstart', recordTouchStart);\n      messageListEl.removeEventListener('touchmove', recordTouchIntent);\n    };\n  }, [eventId]);\n\n  const prefetchPreviews = useUrlPreviewPrefetch(mx, settings.showUrlPreview, processedEventsRef);\n\n  const prefetchAroundViewport = useCallback(() => {\n    const v = vListRef.current;\n    if (!v) return;\n    const { scrollOffset, viewportSize } = v;\n    prefetchPreviews(v.findItemIndex(scrollOffset), v.findItemIndex(scrollOffset + viewportSize));\n  }, [prefetchPreviews]);\n\n  useEffect(prefetchAroundViewport, [prefetchAroundViewport, timelineSync.eventsLength]);\n\n  const handleVListScroll = useCallback(\n    (offset: number) => {\n      notifyScroll();\n      const v = vListRef.current;\n      if (!v) return;\n\n      prefetchAroundViewport();\n\n      const distanceFromBottom = v.scrollSize - offset - v.viewportSize;\n      syncAtBottom(offset);\n\n      if (hasUserScrollIntentRef.current && distanceFromBottom >= 100) {\n        initialScrollCancelledRef.current = true;\n        if (initialScrollTimerRef.current !== undefined) {\n          clearTimeout(initialScrollTimerRef.current);\n          initialScrollTimerRef.current = undefined;\n        }\n        setIsReady(true);\n      }\n\n      if (eventId !== undefined || timelineSyncRef.current.focusItem) {\n        const intent = focusedPaginationIntentRef.current;\n        if (\n          intent === 'backward' &&\n          offset <= FOCUSED_PAGINATION_EDGE_PX &&\n          canPaginateBackRef.current &&\n          backwardStatusRef.current === 'idle'\n        ) {\n          focusedPaginationIntentRef.current = undefined;\n          void timelineSyncRef.current.handleTimelinePagination(true);\n        } else if (\n          intent === 'forward' &&\n          distanceFromBottom <= FOCUSED_PAGINATION_EDGE_PX &&\n          canPaginateForwardRef.current &&\n          forwardStatusRef.current === 'idle'\n        ) {\n          focusedPaginationIntentRef.current = undefined;\n          void timelineSyncRef.current.handleTimelinePagination(false);\n        }\n        return;\n      }\n\n      if (scrollAnchorRef.current !== undefined) return;\n\n      if (offset < 500 && canPaginateBackRef.current && backwardStatusRef.current === 'idle') {\n        void timelineSyncRef.current.handleTimelinePagination(true);\n      }\n      if (\n        distanceFromBottom < 500 &&\n        canPaginateForwardRef.current &&\n        forwardStatusRef.current === 'idle'\n      ) {\n        void timelineSyncRef.current.handleTimelinePagination(false);\n      }\n    },\n    [eventId, notifyScroll, syncAtBottom, prefetchAroundViewport]\n  );\n  const handleVListScrollEnd = useCallback(() => {\n    if (!timelineSyncRef.current.focusItem?.scrollTo) return;\n    restoreScrollAnchor();\n    timelineSyncRef.current.setFocusItem((prev) =>\n      prev ? { ...prev, scrollTo: false } : undefined\n    );\n  }, [restoreScrollAnchor]);\n\n  // A failed backfill keeps its pagination token, so the placeholder condition\n  // would otherwise hold forever and never reach the error and its Retry.\n  const showEmptyPaginationError = timelineSync.eventsLength === 0 && timelineSync.backwardError;\n\n  const showLoadingPlaceholders =\n    timelineSync.eventsLength === 0 &&\n    !showEmptyPaginationError &&\n    (!isReady || timelineSync.canPaginateBack || timelineSync.backwardStatus === 'loading');\n\n  let backPaginationJSX: ReactNode | undefined;\n  if (\n    timelineSync.canPaginateBack ||\n    timelineSync.backwardStatus !== 'idle' ||\n    timelineSync.backwardError\n  ) {\n    if (timelineSync.backwardError) {\n      backPaginationJSX = (\n        <Box\n          justifyContent=\"Center\"\n          alignItems=\"Center\"\n          gap=\"200\"\n          style={{ padding: config.space.S300 }}\n        >\n          <Text style={{ color: color.Critical.Main }} size=\"T300\">\n            Failed to load history.\n          </Text>\n          <Chip\n            variant=\"SurfaceVariant\"\n            radii=\"Pill\"\n            outlined\n            onClick={() => timelineSync.handleTimelinePagination(true)}\n          >\n            <Text size=\"B300\">Retry</Text>\n          </Chip>\n        </Box>\n      );\n    }\n  }\n\n  let frontPaginationJSX: ReactNode | undefined;\n  if (\n    !timelineSync.liveTimelineLinked ||\n    timelineSync.forwardStatus !== 'idle' ||\n    timelineSync.forwardError\n  ) {\n    if (timelineSync.forwardError) {\n      frontPaginationJSX = (\n        <Box\n          justifyContent=\"Center\"\n          alignItems=\"Center\"\n          gap=\"200\"\n          style={{ padding: config.space.S300 }}\n        >\n          <Text style={{ color: color.Critical.Main }} size=\"T300\">\n            Failed to load messages.\n          </Text>\n          <Chip\n            variant=\"SurfaceVariant\"\n            radii=\"Pill\"\n            outlined\n            onClick={() => timelineSync.handleTimelinePagination(false)}\n          >\n            <Text size=\"B300\">Retry</Text>\n          </Chip>\n        </Box>\n      );\n    }\n  }\n\n  const showBackPaginationSpinner =\n    timelineSync.backwardStatus === 'loading' && timelineSync.eventsLength > 0;\n  const showFrontPaginationSpinner =\n    timelineSync.forwardStatus === 'loading' && timelineSync.eventsLength > 0;\n  const hasPowerLevelState = !!room\n    .getLiveTimeline()\n    ?.getState(EventTimeline.FORWARDS)\n    ?.getStateEvents(EventType.RoomPowerLevels, '');\n  const hideTimelineForRoomState = roomSyncLoading && hideMemberInReadOnly && !hasPowerLevelState;\n  const timelineBottomFloatLift =\n    !atBottomState && isReady ? { bottom: `calc(${config.space.S400} + ${toRem(52)})` } : undefined;\n  const timelineTopFloatLift =\n    unreadInfo?.readUptoEventId && !unreadInfo?.inLiveTimeline && isReady\n      ? { top: `calc(${config.space.S400} + ${toRem(52)})` }\n      : undefined;\n\n  let vListItemCount = timelineSync.eventsLength;\n  if (showLoadingPlaceholders) vListItemCount = 3;\n  // One row so the error and its Retry have somewhere to render.\n  else if (showEmptyPaginationError) vListItemCount = 1;\n  const vListIndices = useMemo(() => {\n    // Keep the cache-busting timeline identity explicit for exhaustive-deps.\n    void timelineSync.timeline;\n    return Array.from({ length: vListItemCount }, (_, i) => i);\n  }, [vListItemCount, timelineSync.timeline]);\n\n  const processedEvents = useProcessedTimeline({\n    items: vListIndices,\n    linkedTimelines: timelineSync.timeline.linkedTimelines,\n    ignoredUsersSet,\n    hiddenEvents,\n    mxUserId: mx.getUserId(),\n    readUptoEventId: readUptoEventIdRef.current,\n    hideMembershipEvents,\n    hideNickAvatarEvents,\n    isReadOnly,\n    hideMemberInReadOnly,\n  });\n\n  processedEventsRef.current = processedEvents;\n  const previousProcessedEventIdsRef = useRef<string[] | undefined>(undefined);\n  const processedEventIds = processedEvents.map((event) => event.id);\n  const previousProcessedEventIds = previousProcessedEventIdsRef.current;\n  const shouldShift =\n    previousProcessedEventIds !== undefined &&\n    processedEventIds.length > previousProcessedEventIds.length &&\n    previousProcessedEventIds.every(\n      (id, index) =>\n        id ===\n        processedEventIds[index + processedEventIds.length - previousProcessedEventIds.length]\n    );\n  useLayoutEffect(() => {\n    previousProcessedEventIdsRef.current = processedEventIds;\n  }, [processedEventIds]);\n  const vListKeyRef = useRef(room.roomId);\n  if (!isReady && scrollOwner === 'live')\n    vListKeyRef.current = `${room.roomId}:${processedEvents.map((event) => event.id).join(',')}`;\n\n  useLayoutEffect(() => {\n    if (!pendingReadyRef.current) return;\n    if (processedEvents.length === 0) return;\n    pendingReadyRef.current = false;\n    restoreScrollPosition();\n    setIsReady(true);\n  }, [processedEvents.length, restoreScrollPosition]);\n\n  useEffect(() => {\n    if (!onEditLastMessageRef) return;\n    const ref = onEditLastMessageRef;\n    ref.current = () => {\n      const myUserId = mx.getUserId();\n      const found = [...processedEventsRef.current]\n        .toReversed()\n        .find(\n          (e) =>\n            e.mEvent.getSender() === myUserId &&\n            e.mEvent.getType() === (EventType.RoomMessage as string) &&\n            !e.mEvent.isRedacted()\n        );\n      if (found?.mEvent.getId()) actions.handleEdit(found.mEvent.getId());\n    };\n  }, [onEditLastMessageRef, mx, actions]);\n\n  useEffect(() => {\n    viewportFillCountRef.current = 0;\n  }, [room.roomId]);\n\n  // Fill an initially short live timeline. Focused history is user-owned and must not\n  // auto-continue after its anchor is released.\n  useEffect(() => {\n    if (scrollOwner !== 'live') return () => {};\n    if (!canPaginateBackRef.current) return () => {};\n    if (scrollAnchorRef.current !== undefined) return () => {};\n\n    let rafId: number;\n    let attempts = 0;\n    const MAX_ATTEMPTS = 20;\n\n    const check = () => {\n      if (scrollAnchorRef.current !== undefined) return;\n\n      const v = vListRef.current;\n      if (!v) return;\n\n      if (v.viewportSize === 0) {\n        attempts += 1;\n        if (attempts <= MAX_ATTEMPTS) rafId = requestAnimationFrame(check);\n        return;\n      }\n\n      if (!canPaginateBackRef.current) return;\n      if (backwardStatusRef.current !== 'idle') return;\n\n      if (viewportFillCountRef.current >= MAX_VIEWPORT_FILL_PAGINATIONS) return;\n\n      if (v.scrollSize <= v.viewportSize + 300) {\n        viewportFillCountRef.current += 1;\n        void timelineSyncRef.current.handleTimelinePagination(true, true);\n      }\n    };\n\n    rafId = requestAnimationFrame(check);\n    return () => cancelAnimationFrame(rafId);\n  }, [room.roomId, scrollOwner, timelineSync.eventsLength, timelineSync.backwardStatus]);\n\n  return (\n    <Box grow=\"Yes\" style={{ position: 'relative', minWidth: 0, minHeight: 0, width: '100%' }}>\n      {(hideTimelineForRoomState || (roomSyncLoading && timelineSync.eventsLength === 0)) && (\n        <Box\n          justifyContent=\"Center\"\n          alignItems=\"Center\"\n          style={{ position: 'absolute', inset: 0, zIndex: 1, pointerEvents: 'none' }}\n        >\n          <Spinner variant=\"Secondary\" size=\"400\" />\n        </Box>\n      )}\n      {unreadInfo?.readUptoEventId && !unreadInfo?.inLiveTimeline && isReady && (\n        <TimelineFloat position=\"Top\" style={{ background: 'transparent' }}>\n          <Chip\n            variant=\"Primary\"\n            radii=\"Pill\"\n            outlined\n            before={chipIcon(ChatTeardropDots)}\n            onClick={() => jumpToEvent(unreadInfo.readUptoEventId)}\n          >\n            <Text size=\"L400\">Jump to Unread</Text>\n          </Chip>\n          <Chip\n            variant=\"SurfaceVariant\"\n            radii=\"Pill\"\n            outlined\n            before={chipIcon(Checks)}\n            onClick={() => markAsRead(mx, room.roomId, hideReads, true)}\n          >\n            <Text size=\"L400\">Mark as Read</Text>\n          </Chip>\n        </TimelineFloat>\n      )}\n\n      <div\n        ref={messageListRef}\n        data-testid=\"timeline\"\n        style={{\n          flex: 1,\n          minHeight: 0,\n          width: '100%',\n          overflow: 'hidden',\n          position: 'relative',\n          opacity:\n            !hideTimelineForRoomState &&\n            (isReady || showLoadingPlaceholders || showEmptyPaginationError)\n              ? 1\n              : 0,\n        }}\n      >\n        <TimelineScrollingProvider value={isTimelineScrolling}>\n          <VList<ProcessedEvent>\n            key={vListKeyRef.current}\n            ref={vListRef}\n            data={processedEvents}\n            shift={shouldShift}\n            id=\"timeline-scroller\"\n            className={css.messageList}\n            style={{\n              flex: 1,\n              minHeight: 0,\n              width: '100%',\n              display: 'flex',\n              flexDirection: 'column',\n              paddingTop: topSpacerHeight > 0 ? topSpacerHeight : config.space.S600,\n              paddingBottom: config.space.S600,\n            }}\n            onScroll={handleVListScroll}\n            onScrollEnd={handleVListScrollEnd}\n          >\n            {(eventData, index) => (\n              <MemoizedTimelineItem\n                key={\n                  eventData\n                    ? `${eventData.id}:${eventData.isRedacted ? 'redacted' : 'message'}`\n                    : `placeholder-${index}`\n                }\n                eventData={eventData}\n                index={index}\n                showLoadingPlaceholders={showLoadingPlaceholders}\n                canPaginateBack={timelineSync.canPaginateBack}\n                backPaginationJSX={backPaginationJSX}\n                room={room}\n                messageLayout={messageLayout}\n                messageSpacing={messageSpacing}\n                settings={settings as unknown as Record<string, unknown>}\n                permissions={rowPermissions}\n                renderMatrixEvent={renderMatrixEvent}\n                focusItem={timelineSync.focusItem}\n                editId={editId}\n                activeReplyId={activeReplyId}\n                openThreadId={openThreadId}\n              />\n            )}\n          </VList>\n        </TimelineScrollingProvider>\n      </div>\n      {selectedMediaEventId && (\n        <RoomMediaViewer\n          items={roomMedia}\n          selectedEventId={selectedMediaEventId}\n          selectEvent={setSelectedMediaEventId}\n          requestClose={() => setSelectedMediaEventId(undefined)}\n        />\n      )}\n\n      {showBackPaginationSpinner && (\n        <TimelineFloat position=\"Top\" style={timelineTopFloatLift}>\n          <Spinner variant=\"Secondary\" size=\"400\" style={{ backgroundColor: 'transparent' }} />\n        </TimelineFloat>\n      )}\n\n      {showFrontPaginationSpinner && (\n        <TimelineFloat position=\"Bottom\" style={timelineBottomFloatLift}>\n          <Spinner variant=\"Secondary\" size=\"400\" style={{ backgroundColor: 'transparent' }} />\n        </TimelineFloat>\n      )}\n\n      {frontPaginationJSX && (\n        <TimelineFloat position=\"Bottom\" style={timelineBottomFloatLift}>\n          {frontPaginationJSX}\n        </TimelineFloat>\n      )}\n\n      {(!atBottomState || !timelineSync.liveTimelineLinked) && isReady && (\n        <TimelineFloat position=\"Bottom\">\n          <Chip\n            variant=\"SurfaceVariant\"\n            radii=\"Pill\"\n            outlined\n            before={chipIcon(ArrowDown)}\n            onClick={() => {\n              scrollAnchorRef.current = undefined;\n              if (eventId) navigateRoom(room.roomId, undefined, { replace: true });\n              timelineSync.focusLiveTimeline();\n              setAtBottom(true);\n              scrollToBottom();\n            }}\n            style={{\n              WebkitUserSelect: 'none',\n              msUserSelect: 'none',\n              userSelect: 'none',\n              MozUserSelect: 'none',\n            }}\n          >\n            <Text size=\"L400\">Jump to Latest</Text>\n          </Chip>\n        </TimelineFloat>\n      )}\n    </Box>\n  );\n}\n","import { useCallback, useRef, useState } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { Box, Text, config } from 'folds';\nimport { EventType } from '$types/matrix-sdk';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { useStateEvent } from '$hooks/useStateEvent';\n\nimport { usePowerLevelsContext } from '$hooks/usePowerLevels';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useEditor } from '$components/editor';\nimport { BlockType } from '$components/editor';\nimport { Page } from '$components/page';\nimport { useKeyDown } from '$hooks/useKeyDown';\nimport { editableActiveElement } from '$utils/dom';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { SwipeableChatWrapper } from '$components/SwipeableChatWrapper';\nimport { useOpenRoomSettings } from '$state/hooks/roomSettings';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { RoomSettingsPage } from '$state/roomSettings';\nimport { GlobalModalManager } from '$components/message/modals/GlobalModalManager';\nimport { useDelayedEventsSupport } from '$hooks/useDelayedEventsSupport';\nimport { delayedEventsSupportedAtom } from '$state/scheduledMessages';\nimport { useCallMembers, useCallSession } from '$hooks/useCall';\nimport { callEmbedAtom } from '$state/callEmbed';\nimport { useCallJoined } from '$hooks/useCallEmbed';\nimport { CallView } from '$features/call/CallView';\nimport { useRoom } from '$hooks/useRoom';\nimport { useMessageEdit } from '$hooks/useMessageEdit';\nimport { useAlive } from '$hooks/useAlive';\nimport { RoomViewFollowing, RoomViewFollowingPlaceholder } from './RoomViewFollowing';\nimport { RoomInput } from './RoomInput';\nimport { RoomTombstone } from './RoomTombstone';\nimport { RoomViewTyping } from './RoomViewTyping';\nimport { RoomTimeline } from './RoomTimeline';\nimport { RoomInputPlaceholder } from './RoomInputPlaceholder';\nimport { ScheduledMessagesList } from './schedule-send';\n\nconst FN_KEYS_REGEX = /^F\\d+$/;\nconst shouldFocusMessageField = (evt: KeyboardEvent): boolean => {\n  const { code } = evt;\n  if (evt.metaKey || evt.altKey || evt.ctrlKey) {\n    return false;\n  }\n\n  if (FN_KEYS_REGEX.test(code)) return false;\n\n  if (\n    code.startsWith('OS') ||\n    code.startsWith('Meta') ||\n    code.startsWith('Shift') ||\n    code.startsWith('Alt') ||\n    code.startsWith('Control') ||\n    code.startsWith('Arrow') ||\n    code.startsWith('Page') ||\n    code.startsWith('End') ||\n    code.startsWith('Home') ||\n    code === 'Tab' ||\n    code === 'Space' ||\n    code === 'Enter' ||\n    code === 'NumLock' ||\n    code === 'ScrollLock'\n  ) {\n    return false;\n  }\n\n  return true;\n};\n\nexport function RoomView({ eventId }: { eventId?: string }) {\n  const roomInputRef = useRef<HTMLDivElement>(null);\n  const roomViewRef = useRef<HTMLDivElement>(null);\n  const editLastMessageRef = useRef<(() => void) | undefined>(undefined);\n\n  const [hideReads] = useSetting(settingsAtom, 'hideReads');\n  const screenSize = useScreenSizeContext();\n\n  const room = useRoom();\n  const { roomId } = room;\n  const editor = useEditor();\n\n  const mx = useMatrixClient();\n\n  const tombstoneEvent = useStateEvent(room, EventType.RoomTombstone);\n  const powerLevels = usePowerLevelsContext();\n  const creators = useRoomCreators(room);\n\n  const permissions = useRoomPermissions(creators, powerLevels);\n  const canMessage = permissions.message(room.hasEncryptionStateEvent(), mx.getSafeUserId());\n\n  const [editorResetKey, setEditorResetKey] = useState(0);\n  const handleResetEditor = useCallback(() => setEditorResetKey((prev) => prev + 1), []);\n  const alive = useAlive();\n  const { editId, handleEdit } = useMessageEdit(editor, {\n    onReset: handleResetEditor,\n    alive,\n    focusOnCancel: !isMobileOrTablet(),\n  });\n  const onCancelEdit = useCallback(() => handleEdit(undefined), [handleEdit]);\n  const onEditLastMessage = useCallback(() => editLastMessageRef.current?.(), []);\n\n  useDelayedEventsSupport();\n  const delayedEventsSupported = useAtomValue(delayedEventsSupportedAtom);\n\n  const handleEditMessage = useCallback(\n    (body: string) => {\n      editor.setDocument(body ? [{ type: BlockType.Paragraph, children: [{ text: body }] }] : []);\n      editor.focus();\n    },\n    [editor]\n  );\n\n  useKeyDown(\n    window,\n    useCallback(\n      (evt) => {\n        if (editableActiveElement()) return;\n        const portalContainer = document.getElementById('portalContainer');\n        if (portalContainer && portalContainer.children.length > 0) {\n          return;\n        }\n        if (shouldFocusMessageField(evt) || isKeyHotkey('mod+v', evt)) {\n          editor.focus();\n        }\n      },\n      [editor]\n    )\n  );\n\n  const openSettings = useOpenRoomSettings();\n  const space = useSpaceOptionally();\n\n  const handleOpenMembers = useCallback(() => {\n    if (screenSize === ScreenSize.Mobile) {\n      openSettings(room.roomId, space?.roomId, RoomSettingsPage.MembersPage, { viaSwipe: true });\n    }\n  }, [screenSize, openSettings, room.roomId, space?.roomId]);\n\n  const callSession = useCallSession(room);\n  const callMembers = useCallMembers(room, callSession);\n  const callEmbed = useAtomValue(callEmbedAtom);\n  const isJoinedInThisRoom = useCallJoined(callEmbed) && callEmbed?.roomId === room.roomId;\n  const showCallView = !room.isCallRoom() && (callMembers.length > 0 || isJoinedInThisRoom);\n\n  return (\n    <Page\n      ref={roomViewRef}\n      style={{\n        position: 'relative',\n        overflow: 'hidden',\n        isolation: 'isolate',\n        minWidth: 0,\n        minHeight: 0,\n        width: '100%',\n      }}\n    >\n      <SwipeableChatWrapper onOpenMembers={handleOpenMembers}>\n        <Box grow=\"Yes\" direction=\"Column\">\n          {showCallView && (\n            <Box shrink=\"No\" style={{ width: '100%', position: 'relative' }}>\n              <CallView resizable />\n            </Box>\n          )}\n          <RoomTimeline\n            key={roomId}\n            room={room}\n            eventId={eventId}\n            editor={editor}\n            onEditorReset={handleResetEditor}\n            onEditLastMessageRef={editLastMessageRef}\n            editId={editId}\n            onEditId={handleEdit}\n          />\n          <div style={{ position: 'relative', flexShrink: 0 }}>\n            <RoomViewTyping room={room} />\n          </div>\n          <GlobalModalManager />\n        </Box>\n        <Box shrink=\"No\" direction=\"Column\">\n          {canMessage && delayedEventsSupported && (\n            <ScheduledMessagesList room={room} onEditMessage={handleEditMessage} />\n          )}\n          <div style={{ padding: `0 ${config.space.S400}` }}>\n            {tombstoneEvent ? (\n              <RoomTombstone\n                roomId={roomId}\n                body={tombstoneEvent.getContent().body}\n                replacementRoomId={tombstoneEvent.getContent().replacement_room}\n              />\n            ) : (\n              <>\n                {canMessage && (\n                  <RoomInput\n                    key={`${roomId}-${editorResetKey}`}\n                    room={room}\n                    editor={editor}\n                    roomId={roomId}\n                    fileDropContainerRef={roomViewRef}\n                    ref={roomInputRef}\n                    onEditLastMessage={onEditLastMessage}\n                    editId={editId}\n                    onCancelEdit={onCancelEdit}\n                  />\n                )}\n                {!canMessage && (\n                  <RoomInputPlaceholder\n                    style={{ padding: config.space.S200 }}\n                    alignItems=\"Center\"\n                    justifyContent=\"Center\"\n                  >\n                    <Text align=\"Center\">You do not have permission to post in this room</Text>\n                  </RoomInputPlaceholder>\n                )}\n              </>\n            )}\n            {hideReads ? <RoomViewFollowingPlaceholder /> : <RoomViewFollowing room={room} />}\n          </div>\n        </Box>\n      </SwipeableChatWrapper>\n    </Page>\n  );\n}\n","import { useSetAtom } from 'jotai';\nimport { useParams } from 'react-router';\nimport { Box, Text, Tooltip, IconButton, toRem } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { composerIcon, X } from '$components/icons/phosphor';\nimport { Page, PageHeader } from '../../components/page';\nimport { callChatAtom } from '../../state/callEmbed';\nimport { RoomView } from './RoomView';\nimport { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize';\nimport { SidebarResizer } from '$pages/client/sidebar/SidebarResizer';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { useState, useEffect } from 'react';\n\nexport function CallChatView() {\n  const { eventId } = useParams();\n  const setChat = useSetAtom(callChatAtom);\n  const screenSize = useScreenSizeContext();\n\n  const handleClose = () => setChat(false);\n\n  const [vcmsgSidebarWidth, setVcmsgSidebarWidth] = useSetting(settingsAtom, 'vcmsgSidebarWidth');\n  const [curWidth, setCurWidth] = useState(vcmsgSidebarWidth);\n  useEffect(() => {\n    setCurWidth(vcmsgSidebarWidth);\n  }, [vcmsgSidebarWidth]);\n  return (\n    <Box\n      shrink=\"No\"\n      style={{\n        position: 'relative',\n        width: screenSize === ScreenSize.Desktop ? toRem(curWidth) : '100%',\n        flexShrink: 0,\n        flexGrow: 0,\n      }}\n    >\n      {!isMobileOrTablet() && (\n        <SidebarResizer\n          setCurWidth={setCurWidth}\n          sidebarWidth={vcmsgSidebarWidth}\n          setSidebarWidth={setVcmsgSidebarWidth}\n          minValue={300}\n          maxValue={1000}\n          isReversed\n        />\n      )}\n      <Page\n        style={{\n          width: '100%',\n          flexShrink: 0,\n          flexGrow: 0,\n        }}\n      >\n        <PageHeader>\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            <Box grow=\"Yes\">\n              <Text size=\"H5\" truncate>\n                Chat\n              </Text>\n            </Box>\n            <Box shrink=\"No\" alignItems=\"Center\">\n              <TooltipProvider\n                position=\"Bottom\"\n                align=\"End\"\n                offset={4}\n                tooltip={\n                  <Tooltip>\n                    <Text>Close</Text>\n                  </Tooltip>\n                }\n              >\n                {(triggerRef) => (\n                  <IconButton ref={triggerRef} variant=\"Surface\" onClick={handleClose}>\n                    {composerIcon(X)}\n                  </IconButton>\n                )}\n              </TooltipProvider>\n            </Box>\n          </Box>\n        </PageHeader>\n        <Box grow=\"Yes\" direction=\"Column\">\n          <RoomView eventId={eventId} />\n        </Box>\n      </Page>\n    </Box>\n  );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Header, IconButton, Scroll, Spinner, Text, config, toRem } from 'folds';\nimport { Chats, composerIcon, X } from '$components/icons/phosphor';\nimport type { IEvent, Room, CryptoBackend } from '$types/matrix-sdk';\nimport {\n  Direction,\n  MatrixEvent,\n  MatrixEventEvent,\n  ReceiptType,\n  RoomEvent,\n  ThreadEvent,\n} from '$types/matrix-sdk';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { useTimelineActions } from '$hooks/timeline/useTimelineActions';\nimport { useTimelineRendererContext } from '$hooks/timeline/useTimelineRendererContext';\nimport { useAtomValue, useSetAtom, useStore } from 'jotai';\nimport {\n  getThreadReplyEvents,\n  isThreadRelationEvent,\n  reactionOrEditEvent,\n  unwrapRelationJumpTarget,\n  getEditedEvent,\n  getEventReactions,\n} from '$utils/room/relations';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useIsInactivePanel } from '$hooks/useRoom';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { useEditor } from '$components/editor';\nimport { useImagePackRooms } from '$hooks/useImagePackRooms';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { roomIdToReplyDraftAtomFamily } from '$state/room/roomInputDrafts';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { useIgnoredUsers } from '$hooks/useIgnoredUsers';\nimport { useMessageEdit } from '$hooks/useMessageEdit';\nimport {\n  useProcessedTimeline,\n  getProcessedRowIndexForRawTimelineIndex,\n  type ProcessedEvent,\n} from '$hooks/timeline/useProcessedTimeline';\nimport { useTimelineEventRenderer } from '$hooks/timeline/useTimelineEventRenderer';\nimport { RoomInput } from './RoomInput';\nimport { RoomViewFollowing, RoomViewFollowingPlaceholder } from './RoomViewFollowing';\nimport * as css from './ThreadDrawer.css';\nimport { SidebarResizer } from '$pages/client/sidebar/SidebarResizer';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { useDismissOnBack } from '$utils/androidBack';\nimport type { Persona } from '$app/persona';\n\ntype ThreadDrawerProps = {\n  room: Room;\n  threadRootId: string;\n  onClose: () => void;\n  overlay?: boolean;\n};\n\nexport function ThreadDrawer({ room, threadRootId, onClose, overlay }: ThreadDrawerProps) {\n  const mx = useMatrixClient();\n  const drawerRef = useRef<HTMLDivElement>(null);\n  const editor = useEditor();\n  const [forceUpdateCounter, forceUpdate] = useState(0);\n  const [jumpToEventId, setJumpToEventId] = useState<string | undefined>(undefined);\n  const [loadingOlderReplies, setLoadingOlderReplies] = useState(false);\n  const [canPageBack, setCanPageBack] = useState(true);\n  const paginatingOlderRef = useRef(false);\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const prevReplyCountRef = useRef(0);\n  const processedEventsRef = useRef<ProcessedEvent[]>([]);\n  const serverFetchAttemptedRef = useRef<string | null>(null);\n  const autoFillInProgressRef = useRef(false);\n  const { editId, handleEdit } = useMessageEdit(editor);\n  const nicknames = useAtomValue(nicknamesAtom);\n  const jotaiStore = useStore();\n  const getGlobalProfile = useCallback(\n    (userId: string) => jotaiStore.get(profilesCacheAtom)[userId],\n    [jotaiStore]\n  );\n  const pushProcessor = mx.pushProcessor;\n  useDismissOnBack(onClose);\n  const isInactivePanel = useIsInactivePanel();\n\n  // Shared renderer context — replaces 17+ inline useSetting calls,\n  // linkifyOpts useMemo, htmlReactParserOptions useMemo, and the\n  // permissions block that were duplicated with RoomTimeline.\n  const rendererCtx = useTimelineRendererContext(room);\n\n  const {\n    settings,\n    linkifyOpts,\n    htmlReactParserOptions,\n    permissions: {\n      canRedact,\n      canDeleteOwn,\n      canSendReaction,\n      canPinEvent,\n      isReadOnly,\n      getMemberPowerTag,\n      parseMemberEvent,\n    },\n  } = rendererCtx;\n\n  // ThreadDrawer overrides on top of the shared settings:\n  //   - hideThreadChip: true (thread replies don't show a nested thread chip)\n  //   - hideMembershipEvents: true (thread view never shows membership)\n  //   - hideNickAvatarEvents: true (thread view never shows nick changes)\n  const threadSettings = useMemo(\n    () => ({\n      ...settings,\n      hideThreadChip: true as const,\n      hideMembershipEvents: true,\n      hideNickAvatarEvents: true,\n    }),\n    [settings]\n  );\n\n  const hiddenEvents = settings.hiddenEvents;\n  const hideMemberInReadOnly = settings.hideMemberInReadOnly;\n  const hideReads = settings.hideReads;\n\n  // Ignored users\n  const ignoredUsersList = useIgnoredUsers();\n  const ignoredUsersSet = useMemo(() => new Set(ignoredUsersList), [ignoredUsersList]);\n\n  // Image packs\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const imagePackRooms: Room[] = useImagePackRooms(room.roomId, roomToParents);\n\n  // Reply draft (keyed by threadRootId to match RoomInput's draftKey logic)\n  const setReplyDraft = useSetAtom(roomIdToReplyDraftAtomFamily(threadRootId));\n  const replyDraft = useAtomValue(roomIdToReplyDraftAtomFamily(threadRootId));\n  const activeReplyId = replyDraft?.eventId;\n  const suppressMark = !replyDraft?.body;\n\n  // User profile popup\n  const openUserRoomProfile = useOpenUserRoomProfile();\n  const optionalSpace = useSpaceOptionally();\n\n  // Shared timeline actions — replaces inline handleUserClick,\n  // handleUsernameClick, handleReplyClick, handleReactionToggle,\n  // handleResend, handleDeleteFailedSend (~65 lines).\n  // handleOpenEvent is caller-specific (ThreadDrawer's scroll architecture).\n  // setOpenThread is a no-op (thread drawer can't open sub-threads).\n  const actions = useTimelineActions({\n    room,\n    mx,\n    editor,\n    nicknames,\n    getGlobalProfile,\n    spaceId: optionalSpace?.roomId,\n    openUserRoomProfile: openUserRoomProfile as unknown as (\n      roomId: string,\n      spaceId: string | undefined,\n      userId: string,\n      pmp: Persona | undefined,\n      rect: DOMRect,\n      undefinedArg?: undefined,\n      options?: unknown\n    ) => void,\n    activeReplyId,\n    activeReplyBody: replyDraft?.body,\n    setReplyDraft: setReplyDraft as unknown as (draft: unknown) => void,\n    threadRootId,\n    openThreadId: threadRootId,\n    setOpenThread: () => {},\n    handleEdit,\n    handleOpenEvent: (id) => {\n      let anchorId = unwrapRelationJumpTarget(room, id);\n      const threadLive = thread?.timelineSet.getLiveTimeline();\n      const threadEvents = threadLive?.getEvents();\n      const rawIndex = threadEvents?.findIndex((e) => e.getId() === anchorId) ?? -1;\n      if (rawIndex >= 0) {\n        const nearest = getProcessedRowIndexForRawTimelineIndex(\n          processedEventsRef.current,\n          rawIndex\n        );\n        if (nearest) {\n          const rowEv = processedEventsRef.current[nearest.rowIndex];\n          if (rowEv) anchorId = rowEv.id;\n        }\n      }\n      const isRoot = anchorId === threadRootId;\n      const isInReplies = processedEventsRef.current.some((e) => e.id === anchorId);\n      if (!isRoot && !isInReplies) return;\n      setJumpToEventId(anchorId);\n      setTimeout(() => setJumpToEventId(undefined), 2500);\n      const el = drawerRef.current;\n      if (el) {\n        const target = el.querySelector(`[data-message-id=\"${anchorId}\"]`);\n        target?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n      }\n    },\n  });\n\n  // Thread timeline data for useProcessedTimeline\n  const thread = room.getThread(threadRootId);\n  const threadTimeline = thread?.timelineSet.getLiveTimeline();\n\n  // Prefer the event from the main timeline (already indexed), but fall back\n  // to thread.rootEvent — populated from bundled /threads server data even when\n  // the root is outside the currently-loaded timeline window.\n  const rootEvent = room.findEventById(threadRootId) ?? thread?.rootEvent;\n  const totalEvents = threadTimeline?.getEvents().length ?? 0;\n  const linkedTimelines = useMemo(() => {\n    void totalEvents;\n    return threadTimeline ? [threadTimeline] : [];\n  }, [threadTimeline, totalEvents]);\n  const items = useMemo(() => Array.from({ length: totalEvents }, (_, i) => i), [totalEvents]);\n\n  const processedEvents = useProcessedTimeline({\n    items,\n    linkedTimelines,\n    skipThreadFilter: true,\n    ignoredUsersSet,\n    hiddenEvents,\n    mxUserId: mx.getUserId(),\n    readUptoEventId: undefined,\n    hideMembershipEvents: true,\n    hideNickAvatarEvents: true,\n    isReadOnly,\n    hideMemberInReadOnly,\n  });\n\n  // When the thread's own timeline is empty (server-side threads not yet fetched,\n  // or classic sync before backfill completes), fall back to scanning the main\n  // room timeline directly so replies are shown immediately.\n  const displayReplies = useMemo((): ProcessedEvent[] => {\n    // `forceUpdateCounter` is a cache-busting key for thread/timeline updates.\n    void forceUpdateCounter;\n    const filtered = processedEvents.filter((e) => e.id !== threadRootId);\n    if (filtered.length > 0) return filtered;\n    const timelineSet = thread?.timelineSet ?? room.getUnfilteredTimelineSet();\n    return getThreadReplyEvents(room, threadRootId).map((ev, idx) => ({\n      id: ev.getId() ?? `thread-reply-${idx}`,\n      itemIndex: idx,\n      mEvent: ev,\n      isRedacted: ev.isRedacted(),\n      timelineSet,\n      eventSender: ev.getSender() ?? null,\n      collapsed: false,\n      willRenderNewDivider: false,\n      willRenderDayDivider: false,\n      editId: getEditedEvent(ev.getId() ?? '', ev, timelineSet)?.getId(),\n      reactionsKey:\n        getEventReactions(timelineSet, ev.getId() ?? '')\n          ?.getSortedAnnotationsByKey()\n          ?.map((r) => `${r[0]}:${r[1].size}`)\n          .join(',') ?? '',\n      content: ev.getContent(),\n      sendStatus: ev.getAssociatedStatus(),\n    }));\n    // forceUpdateCounter makes this recompute whenever events arrive\n  }, [room, threadRootId, thread, processedEvents, forceUpdateCounter]);\n\n  processedEventsRef.current = displayReplies;\n\n  const processedReplies = displayReplies;\n\n  // Ensure the Thread object exists and has its reply events loaded.\n  useEffect(() => {\n    // Case A: create thread shell; SDK handles the rest asynchronously.\n    if (!room.getThread(threadRootId)) {\n      const localRoot = room.findEventById(threadRootId);\n      if (localRoot) {\n        room.createThread(threadRootId, localRoot, [], false);\n      } else {\n        // Root not in local timeline — fetch it from the server without\n        // touching the main timeline (no TimelineRefresh side-effect).\n        mx.fetchRoomEvent(room.roomId, threadRootId)\n          .then((rawEvt) => {\n            if (room.getThread(threadRootId)) return; // created concurrently\n            room.createThread(threadRootId, new MatrixEvent(rawEvt as IEvent), [], false);\n          })\n          .catch(() => {});\n      }\n    }\n\n    const currThread = room.getThread(threadRootId);\n    // Case B: SDK is actively initialising — don't interfere.\n    if (!currThread || !currThread.initialEventsFetched) return;\n\n    // Case C: SDK is done (or classic sync). Backfill from live timeline if\n    // thread.events is still empty (classic sync path; server-side was already\n    // populated by paginateEventTimeline inside updateThreadMetadata).\n    const hasRepliesInThread = currThread.events.some(\n      (ev) =>\n        ev.getId() !== threadRootId &&\n        !reactionOrEditEvent(ev) &&\n        isThreadRelationEvent(ev, threadRootId)\n    );\n    if (hasRepliesInThread) return;\n\n    const liveEvents = getThreadReplyEvents(room, threadRootId);\n    if (liveEvents.length > 0) {\n      // thread.addEvents() is typed as void but is internally async; schedule\n      // forceUpdate in a microtask so the timeline has been updated first.\n      currThread.addEvents(liveEvents, false);\n      Promise.resolve().then(() => forceUpdate((n) => n + 1));\n      return;\n    }\n\n    if (serverFetchAttemptedRef.current === threadRootId) return;\n    serverFetchAttemptedRef.current = threadRootId;\n\n    mx.paginateEventTimeline(currThread.timelineSet.getLiveTimeline(), { backwards: true })\n      .then(() => forceUpdate((n) => n + 1))\n      .catch(() => {});\n    // forceUpdateCounter must be in deps so this effect re-runs after\n    // ThreadEvent.Update fires (which flips initialEventsFetched from false to\n    // true).\n  }, [mx, room, threadRootId, forceUpdate, forceUpdateCounter]);\n\n  // Re-render when new thread events arrive (including reactions via ThreadEvent.Update).\n  useEffect(() => {\n    const isEventInThread = (mEvent: MatrixEvent): boolean => {\n      // Direct thread message or the root itself\n      if (mEvent.getId() === threadRootId || isThreadRelationEvent(mEvent, threadRootId)) {\n        return true;\n      }\n\n      // Check if this is a reaction/edit targeting an event in this thread\n      if (reactionOrEditEvent(mEvent)) {\n        const relation = mEvent.getRelation();\n        const targetEventId = relation?.event_id;\n        if (targetEventId) {\n          const targetEvent = room.findEventById(targetEventId);\n          if (\n            targetEvent &&\n            (targetEvent.getId() === threadRootId ||\n              isThreadRelationEvent(targetEvent, threadRootId))\n          ) {\n            return true;\n          }\n        }\n      }\n\n      return false;\n    };\n\n    const onTimeline = (mEvent: MatrixEvent) => {\n      if (isEventInThread(mEvent)) {\n        forceUpdate((n) => n + 1);\n      }\n    };\n    const onRedaction = (mEvent: MatrixEvent) => {\n      // Redactions (removing reactions/messages) should also trigger updates\n      if (isEventInThread(mEvent)) {\n        forceUpdate((n) => n + 1);\n      }\n    };\n    const onDecrypted = (mEvent: MatrixEvent) => {\n      if (isEventInThread(mEvent)) {\n        const currThread = room.getThread(threadRootId);\n        if (currThread && !currThread.events.includes(mEvent)) {\n          currThread.addEvents([mEvent], false);\n        }\n        forceUpdate((n) => n + 1);\n      }\n    };\n    const onThreadUpdate = () => forceUpdate((n) => n + 1);\n    mx.on(RoomEvent.Timeline, onTimeline);\n    room.on(RoomEvent.Redaction, onRedaction);\n    room.on(ThreadEvent.Update, onThreadUpdate);\n    room.on(ThreadEvent.NewReply, onThreadUpdate);\n    mx.on(MatrixEventEvent.Decrypted, onDecrypted);\n    return () => {\n      mx.off(RoomEvent.Timeline, onTimeline);\n      room.removeListener(RoomEvent.Redaction, onRedaction);\n      room.removeListener(ThreadEvent.Update, onThreadUpdate);\n      room.removeListener(ThreadEvent.NewReply, onThreadUpdate);\n      mx.removeListener(MatrixEventEvent.Decrypted, onDecrypted);\n    };\n  }, [mx, room, threadRootId]);\n\n  // Retry decryption for thread root events that failed because they were fetched before keys arrived\n  useEffect(() => {\n    if (!rootEvent?.isEncrypted() || !rootEvent.isDecryptionFailure()) return undefined;\n    const crypto = mx.getCrypto();\n    if (!crypto) return undefined;\n\n    const retryDecrypt = async () => {\n      try {\n        await rootEvent.attemptDecryption(crypto as CryptoBackend);\n        if (!rootEvent.isDecryptionFailure()) forceUpdate((n) => n + 1);\n      } catch {\n        // ignore\n      }\n    };\n\n    // Piggyback on other decryptions as a proxy signal for key arrival\n    const sentinels = room\n      .getLiveTimeline()\n      .getEvents()\n      .slice(-50)\n      .filter((e) => e.isEncrypted());\n    sentinels.forEach((e) => e.on(MatrixEventEvent.Decrypted, retryDecrypt));\n\n    // Attempt immediately in case keys arrived since the initial failure\n    retryDecrypt();\n\n    return () => {\n      sentinels.forEach((e) => e.off(MatrixEventEvent.Decrypted, retryDecrypt));\n    };\n  }, [rootEvent, room, mx]);\n\n  // Mark thread as read when viewing it\n  useEffect(() => {\n    if (isInactivePanel) return; // Don't send read receipt while room is behind the list\n    const markThreadAsRead = async () => {\n      const currentThread = room.getThread(threadRootId);\n      if (!currentThread) return;\n\n      const events = currentThread.events || [];\n      if (events.length === 0) return;\n\n      const lastEvent = events[events.length - 1];\n      if (!lastEvent || lastEvent.isSending()) return;\n\n      const userId = mx.getUserId();\n      if (!userId) return;\n\n      const readUpToId = currentThread.getEventReadUpTo(userId, false);\n      const lastEventId = lastEvent.getId();\n\n      // Only send receipt if we haven't already read up to the last event\n      if (readUpToId !== lastEventId) {\n        try {\n          await mx.sendReadReceipt(lastEvent, ReceiptType.Read);\n        } catch (err) {\n          console.warn('Failed to send thread read receipt:', err);\n        }\n      }\n    };\n\n    // Mark as read when opened and when new messages arrive\n    markThreadAsRead();\n  }, [mx, room, threadRootId, forceUpdateCounter, isInactivePanel]);\n\n  const replyEvents = getThreadReplyEvents(room, threadRootId);\n  const isThreadLoading = !!thread && !thread.initialEventsFetched && replyEvents.length === 0;\n\n  const hasOlderReplies =\n    canPageBack &&\n    !!thread?.initialEventsFetched &&\n    thread?.timelineSet.getLiveTimeline().getPaginationToken(Direction.Backward) != null;\n\n  // Keep a ref so the scroll handler always reads the latest value without deps.\n  const hasOlderRepliesRef = useRef(hasOlderReplies);\n  hasOlderRepliesRef.current = hasOlderReplies;\n\n  const loadOlderReplies = useCallback(() => {\n    const t = room.getThread(threadRootId);\n    if (!t || !t.initialEventsFetched || paginatingOlderRef.current) return;\n    paginatingOlderRef.current = true;\n    setLoadingOlderReplies(true);\n    mx.paginateEventTimeline(t.timelineSet.getLiveTimeline(), { backwards: true })\n      .then((hasMore) => {\n        paginatingOlderRef.current = false;\n        if (!hasMore) setCanPageBack(false);\n        setLoadingOlderReplies(false);\n        forceUpdate((n) => n + 1);\n      })\n      .catch(() => {\n        paginatingOlderRef.current = false;\n        setLoadingOlderReplies(false);\n      });\n  }, [mx, room, threadRootId, forceUpdate]);\n\n  const loadOlderRepliesRef = useRef(loadOlderReplies);\n  loadOlderRepliesRef.current = loadOlderReplies;\n\n  useEffect(() => {\n    setCanPageBack(true);\n    autoFillInProgressRef.current = false;\n  }, [threadRootId]);\n\n  const handleRepliesScroll = useCallback(() => {\n    const el = scrollRef.current;\n    if (!el) return;\n    if (el.scrollTop < 200 && hasOlderRepliesRef.current && !paginatingOlderRef.current) {\n      loadOlderRepliesRef.current();\n    }\n  }, []);\n\n  // Auto-scroll to bottom when event count grows.\n  useEffect(() => {\n    const el = scrollRef.current;\n    if (!el) return;\n    const isAtBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 150;\n    if (prevReplyCountRef.current === 0 || isAtBottom || autoFillInProgressRef.current) {\n      el.scrollTop = el.scrollHeight;\n    }\n    prevReplyCountRef.current = processedReplies.length;\n  }, [processedReplies.length]);\n\n  // Auto-fill viewport: paginate backwards until content overflows the scroll\n  // container, then stop.  The scroll handler (handleRepliesScroll) loads more\n  // when the user scrolls back up past the top threshold.\n  useEffect(() => {\n    if (paginatingOlderRef.current) return;\n    const el = scrollRef.current;\n    if (!el) return;\n    if (!hasOlderReplies) {\n      autoFillInProgressRef.current = false;\n      return;\n    }\n    if (el.scrollHeight <= el.clientHeight) {\n      // Content doesn't yet fill the viewport — paginate one more page.\n      autoFillInProgressRef.current = true;\n      loadOlderRepliesRef.current();\n    } else {\n      // Content now overflows — fill is complete.\n      autoFillInProgressRef.current = false;\n    }\n  }, [processedReplies.length, hasOlderReplies]);\n\n  const handleEditLastMessage = useCallback(() => {\n    const userId = mx.getUserId();\n    const ownReply = [...processedEventsRef.current]\n      .toReversed()\n      .find(\n        (e) =>\n          e.id !== threadRootId &&\n          e.mEvent.getSender() === userId &&\n          !e.mEvent.isRedacted() &&\n          !reactionOrEditEvent(e.mEvent)\n      );\n    const ownId = ownReply?.id;\n    if (ownId) {\n      handleEdit(ownId);\n      const el = drawerRef.current;\n      if (el) {\n        el.querySelector(`[data-message-id=\"${ownId}\"]`)?.scrollIntoView({\n          block: 'nearest',\n          behavior: 'smooth',\n        });\n      }\n    }\n  }, [mx, threadRootId, handleEdit]);\n\n  const focusItem = jumpToEventId\n    ? { eventId: jumpToEventId, highlight: true, scrollTo: false as const }\n    : undefined;\n\n  const renderMatrixEvent = useTimelineEventRenderer({\n    room,\n    mx,\n    pushProcessor,\n    nicknames,\n    getProfile: getGlobalProfile,\n    imagePackRooms,\n    settings: threadSettings,\n    state: { focusItem, editId, activeReplyId, openThreadId: threadRootId, suppressMark },\n    permissions: {\n      canRedact,\n      canDeleteOwn,\n      canSendReaction,\n      canPinEvent,\n    },\n    callbacks: {\n      onUserClick: actions.handleUserClick,\n      onUsernameClick: actions.handleUsernameClick,\n      onReplyClick: actions.handleReplyClick,\n      onReactionToggle: actions.handleReactionToggle,\n      onEditId: actions.handleEdit,\n      onResend: actions.handleResend,\n      onDeleteFailedSend: actions.handleDeleteFailedSend,\n      setOpenThread: () => {},\n      handleOpenReply: actions.handleOpenReply,\n    },\n    utils: { htmlReactParserOptions, linkifyOpts, getMemberPowerTag, parseMemberEvent },\n  });\n\n  // Latest thread event for the following indicator (latest reply, or root if no replies)\n  const threadParticipantIds = new Set(\n    processedEvents.map((e) => e.mEvent.getSender()).filter(Boolean) as string[]\n  );\n  const latestThreadEventId = processedEvents.at(-1)?.id ?? rootEvent?.getId();\n\n  const [threadSidebarWidth, setThreadSidebarWidth] = useSetting(\n    settingsAtom,\n    'threadSidebarWidth'\n  );\n  const [curWidth, setCurWidth] = useState(threadSidebarWidth);\n  useEffect(() => {\n    setCurWidth(threadSidebarWidth);\n  }, [threadSidebarWidth]);\n\n  const [threadRootHeight, setThreadRootHeight] = useSetting(settingsAtom, 'threadRootHeight');\n  const [curHeight, setCurHeight] = useState(threadRootHeight);\n  useEffect(() => {\n    setCurHeight(threadRootHeight);\n  }, [threadRootHeight]);\n  return (\n    <Box\n      ref={drawerRef}\n      className={overlay ? css.ThreadDrawerOverlay : css.ThreadDrawer}\n      direction=\"Column\"\n      shrink=\"No\"\n      style={{\n        position: overlay ? 'absolute' : 'relative',\n        isolation: 'isolate',\n        width: overlay ? '100%' : toRem(curWidth),\n      }}\n    >\n      {!isMobileOrTablet() && (\n        <SidebarResizer\n          setCurWidth={setCurWidth}\n          sidebarWidth={threadSidebarWidth}\n          setSidebarWidth={setThreadSidebarWidth}\n          minValue={250}\n          maxValue={600}\n          isReversed\n        />\n      )}\n      {/* Header */}\n      <Header className={css.ThreadDrawerHeader} variant=\"Background\" size=\"600\">\n        <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n          {composerIcon(Chats)}\n          <Text size=\"H4\" truncate>\n            Thread\n          </Text>\n        </Box>\n        <Box alignItems=\"Center\" gap=\"200\" shrink=\"No\">\n          <IconButton\n            onClick={onClose}\n            variant=\"SurfaceVariant\"\n            size=\"300\"\n            radii=\"300\"\n            aria-label=\"Close thread\"\n          >\n            {composerIcon(X)}\n          </IconButton>\n        </Box>\n      </Header>\n\n      {/* Thread root message */}\n      {rootEvent && (\n        <Box className={css.threadRootShell}>\n          <Box className={css.threadRootScrollShadow}>\n            <Scroll\n              variant=\"Background\"\n              visibility=\"Hover\"\n              direction=\"Vertical\"\n              size=\"300\"\n              hideTrack\n              style={{\n                height: toRem(curHeight),\n                flexShrink: 0,\n              }}\n            >\n              <Box\n                className={css.messageList}\n                direction=\"Column\"\n                style={{\n                  padding: `${config.space.S200} 0 ${config.space.S100} 0`,\n                }}\n              >\n                {renderMatrixEvent(\n                  rootEvent.getType(),\n                  typeof rootEvent.getStateKey() === 'string',\n                  rootEvent.getId()!,\n                  rootEvent,\n                  processedEvents.find((e) => e.id === threadRootId)?.itemIndex ?? 0,\n                  thread?.timelineSet ?? room.getUnfilteredTimelineSet(),\n                  false\n                )}\n              </Box>\n            </Scroll>\n          </Box>\n          <SidebarResizer\n            setCurWidth={setCurHeight}\n            sidebarWidth={threadRootHeight}\n            setSidebarWidth={setThreadRootHeight}\n            minValue={60}\n            maxValue={700}\n            topSided\n          />\n        </Box>\n      )}\n      {/* Replies */}\n      <Box className={css.ThreadDrawerContent} grow=\"Yes\" direction=\"Column\">\n        <Scroll\n          ref={scrollRef}\n          variant=\"Background\"\n          visibility=\"Hover\"\n          direction=\"Vertical\"\n          size=\"300\"\n          onScroll={handleRepliesScroll}\n          style={{ flexGrow: 1 }}\n        >\n          {(() => {\n            if (isThreadLoading)\n              return (\n                <Box\n                  direction=\"Column\"\n                  alignItems=\"Center\"\n                  justifyContent=\"Center\"\n                  style={{ padding: config.space.S400 }}\n                >\n                  <Spinner variant=\"Secondary\" size=\"400\" />\n                </Box>\n              );\n            if (processedReplies.length === 0)\n              return (\n                <Box\n                  direction=\"Column\"\n                  alignItems=\"Center\"\n                  justifyContent=\"Center\"\n                  style={{ padding: config.space.S400, gap: config.space.S200 }}\n                >\n                  {composerIcon(Chats, { style: { opacity: 0.6 } })}\n                  <Text size=\"T300\" align=\"Center\">\n                    No replies yet. Start the thread below!\n                  </Text>\n                </Box>\n              );\n            return (\n              <>\n                {loadingOlderReplies && (\n                  <Box\n                    justifyContent=\"Center\"\n                    style={{ padding: config.space.S300, flexShrink: 0 }}\n                  >\n                    <Spinner variant=\"Secondary\" size=\"200\" />\n                  </Box>\n                )}\n                {/* Reply count label inside scroll area */}\n                <Box\n                  style={{\n                    padding: `${config.space.S200} ${config.space.S400}`,\n                    flexShrink: 0,\n                  }}\n                >\n                  <Text size=\"T300\" priority=\"300\">\n                    {processedReplies.length} {processedReplies.length === 1 ? 'reply' : 'replies'}\n                  </Text>\n                </Box>\n                <Box\n                  className={css.messageList}\n                  direction=\"Column\"\n                  style={{ padding: `0 0 ${config.space.S600} 0` }}\n                >\n                  {processedReplies.map((e) =>\n                    renderMatrixEvent(\n                      e.mEvent.getType(),\n                      typeof e.mEvent.getStateKey() === 'string',\n                      e.id,\n                      e.mEvent,\n                      e.itemIndex,\n                      e.timelineSet,\n                      e.collapsed\n                    )\n                  )}\n                </Box>\n              </>\n            );\n          })()}\n        </Scroll>\n      </Box>\n\n      {/* Thread input */}\n      <Box className={css.ThreadDrawerInput} direction=\"Column\" shrink=\"No\">\n        <div style={{ padding: `0 ${config.space.S400}` }}>\n          <RoomInput\n            key={threadRootId}\n            room={room}\n            roomId={room.roomId}\n            threadRootId={threadRootId}\n            editor={editor}\n            fileDropContainerRef={drawerRef}\n            onEditLastMessage={handleEditLastMessage}\n          />\n        </div>\n        {hideReads ? (\n          <RoomViewFollowingPlaceholder />\n        ) : (\n          <RoomViewFollowing\n            room={room}\n            threadEventId={latestThreadEventId}\n            participantIds={threadParticipantIds}\n          />\n        )}\n      </Box>\n    </Box>\n  );\n}\n","import type { ChangeEventHandler, MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Header, IconButton, Input, Scroll, Spinner, Text, config, Chip, toRem } from 'folds';\nimport type { EventTimelineSet, MatrixEvent, Room, Thread } from '$types/matrix-sdk';\nimport { NotificationCountType, RoomEvent, ThreadEvent } from '$types/matrix-sdk';\nimport { useAtomValue } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport { useRoomMemberHydration } from '$hooks/useRoomMemberHydration';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { reactionOrEditEvent } from '$utils/room/relations';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { Chats, chipIcon, composerIcon, MagnifyingGlass, X } from '$components/icons/phosphor';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { MessagePreview, useRoomMessagePreviewRenderer } from '$components/message-preview';\nimport { UnreadBadge, UnreadBadgeCenter } from '$components/unread-badge';\nimport * as css from './ThreadDrawer.css';\nimport { SidebarResizer } from '$pages/client/sidebar/SidebarResizer';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { useDismissOnBack } from '$utils/androidBack';\nimport { useMatrixEvent } from '$hooks/useMatrixEvent';\n\ntype ThreadPreviewProps = {\n  room: Room;\n  thread: Thread;\n  onClick: (threadId: string) => void;\n  onJump?: () => void;\n};\n\nfunction ThreadPreview({ room, thread, onClick, onJump }: ThreadPreviewProps) {\n  const { navigateRoom } = useRoomNavigate();\n  const nicknames = useAtomValue(nicknamesAtom);\n  const cachedProfiles = useAtomValue(profilesCacheAtom);\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n  const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n  const renderContent = useRoomMessagePreviewRenderer(room);\n\n  const handleJumpClick: MouseEventHandler = useCallback(\n    (evt) => {\n      evt.stopPropagation();\n      navigateRoom(room.roomId, thread.id);\n      onJump?.();\n    },\n    [navigateRoom, room.roomId, thread.id, onJump]\n  );\n\n  const [, forceUnread] = useState(0);\n  const onUnread = useCallback(\n    (_count: unknown, threadId?: string) => {\n      if (!threadId || threadId === thread.id) forceUnread((n) => n + 1);\n    },\n    [thread.id]\n  );\n  useMatrixEvent(room, RoomEvent.UnreadNotifications, onUnread);\n  const unreadTotal = room.getThreadUnreadNotificationCount(thread.id, NotificationCountType.Total);\n  const unreadHighlight = room.getThreadUnreadNotificationCount(\n    thread.id,\n    NotificationCountType.Highlight\n  );\n\n  const { rootEvent } = thread;\n  const lastReply = thread.events.findLast(\n    (ev: MatrixEvent) => ev.getId() !== thread.id && !reactionOrEditEvent(ev)\n  );\n  const lastSenderId = lastReply?.getSender() ?? '';\n  useRoomMemberHydration(room, lastSenderId);\n\n  if (!rootEvent) return null;\n\n  const localReplyCount = thread.events.filter(\n    (ev: MatrixEvent) => ev.getId() !== thread.id && !reactionOrEditEvent(ev)\n  ).length;\n  // Use Math.max so we never show fewer replies than the server reports.\n  const replyCount = Math.max(localReplyCount, thread.length ?? 0);\n\n  const lastDisplayName =\n    getMemberDisplayName(room, lastSenderId, nicknames) ??\n    cachedProfiles[lastSenderId]?.displayName ??\n    getMxIdLocalPart(lastSenderId) ??\n    lastSenderId;\n  const lastContent = lastReply?.getContent();\n  const lastBody: string = typeof lastContent?.body === 'string' ? lastContent.body : '';\n\n  return (\n    <Box\n      as=\"button\"\n      direction=\"Column\"\n      gap=\"100\"\n      className={css.ThreadBrowserItem}\n      onClick={() => onClick(thread.id)}\n    >\n      <MessagePreview\n        room={room}\n        event={rootEvent}\n        renderContent={renderContent}\n        actions={\n          <Box shrink=\"No\" alignItems=\"Center\" gap=\"200\">\n            {unreadTotal > 0 && (\n              <UnreadBadgeCenter>\n                <UnreadBadge highlight={unreadHighlight > 0} count={unreadTotal} />\n              </UnreadBadgeCenter>\n            )}\n            <Chip data-event-id={thread.id} onClick={handleJumpClick} radii=\"Pill\">\n              <Text size=\"T200\">Jump</Text>\n            </Chip>\n          </Box>\n        }\n        onOpen={handleJumpClick}\n        hour24Clock={hour24Clock}\n        dateFormatString={dateFormatString}\n      />\n      {replyCount > 0 && (\n        <Box gap=\"100\" alignItems=\"Center\" style={{ marginTop: config.space.S200 }}>\n          <Text size=\"T200\" priority=\"300\" style={{ flexShrink: 0 }}>\n            {replyCount} {replyCount === 1 ? 'reply' : 'replies'}\n          </Text>\n          {lastReply && lastBody && (\n            <Text\n              size=\"T200\"\n              priority=\"300\"\n              style={{\n                overflow: 'hidden',\n                textOverflow: 'ellipsis',\n                whiteSpace: 'nowrap',\n                minWidth: 0,\n              }}\n            >\n              · {lastDisplayName}: {lastBody.slice(0, 60)}\n            </Text>\n          )}\n        </Box>\n      )}\n    </Box>\n  );\n}\n\ntype ThreadBrowserProps = {\n  room: Room;\n  onOpenThread: (threadId: string) => void;\n  onClose: () => void;\n  overlay?: boolean;\n};\n\nexport function ThreadBrowser({ room, onOpenThread, onClose, overlay }: ThreadBrowserProps) {\n  const mx = useMatrixClient();\n  const [, forceUpdate] = useState(0);\n  const [query, setQuery] = useState('');\n  const [loadingMore, setLoadingMore] = useState(false);\n  const [canLoadMore, setCanLoadMore] = useState(false);\n  const searchRef = useRef<HTMLInputElement>(null);\n  const threadListTimelineSetRef = useRef<EventTimelineSet | null>(null);\n  const loadingMoreRef = useRef(false);\n  const canLoadMoreRef = useRef(false);\n  canLoadMoreRef.current = canLoadMore;\n  useDismissOnBack(onClose);\n\n  // On mount, set up thread event listeners, create the server-side thread\n  // timeline sets, then fetch page 1 via paginate.  The two operations are\n  // sequenced in a single effect so that createThreadsTimelineSets() always\n  // resolves before fetchRoomThreads() runs — the SDK's fetchRoomThreadList\n  // has an early-return guard (`if (this.threadsTimelineSets.length === 0)`)\n  // that silently no-ops when the sets haven't been created yet, so running\n  // both in parallel (the old two-effect approach) caused fetchRoomThreads to\n  // always be a no-op and left threadsReady=true prematurely.\n  useEffect(() => {\n    const onUpdate = () => forceUpdate((n) => n + 1);\n    room.on(ThreadEvent.New, onUpdate);\n    room.on(ThreadEvent.Update, onUpdate);\n    room.on(ThreadEvent.NewReply, onUpdate);\n\n    let cancelled = false;\n    const loadThreads = async () => {\n      setLoadingMore(true);\n      try {\n        // Create the timeline sets first — required before fetchRoomThreads().\n        const sets = await room.createThreadsTimelineSets();\n        if (!sets || cancelled) return;\n        const [allThreadsSet] = sets;\n        threadListTimelineSetRef.current = allThreadsSet;\n\n        // Now fetch page 1 from the /threads endpoint.  threadsTimelineSets is\n        // populated so fetchRoomThreadList will not early-return.\n        await room.fetchRoomThreads().catch((err: unknown) => {\n          console.warn('ThreadBrowser: fetchRoomThreads failed', err);\n        });\n\n        // Paginate to load the first page into the timeline set.\n        const hasMore = await mx.paginateEventTimeline(allThreadsSet.getLiveTimeline(), {\n          backwards: true,\n        });\n        // Ensure Thread objects exist for server-returned thread roots not yet\n        // known locally (threads outside the current sliding-sync window).\n        // fetchRoomThreads() creates Thread objects internally but uses\n        // room.findEventById() to set rootEvent — if the root event isn't in\n        // the sliding-sync cache, rootEvent ends up undefined, and\n        // ThreadPreview returns null for those threads.  Backfill here using\n        // the event we already have from the threads timeline set.\n        allThreadsSet\n          .getLiveTimeline()\n          .getEvents()\n          .filter((event) => !!event.getId())\n          .forEach((event) => {\n            const id = event.getId()!;\n            const existingThread = room.getThread(id);\n\n            if (!existingThread) {\n              room.createThread(id, event, [], false);\n            } else {\n              if (!existingThread.rootEvent) {\n                existingThread.rootEvent = event;\n                existingThread.setEventMetadata(event);\n              }\n            }\n          });\n        if (!cancelled) {\n          setCanLoadMore(hasMore);\n          forceUpdate((n) => n + 1);\n        }\n      } catch {\n        // Server doesn't support thread list API; fall back to locally known threads.\n      } finally {\n        if (!cancelled) setLoadingMore(false);\n      }\n    };\n    loadThreads();\n\n    return () => {\n      cancelled = true;\n      room.off(ThreadEvent.New, onUpdate);\n      room.off(ThreadEvent.Update, onUpdate);\n      room.off(ThreadEvent.NewReply, onUpdate);\n    };\n  }, [room, mx]);\n\n  const handleLoadMore = useCallback(async () => {\n    const tls = threadListTimelineSetRef.current;\n    if (!tls || loadingMore) return;\n    setLoadingMore(true);\n    try {\n      const hasMore = await mx.paginateEventTimeline(tls.getLiveTimeline(), {\n        backwards: true,\n      });\n      tls\n        .getLiveTimeline()\n        .getEvents()\n        .filter((event) => !!event.getId())\n        .forEach((event) => {\n          const id = event.getId()!;\n          const existingThread = room.getThread(id);\n\n          if (!existingThread) {\n            room.createThread(id, event, [], false);\n          } else {\n            if (!existingThread.rootEvent) {\n              existingThread.rootEvent = event;\n              existingThread.setEventMetadata(event);\n            }\n          }\n        });\n      setCanLoadMore(hasMore);\n      forceUpdate((n) => n + 1);\n    } catch {\n      // ignore\n    } finally {\n      setLoadingMore(false);\n      loadingMoreRef.current = false;\n    }\n  }, [mx, room, loadingMore]);\n\n  const handleLoadMoreRef = useRef(handleLoadMore);\n  handleLoadMoreRef.current = handleLoadMore;\n\n  const handleThreadsScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n    const el = e.currentTarget;\n    const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;\n    if (distanceFromBottom < 200 && canLoadMoreRef.current && !loadingMoreRef.current) {\n      handleLoadMoreRef.current();\n    }\n  }, []);\n\n  const allThreads = room.getThreads().toSorted((a: Thread, b: Thread) => {\n    const aTs = a.events.at(-1)?.getTs() ?? a.rootEvent?.getTs() ?? 0;\n    const bTs = b.events.at(-1)?.getTs() ?? b.rootEvent?.getTs() ?? 0;\n    return bTs - aTs;\n  });\n\n  const lowerQuery = query.trim().toLowerCase();\n  const threads = lowerQuery\n    ? allThreads.filter((t: Thread) => {\n        const body = t.rootEvent?.getContent()?.body ?? '';\n        return typeof body === 'string' && body.toLowerCase().includes(lowerQuery);\n      })\n    : allThreads;\n\n  const handleSearchChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n    setQuery(e.target.value);\n  };\n\n  const [threadSidebarWidth, setThreadSidebarWidth] = useSetting(\n    settingsAtom,\n    'threadSidebarWidth'\n  );\n  const [curWidth, setCurWidth] = useState(threadSidebarWidth);\n  useEffect(() => {\n    setCurWidth(threadSidebarWidth);\n  }, [threadSidebarWidth]);\n  return (\n    <Box\n      className={overlay ? css.ThreadDrawerOverlay : css.ThreadDrawer}\n      direction=\"Column\"\n      shrink=\"No\"\n      style={{\n        position: 'relative',\n        width: overlay ? '100%' : toRem(curWidth),\n      }}\n    >\n      {!isMobileOrTablet() && (\n        <SidebarResizer\n          setCurWidth={setCurWidth}\n          sidebarWidth={threadSidebarWidth}\n          setSidebarWidth={setThreadSidebarWidth}\n          minValue={150}\n          maxValue={600}\n          isReversed\n        />\n      )}\n      <Header className={css.ThreadDrawerHeader} variant=\"Background\" size=\"600\">\n        <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n          {composerIcon(Chats)}\n          <Text size=\"H4\" truncate>\n            Threads\n          </Text>\n        </Box>\n        <Box alignItems=\"Center\" gap=\"200\" shrink=\"No\">\n          <IconButton\n            onClick={onClose}\n            variant=\"SurfaceVariant\"\n            size=\"300\"\n            radii=\"300\"\n            aria-label=\"Close threads\"\n          >\n            {composerIcon(X)}\n          </IconButton>\n        </Box>\n      </Header>\n\n      <Box\n        direction=\"Column\"\n        gap=\"100\"\n        style={{ padding: `${config.space.S200} ${config.space.S300}` }}\n        shrink=\"No\"\n      >\n        <Input\n          ref={searchRef}\n          value={query}\n          onChange={handleSearchChange}\n          placeholder=\"Search threads...\"\n          variant=\"Surface\"\n          size=\"400\"\n          radii=\"400\"\n          before={chipIcon(MagnifyingGlass)}\n          after={\n            query ? (\n              <IconButton\n                size=\"300\"\n                radii=\"300\"\n                variant=\"SurfaceVariant\"\n                onClick={() => {\n                  setQuery('');\n                  searchRef.current?.focus();\n                }}\n                aria-label=\"Clear search\"\n              >\n                {chipIcon(X)}\n              </IconButton>\n            ) : undefined\n          }\n        />\n      </Box>\n\n      <Box className={css.ThreadDrawerContent} grow=\"Yes\" direction=\"Column\">\n        <Scroll\n          variant=\"Background\"\n          visibility=\"Hover\"\n          direction=\"Vertical\"\n          size=\"300\"\n          onScroll={handleThreadsScroll}\n          style={{ flexGrow: 1 }}\n        >\n          {(() => {\n            if (threads.length === 0 && loadingMore)\n              return (\n                <Box\n                  direction=\"Column\"\n                  alignItems=\"Center\"\n                  justifyContent=\"Center\"\n                  style={{ padding: config.space.S400, gap: config.space.S200 }}\n                >\n                  <Spinner variant=\"Secondary\" size=\"400\" />\n                </Box>\n              );\n            if (threads.length === 0)\n              return (\n                <Box\n                  direction=\"Column\"\n                  alignItems=\"Center\"\n                  justifyContent=\"Center\"\n                  style={{ padding: config.space.S400, gap: config.space.S200 }}\n                >\n                  {composerIcon(Chats, { style: { opacity: 0.6 } })}\n                  <Text size=\"T300\" align=\"Center\">\n                    {lowerQuery ? 'No threads match your search.' : 'No threads yet.'}\n                  </Text>\n                </Box>\n              );\n            return (\n              <>\n                <Box\n                  direction=\"Column\"\n                  style={{ padding: `${config.space.S100} ${config.space.S200}` }}\n                >\n                  {threads.map((thread: Thread) => (\n                    <ThreadPreview\n                      key={thread.id}\n                      room={room}\n                      thread={thread}\n                      onClick={onOpenThread}\n                      onJump={onClose}\n                    />\n                  ))}\n                </Box>\n                {loadingMore && (\n                  <Box\n                    justifyContent=\"Center\"\n                    style={{ padding: config.space.S300, flexShrink: 0 }}\n                  >\n                    <Spinner variant=\"Secondary\" size=\"400\" />\n                  </Box>\n                )}\n              </>\n            );\n          })()}\n        </Scroll>\n      </Box>\n    </Box>\n  );\n}\n","import { useCallback, useEffect } from 'react';\nimport { Box, Line } from 'folds';\nimport { useParams } from 'react-router';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { useAtom, useAtomValue } from 'jotai';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { PowerLevelsContextProvider, usePowerLevels } from '$hooks/usePowerLevels';\nimport { useRoom, useDisplayedEventId } from '$hooks/useRoom';\nimport { useKeyDown } from '$hooks/useKeyDown';\nimport { markAsRead } from '$utils/notifications';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRoomMembers } from '$hooks/useRoomMembers';\nimport { Page } from '$components/page';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { CallView } from '$features/call/CallView';\nimport { WidgetsDrawer } from '$features/widgets/WidgetsDrawer';\nimport { callChatAtom } from '$state/callEmbed';\nimport { roomIdToOpenThreadAtomFamily } from '$state/room/roomToOpenThread';\nimport { roomIdToThreadBrowserAtomFamily } from '$state/room/roomToThreadBrowser';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport { useMergedAbbreviations, RoomAbbreviationsContext } from '$hooks/useRoomAbbreviations';\nimport { RoomViewHeader } from './RoomViewHeader';\nimport { MembersDrawer } from './MembersDrawer';\nimport { RoomView } from './RoomView';\nimport { CallChatView } from './CallChatView';\nimport { ThreadDrawer } from './ThreadDrawer';\nimport { ThreadBrowser } from './ThreadBrowser';\n\nconst debugLog = createDebugLogger('Room');\n\nexport function Room() {\n  const displayedEventId = useDisplayedEventId();\n  const { eventId: paramEventId } = useParams();\n  const eventId = displayedEventId ?? paramEventId;\n  const room = useRoom();\n  const mx = useMatrixClient();\n\n  // Log room mount\n  useEffect(() => {\n    debugLog.info('ui', 'Room component mounted', { roomId: room.roomId, eventId });\n    return () => {\n      debugLog.info('ui', 'Room component unmounted', { roomId: room.roomId });\n    };\n  }, [room.roomId, eventId]);\n\n  const [isDrawer] = useSetting(settingsAtom, 'isPeopleDrawer');\n  const [isWidgetDrawerOpen, setWidgetDrawerOpen] = useSetting(settingsAtom, 'isWidgetDrawer');\n  const [hideReads] = useSetting(settingsAtom, 'hideReads');\n  const screenSize = useScreenSizeContext();\n\n  // Log drawer state changes\n  useEffect(() => {\n    debugLog.debug('ui', 'Members drawer state changed', {\n      roomId: room.roomId,\n      isOpen: isDrawer,\n    });\n  }, [isDrawer, room.roomId]);\n\n  useEffect(() => {\n    debugLog.debug('ui', 'Widgets drawer state changed', {\n      roomId: room.roomId,\n      isOpen: isWidgetDrawerOpen,\n    });\n  }, [isWidgetDrawerOpen, room.roomId]);\n  const powerLevels = usePowerLevels(room);\n  const members = useRoomMembers(mx, room.roomId, screenSize === ScreenSize.Desktop && isDrawer);\n  const chat = useAtomValue(callChatAtom);\n  const [openThreadId, setOpenThread] = useAtom(roomIdToOpenThreadAtomFamily(room.roomId));\n  const [threadBrowserOpen, setThreadBrowserOpen] = useAtom(\n    roomIdToThreadBrowserAtomFamily(room.roomId)\n  );\n\n  // If navigating to an event in a thread, open the thread drawer\n  useEffect(() => {\n    if (!eventId) return;\n\n    const event = room.findEventById(eventId);\n    if (!event) return;\n\n    const { threadRootId } = event;\n    if (threadRootId) {\n      // Ensure Thread object exists\n      if (!room.getThread(threadRootId)) {\n        const rootEvent = room.findEventById(threadRootId);\n        if (rootEvent) {\n          room.createThread(threadRootId, rootEvent, [], false);\n        }\n      }\n      setOpenThread(threadRootId);\n    }\n  }, [eventId, room, setOpenThread]);\n\n  useKeyDown(\n    window,\n    useCallback(\n      (evt) => {\n        if (isKeyHotkey('escape', evt)) {\n          markAsRead(mx, room.roomId, hideReads);\n        }\n      },\n      [mx, room.roomId, hideReads]\n    )\n  );\n\n  const callView = room.isCallRoom();\n  const abbreviations = useMergedAbbreviations(room);\n\n  // Log call view state\n  useEffect(() => {\n    debugLog.debug('ui', 'Room view mode', { roomId: room.roomId, callView, chatOpen: chat });\n  }, [callView, chat, room.roomId]);\n\n  return (\n    <PowerLevelsContextProvider value={powerLevels}>\n      <RoomAbbreviationsContext.Provider value={abbreviations}>\n        <Box grow=\"Yes\" style={{ position: 'relative', minWidth: 0, width: '100%' }}>\n          {callView && (screenSize === ScreenSize.Desktop || !chat) && (\n            <Page>\n              <RoomViewHeader callView />\n              <Box grow=\"Yes\">\n                <CallView />\n              </Box>\n            </Page>\n          )}\n          {!callView && (\n            <Box grow=\"Yes\" direction=\"Column\">\n              <RoomViewHeader />\n              <Box grow=\"Yes\" style={{ minWidth: 0, minHeight: 0, width: '100%' }}>\n                <RoomView eventId={eventId} />\n              </Box>\n            </Box>\n          )}\n\n          {callView && chat && (\n            <>\n              {screenSize === ScreenSize.Desktop && (\n                <Line variant=\"Background\" direction=\"Vertical\" size=\"300\" />\n              )}\n              <CallChatView />\n            </>\n          )}\n          {!callView && screenSize === ScreenSize.Desktop && isDrawer && (\n            <>\n              <Line variant=\"Background\" direction=\"Vertical\" size=\"300\" />\n              <MembersDrawer key={room.roomId} room={room} members={members} />\n            </>\n          )}\n          {screenSize === ScreenSize.Desktop && isWidgetDrawerOpen && (\n            <>\n              <Line variant=\"Background\" direction=\"Vertical\" size=\"300\" />\n              <WidgetsDrawer key={`widgets-${room.roomId}`} room={room} />\n            </>\n          )}\n          {screenSize !== ScreenSize.Desktop && isWidgetDrawerOpen && (\n            <ModalOverlay\n              requestClose={() => setWidgetDrawerOpen(false)}\n              dismissOnClickOutside={false}\n              mobile=\"fullscreen\"\n            >\n              <Box\n                className={ContainerColor({ variant: 'Background' })}\n                direction=\"Column\"\n                style={{ position: 'fixed', inset: 0 }}\n              >\n                <WidgetsDrawer key={`widgets-${room.roomId}`} room={room} />\n              </Box>\n            </ModalOverlay>\n          )}\n          {screenSize === ScreenSize.Desktop && openThreadId && (\n            <>\n              <Line variant=\"Background\" direction=\"Vertical\" size=\"300\" />\n              <ThreadDrawer\n                key={`thread-${room.roomId}-${openThreadId}`}\n                room={room}\n                threadRootId={openThreadId}\n                onClose={() => setOpenThread(undefined)}\n              />\n            </>\n          )}\n          {screenSize === ScreenSize.Desktop && threadBrowserOpen && !openThreadId && (\n            <>\n              <Line variant=\"Background\" direction=\"Vertical\" size=\"300\" />\n              <ThreadBrowser\n                key={`thread-browser-${room.roomId}`}\n                room={room}\n                onOpenThread={(id) => {\n                  setOpenThread(id);\n                  setThreadBrowserOpen(false);\n                }}\n                onClose={() => setThreadBrowserOpen(false)}\n              />\n            </>\n          )}\n          {screenSize !== ScreenSize.Desktop && openThreadId && (\n            <ThreadDrawer\n              key={`thread-${room.roomId}-${openThreadId}`}\n              room={room}\n              threadRootId={openThreadId}\n              onClose={() => setOpenThread(undefined)}\n              overlay\n            />\n          )}\n          {screenSize !== ScreenSize.Desktop && threadBrowserOpen && !openThreadId && (\n            <ThreadBrowser\n              key={`thread-browser-${room.roomId}`}\n              room={room}\n              onOpenThread={(id) => {\n                setOpenThread(id);\n                setThreadBrowserOpen(false);\n              }}\n              onClose={() => setThreadBrowserOpen(false)}\n              overlay\n            />\n          )}\n        </Box>\n      </RoomAbbreviationsContext.Provider>\n    </PowerLevelsContextProvider>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { as } from 'folds';\nimport classNames from 'classnames';\nimport * as css from './styles.css';\n\ntype NavCategoryProps = {\n  children: ReactNode;\n};\nexport const NavCategory = as<'div', NavCategoryProps>(({ className, ...props }, ref) => (\n  <div className={classNames(css.NavCategory, className)} {...props} ref={ref} />\n));\n","import type { ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { Header, as } from 'folds';\nimport * as css from './styles.css';\n\ntype NavCategoryHeaderProps = {\n  children: ReactNode;\n};\nexport const NavCategoryHeader = as<'div', NavCategoryHeaderProps>(\n  ({ className, ...props }, ref) => (\n    <Header\n      className={classNames(css.NavCategoryHeader, className)}\n      variant=\"Background\"\n      size=\"300\"\n      {...props}\n      ref={ref}\n    />\n  )\n);\n","import { Box, config } from 'folds';\nimport type { ReactNode } from 'react';\n\nexport function NavEmptyCenter({ children }: { children: ReactNode }) {\n  return (\n    <Box\n      style={{\n        padding: config.space.S500,\n      }}\n      grow=\"Yes\"\n      direction=\"Column\"\n      justifyContent=\"Center\"\n    >\n      {children}\n    </Box>\n  );\n}\n\ntype NavEmptyLayoutProps = {\n  icon?: ReactNode;\n  title?: ReactNode;\n  content?: ReactNode;\n  options?: ReactNode;\n};\nexport function NavEmptyLayout({ icon, title, content, options }: NavEmptyLayoutProps) {\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Box direction=\"Column\" alignItems=\"Center\" gap=\"200\">\n        {icon}\n      </Box>\n      <Box direction=\"Column\" gap=\"100\" alignItems=\"Center\">\n        {title}\n        {content}\n      </Box>\n      <Box direction=\"Column\" gap=\"200\">\n        {options}\n      </Box>\n    </Box>\n  );\n}\n","import classNames from 'classnames';\nimport type { ComponentProps } from 'react';\nimport { forwardRef } from 'react';\nimport { Link } from 'react-router';\nimport { as } from 'folds';\nimport * as css from './styles.css';\n\nexport const NavItem = as<'div', { highlight?: boolean } & css.RoomSelectorVariants>(\n  ({ as: AsNavItem = 'div', className, highlight, variant, radii, children, ...props }, ref) => (\n    <AsNavItem\n      className={classNames(css.NavItem({ variant, radii }), className)}\n      data-highlight={highlight}\n      {...props}\n      ref={ref}\n    >\n      {children}\n    </AsNavItem>\n  )\n);\n\nexport const NavLink = forwardRef<HTMLAnchorElement, ComponentProps<typeof Link>>(\n  ({ className, ...props }, ref) => (\n    <Link className={classNames(css.NavLink, className)} {...props} ref={ref} />\n  )\n);\n\nexport const NavButton = as<'button'>(\n  ({ as: AsNavButton = 'button', className, ...props }, ref) => (\n    <AsNavButton className={classNames(css.NavLink, className)} {...props} ref={ref} />\n  )\n);\n","import type { ComponentProps } from 'react';\nimport { Text, as } from 'folds';\nimport classNames from 'classnames';\nimport * as css from './styles.css';\n\nexport const NavItemContent = as<'p', ComponentProps<typeof Text>>(\n  ({ children, className, ...props }, ref) => (\n    <Text className={classNames(css.NavItemContent, className)} size=\"T300\" {...props} ref={ref}>\n      {children}\n    </Text>\n  )\n);\n","import type { ComponentProps } from 'react';\nimport { Box, as } from 'folds';\nimport classNames from 'classnames';\nimport * as css from './styles.css';\n\nexport const NavItemOptions = as<'div', ComponentProps<typeof Box>>(\n  ({ className, ...props }, ref) => (\n    <Box\n      className={classNames(css.NavItemOptions, className)}\n      alignItems=\"Center\"\n      shrink=\"No\"\n      gap=\"0\"\n      {...props}\n      ref={ref}\n    />\n  )\n);\n","import { useMatch, useParams } from 'react-router';\nimport {\n  getCreatePath,\n  getDirectCreatePath,\n  getDirectPath,\n  getExploreFeaturedPath,\n  getExplorePath,\n  getHomePath,\n  getHomeSearchPath,\n  getInboxBookmarksPath,\n  getInboxInvitesPath,\n  getInboxNotificationsPath,\n  getInboxPath,\n  getNavigatePath,\n  getProfilePath,\n} from '$pages/pathUtils';\nimport { CREATE_ROOM_PATH } from '$pages/paths';\n\n/** True when the current location is at, or inside, the given path. */\nexport const useRouteSelected = (path: string): boolean =>\n  !!useMatch({ path, caseSensitive: true, end: false });\n\nexport const useCreateSelected = (): boolean => useRouteSelected(getCreatePath());\n\nexport const useDirectSelected = (): boolean => useRouteSelected(getDirectPath());\nexport const useDirectCreateSelected = (): boolean => useRouteSelected(getDirectCreatePath());\n\nexport const useExploreSelected = (): boolean => useRouteSelected(getExplorePath());\nexport const useExploreFeaturedSelected = (): boolean => useRouteSelected(getExploreFeaturedPath());\nexport const useExploreServer = (): string | undefined => useParams().server;\n\nexport const useHomeSelected = (): boolean => useRouteSelected(getHomePath());\nexport const useHomeCreateSelected = (): boolean => useRouteSelected(CREATE_ROOM_PATH);\nexport const useHomeSearchSelected = (): boolean => useRouteSelected(getHomeSearchPath());\n\nexport const useInboxSelected = (): boolean => useRouteSelected(getInboxPath());\nexport const useInboxNotificationsSelected = (): boolean =>\n  useRouteSelected(getInboxNotificationsPath());\nexport const useInboxInvitesSelected = (): boolean => useRouteSelected(getInboxInvitesPath());\nexport const useInboxBookmarksSelected = (): boolean => useRouteSelected(getInboxBookmarksPath());\n\nexport const useNavigateSelected = (): boolean => useRouteSelected(getNavigatePath());\n\nexport const useProfileSelected = (): boolean => useRouteSelected(getProfilePath());\n","import type { ComponentProps, MouseEventHandler } from 'react';\nimport { MenuItem } from 'folds';\nimport { useMobileTapActivation } from '$hooks/useMobileTapActivation';\n\ntype MenuItemProps = ComponentProps<typeof MenuItem>;\n\ntype MobileMenuItemProps = Omit<MenuItemProps, 'onClick'> & {\n  isMobile: boolean;\n  onClick?: MouseEventHandler<HTMLButtonElement>;\n};\n\n/**\n * Wraps folds' `MenuItem` with pointer-based tap activation for Android\n * WebView, where click synthesis is suppressed after the long-press gesture\n * that opens the mobile swipe-down modal. On mobile the `onClick` handler\n * fires on `pointerup` instead of relying on the missing click event.\n */\nexport function MobileMenuItem({ isMobile, onClick, ...props }: MobileMenuItemProps) {\n  const activation = useMobileTapActivation<HTMLButtonElement>(isMobile, (evt) => {\n    onClick?.(evt);\n  });\n  return <MenuItem {...activation} {...props} data-mobile-sheet-no-drag=\"\" />;\n}\n","import { Avatar, Box, Text } from 'folds';\nimport { userFallbackIcon } from '$components/icons/phosphor';\nimport type { MouseEventHandler } from 'react';\nimport { useAtomValue } from 'jotai';\nimport type { Room, CallMembership } from '$types/matrix-sdk';\nimport { NavButton, NavItem, NavItemContent } from '$components/nav';\nimport { UserAvatar } from '$components/user-avatar';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { getAvatarUrl, getMemberAvatarMxc, getMemberDisplayName } from '$utils/room/display';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { useCallEmbed } from '$hooks/useCallEmbed';\n\ntype RoomNavUserProps = {\n  room: Room;\n  callMembership: CallMembership;\n  hideText?: boolean;\n};\n\nexport function RoomNavUser({ room, callMembership, hideText }: RoomNavUserProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const openProfile = useOpenUserRoomProfile();\n  const space = useSpaceOptionally();\n\n  const callEmbed = useCallEmbed();\n  const isActiveCall = callEmbed?.roomId === room.roomId;\n\n  const userId = callMembership.sender ?? '';\n  const avatarMxcUrl = getMemberAvatarMxc(room, userId);\n  const avatarUrl = getAvatarUrl(mx, avatarMxcUrl, 32, useAuthentication);\n  const nicknames = useAtomValue(nicknamesAtom);\n  const name = getMemberDisplayName(room, userId, nicknames) ?? getMxIdLocalPart(userId);\n  const isCallParticipant = isActiveCall && userId !== mx.getUserId();\n\n  const handleNavUserClick: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    openProfile(\n      room.roomId,\n      space?.roomId,\n      userId,\n      undefined,\n      evt.currentTarget.getBoundingClientRect()\n    );\n  };\n\n  const ariaLabel = isCallParticipant ? `Call Participant: ${name}` : name;\n\n  return (\n    <NavItem variant=\"Background\" radii=\"400\">\n      <NavButton onClick={handleNavUserClick} aria-label={ariaLabel}>\n        <NavItemContent as=\"div\" style={hideText ? { padding: '0' } : {}}>\n          <Box direction=\"Column\" grow=\"Yes\" gap=\"200\" justifyContent=\"Stretch\">\n            <Box alignItems=\"Center\" gap=\"200\" justifyContent={hideText ? 'Center' : 'Start'}>\n              <Avatar size=\"200\">\n                <UserAvatar\n                  userId={userId}\n                  src={avatarUrl ?? undefined}\n                  alt={name}\n                  renderFallback={() => userFallbackIcon('sm')}\n                />\n              </Avatar>\n              {!hideText && (\n                <Text as=\"span\" size=\"B400\" priority=\"300\" truncate>\n                  {name}\n                </Text>\n              )}\n            </Box>\n          </Box>\n        </NavItemContent>\n      </NavButton>\n    </NavItem>\n  );\n}\n","import classNames from 'classnames';\nimport { as } from 'folds';\nimport * as css from './Sidebar.css';\n\nexport const Sidebar = as<'div'>(({ as: AsSidebar = 'div', className, ...props }, ref) => (\n  <AsSidebar className={classNames(css.Sidebar, className)} {...props} ref={ref} />\n));\n","import classNames from 'classnames';\nimport type { Position } from 'folds';\nimport { as, Avatar, Text, Tooltip, toRem } from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport type { ComponentProps, ReactNode, RefCallback } from 'react';\nimport { isMobileOrTablet } from '$utils/platform';\nimport * as css from './Sidebar.css';\n\nconst SidebarItemBottom = as<'div', css.SidebarItemVariants>(\n  ({ as: AsSidebarAvatarBox = 'div', className, active, ...props }, ref) => (\n    <AsSidebarAvatarBox\n      className={classNames(css.SidebarItemBottom({ active }), className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport const SidebarItemLeft = as<'div', css.SidebarItemVariants>(\n  ({ as: AsSidebarAvatarBox = 'div', className, active, ...props }, ref) => (\n    <AsSidebarAvatarBox\n      className={classNames(css.SidebarItem({ active }), className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport const SidebarItem = ({\n  className,\n  active,\n  isBottom,\n  children,\n  ...props\n}: {\n  className?: string;\n  active?: boolean;\n  isBottom?: boolean;\n  children: ReactNode;\n}) => {\n  if (isBottom)\n    return (\n      <SidebarItemBottom className={className} active={active} {...props}>\n        {children}\n      </SidebarItemBottom>\n    );\n  else\n    return (\n      <SidebarItemLeft className={className} active={active} {...props}>\n        {children}\n      </SidebarItemLeft>\n    );\n};\n\nexport const SidebarItemBadge = as<'div', css.SidebarItemBadgeVariants>(\n  ({ as: AsSidebarBadgeBox = 'div', className, mode, ...props }, ref) => (\n    <AsSidebarBadgeBox\n      className={classNames(css.SidebarItemBadge({ mode }), className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport function SidebarItemTooltip({\n  tooltip,\n  children,\n  position,\n}: {\n  tooltip?: ReactNode | string;\n  children: (triggerRef: RefCallback<HTMLElement | SVGElement>) => ReactNode;\n  position?: Position;\n}) {\n  if (!tooltip || isMobileOrTablet()) {\n    return children(() => undefined);\n  }\n\n  return (\n    <TooltipProvider\n      delay={400}\n      position={position ?? 'Right'}\n      tooltip={\n        <Tooltip style={{ maxWidth: toRem(280) }}>\n          <Text size=\"H5\">{tooltip}</Text>\n        </Tooltip>\n      }\n    >\n      {children}\n    </TooltipProvider>\n  );\n}\n\nexport const SidebarAvatar = as<'div', css.SidebarAvatarVariants & ComponentProps<typeof Avatar>>(\n  ({ className, size, outlined, radii, ...props }, ref) => (\n    <Avatar\n      className={classNames(css.SidebarAvatar({ size, outlined }), className)}\n      radii={radii}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport const SidebarFolder = as<'div', css.SidebarFolderVariants>(\n  ({ as: AsSidebarFolder = 'div', className, state, ...props }, ref) => (\n    <AsSidebarFolder\n      className={classNames(css.SidebarFolder({ state }), className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport const SidebarFolderDropTarget = as<'div', css.SidebarFolderDropTargetVariants>(\n  ({ as: AsSidebarFolderDropTarget = 'div', className, position, ...props }, ref) => (\n    <AsSidebarFolderDropTarget\n      className={classNames(css.SidebarFolderDropTarget({ position }), className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n","import type { UnreadBadgeMode } from '$components/unread-badge';\nimport { UnreadBadge, resolveUnreadBadgeMode } from '$components/unread-badge';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { SidebarItemBadge } from './SidebarItem';\n\ntype SidebarUnreadBadgeProps = {\n  highlight?: boolean;\n  count: number;\n  dm?: boolean;\n  mode?: UnreadBadgeMode;\n};\n\nexport function SidebarUnreadBadge({\n  highlight,\n  count,\n  dm,\n  mode,\n}: Readonly<SidebarUnreadBadgeProps>) {\n  const [showUnreadCounts] = useSetting(settingsAtom, 'showUnreadCounts');\n  const [badgeCountDMsOnly] = useSetting(settingsAtom, 'badgeCountDMsOnly');\n  const [showPingCounts] = useSetting(settingsAtom, 'showPingCounts');\n  const resolvedMode =\n    mode ??\n    resolveUnreadBadgeMode({\n      highlight,\n      count,\n      dm,\n      showUnreadCounts,\n      badgeCountDMsOnly,\n      showPingCounts,\n    });\n\n  return (\n    <SidebarItemBadge mode={resolvedMode}>\n      <UnreadBadge highlight={highlight} count={count} dm={dm} mode={resolvedMode} />\n    </SidebarItemBadge>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Box } from 'folds';\n\ntype SidebarContentProps = {\n  scrollable: ReactNode;\n  sticky: ReactNode;\n};\nexport function SidebarContent({ scrollable, sticky }: SidebarContentProps) {\n  return (\n    <>\n      <Box direction=\"Column\" grow=\"Yes\">\n        {scrollable}\n      </Box>\n      <Box direction=\"Column\" shrink=\"No\">\n        {sticky}\n      </Box>\n    </>\n  );\n}\n","import classNames from 'classnames';\nimport { as } from 'folds';\nimport * as css from './Sidebar.css';\n\nexport const SidebarStack = as<'div'>(\n  ({ as: AsSidebarStack = 'div', className, ...props }, ref) => (\n    <AsSidebarStack className={classNames(css.SidebarStack, className)} {...props} ref={ref} />\n  )\n);\n","import { Line, toRem } from 'folds';\n\nexport function SidebarStackSeparator() {\n  return (\n    <Line\n      role=\"separator\"\n      style={{ width: toRem(24), margin: '0 auto' }}\n      variant=\"Background\"\n      size=\"300\"\n    />\n  );\n}\n","import type { ReactNode } from 'react';\nimport {\n  SidebarAvatar,\n  SidebarItemLeft,\n  SidebarUnreadBadge,\n  SidebarItemTooltip,\n} from '$components/sidebar';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport type { MenuAnchor } from '$hooks/useMenuAnchor';\n\ntype SidebarTabProps = {\n  icon: ReactNode;\n  selected: boolean;\n  tooltip: string;\n  onClick: () => void;\n  menu: ReactNode;\n  menuAnchor: MenuAnchor<HTMLButtonElement>;\n  unreadHighlight?: boolean;\n  unreadCount?: number;\n  dm?: boolean;\n};\n\nexport function SidebarTab({\n  icon,\n  selected,\n  tooltip,\n  onClick,\n  menu,\n  menuAnchor,\n  unreadHighlight = false,\n  unreadCount = 0,\n  dm = false,\n}: SidebarTabProps) {\n  const { anchor, close, triggerProps, consumeLongPressFired } = menuAnchor;\n\n  // Platforms that do not fire `contextmenu` on a long press (WKWebView) still send a\n  // synthetic click on release, which would navigate away from the menu just opened.\n  const handleClick = () => {\n    if (consumeLongPressFired()) return;\n    onClick();\n  };\n\n  return (\n    <SidebarItemLeft active={selected}>\n      <SidebarItemTooltip tooltip={tooltip}>\n        {(triggerRef) => (\n          <ResponsiveMenu\n            anchor={anchor}\n            requestClose={close}\n            position=\"Right\"\n            align=\"Start\"\n            menu={menu}\n          >\n            <SidebarAvatar\n              as=\"button\"\n              ref={triggerRef}\n              outlined\n              onClick={handleClick}\n              onContextMenu={triggerProps.onContextMenu}\n              onTouchStart={triggerProps.onTouchStart}\n              onTouchEnd={triggerProps.onTouchEnd}\n              onTouchMove={triggerProps.onTouchMove}\n              onTouchCancel={triggerProps.onTouchCancel}\n            >\n              {icon}\n            </SidebarAvatar>\n          </ResponsiveMenu>\n        )}\n      </SidebarItemTooltip>\n      {unreadCount > 0 && (\n        <SidebarUnreadBadge highlight={unreadHighlight} count={unreadCount} dm={dm} />\n      )}\n    </SidebarItemLeft>\n  );\n}\n","import type { MouseEventHandler, MouseEvent } from 'react';\nimport { forwardRef, startTransition, useState, useEffect } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport { RoomEvent as RoomEventEnum } from '$types/matrix-sdk';\nimport {\n  Avatar,\n  Box,\n  IconButton,\n  Text,\n  Menu,\n  config,\n  toRem,\n  Line,\n  Badge,\n  Spinner,\n  Tooltip,\n} from 'folds';\nimport { TooltipProvider } from '$components/overlay-stack';\nimport { useFocusWithin, useHover } from 'react-aria';\nimport { useAtom, useAtomValue } from 'jotai';\nimport { useNavigate } from 'react-router';\nimport { NavButton, NavItem, NavItemContent, NavItemOptions } from '$components/nav';\nimport { UnreadBadge, UnreadBadgeCenter } from '$components/unread-badge';\nimport { RoomAvatar, RoomIcon } from '$components/room-avatar';\nimport { getDirectRoomAvatarUrl, getDmOtherMember, getRoomAvatarUrl } from '$utils/room/display';\nimport { roomHaveUnread } from '$utils/room/unread';\nimport { nameInitials } from '$utils/common';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRoomUnread } from '$state/hooks/unread';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { copyToClipboard } from '$utils/dom';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { useRoomTypingMember } from '$hooks/useRoomTypingMembers';\nimport { TypingIndicator } from '$components/typing-indicator';\n\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\n\nimport {\n  ChatCircleDots,\n  Checks,\n  chipIcon,\n  DotsThreeOutlineVerticalIcon,\n  GearSix,\n  Link,\n  menuIcon,\n  Phone,\n  SignOut,\n  UserPlus,\n} from '$components/icons/phosphor';\nimport { Copy as CopyIcon } from '@phosphor-icons/react';\nimport { MobileMenuItem } from '$components/MobileMenuItem';\nimport {\n  RoomNotificationMode,\n  roomNotificationModeChipIcon,\n  roomNotificationModeIcon,\n} from '$hooks/useRoomsNotificationPreferences';\nimport { RoomNotificationModeSwitcher } from '$components/RoomNotificationSwitcher';\n\nimport { InviteUserPrompt } from '$components/invite-user-prompt';\nimport { DirectInvitePrompt } from '$components/direct-invite-prompt';\nimport { AsyncStatus } from '$hooks/useAsyncCallback';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { useRoomName, useRoomTopic } from '$hooks/useRoomMeta';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { warmupRoomDecryption } from '$utils/decryptScheduler';\nimport { useMobileTapActivation } from '$hooks/useMobileTapActivation';\nimport { useOpenMobileDrawerContent } from '$components/page/MobileNavDrawerContext';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { useRoomMenuActions } from '$hooks/useRoomMenuActions';\n\n// Call Hooks & Plugins\nimport { useCallMembers, useCallSession } from '$hooks/useCall';\nimport { useCallEmbed, useCallStart } from '$hooks/useCallEmbed';\nimport { callChatAtom } from '$state/callEmbed';\nimport { useCallPreferencesAtom } from '$state/hooks/callPreferences';\nimport { CallControlState } from '$plugins/call/CallControlState';\nimport { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo';\nimport { livekitSupport } from '$hooks/useLivekitSupport';\nimport { Presence, useUserPresence } from '$hooks/useUserPresence';\nimport { AvatarPresence, PresenceBadge } from '$components/presence';\nimport { RoomNavUser } from './RoomNavUser';\nimport { SidebarUnreadBadge } from '$components/sidebar';\nimport * as css from './styles.css';\n\n/**\n * Reactively checks whether a room has unread messages.\n */\nfunction useRoomHasUnread(room: Room): boolean {\n  const mx = useMatrixClient();\n  const [hasUnread, setHasUnread] = useState(() => roomHaveUnread(mx, room));\n\n  useEffect(() => {\n    const update = () => setHasUnread(roomHaveUnread(mx, room));\n    room.on(RoomEventEnum.Timeline, update);\n    room.on(RoomEventEnum.Receipt, update);\n    return () => {\n      room.removeListener(RoomEventEnum.Timeline, update);\n      room.removeListener(RoomEventEnum.Receipt, update);\n    };\n  }, [room, mx]);\n\n  return hasUnread;\n}\n\ntype RoomNavItemMenuProps = {\n  room: Room;\n  requestClose: () => void;\n  notificationMode?: RoomNotificationMode;\n};\n\nconst RoomNavItemMenu = forwardRef<HTMLDivElement, RoomNavItemMenuProps>(\n  ({ room, requestClose, notificationMode }, ref) => {\n    const {\n      handleMarkAsRead: hookMarkAsRead,\n      handleInvite: hookInvite,\n      handleCopyLink: hookCopyLink,\n      handleOpenSettings: hookOpenSettings,\n      handleLeaveRoom: hookLeaveRoom,\n      canInvite,\n      unread,\n      invitePrompt,\n      setInvitePrompt,\n      directInvitePrompt,\n      handleInviteDirect,\n      handleDirectInviteCancel,\n      handleConvertAndInvite,\n      convertState,\n    } = useRoomMenuActions(room);\n\n    const mx = useMatrixClient();\n    const isMobile = useScreenSizeContext() === ScreenSize.Mobile;\n\n    const handleMarkAsRead = () => {\n      hookMarkAsRead();\n      requestClose();\n    };\n\n    const handleInvite = hookInvite;\n\n    const handleCopyName = () => {\n      const roomName = mx.getRoom(room.roomId)?.name || 'Room';\n      copyToClipboard(roomName);\n      requestClose();\n    };\n\n    const handleCopyLink = () => {\n      hookCopyLink();\n      requestClose();\n    };\n\n    const handleRoomSettings = () => {\n      hookOpenSettings();\n      requestClose();\n    };\n\n    const handleLeaveRoom = async () => {\n      if (await hookLeaveRoom()) requestClose();\n    };\n\n    return (\n      <Menu ref={ref} style={{ maxWidth: toRem(160), width: '100vw' }}>\n        {invitePrompt && room && (\n          <InviteUserPrompt\n            room={room}\n            requestClose={() => {\n              setInvitePrompt(false);\n              requestClose();\n            }}\n          />\n        )}\n        {directInvitePrompt && (\n          <DirectInvitePrompt\n            onCancel={() => handleDirectInviteCancel(requestClose)}\n            onInviteDirect={handleInviteDirect}\n            onConvertAndInvite={handleConvertAndInvite}\n            converting={convertState.status === AsyncStatus.Loading}\n            convertError={\n              convertState.status === AsyncStatus.Error ? convertState.error.message : undefined\n            }\n          />\n        )}\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n          <MobileMenuItem\n            isMobile={isMobile}\n            onClick={handleMarkAsRead}\n            size=\"300\"\n            after={menuIcon(Checks)}\n            radii=\"300\"\n            disabled={!unread}\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Mark as Read\n            </Text>\n          </MobileMenuItem>\n          <RoomNotificationModeSwitcher roomId={room.roomId} value={notificationMode}>\n            {(handleOpen, opened, changing) => (\n              <MobileMenuItem\n                isMobile={isMobile}\n                size=\"300\"\n                after={\n                  changing ? (\n                    <Spinner size=\"100\" variant=\"Secondary\" />\n                  ) : (\n                    roomNotificationModeIcon(notificationMode)\n                  )\n                }\n                radii=\"300\"\n                aria-pressed={opened}\n                onClick={handleOpen}\n              >\n                <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n                  Notifications\n                </Text>\n              </MobileMenuItem>\n            )}\n          </RoomNotificationModeSwitcher>\n        </Box>\n        <Line variant=\"Surface\" size=\"300\" />\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n          <MobileMenuItem\n            isMobile={isMobile}\n            onClick={handleInvite}\n            variant=\"Primary\"\n            fill=\"None\"\n            size=\"300\"\n            after={menuIcon(UserPlus)}\n            radii=\"300\"\n            aria-pressed={invitePrompt}\n            disabled={!canInvite}\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Invite\n            </Text>\n          </MobileMenuItem>\n          <MobileMenuItem\n            isMobile={isMobile}\n            onClick={handleCopyLink}\n            size=\"300\"\n            after={menuIcon(Link)}\n            radii=\"300\"\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Copy Link\n            </Text>\n          </MobileMenuItem>\n          <MobileMenuItem\n            isMobile={isMobile}\n            onClick={handleCopyName}\n            size=\"300\"\n            after={menuIcon(CopyIcon)}\n            radii=\"300\"\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Copy Room Name\n            </Text>\n          </MobileMenuItem>\n          <MobileMenuItem\n            isMobile={isMobile}\n            onClick={handleRoomSettings}\n            size=\"300\"\n            after={menuIcon(GearSix)}\n            radii=\"300\"\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Room Settings\n            </Text>\n          </MobileMenuItem>\n        </Box>\n        <Line variant=\"Surface\" size=\"300\" />\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n          <MobileMenuItem\n            isMobile={isMobile}\n            onClick={handleLeaveRoom}\n            variant=\"Critical\"\n            fill=\"None\"\n            size=\"300\"\n            after={menuIcon(SignOut)}\n            radii=\"300\"\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Leave Room\n            </Text>\n          </MobileMenuItem>\n        </Box>\n      </Menu>\n    );\n  }\n);\n\nconst hideTextStyling = (isHidden: boolean | undefined) =>\n  isHidden ? { width: '100%', height: '100%', padding: '0', paddingTop: '0px' } : {};\n\ntype RoomNavItemProps = {\n  room: Room;\n  selected: boolean;\n  linkPath: string;\n  notificationMode?: RoomNotificationMode;\n  showAvatar?: boolean;\n  direct?: boolean;\n  customDMCards?: boolean;\n  hideText?: boolean;\n  isStrict?: boolean;\n  joinCallOnSingleClick?: boolean;\n};\n\nexport function RoomNavItem({\n  room,\n  selected,\n  showAvatar,\n  direct,\n  customDMCards,\n  notificationMode,\n  linkPath,\n  hideText,\n  isStrict,\n  joinCallOnSingleClick,\n}: RoomNavItemProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const [hover, setHover] = useState(false);\n  const { hoverProps } = useHover({ onHoverChange: setHover });\n  const { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setHover });\n\n  const unread = useRoomUnread(room.roomId, roomToUnreadAtom);\n  const hasRoomUnread = useRoomHasUnread(room);\n  const typingMember = useRoomTypingMember(room.roomId).filter(\n    (receipt) => receipt.userId !== mx.getUserId()\n  );\n\n  const [roomIconOverlay] = useSetting(settingsAtom, 'roomIconOverlay');\n  const nicknames = useAtomValue(nicknamesAtom);\n  const dmUserId = direct ? getDmOtherMember(mx, room)?.userId : undefined;\n  const matrixRoomName = useRoomName(room);\n  const roomName = (dmUserId && nicknames[dmUserId]) || matrixRoomName;\n  const presence = useUserPresence(dmUserId ?? '');\n  const getRoomTopic = useRoomTopic(room);\n  const roomTopic = direct ? ((customDMCards && getRoomTopic) ?? presence?.status) : undefined;\n\n  const { navigateRoom } = useRoomNavigate();\n  const navigate = useNavigate();\n  const screenSize = useScreenSizeContext();\n  const isMobile = screenSize === ScreenSize.Mobile;\n  const openMobileDrawerContent = useOpenMobileDrawerContent();\n\n  const callSession = useCallSession(room);\n  const callMembers = useCallMembers(room, callSession);\n  const startCall = useCallStart(direct);\n  const callEmbed = useCallEmbed();\n  const callPref = useAtomValue(useCallPreferencesAtom());\n  const [isChatOpen, setChatOpen] = useAtom(callChatAtom);\n  const autoDiscoveryInfo = useAutoDiscoveryInfo();\n\n  const avatarSrc =\n    ((!direct || customDMCards) && getRoomAvatarUrl(mx, room, 96, useAuthentication)) ||\n    (direct && getDirectRoomAvatarUrl(mx, room, 96, useAuthentication)) ||\n    undefined;\n\n  const isActiveCall = callEmbed?.roomId === room.roomId;\n\n  const menu = useMenuAnchor<HTMLElement>();\n\n  const contextMenuHandler: MouseEventHandler<HTMLElement> = (evt) => {\n    if (isMobile) {\n      evt.preventDefault();\n      menu.triggerProps.onContextMenu(evt);\n      return;\n    }\n    menu.triggerProps.onContextMenu(evt);\n  };\n\n  const handleOpenMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    menu.triggerProps.onClick(evt);\n  };\n\n  const handleNavItemClick: MouseEventHandler<HTMLElement> = (evt) => {\n    if (menu.consumeLongPressFired() || menu.anchor) return;\n    if (room.isCallRoom()) {\n      if (!livekitSupport(autoDiscoveryInfo) && callMembers.length === 0) return;\n      if (callEmbed && !isActiveCall) return;\n\n      if (!isMobile && !hideText) {\n        if (!isActiveCall && !callEmbed && joinCallOnSingleClick) {\n          startCall(\n            room,\n            new CallControlState(callPref.microphone, callPref.video, callPref.sound)\n          );\n        } else {\n          navigateRoom(room.roomId);\n        }\n      } else {\n        evt.stopPropagation();\n        if (isChatOpen) setChatOpen(false);\n        navigateRoom(room.roomId);\n      }\n    } else {\n      if (isMobile && openMobileDrawerContent) {\n        openMobileDrawerContent(linkPath);\n      } else {\n        // Render the room off the urgent path so the tap doesn't freeze the UI on mount.\n        startTransition(() => {\n          void navigate(linkPath);\n        });\n      }\n    }\n  };\n\n  const mobileTapActivation = useMobileTapActivation(\n    isMobile && !room.isCallRoom(),\n    () => {\n      if (openMobileDrawerContent) {\n        openMobileDrawerContent(linkPath);\n      } else {\n        navigate(linkPath);\n      }\n    },\n    handleNavItemClick\n  );\n\n  const handleChatButtonClick = (evt: MouseEvent<HTMLButtonElement>) => {\n    evt.stopPropagation();\n    setChatOpen(!isChatOpen);\n    navigate(linkPath);\n  };\n\n  const optionsVisible = hover || !!menu.anchor;\n  const isMutedRoom = notificationMode === RoomNotificationMode.Mute;\n  const shouldShowUnreadIndicator = !isMutedRoom && (!!unread || hasRoomUnread);\n\n  let unreadCount = 0;\n  if (unread) {\n    unreadCount = unread.highlight > 0 ? unread.highlight : unread.total;\n  }\n\n  const ariaLabel = [\n    roomName,\n    room.isCallRoom()\n      ? [\n          'Call Room',\n          isActiveCall && 'Currently in Call',\n          callMembers.length && `${callMembers.length} in Call`,\n        ]\n      : 'Text Room',\n    unread?.total && `${unread.total} Messages`,\n  ]\n    .flat()\n    .filter(Boolean)\n    .join(', ');\n  return (\n    <>\n      <Box\n        direction=\"Column\"\n        grow=\"Yes\"\n        style={{\n          ...hideTextStyling(hideText),\n          marginTop: hideText ? toRem(5) : '0',\n          userSelect: 'none',\n          WebkitUserSelect: 'none',\n        }}\n      >\n        <NavItem\n          variant=\"Background\"\n          radii=\"400\"\n          highlight={shouldShowUnreadIndicator}\n          aria-selected={selected}\n          data-hover={!!menu.anchor || menu.isPressing}\n          onContextMenu={contextMenuHandler}\n          {...hoverProps}\n          {...focusWithinProps}\n          style={hideTextStyling(hideText)}\n        >\n          <TooltipProvider\n            position=\"Right\"\n            offset={4}\n            tooltip={\n              hideText && (\n                <Tooltip>\n                  <Text>{roomName}</Text>\n                </Tooltip>\n              )\n            }\n          >\n            {(triggerRef) => (\n              <NavButton\n                onClick={mobileTapActivation.onClick}\n                onPointerDown={(evt) => {\n                  warmupRoomDecryption(mx, room.roomId);\n                  mobileTapActivation.onPointerDown(evt);\n                }}\n                onPointerMove={mobileTapActivation.onPointerMove}\n                onPointerUp={mobileTapActivation.onPointerUp}\n                onPointerCancel={mobileTapActivation.onPointerCancel}\n                onTouchStart={menu.triggerProps.onTouchStart}\n                onTouchEnd={menu.triggerProps.onTouchEnd}\n                onTouchMove={menu.triggerProps.onTouchMove}\n                onTouchCancel={menu.triggerProps.onTouchCancel}\n                aria-label={ariaLabel}\n                ref={triggerRef}\n                style={{\n                  ...hideTextStyling(hideText),\n                  WebkitTapHighlightColor: 'transparent',\n                }}\n              >\n                <NavItemContent style={hideTextStyling(hideText)}>\n                  <Box\n                    as=\"span\"\n                    grow=\"Yes\"\n                    alignItems=\"Center\"\n                    justifyContent=\"Start\"\n                    gap=\"200\"\n                    style={hideTextStyling(hideText)}\n                  >\n                    <AvatarPresence\n                      badge={\n                        presence &&\n                        presence.presence !== Presence.Offline && (\n                          <PresenceBadge\n                            presence={presence.presence}\n                            size={hideText ? '300' : '200'}\n                          />\n                        )\n                      }\n                      style={hideTextStyling(hideText)}\n                    >\n                      <Avatar\n                        size={hideText ? undefined : '200'}\n                        radii=\"400\"\n                        style={hideTextStyling(hideText)}\n                      >\n                        {showAvatar || (avatarSrc && isStrict) ? (\n                          <RoomAvatar\n                            roomId={room.roomId}\n                            src={avatarSrc}\n                            uniformIcons\n                            alt={roomName}\n                            renderFallback={() => (\n                              <Text as=\"span\" size=\"H6\">\n                                {nameInitials(roomName)}\n                              </Text>\n                            )}\n                          />\n                        ) : (\n                          <RoomIcon\n                            style={{\n                              opacity:\n                                unread || hasRoomUnread || isActiveCall\n                                  ? config.opacity.P500\n                                  : config.opacity.P300,\n                            }}\n                            filled={selected || isActiveCall}\n                            size={isStrict && hideText ? '300' : '200'}\n                            joinRule={room.getJoinRule()}\n                            roomType={room.getType()}\n                            withOverlay={roomIconOverlay}\n                          />\n                        )}\n                      </Avatar>\n                    </AvatarPresence>\n                    {unread && hideText && (\n                      <SidebarUnreadBadge\n                        highlight={unread.highlight > 0}\n                        count={unread.highlight > 0 ? unread.highlight : unread.total}\n                      />\n                    )}\n\n                    {!hideText && (\n                      <>\n                        <Box as=\"span\" grow=\"Yes\" direction=\"Column\">\n                          <Text\n                            priority={unread || hasRoomUnread || isActiveCall ? '500' : '400'}\n                            as=\"span\"\n                            size=\"Inherit\"\n                            truncate\n                          >\n                            {roomName}\n                          </Text>\n                          {roomTopic && (\n                            <Text\n                              truncate\n                              size=\"T200\"\n                              priority=\"300\"\n                              style={{\n                                opacity: config.opacity.P300,\n                                marginTop: '-2px',\n                              }}\n                            >\n                              {roomTopic}\n                            </Text>\n                          )}\n                        </Box>\n                        {!optionsVisible && !unread && !selected && typingMember.length > 0 && (\n                          <Badge size=\"300\" variant=\"Secondary\" fill=\"Soft\" radii=\"Pill\" outlined>\n                            <TypingIndicator size=\"300\" disableAnimation />\n                          </Badge>\n                        )}\n                        {!optionsVisible && shouldShowUnreadIndicator && (\n                          <UnreadBadgeCenter>\n                            <UnreadBadge\n                              highlight={!!unread && unread.highlight > 0}\n                              count={unreadCount}\n                              dm={direct}\n                            />\n                          </UnreadBadgeCenter>\n                        )}\n                        {!optionsVisible && notificationMode !== RoomNotificationMode.Unset && (\n                          <span className={css.NavItemChipIcon} aria-label={notificationMode}>\n                            {roomNotificationModeChipIcon(notificationMode)}\n                          </span>\n                        )}\n                        {(room.isCallRoom() || direct) &&\n                          callMembers.length > 0 &&\n                          !optionsVisible && (\n                            <Badge variant=\"Critical\" fill=\"Solid\" size=\"400\">\n                              <Box alignItems=\"Center\" gap=\"100\">\n                                {chipIcon(Phone)}\n                                <Text as=\"span\" size=\"L400\" truncate>\n                                  {direct ? 'Calling' : `${callMembers.length} Live`}\n                                </Text>\n                              </Box>\n                            </Badge>\n                          )}\n                      </>\n                    )}\n                  </Box>\n                </NavItemContent>\n              </NavButton>\n            )}\n          </TooltipProvider>\n          {optionsVisible && !hideText && (\n            <NavItemOptions>\n              {(room.isCallRoom() || (direct && callMembers.length > 0)) && (\n                <TooltipProvider\n                  position=\"Bottom\"\n                  offset={4}\n                  tooltip={\n                    <Tooltip>\n                      <Text>{isChatOpen ? 'Hide Chat' : 'Show Chat'}</Text>\n                    </Tooltip>\n                  }\n                >\n                  {(triggerRef) => (\n                    <IconButton\n                      ref={triggerRef}\n                      data-testid=\"chat-button\"\n                      onClick={handleChatButtonClick}\n                      aria-pressed={isChatOpen && selected}\n                      aria-label=\"Open Chat\"\n                      variant=\"Background\"\n                      fill=\"None\"\n                      size=\"300\"\n                      radii=\"300\"\n                    >\n                      {chipIcon(ChatCircleDots, { weight: isChatOpen ? 'fill' : 'regular' })}\n                    </IconButton>\n                  )}\n                </TooltipProvider>\n              )}\n              <ResponsiveMenu\n                anchor={menu.anchor}\n                requestClose={menu.close}\n                position=\"Bottom\"\n                align={menu.anchor?.width === 0 ? 'Start' : 'End'}\n                offset={menu.anchor?.width === 0 ? 0 : undefined}\n                menu={\n                  <RoomNavItemMenu\n                    room={room}\n                    requestClose={menu.close}\n                    notificationMode={notificationMode}\n                  />\n                }\n              >\n                {!hideText && (\n                  <IconButton\n                    onClick={handleOpenMenu}\n                    aria-pressed={!!menu.anchor}\n                    aria-controls={`menu-${room.roomId}`}\n                    aria-label=\"More Options\"\n                    variant=\"Background\"\n                    fill=\"None\"\n                    size=\"300\"\n                    radii=\"300\"\n                  >\n                    {chipIcon(DotsThreeOutlineVerticalIcon, {\n                      weight: menu.anchor ? 'fill' : 'regular',\n                    })}\n                  </IconButton>\n                )}\n              </ResponsiveMenu>\n            </NavItemOptions>\n          )}\n        </NavItem>\n      </Box>\n      {room.isCallRoom() && (\n        <Box\n          direction=\"Column\"\n          style={{ paddingLeft: hideText ? config.space.S0 : config.space.S200 }}\n        >\n          {callMembers.map((callMembership) => (\n            <RoomNavUser\n              key={callMembership.membershipID}\n              room={room}\n              callMembership={callMembership}\n              hideText={hideText}\n            />\n          ))}\n        </Box>\n      )}\n    </>\n  );\n}\n","import { as, Chip, IconButton, Text } from 'folds';\nimport classNames from 'classnames';\nimport { CaretDown, CaretRight, chipCaretIcon } from '$components/icons/phosphor';\nimport * as css from './styles.css';\n\nexport const RoomNavCategoryButton = as<'button', { closed?: boolean }>(\n  ({ className, closed, children, ...props }, ref) => {\n    if (children)\n      return (\n        <Chip\n          className={classNames(css.CategoryButton, className)}\n          variant=\"Background\"\n          radii=\"400\"\n          after={\n            <span className={css.CategoryButtonIcon}>\n              {chipCaretIcon(closed ? CaretRight : CaretDown)}\n            </span>\n          }\n          {...props}\n          ref={ref}\n        >\n          {children && (\n            <Text size=\"B400\" priority=\"300\" truncate>\n              {children}\n            </Text>\n          )}\n        </Chip>\n      );\n    return (\n      <IconButton\n        className={classNames(css.CategoryButton, className)}\n        variant=\"Background\"\n        radii=\"400\"\n        {...props}\n        style={{ padding: '0' }}\n        ref={ref}\n      >\n        <span className={css.CategoryButtonIcon} style={{ padding: '0' }}>\n          {chipCaretIcon(closed ? CaretRight : CaretDown)}\n        </span>\n      </IconButton>\n    );\n  }\n);\n","import type { WritableAtom } from 'jotai';\nimport { atom } from 'jotai';\nimport { produce } from 'immer';\nimport {\n  atomWithLocalStorage,\n  getLocalStorageItem,\n  setLocalStorageItem,\n} from './atomWithLocalStorage';\n\nexport type StringSetAction = { type: 'PUT' | 'DELETE'; value: string };\n\nexport type StringSetAtom = WritableAtom<Set<string>, [StringSetAction], undefined>;\n\n/**\n * A per-account Set of strings persisted to local storage. `loadInitial` is for\n * the one caller whose stored value is overridden by a setting.\n */\nexport const makeStringSetAtom = (\n  storeKey: string,\n  loadInitial: (key: string) => Set<string> = (key) =>\n    new Set(getLocalStorageItem<string[]>(key, []))\n): StringSetAtom => {\n  const baseAtom = atomWithLocalStorage<Set<string>>(storeKey, loadInitial, (key, value) => {\n    setLocalStorageItem(key, Array.from(value));\n  });\n\n  return atom<Set<string>, [StringSetAction], undefined>(\n    (get) => get(baseAtom),\n    (get, set, action) => {\n      set(\n        baseAtom,\n        produce(get(baseAtom), (draft) => {\n          if (action.type === 'DELETE') draft.delete(action.value);\n          else draft.add(action.value);\n        })\n      );\n    }\n  );\n};\n","import { makeStringSetAtom } from './utils/stringSetAtom';\nimport type { StringSetAtom } from './utils/stringSetAtom';\n\nconst CLOSED_NAV_CATEGORY = 'closedNavCategories';\n\nexport type ClosedNavCategoriesAtom = StringSetAtom;\n\nexport const makeClosedNavCategoriesAtom = (userId: string): ClosedNavCategoriesAtom =>\n  makeStringSetAtom(`${CLOSED_NAV_CATEGORY}${userId}`);\n\nexport const makeNavCategoryId = (...args: string[]): string => args.join('|');\n","import type { MouseEventHandler } from 'react';\n\ntype CategoryAction =\n  | {\n      type: 'PUT';\n      value: string;\n    }\n  | {\n      type: 'DELETE';\n      value: string;\n    };\nexport const useCategoryHandler = (\n  setAtom: (action: CategoryAction) => void,\n  closed: (categoryId: string) => boolean\n) => {\n  const handleCategoryClick: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    const categoryId = evt.currentTarget.getAttribute('data-category-id');\n    if (!categoryId) return;\n    if (closed(categoryId)) {\n      setAtom({ type: 'DELETE', value: categoryId });\n      return;\n    }\n    setAtom({ type: 'PUT', value: categoryId });\n  };\n\n  return handleCategoryClick;\n};\n","import { createContext, useContext } from 'react';\nimport type { NavToActivePathAtom } from '$state/navToActivePath';\n\nconst NavToActivePathAtomContext = createContext<NavToActivePathAtom | null>(null);\nexport const NavToActivePathProvider = NavToActivePathAtomContext.Provider;\n\nexport const useNavToActivePathAtom = (): NavToActivePathAtom => {\n  const anAtom = useContext(NavToActivePathAtomContext);\n\n  if (!anAtom) {\n    throw new Error('NavToActivePathAtom is not provided!');\n  }\n\n  return anAtom;\n};\n","import { useEffect } from 'react';\nimport { useSetAtom } from 'jotai';\nimport { useLocation } from 'react-router';\nimport { useNavToActivePathAtom } from '$state/hooks/navToActivePath';\n\nexport const useNavToActivePathMapper = (navId: string) => {\n  const location = useLocation();\n  const setNavToActivePath = useSetAtom(useNavToActivePathAtom());\n\n  useEffect(() => {\n    const { pathname, search, hash } = location;\n    setNavToActivePath({\n      type: 'PUT',\n      navId,\n      path: { pathname, search, hash },\n    });\n  }, [location, setNavToActivePath, navId]);\n};\n","import type { WritableAtom } from 'jotai';\nimport { atom } from 'jotai';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { useMemo } from 'react';\n\nimport type { RoomsAction } from './utils';\nimport { applyRoomsAction, useBindRoomsWithMembershipsAtom } from './utils';\nimport { KnownMembership } from '$types/matrix-sdk';\n\nconst baseRoomsAtom = atom<string[]>([]);\nexport const allInvitesAtom = atom<string[], [RoomsAction], undefined>(\n  (get) => get(baseRoomsAtom),\n  (_get, set, action) => {\n    set(baseRoomsAtom, (ids) => applyRoomsAction(ids, action));\n    return undefined;\n  }\n);\n\nexport const useBindAllInvitesAtom = (\n  mx: MatrixClient,\n  allRooms: WritableAtom<string[], [RoomsAction], undefined>\n) => {\n  useBindRoomsWithMembershipsAtom(\n    mx,\n    allRooms,\n    useMemo(() => [KnownMembership.Invite], [])\n  );\n};\n","import { atom } from 'jotai';\n\nexport const updateInviteList = atom(0);\n","import { useCallback, useState } from 'react';\n\nimport { updateInviteList } from '$state/updateInvites';\nimport { useAtomValue } from 'jotai';\nimport { useMatrixClient } from './useMatrixClient';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\nimport { useAccountDataCallback } from './useAccountDataCallback';\n\nexport const useDismissedInviteList = () => {\n  const mx = useMatrixClient();\n  const updateInvites = useAtomValue(updateInviteList);\n  const [dismissedInvitesIds, setDismissedInvitesIds] = useState(\n    mx.getAccountData(CustomAccountDataEvent.SableDismissedInvites)?.getContent<{\n      roomIds: string[];\n    }>().roomIds\n  );\n  useAccountDataCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (mEvent.getType() === (CustomAccountDataEvent.SableDismissedInvites as string)) {\n          const newList = mx\n            .getAccountData(CustomAccountDataEvent.SableDismissedInvites)\n            ?.getContent<{\n              roomIds: string[];\n            }>().roomIds;\n          setDismissedInvitesIds(newList ?? []);\n        }\n      },\n      // oxlint-disable-next-line eslint-plugin-react-hooks/exhaustive-deps\n      [mx, updateInvites]\n    )\n  );\n  return dismissedInvitesIds;\n};\n","import { useAtomValue } from 'jotai';\nimport { allInvitesAtom } from '$state/room-list/inviteList';\nimport { useDismissedInviteList } from './useDismissedInvites';\n\nexport const useInviteCount = () => {\n  const dismissedInvitesIds = useDismissedInviteList();\n  const allInvites = useAtomValue(allInvitesAtom).filter(\n    (invite) => !dismissedInvitesIds?.includes(invite)\n  );\n  return allInvites.length;\n};\n","import { useAtomValue } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { isDMRoom } from '$utils/room/unread';\nimport type { Room } from '$types/matrix-sdk';\nimport type { RoomToUnread } from '$types/matrix/room';\n\nexport const countInboxNotifications = (\n  rooms: readonly Room[],\n  roomToUnread: RoomToUnread,\n  mDirects: Set<string>\n): number =>\n  rooms.reduce((count, room) => {\n    if (room.isSpaceRoom()) return count;\n    const unread = roomToUnread.get(room.roomId);\n    if (!unread) return count;\n    return count + (isDMRoom(room, mDirects) ? unread.total : unread.highlight);\n  }, 0);\n\nexport const useInboxNotificationCount = (): number => {\n  const mx = useMatrixClient();\n  const roomIds = useAtomValue(allRoomsAtom);\n  const roomToUnread = useAtomValue(roomToUnreadAtom);\n  const mDirects = useAtomValue(mDirectAtom);\n\n  const rooms = roomIds.flatMap((roomId) => mx.getRoom(roomId) ?? []);\n  return countInboxNotifications(rooms, roomToUnread, mDirects);\n};\n","import { useNavigate } from 'react-router';\nimport { useAtomValue } from 'jotai';\nimport {\n  SidebarAvatar,\n  SidebarUnreadBadge,\n  SidebarItemTooltip,\n  SidebarItem,\n} from '$components/sidebar';\nimport {\n  getInboxInvitesPath,\n  getInboxNotificationsPath,\n  getInboxPath,\n  joinPathComponent,\n} from '$pages/pathUtils';\nimport {\n  useInboxBookmarksSelected,\n  useInboxInvitesSelected,\n  useInboxNotificationsSelected,\n  useInboxSelected,\n} from '$hooks/router/useRouteSelected';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { useNavToActivePathAtom } from '$state/hooks/navToActivePath';\nimport { useInviteCount } from '$hooks/useInviteCount';\nimport { useInboxNotificationCount } from '$hooks/useInboxNotificationCount';\nimport { Text, Box, color } from 'folds';\nimport { EnvelopeSimple, getPhosphorIconSize, Tray } from '$components/icons/phosphor';\nimport { BookmarkIcon, ChatCircleDotsIcon } from '@phosphor-icons/react';\nimport { useMobileTapActivation } from '$hooks/useMobileTapActivation';\n\nexport function InboxTab({ isBottom, isMobile }: { isBottom?: boolean; isMobile?: boolean }) {\n  const screenSize = useScreenSizeContext();\n  const navigate = useNavigate();\n  const navToActivePath = useAtomValue(useNavToActivePathAtom());\n  const inboxSelected = useInboxSelected();\n  const inviteCount = useInviteCount();\n  const notificationCount = useInboxNotificationCount();\n  const totalBadge = inviteCount + notificationCount;\n  const opened = inboxSelected;\n  const InboxIconSize = getPhosphorIconSize(isBottom ? 'inline' : 'toolbar');\n\n  const notificationsSelected = useInboxNotificationsSelected();\n  const bookmarksSelected = useInboxBookmarksSelected();\n  const invitesSelected = useInboxInvitesSelected();\n\n  const handleInboxClick = () => {\n    if (screenSize === ScreenSize.Mobile) {\n      navigate(getInboxPath());\n      return;\n    }\n    const activePath = navToActivePath.get('inbox');\n    if (activePath) {\n      navigate(joinPathComponent(activePath));\n      return;\n    }\n\n    const path = inviteCount > 0 ? getInboxInvitesPath() : getInboxNotificationsPath();\n    navigate(path);\n  };\n  const mobileTapActivation = useMobileTapActivation(\n    isMobile ?? false,\n    handleInboxClick,\n    handleInboxClick\n  );\n\n  return (\n    <SidebarItem active={opened && !isMobile} isBottom={isBottom}>\n      <SidebarItemTooltip tooltip=\"Inbox\" position={isBottom ? 'Top' : 'Right'}>\n        {(triggerRef) => (\n          <Box direction=\"Column\" alignItems=\"Center\">\n            <SidebarAvatar\n              as=\"button\"\n              ref={triggerRef}\n              outlined={!isMobile}\n              {...mobileTapActivation}\n              size={'400'}\n            >\n              {(notificationsSelected && (\n                <ChatCircleDotsIcon\n                  size={InboxIconSize}\n                  weight=\"fill\"\n                  color={opened && isMobile ? color.Primary.Main : color.Background.OnContainer}\n                />\n              )) ||\n                (bookmarksSelected && (\n                  <BookmarkIcon\n                    size={InboxIconSize}\n                    weight=\"fill\"\n                    color={opened && isMobile ? color.Primary.Main : color.Background.OnContainer}\n                  />\n                )) ||\n                (invitesSelected && (\n                  <EnvelopeSimple\n                    size={InboxIconSize}\n                    weight=\"fill\"\n                    color={opened && isMobile ? color.Primary.Main : color.Background.OnContainer}\n                  />\n                )) || (\n                  <Tray\n                    size={InboxIconSize}\n                    weight={inboxSelected ? 'fill' : 'regular'}\n                    color={opened && isMobile ? color.Primary.Main : color.Background.OnContainer}\n                  />\n                )}\n            </SidebarAvatar>\n            {isMobile && (\n              <Text size=\"B300\" priority=\"300\">\n                Inbox\n              </Text>\n            )}\n          </Box>\n        )}\n      </SidebarItemTooltip>\n      {totalBadge > 0 && <SidebarUnreadBadge highlight count={totalBadge} />}\n    </SidebarItem>\n  );\n}\n","import { SidebarAvatar, SidebarItem, SidebarItemTooltip } from '$components/sidebar';\nimport { ListMagnifyingGlassIcon } from '@phosphor-icons/react';\nimport { getPhosphorIconSize } from '$components/icons/phosphor';\nimport { Text, Box, color } from 'folds';\nimport { getNavigatePath } from '$pages/pathUtils';\nimport { useOpenShallowRoute } from '$pages/client/useShallowRoute';\nimport { useNavigateSelected } from '$hooks/router/useRouteSelected';\nimport { useMobileTapActivation } from '$hooks/useMobileTapActivation';\n\nexport function NavigateTab({ isBottom, isMobile }: { isBottom?: boolean; isMobile?: boolean }) {\n  const isNavigate = useNavigateSelected();\n  const openShallowRoute = useOpenShallowRoute();\n  const open = () => openShallowRoute(getNavigatePath());\n  const mobileTapActivation = useMobileTapActivation(isMobile ?? false, open);\n\n  return (\n    <SidebarItem active={isNavigate && !isMobile} isBottom={isBottom}>\n      <SidebarItemTooltip tooltip=\"Search\" position={isBottom ? 'Top' : 'Right'}>\n        {(triggerRef) => (\n          <Box direction=\"Column\" alignItems=\"Center\">\n            <SidebarAvatar\n              as=\"button\"\n              ref={triggerRef}\n              outlined={!isMobile}\n              {...mobileTapActivation}\n              size={'400'}\n            >\n              <ListMagnifyingGlassIcon\n                size={getPhosphorIconSize(isBottom ? 'inline' : 'toolbar')}\n                weight={isNavigate ? 'fill' : 'regular'}\n                color={isNavigate && isMobile ? color.Primary.Main : color.Background.OnContainer}\n              />\n            </SidebarAvatar>\n            {isMobile && (\n              <Text size=\"B300\" priority=\"300\">\n                Navigate\n              </Text>\n            )}\n          </Box>\n        )}\n      </SidebarItemTooltip>\n    </SidebarItem>\n  );\n}\n","import type { SecretAccountData } from '$types/matrix/accountData';\n\nimport { useAccountData } from './useAccountData';\n\nexport const useCrossSigningActive = (): boolean => {\n  const masterEvent = useAccountData('m.cross_signing.master');\n  const content = masterEvent?.getContent<SecretAccountData>();\n\n  return !!content;\n};\n","import type { CryptoApi } from '$types/matrix-sdk';\n\nexport const verifiedDevice = async (\n  api: CryptoApi,\n  userId: string,\n  deviceId: string\n): Promise<boolean | null> => {\n  const status = await api.getDeviceVerificationStatus(userId, deviceId);\n\n  if (!status) return null;\n\n  const verified = status.crossSigningVerified || status.localVerified;\n  return verified;\n};\n","import { useCallback, useEffect } from 'react';\nimport { useQueries, useQuery, useQueryClient } from '@tanstack/react-query';\nimport * as Sentry from '@sentry/react';\nimport { type CryptoApi, type CryptoEventHandlerMap, CryptoEvent } from '$types/matrix-sdk';\nimport { verifiedDevice } from '$utils/matrix-crypto';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport const useCrossSigningKeysChange = (\n  onChange: CryptoEventHandlerMap[CryptoEvent.KeysChanged]\n) => {\n  const mx = useMatrixClient();\n  useEffect(() => {\n    mx.on(CryptoEvent.KeysChanged, onChange);\n    return () => {\n      mx.removeListener(CryptoEvent.KeysChanged, onChange);\n    };\n  }, [mx, onChange]);\n};\n\n// onUserIdentityUpdated only emits KeysChanged for our own identity, so another user's\n// cross-signing status changes are observable through this event alone.\nexport const useUserTrustStatusChange = (\n  onChange: CryptoEventHandlerMap[CryptoEvent.UserTrustStatusChanged]\n) => {\n  const mx = useMatrixClient();\n  useEffect(() => {\n    mx.on(CryptoEvent.UserTrustStatusChanged, onChange);\n    return () => {\n      mx.removeListener(CryptoEvent.UserTrustStatusChanged, onChange);\n    };\n  }, [mx, onChange]);\n};\n\nexport enum VerificationStatus {\n  Unknown,\n  Unverified,\n  Verified,\n  Unsupported,\n}\n\nconst DEVICE_VERIFICATION_QUERY_KEY = 'device-verification';\n\nconst cryptoIds = new WeakMap<CryptoApi, string>();\nlet cryptoIdCounter = 0;\nconst verificationStatuses = new WeakMap<CryptoApi, Map<string, VerificationStatus>>();\n\nconst getCryptoId = (crypto: CryptoApi | undefined): string => {\n  if (!crypto) return 'none';\n  let id = cryptoIds.get(crypto);\n  if (!id) {\n    id = `crypto_${++cryptoIdCounter}`;\n    cryptoIds.set(crypto, id);\n  }\n  return id;\n};\n\n// Cache per device so repeated consumers share one verification result.\n// Event-driven invalidation refreshes the cache when device or trust data may have changed.\nconst deviceVerificationQuery = (\n  crypto: CryptoApi | undefined,\n  userId: string,\n  deviceId: string | undefined\n) => ({\n  queryKey: [DEVICE_VERIFICATION_QUERY_KEY, userId, deviceId ?? '', getCryptoId(crypto)],\n  queryFn: async () => {\n    if (!crypto || !deviceId) return null;\n    return verifiedDevice(crypto, userId, deviceId);\n  },\n  enabled: Boolean(crypto) && Boolean(deviceId),\n  staleTime: Infinity,\n  // Crypto listeners are shared only while a consumer is mounted. Refresh on\n  // remount so changes that happened while the UI was closed cannot stay hidden\n  // behind an indefinitely fresh inactive query.\n  refetchOnMount: 'always' as const,\n});\n\ntype SubscriptionState = {\n  refCount: number;\n  cleanup: () => void;\n};\n\nconst clientSubscriptions = new WeakMap<ReturnType<typeof useMatrixClient>, SubscriptionState>();\n\nconst useInvalidateDeviceVerification = (crypto: CryptoApi | undefined): void => {\n  const mx = useMatrixClient();\n  const queryClient = useQueryClient();\n\n  useEffect(() => {\n    if (!crypto) return undefined;\n\n    let sub = clientSubscriptions.get(mx);\n    if (!sub) {\n      const onDevicesUpdated: CryptoEventHandlerMap[CryptoEvent.DevicesUpdated] = (userIds) => {\n        if (userIds.includes(mx.getSafeUserId())) {\n          Sentry.addBreadcrumb({\n            category: 'crypto',\n            message: 'Device verification refreshed',\n            level: 'info',\n            data: { trigger: 'devices_updated' },\n          });\n        }\n        for (const uid of userIds) {\n          queryClient.invalidateQueries({ queryKey: [DEVICE_VERIFICATION_QUERY_KEY, uid] });\n        }\n      };\n      const onKeysChanged: CryptoEventHandlerMap[CryptoEvent.KeysChanged] = () => {\n        Sentry.addBreadcrumb({\n          category: 'crypto',\n          message: 'Device verification refreshed',\n          level: 'info',\n          data: { trigger: 'keys_changed' },\n        });\n        queryClient.invalidateQueries({ queryKey: [DEVICE_VERIFICATION_QUERY_KEY] });\n      };\n      const onUserTrustStatusChanged: CryptoEventHandlerMap[CryptoEvent.UserTrustStatusChanged] = (\n        changedUserId\n      ) => {\n        if (changedUserId === mx.getSafeUserId()) {\n          Sentry.addBreadcrumb({\n            category: 'crypto',\n            message: 'Device verification refreshed',\n            level: 'info',\n            data: { trigger: 'user_trust_changed' },\n          });\n        }\n        queryClient.invalidateQueries({\n          queryKey: [DEVICE_VERIFICATION_QUERY_KEY, changedUserId],\n        });\n      };\n\n      mx.on(CryptoEvent.DevicesUpdated, onDevicesUpdated);\n      mx.on(CryptoEvent.KeysChanged, onKeysChanged);\n      mx.on(CryptoEvent.UserTrustStatusChanged, onUserTrustStatusChanged);\n\n      sub = {\n        refCount: 0,\n        cleanup: () => {\n          mx.removeListener(CryptoEvent.DevicesUpdated, onDevicesUpdated);\n          mx.removeListener(CryptoEvent.KeysChanged, onKeysChanged);\n          mx.removeListener(CryptoEvent.UserTrustStatusChanged, onUserTrustStatusChanged);\n        },\n      };\n      clientSubscriptions.set(mx, sub);\n    }\n\n    sub.refCount++;\n\n    return () => {\n      sub!.refCount--;\n      if (sub!.refCount === 0) {\n        sub!.cleanup();\n        clientSubscriptions.delete(mx);\n      }\n    };\n  }, [mx, crypto, queryClient]);\n};\n\n// Cross-signing bootstrap signs this device without emitting a CryptoEvent, so none\n// of the listeners above fire for it.\nexport const useRefreshDeviceVerificationStatus = (): (() => void) => {\n  const queryClient = useQueryClient();\n\n  return useCallback(() => {\n    queryClient.invalidateQueries({ queryKey: [DEVICE_VERIFICATION_QUERY_KEY] });\n  }, [queryClient]);\n};\n\nconst toVerificationStatus = (verified: boolean | null | undefined): VerificationStatus => {\n  if (verified === undefined) return VerificationStatus.Unknown;\n  if (verified === null) return VerificationStatus.Unsupported;\n  return verified ? VerificationStatus.Verified : VerificationStatus.Unverified;\n};\n\nexport const useDeviceVerificationStatus = (\n  crypto: CryptoApi | undefined,\n  userId: string,\n  deviceId: string | undefined\n): VerificationStatus => {\n  const mx = useMatrixClient();\n  useInvalidateDeviceVerification(crypto);\n\n  const { data } = useQuery(deviceVerificationQuery(crypto, userId, deviceId));\n\n  const status = toVerificationStatus(data);\n\n  useEffect(() => {\n    if (!crypto || !deviceId) return;\n\n    const deviceKey = `${userId}\\x00${deviceId}`;\n    const statuses = verificationStatuses.get(crypto) ?? new Map<string, VerificationStatus>();\n    const previous = statuses.get(deviceKey);\n    statuses.set(deviceKey, status);\n    verificationStatuses.set(crypto, statuses);\n\n    if (previous === VerificationStatus.Verified && status === VerificationStatus.Unverified) {\n      Sentry.addBreadcrumb({\n        category: 'crypto',\n        message: 'Device verification changed to unverified',\n        level: 'warning',\n        data: { own_device: userId === mx.getSafeUserId() },\n      });\n      Sentry.metrics.count('sable.crypto.device_verification_lost', 1, {\n        attributes: { own_device: userId === mx.getSafeUserId() },\n      });\n    }\n  }, [crypto, deviceId, mx, status, userId]);\n\n  return status;\n};\n\nexport const useUnverifiedDeviceCount = (\n  crypto: CryptoApi | undefined,\n  userId: string,\n  devices: string[]\n): number | undefined => {\n  useInvalidateDeviceVerification(crypto);\n\n  return useQueries({\n    queries: devices.map((deviceId) => deviceVerificationQuery(crypto, userId, deviceId)),\n    combine: (results) => {\n      if (!crypto) return 0;\n      if (results.some((result) => result.isPending)) return undefined;\n      return results.filter((result) => result.data === false).length;\n    },\n  });\n};\n","import { forwardRef, useCallback } from 'react';\nimport { Dialog, Header, config, Box, Text } from 'folds';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { logoutClient } from '$client/initMatrix';\nimport { activeSessionIdAtom, sessionsAtom } from '$state/sessions';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useCrossSigningActive } from '$hooks/useCrossSigning';\nimport {\n  useDeviceVerificationStatus,\n  VerificationStatus,\n} from '$hooks/useDeviceVerificationStatus';\nimport { InfoCard } from './info-card';\nimport { AsyncError } from '$components/AsyncError';\nimport { Button } from '$components/button';\n\ntype LogoutDialogProps = {\n  handleClose: () => void;\n};\nexport const LogoutDialog = forwardRef<HTMLDivElement, LogoutDialogProps>(\n  ({ handleClose }, ref) => {\n    const mx = useMatrixClient();\n    const sessions = useAtomValue(sessionsAtom);\n    const activeSessionId = useAtomValue(activeSessionIdAtom);\n    const setSessions = useSetAtom(sessionsAtom);\n    const setActiveSessionId = useSetAtom(activeSessionIdAtom);\n    const activeSession = sessions.find((s) => s.userId === activeSessionId) ?? sessions[0];\n    const hasEncryptedRoom = !!mx.getRooms().find((room) => room.hasEncryptionStateEvent());\n    const crossSigningActive = useCrossSigningActive();\n    const verificationStatus = useDeviceVerificationStatus(\n      mx.getCrypto(),\n      mx.getSafeUserId(),\n      mx.getDeviceId() ?? undefined\n    );\n\n    const [logoutState, logout] = useAsyncCallback<void, Error, []>(\n      useCallback(async () => {\n        await logoutClient(mx, activeSession);\n        if (activeSession) {\n          setSessions({ type: 'DELETE', session: activeSession });\n          setActiveSessionId(\n            sessions.find((s) => s.userId !== activeSession.userId)?.userId ?? undefined\n          );\n        }\n        window.location.reload();\n      }, [mx, activeSession, sessions, setSessions, setActiveSessionId])\n    );\n\n    const ongoingLogout = logoutState.status === AsyncStatus.Loading;\n\n    return (\n      <Dialog variant=\"Surface\" ref={ref}>\n        <Header\n          style={{\n            padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n            borderBottomWidth: config.borderWidth.B300,\n          }}\n          variant=\"Surface\"\n          size=\"500\"\n        >\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">Logout</Text>\n          </Box>\n        </Header>\n        <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n          {hasEncryptedRoom &&\n            (crossSigningActive ? (\n              verificationStatus === VerificationStatus.Unverified && (\n                <InfoCard\n                  variant=\"Critical\"\n                  title=\"Unverified Device\"\n                  description=\"Verify your device before logging out to save your encrypted messages.\"\n                />\n              )\n            ) : (\n              <InfoCard\n                variant=\"Critical\"\n                title=\"Alert\"\n                description=\"Enable device verification or export your encrypted data from settings to avoid losing access to your messages.\"\n              />\n            ))}\n          <Text priority=\"400\">You’re about to log out. Are you sure?</Text>\n          <AsyncError state={logoutState} prefix=\"Failed to logout\" size=\"T300\" />\n          <Box direction=\"Column\" gap=\"200\">\n            <Button\n              variant=\"Critical\"\n              onClick={logout}\n              loading={ongoingLogout}\n              spinnerVariant=\"Critical\"\n              spinnerSize=\"200\"\n            >\n              <Text size=\"B400\">Logout</Text>\n            </Button>\n            <Button variant=\"Secondary\" fill=\"Soft\" onClick={handleClose} disabled={ongoingLogout}>\n              <Text size=\"B400\">Cancel</Text>\n            </Button>\n          </Box>\n        </Box>\n      </Dialog>\n    );\n  }\n);\n","import { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { LogoutDialog } from '$components/LogoutDialog';\n\ntype LogoutDialogOverlayProps = {\n  requestClose: () => void;\n};\n\nexport function LogoutDialogOverlay({ requestClose }: LogoutDialogOverlayProps) {\n  return (\n    <ModalOverlay requestClose={requestClose}>\n      <LogoutDialog handleClose={requestClose} />\n    </ModalOverlay>\n  );\n}\n","import type { ComponentType, JSX, ReactNode } from 'react';\nimport type { IconProps } from '@phosphor-icons/react';\nimport { Box, config, IconButton, MenuItem, Text } from 'folds';\nimport { PageNav, PageNavContent, PageNavHeader, PageRoot } from '$components/page';\nimport { SettingsSectionHeader } from '$components/page/style.css';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { composerIcon, settingsNavIcon, X } from '$components/icons/phosphor';\n\ntype PhosphorIcon = ComponentType<IconProps>;\n\nexport type SectionDescriptor = {\n  label: string;\n  icon: PhosphorIcon;\n  activeIcon?: PhosphorIcon;\n  Component: (props: { requestBack?: () => void; requestClose: () => void }) => JSX.Element | null;\n  visible?: boolean;\n};\n\nexport type SettingsShellProps<Id extends string> = {\n  sections: Record<Id, SectionDescriptor>;\n  /** Ordered list of section ids for the menu (controls order and visibility filtering). */\n  sectionIds: ReadonlyArray<Id>;\n  active: Id | null;\n  onSelect: (id: Id) => void;\n  onBack?: () => void;\n  requestClose: () => void;\n  /** Render custom header content inside PageNavHeader. Receives a `closeButton` slot. */\n  renderHeader?: (closeButton: ReactNode) => ReactNode;\n  /** Render custom footer below the menu (inside the PageNav column). */\n  footer?: ReactNode;\n  searchBar?: ReactNode;\n  searchResults?: ReactNode;\n  /** Optional wrapper rendered around the entire component (e.g. SwipeableOverlayWrapper). */\n  wrapper?: (children: ReactNode) => ReactNode;\n  /** Wrap the section viewport content (e.g. SettingsLinkProvider). Receives the viewport element. */\n  renderSection?: (viewport: ReactNode) => ReactNode;\n  /** Show the close button next to header text? (Settings: only when no section active; RoomSettings: always on mobile). */\n  showCloseInHeader?: boolean;\n  /** Passed through to PageRoot. RoomSettings disables mobile drawer. */\n  mobileDrawer?: boolean;\n  /** Text size for menu item labels. Defaults to 'T300'. */\n  menuItemTextSize?: 'T300' | 'T400';\n  /** aria-label for the close button. Defaults to 'Close'. */\n  closeButtonAriaLabel?: string;\n};\n\nfunction SectionViewport<Id extends string>({\n  sectionId,\n  sections,\n  requestBack,\n  requestClose,\n}: {\n  sectionId: Id;\n  sections: Record<Id, SectionDescriptor>;\n  requestBack?: () => void;\n  requestClose: () => void;\n}) {\n  const Section = sections[sectionId].Component;\n  return <Section requestBack={requestBack} requestClose={requestClose} />;\n}\n\nexport function SettingsShell<Id extends string>({\n  sections,\n  sectionIds,\n  active,\n  onSelect,\n  onBack,\n  requestClose,\n  renderHeader,\n  footer,\n  searchBar,\n  searchResults,\n  wrapper,\n  renderSection,\n  showCloseInHeader,\n  mobileDrawer,\n  menuItemTextSize = 'T300',\n  closeButtonAriaLabel = 'Close',\n}: SettingsShellProps<Id>) {\n  const screenSize = useScreenSizeContext();\n\n  const shouldShowSectionBack = active !== null && screenSize === ScreenSize.Mobile;\n  const sectionRequestBack = shouldShowSectionBack ? (onBack ?? requestClose) : undefined;\n\n  const visibleIds = sectionIds.filter((id) => sections[id].visible !== false);\n\n  const closeButton = showCloseInHeader ? (\n    <IconButton aria-label={closeButtonAriaLabel} onClick={requestClose} variant=\"Background\">\n      {composerIcon(X)}\n    </IconButton>\n  ) : null;\n\n  const nav =\n    screenSize === ScreenSize.Mobile && active !== null ? undefined : (\n      <PageNav size=\"300\">\n        <PageNavHeader className={SettingsSectionHeader} size=\"600\">\n          {renderHeader ? (\n            renderHeader(closeButton)\n          ) : (\n            <Box grow=\"Yes\" gap=\"200\">\n              <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n                <Text size=\"H4\" truncate>\n                  Settings\n                </Text>\n              </Box>\n              <Box shrink=\"No\">{closeButton}</Box>\n            </Box>\n          )}\n        </PageNavHeader>\n        <Box grow=\"Yes\" direction=\"Column\">\n          {searchBar && (\n            <Box style={{ padding: config.space.S200 }} shrink=\"No\">\n              {searchBar}\n            </Box>\n          )}\n          <PageNavContent>\n            <div style={{ flexGrow: 1 }}>\n              {searchResults ??\n                visibleIds.map((id) => {\n                  const section = sections[id];\n                  const isActive = active === id;\n                  const IconComponent =\n                    isActive && section.activeIcon ? section.activeIcon : section.icon;\n\n                  return (\n                    <MenuItem\n                      key={id}\n                      variant=\"Background\"\n                      radii=\"400\"\n                      aria-pressed={isActive}\n                      before={settingsNavIcon(IconComponent, isActive)}\n                      onClick={() => onSelect(id)}\n                    >\n                      <Text\n                        style={{\n                          fontWeight: isActive ? config.fontWeight.W600 : undefined,\n                        }}\n                        size={menuItemTextSize}\n                        truncate\n                      >\n                        {section.label}\n                      </Text>\n                    </MenuItem>\n                  );\n                })}\n            </div>\n          </PageNavContent>\n          {footer}\n        </Box>\n      </PageNav>\n    );\n\n  const content =\n    active && sections[active] && sections[active].visible !== false ? (\n      <SectionViewport\n        sectionId={active}\n        sections={sections}\n        requestBack={sectionRequestBack}\n        requestClose={requestClose}\n      />\n    ) : null;\n\n  const pageRoot = (\n    <PageRoot nav={nav} mobileDrawer={mobileDrawer}>\n      {renderSection ? renderSection(content) : content}\n    </PageRoot>\n  );\n\n  if (wrapper) {\n    return <>{wrapper(pageRoot)}</>;\n  }\n\n  return pageRoot;\n}\n","import { atom } from 'jotai';\nimport {\n  atomWithLocalStorage,\n  getLocalStorageItem,\n  setLocalStorageItem,\n} from './utils/atomWithLocalStorage';\n\nexport type UpdatePhase =\n  | { type: 'idle' }\n  | { type: 'checking' }\n  | { type: 'downloading'; progress: number }\n  | { type: 'ready'; version: string }\n  | { type: 'installing' };\n\nexport const updatePhaseAtom = atom<UpdatePhase>({ type: 'idle' });\n\nexport const updateBannerVisibleAtom = atom(false);\n\nexport const triggerUpdateCheckAtom = atom(0);\n\nconst DESKTOP_UPDATE_LAST_CHECKED_KEY = 'desktopUpdateLastChecked';\n\nexport const desktopUpdateLastCheckedAtom = atomWithLocalStorage<string | null>(\n  DESKTOP_UPDATE_LAST_CHECKED_KEY,\n  (key) => getLocalStorageItem<string | null>(key, null),\n  (key, value) => setLocalStorageItem(key, value)\n);\n\nexport const fakeDesktopUpdate = (): boolean =>\n  localStorage.getItem('sable_fake_desktop_update') === '1';\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, Scroll, Button, config, toRem, Spinner } from 'folds';\nimport { Code, Heart, menuIcon } from '$components/icons/phosphor';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport LogoSVG from '$public/res/svg/logo.svg';\nimport { clearCacheAndReload } from '$client/initMatrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { Method } from '$types/matrix-sdk';\nimport { useOpenShallowRoute } from '$pages/client/useShallowRoute';\nimport { getBugReportPath } from '$pages/pathUtils';\nimport { isDesktopTauri, isDesktopUpdaterEnabled } from '$utils/platform';\nimport {\n  updatePhaseAtom,\n  updateBannerVisibleAtom,\n  triggerUpdateCheckAtom,\n  desktopUpdateLastCheckedAtom,\n} from '$state/desktopUpdate';\nimport dayjs from 'dayjs';\nimport { useAtomValue, useSetAtom } from 'jotai';\n\ntype VersionResult =\n  | { error: { message: string } }\n  | { server: { name?: string; version?: string; compiler?: string } }\n  | undefined;\n\nfunction HomeserverInfo() {\n  const mx = useMatrixClient();\n  const [federationUrl, setFederationUrl] = useState<string>(mx.baseUrl);\n  const [version, setVersion] = useState<VersionResult>(undefined);\n\n  if (!version)\n    mx.http\n      .request(Method.Get, '/version', undefined, undefined, {\n        prefix: '/_matrix/federation/v1',\n        baseUrl: federationUrl,\n      })\n      .then((fetched_version) =>\n        setVersion({\n          server: fetched_version as { name?: string; version?: string; compiler?: string },\n        })\n      )\n      .catch((error) => {\n        if (federationUrl === mx.baseUrl) {\n          mx.http\n            .request(Method.Get, '/server', undefined, undefined, {\n              prefix: '/.well-known/matrix',\n              baseUrl: `https://${mx.getSafeUserId().split(':')[1]}`,\n            })\n            .then((well_known) => {\n              const mServer = (well_known as { 'm.server'?: string })['m.server'];\n              const newUrl = mServer ? `https://${mServer.split(':')[0]}` : federationUrl;\n              if (newUrl !== federationUrl) {\n                setFederationUrl(newUrl);\n              }\n            })\n            .catch((error_) => setVersion({ error: { message: String(error_) } }));\n        } else {\n          setVersion({ error: { message: String(error) } });\n        }\n      });\n\n  return (\n    <Box direction=\"Column\" gap=\"100\" id=\"homeserver-info\">\n      <Text size=\"L400\">Homeserver</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Domain\"\n          focusId=\"domain\"\n          description={mx.getSafeUserId().split(':')[1]}\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Base URL\"\n          focusId=\"base-url\"\n          description={\n            <a href={mx.baseUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n              {mx.baseUrl}\n            </a>\n          }\n        />\n      </SequenceCard>\n      {federationUrl !== mx.baseUrl && (\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"400\"\n        >\n          <SettingTile\n            title=\"Federation URL\"\n            focusId=\"federation-url\"\n            description={\n              <a href={federationUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n                {federationUrl}\n              </a>\n            }\n          />\n        </SequenceCard>\n      )}\n      {version ? (\n        <>\n          {'error' in version && version.error && (\n            <SequenceCard\n              className={SequenceCardStyle}\n              variant=\"SurfaceVariant\"\n              direction=\"Column\"\n              gap=\"400\"\n            >\n              {version.error.message}\n            </SequenceCard>\n          )}\n          {'server' in version && version.server?.name && (\n            <SequenceCard\n              className={SequenceCardStyle}\n              variant=\"SurfaceVariant\"\n              direction=\"Column\"\n              gap=\"400\"\n            >\n              <SettingTile\n                title=\"Name\"\n                focusId=\"homeserver-name\"\n                description={version.server?.name}\n              />\n            </SequenceCard>\n          )}\n          {'server' in version && version.server?.version && (\n            <SequenceCard\n              className={SequenceCardStyle}\n              variant=\"SurfaceVariant\"\n              direction=\"Column\"\n              gap=\"400\"\n            >\n              <SettingTile\n                title=\"Version\"\n                focusId=\"homeserver-version\"\n                description={version.server?.version}\n              />\n            </SequenceCard>\n          )}\n          {'server' in version && version.server?.compiler && (\n            <SequenceCard\n              className={SequenceCardStyle}\n              variant=\"SurfaceVariant\"\n              direction=\"Column\"\n              gap=\"400\"\n            >\n              <SettingTile\n                title=\"Compiler\"\n                focusId=\"homeserver-compiler\"\n                description={version.server?.compiler}\n              />\n            </SequenceCard>\n          )}\n        </>\n      ) : (\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"400\"\n        >\n          <Spinner />\n        </SequenceCard>\n      )}\n    </Box>\n  );\n}\n\ntype AboutProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\nexport function About({ requestBack, requestClose }: Readonly<AboutProps>) {\n  const mx = useMatrixClient();\n  const devLabel = IS_RELEASE_TAG ? '' : '-dev';\n  const buildLabel = BUILD_HASH ? ` (${BUILD_HASH})` : '';\n  const openShallowRoute = useOpenShallowRoute();\n  const openBugReport = () => openShallowRoute(getBugReportPath());\n  const updatePhase = useAtomValue(updatePhaseAtom);\n  const setBannerVisible = useSetAtom(updateBannerVisibleAtom);\n  const triggerCheck = useSetAtom(triggerUpdateCheckAtom);\n  const lastChecked = useAtomValue(desktopUpdateLastCheckedAtom);\n  const [checking, setChecking] = useState(false);\n  const [resultText, setResultText] = useState<string | null>(null);\n  const resultTimerRef = useRef<number | null>(null);\n\n  const lastCheckedText = lastChecked\n    ? `Last checked: ${dayjs(lastChecked).format('HH:mm')}`\n    : null;\n\n  const clearResultTimer = useCallback(() => {\n    if (resultTimerRef.current !== null) {\n      clearTimeout(resultTimerRef.current);\n      resultTimerRef.current = null;\n    }\n  }, []);\n\n  const showResult = useCallback(\n    (text: string) => {\n      setChecking(false);\n      setResultText(text);\n      clearResultTimer();\n      resultTimerRef.current = window.setTimeout(() => {\n        setResultText(null);\n        resultTimerRef.current = null;\n      }, 3000);\n    },\n    [clearResultTimer]\n  );\n\n  useEffect(\n    () => () => {\n      clearResultTimer();\n    },\n    [clearResultTimer]\n  );\n\n  useEffect(() => {\n    if (!checking) return;\n    if (updatePhase.type === 'ready') {\n      showResult(`Update ${updatePhase.version} ready!`);\n      setBannerVisible(true);\n    } else if (updatePhase.type === 'idle') {\n      showResult('Up to date');\n    }\n  }, [updatePhase, checking, showResult, setBannerVisible]);\n\n  const handleCheckForUpdates = useCallback(() => {\n    setChecking(true);\n    setResultText(null);\n    triggerCheck((n) => n + 1);\n  }, [triggerCheck]);\n\n  return (\n    <SettingsSectionPage title=\"About\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <Box gap=\"400\">\n                <Box shrink=\"No\">\n                  <img\n                    style={{ width: toRem(60), height: toRem(60) }}\n                    src={LogoSVG}\n                    alt=\"Sable logo\"\n                  />\n                </Box>\n                <Box direction=\"Column\" gap=\"300\">\n                  <Box direction=\"Column\" gap=\"100\">\n                    <Box gap=\"100\" alignItems=\"End\">\n                      <Text size=\"H3\">Sable</Text>\n                      <Text size=\"T200\">{`v${APP_VERSION}${devLabel}${buildLabel}`}</Text>\n                    </Box>\n                    <Text>An almost stable Matrix client.</Text>\n                  </Box>\n\n                  <Box gap=\"200\" wrap=\"Wrap\">\n                    <Button\n                      as=\"a\"\n                      href=\"https://github.com/SableClient/Sable\"\n                      rel=\"noreferrer noopener\"\n                      target=\"_blank\"\n                      variant=\"Secondary\"\n                      fill=\"Soft\"\n                      size=\"300\"\n                      radii=\"300\"\n                      before={menuIcon(Code, { weight: 'fill' })}\n                    >\n                      <Text size=\"B300\">Source Code</Text>\n                    </Button>\n                    <Button\n                      as=\"a\"\n                      href=\"https://opencollective.com/sable\"\n                      rel=\"noreferrer noopener\"\n                      target=\"_blank\"\n                      variant=\"Critical\"\n                      fill=\"Soft\"\n                      size=\"300\"\n                      radii=\"300\"\n                      before={menuIcon(Heart, { weight: 'fill' })}\n                    >\n                      <Text size=\"B300\">Support</Text>\n                    </Button>\n                  </Box>\n                </Box>\n              </Box>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Options</Text>\n                {isDesktopTauri() && isDesktopUpdaterEnabled() && (\n                  <SequenceCard\n                    className={SequenceCardStyle}\n                    variant=\"SurfaceVariant\"\n                    direction=\"Column\"\n                    gap=\"400\"\n                  >\n                    <SettingTile\n                      title=\"Check for Updates\"\n                      focusId=\"check-for-updates\"\n                      description={`${resultText || 'Check for a new version.'}${lastCheckedText ? ` ${lastCheckedText}` : ''}`}\n                      after={\n                        <Button\n                          onClick={handleCheckForUpdates}\n                          variant=\"Secondary\"\n                          fill=\"Soft\"\n                          size=\"300\"\n                          radii=\"300\"\n                          outlined\n                          disabled={checking}\n                          before={checking ? <Spinner variant=\"Secondary\" size=\"300\" /> : undefined}\n                        >\n                          <Text size=\"B300\">Check</Text>\n                        </Button>\n                      }\n                    />\n                  </SequenceCard>\n                )}\n                <SequenceCard\n                  className={SequenceCardStyle}\n                  variant=\"SurfaceVariant\"\n                  direction=\"Column\"\n                  gap=\"400\"\n                >\n                  <SettingTile\n                    title=\"Clear Cache & Reload\"\n                    focusId=\"clear-cache-and-reload\"\n                    description=\"Clear all your locally stored data and reload from server.\"\n                    after={\n                      <Button\n                        onClick={() => clearCacheAndReload(mx)}\n                        variant=\"Secondary\"\n                        fill=\"Soft\"\n                        size=\"300\"\n                        radii=\"300\"\n                        outlined\n                      >\n                        <Text size=\"B300\">Clear Cache</Text>\n                      </Button>\n                    }\n                  />\n                </SequenceCard>\n                <SequenceCard\n                  className={SequenceCardStyle}\n                  variant=\"SurfaceVariant\"\n                  direction=\"Column\"\n                  gap=\"400\"\n                >\n                  <SettingTile\n                    title=\"Report an Issue\"\n                    focusId=\"report-an-issue\"\n                    description=\"Report a bug or request a feature on GitHub.\"\n                    after={\n                      <Button\n                        onClick={openBugReport}\n                        variant=\"Secondary\"\n                        fill=\"Soft\"\n                        size=\"300\"\n                        radii=\"300\"\n                        outlined\n                      >\n                        <Text size=\"B300\">Report</Text>\n                      </Button>\n                    }\n                  />\n                </SequenceCard>\n              </Box>\n              <HomeserverInfo />\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Credits</Text>\n                <SequenceCard\n                  className={SequenceCardStyle}\n                  variant=\"SurfaceVariant\"\n                  direction=\"Column\"\n                  gap=\"400\"\n                >\n                  <Box\n                    as=\"ul\"\n                    direction=\"Column\"\n                    gap=\"200\"\n                    style={{\n                      margin: 0,\n                      paddingLeft: config.space.S400,\n                    }}\n                  >\n                    <li>\n                      <Text size=\"T300\">\n                        <a\n                          href=\"https://github.com/cinnyapp/cinny\"\n                          rel=\"noreferrer noopener\"\n                          target=\"_blank\"\n                        >\n                          Cinny\n                        </a>\n                        {', © '}\n                        <a\n                          href=\"https://github.com/ajbura\"\n                          rel=\"noreferrer noopener\"\n                          target=\"_blank\"\n                        >\n                          Ajay Bura\n                        </a>\n                        {', is used under the terms of '}\n                        <a\n                          href=\"https://github.com/cinnyapp/cinny/blob/dev/LICENSE\"\n                          rel=\"noreferrer noopener\"\n                          target=\"_blank\"\n                        >\n                          AGPL v3\n                        </a>\n                        .\n                      </Text>\n                    </li>\n                    <li>\n                      <Text size=\"T300\">\n                        {'The '}\n                        <a\n                          href=\"https://github.com/matrix-org/matrix-js-sdk\"\n                          rel=\"noreferrer noopener\"\n                          target=\"_blank\"\n                        >\n                          matrix-js-sdk\n                        </a>\n                        {', © '}\n                        <a\n                          href=\"https://matrix.org/foundation\"\n                          rel=\"noreferrer noopener\"\n                          target=\"_blank\"\n                        >\n                          The Matrix.org Foundation C.I.C\n                        </a>\n                        {', is used under the terms of '}\n                        <a\n                          href=\"http://www.apache.org/licenses/LICENSE-2.0\"\n                          rel=\"noreferrer noopener\"\n                          target=\"_blank\"\n                        >\n                          Apache 2.0\n                        </a>\n                        .\n                      </Text>\n                    </li>\n                    <li>\n                      <Text size=\"T300\">\n                        {'The '}\n                        <a\n                          href=\"https://github.com/mozilla/twemoji-colr\"\n                          target=\"_blank\"\n                          rel=\"noreferrer noopener\"\n                        >\n                          twemoji-colr\n                        </a>\n                        {' font, © '}\n                        <a href=\"https://mozilla.org/\" target=\"_blank\" rel=\"noreferrer noopener\">\n                          Mozilla Foundation\n                        </a>\n                        {', is used under the terms of '}\n                        <a\n                          href=\"http://www.apache.org/licenses/LICENSE-2.0\"\n                          target=\"_blank\"\n                          rel=\"noreferrer noopener\"\n                        >\n                          Apache 2.0\n                        </a>\n                        .\n                      </Text>\n                    </li>\n                    <li>\n                      <Text size=\"T300\">\n                        {'The '}\n                        <a\n                          href=\"https://github.com/twitter/twemoji\"\n                          target=\"_blank\"\n                          rel=\"noreferrer noopener\"\n                        >\n                          Twemoji\n                        </a>\n                        {' emoji art, © '}\n                        <a\n                          href=\"https://github.com/twitter/twemoji\"\n                          target=\"_blank\"\n                          rel=\"noreferrer noopener\"\n                        >\n                          Twitter, Inc and other contributors\n                        </a>\n                        {', is used under the terms of '}\n                        <a\n                          href=\"https://creativecommons.org/licenses/by/4.0/\"\n                          target=\"_blank\"\n                          rel=\"noreferrer noopener\"\n                        >\n                          CC-BY 4.0\n                        </a>\n                        .\n                      </Text>\n                    </li>\n                    <li>\n                      <Text size=\"T300\">\n                        {'The '}\n                        <a\n                          href=\"https://material.io/design/sound/sound-resources.html\"\n                          target=\"_blank\"\n                          rel=\"noreferrer noopener\"\n                        >\n                          Material sound resources\n                        </a>{' '}\n                        {', © '}\n                        <a href=\"https://google.com\" target=\"_blank\" rel=\"noreferrer noopener\">\n                          Google\n                        </a>\n                        {', are used under the terms of '}\n                        <a\n                          href=\"https://creativecommons.org/licenses/by/4.0/\"\n                          target=\"_blank\"\n                          rel=\"noreferrer noopener\"\n                        >\n                          CC-BY 4.0\n                        </a>\n                        .\n                      </Text>\n                    </li>\n                  </Box>\n                </SequenceCard>\n              </Box>\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { Box, Text, Chip } from 'folds';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { copyToClipboard } from '$utils/dom';\n\nexport function MatrixId() {\n  const mx = useMatrixClient();\n  const userId = mx.getUserId()!;\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Matrix ID</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title={userId}\n          focusId=\"matrix-id\"\n          after={\n            <Chip variant=\"Secondary\" radii=\"Pill\" onClick={() => copyToClipboard(userId)}>\n              <Text size=\"T200\">Copy</Text>\n            </Chip>\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import type { Capabilities } from '$types/matrix-sdk';\nimport { createContext, useContext } from 'react';\n\nconst CapabilitiesContext = createContext<Capabilities | null>(null);\n\nexport const CapabilitiesProvider = CapabilitiesContext.Provider;\n\nexport function useCapabilities(): Capabilities {\n  const capabilities = useContext(CapabilitiesContext);\n  if (!capabilities) throw new Error('Capabilities are not provided!');\n  return capabilities;\n}\n","import type { MatrixClient } from '$types/matrix-sdk';\nimport { Method, UserEvent } from '$types/matrix-sdk';\nimport { MATRIX_UNSTABLE_MSC4466_PROPAGATE_TO } from '$unstable/prefixes';\nimport type { ProfileChangePropagation } from '$state/settings';\n\ntype ProfileKey = 'avatar_url' | 'displayname';\n\nasync function setProfileInfoWithPropagation(\n  mx: MatrixClient,\n  key: ProfileKey,\n  value: string,\n  propagateTo?: ProfileChangePropagation\n): Promise<void> {\n  if (propagateTo === undefined) {\n    if (key === 'displayname') await mx.setDisplayName(value);\n    else await mx.setAvatarUrl(value);\n    return;\n  }\n\n  const userId = mx.getSafeUserId();\n  await mx.http.authedRequest(\n    Method.Put,\n    `/profile/${encodeURIComponent(userId)}/${key}`,\n    { [MATRIX_UNSTABLE_MSC4466_PROPAGATE_TO]: propagateTo },\n    { [key]: value }\n  );\n\n  // Match the SDK setters by immediately updating the local profile cache.\n  const user = mx.getUser(userId);\n  if (!user) return;\n\n  if (key === 'displayname') {\n    user.displayName = value;\n    user.emit(UserEvent.DisplayName, user.events.presence, user);\n  } else {\n    user.avatarUrl = value;\n    user.emit(UserEvent.AvatarUrl, user.events.presence, user);\n  }\n}\n\nexport const setDisplayNameWithPropagation = (\n  mx: MatrixClient,\n  displayName: string,\n  propagateTo?: ProfileChangePropagation\n): Promise<void> => setProfileInfoWithPropagation(mx, 'displayname', displayName, propagateTo);\n\nexport const setAvatarUrlWithPropagation = (\n  mx: MatrixClient,\n  avatarUrl: string,\n  propagateTo?: ProfileChangePropagation\n): Promise<void> => setProfileInfoWithPropagation(mx, 'avatar_url', avatarUrl, propagateTo);\n","import type { ChangeEvent } from 'react';\nimport { useMemo, useState, useEffect } from 'react';\nimport { Box, IconButton, Button, Input, Text } from 'folds';\nimport { menuIcon, X } from '$components/icons/phosphor';\nimport { SettingTile } from '$components/setting-tile';\n\ninterface IntlWithSupportedValues {\n  supportedValuesOf(key: 'timeZone' | (string & {})): string[];\n}\n\ntype TimezoneEditorProps = {\n  current?: string;\n  onSave: (tz: string) => void;\n};\n\nexport function TimezoneEditor({ current, onSave }: TimezoneEditorProps) {\n  const [val, setVal] = useState(current ?? '');\n  const zones = useMemo(() => {\n    const intlPolyfill = Intl as unknown as IntlWithSupportedValues;\n    return intlPolyfill.supportedValuesOf('timeZone');\n  }, []);\n\n  useEffect(() => setVal(current ?? ''), [current]);\n\n  const handleSync = () => {\n    const systemTz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n    setVal(systemTz);\n    onSave(systemTz);\n  };\n\n  const handleReset = () => {\n    setVal('');\n    onSave('');\n  };\n\n  const handleManualSave = () => {\n    const trimmed = val.trim().slice(0, 64);\n    const matchedZone = zones.find((z) => z.toLowerCase() === trimmed.toLowerCase());\n    if (matchedZone && matchedZone !== current) {\n      onSave(matchedZone);\n      setVal(matchedZone);\n    }\n  };\n\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    setVal(e.currentTarget.value);\n  };\n\n  return (\n    <SettingTile\n      title=\"Timezone\"\n      focusId=\"timezone\"\n      description=\"Set manually or sync with your system.\"\n      after={\n        <Box gap=\"200\" alignItems=\"Center\">\n          <Input\n            list=\"tz-list\"\n            value={val}\n            size=\"300\"\n            radii=\"300\"\n            variant=\"Secondary\"\n            placeholder=\"e.g. Europe/London\"\n            onChange={handleChange}\n            onBlur={handleManualSave}\n            onKeyDown={(e) => e.key === 'Enter' && handleManualSave()}\n            style={{ width: '180px' }}\n          />\n          <datalist id=\"tz-list\">\n            {zones.map((z) => (\n              <option key={z} value={z}>\n                {z}\n              </option>\n            ))}\n          </datalist>\n          <Button\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            size=\"300\"\n            radii=\"300\"\n            outlined\n            onClick={handleSync}\n          >\n            <Text size=\"B300\">System</Text>\n          </Button>\n          <IconButton\n            size=\"300\"\n            variant=\"Critical\"\n            fill=\"None\"\n            onClick={handleReset}\n            radii=\"300\"\n            title=\"Reset\"\n          >\n            {menuIcon(X)}\n          </IconButton>\n        </Box>\n      }\n    />\n  );\n}\n","import type { ChangeEvent } from 'react';\nimport { useState, useEffect } from 'react';\nimport { Input } from 'folds';\nimport { SettingTile } from '$components/setting-tile';\nimport type { PronounSet } from '$utils/pronouns';\nimport { parsePronounsInput } from '$utils/pronouns';\n\ntype PronounEditorProps = {\n  title: string;\n  current: PronounSet[];\n  onSave: (p: PronounSet[]) => void;\n  disabled?: boolean;\n};\n\nexport function PronounEditor({ title, current, onSave, disabled }: PronounEditorProps) {\n  const initialString = Array.isArray(current)\n    ? current.map((p) => `${p.language ? `${p.language}:` : ''}${p.summary}`).join(', ')\n    : '';\n  const [val, setVal] = useState(initialString);\n\n  useEffect(() => setVal(initialString), [initialString]);\n\n  const handleSave = () => {\n    if (val === initialString) return;\n    const safeVal = val.slice(0, 128);\n    const next = parsePronounsInput(safeVal);\n    onSave(next);\n  };\n\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    setVal(e.currentTarget.value);\n  };\n\n  return (\n    <SettingTile\n      title={title}\n      focusId=\"pronouns\"\n      // let people specify multiple sets of pronouns for different languages\n      // the input is a comma separated list of pronoun sets, each set can have an optional language tag (e.g. \"en:they/them, de:sie/ihr\")\n      description=\"Separate sets with commas (e.g. 'en:they/them, en:it/its, de:sie/ihr').\"\n      after={\n        <Input\n          value={val}\n          size=\"300\"\n          radii=\"300\"\n          disabled={disabled ?? false}\n          variant=\"Secondary\"\n          placeholder=\"Add pronouns...\"\n          onChange={handleChange}\n          onBlur={handleSave}\n          onKeyDown={(e) => e.key === 'Enter' && handleSave()}\n          style={{ width: '232px' }}\n        />\n      }\n    />\n  );\n}\n","import type { KeyboardEventHandler } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport type { RectCords } from 'folds';\nimport { Box, Chip, IconButton, Spinner, Text, config } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { composerIcon, Smiley } from '$components/icons/phosphor';\nimport { isKeyHotkey } from 'is-hotkey';\nimport {\n  AutocompletePrefix,\n  useAutocompleteQuery,\n  EmoticonAutocomplete,\n  MarkdownFormattingToolbarBottom,\n  MarkdownFormattingToolbarToggle,\n  createEmoticonElement,\n  plainToEditorInput,\n  ProseMirrorEditorSurface,\n  toMatrixCustomHTML,\n  toPlainText,\n  trimCustomHtml,\n  toggleProseMirrorKeyboardShortcut,\n  useEditor,\n} from '$components/editor';\nimport { htmlToMarkdown } from '$plugins/markdown';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { EmojiBoard } from '$components/emoji-board';\nimport { SettingTile } from '$components/setting-tile';\nimport * as css from './BioEditor.css';\n\ntype BioEditorProps = {\n  value?: string;\n  isSaving?: boolean;\n  imagePackRooms?: Room[];\n  onSave: (htmlContent: string, plainText: string) => void;\n};\n\nexport function BioEditor({ value, isSaving, imagePackRooms, onSave }: BioEditorProps) {\n  const editor = useEditor();\n  const [enterForNewline] = useSetting(settingsAtom, 'enterForNewline');\n  const [shortcutOverrides] = useSetting(settingsAtom, 'shortcutOverrides');\n\n  const [autocompleteQuery, setAutocompleteQuery, handleCloseAutocomplete] =\n    useAutocompleteQuery(editor);\n  const [hasChanged, setHasChanged] = useState(false);\n\n  const prevValue = useRef(value);\n  const initialized = useRef(false);\n\n  const handleSave = useCallback(() => {\n    const plainText = toPlainText(editor.getDocument()).trim();\n\n    const customHtml = trimCustomHtml(toMatrixCustomHTML(editor.getDocument(), {}));\n\n    onSave(customHtml || plainText, plainText);\n    setHasChanged(false);\n  }, [editor, onSave]);\n\n  useEffect(() => {\n    const valueChanged = prevValue.current !== value;\n    const isFirstValidLoad = !initialized.current && value !== undefined;\n\n    if (valueChanged || isFirstValidLoad) {\n      prevValue.current = value;\n\n      let normalizedValue: string | undefined = value;\n      if (\n        typeof normalizedValue === 'object' &&\n        normalizedValue !== null &&\n        'formatted_body' in normalizedValue\n      ) {\n        normalizedValue = (normalizedValue as { formatted_body?: string }).formatted_body;\n      }\n\n      const safeValue = typeof normalizedValue === 'string' ? normalizedValue : '';\n\n      const incomingPlainText = toPlainText(\n        plainToEditorInput(safeValue.includes('<') ? htmlToMarkdown(safeValue) : safeValue)\n      ).trim();\n      const currentPlainText = toPlainText(editor.getDocument()).trim();\n\n      if (currentPlainText === incomingPlainText && initialized.current) return;\n\n      const isLikelyHtml = safeValue.includes('<') || safeValue.includes('>');\n      const initialValue = isLikelyHtml\n        ? plainToEditorInput(htmlToMarkdown(safeValue))\n        : plainToEditorInput(safeValue);\n\n      editor.setDocument(initialValue);\n\n      initialized.current = true;\n      setHasChanged(false);\n    }\n  }, [value, editor]);\n\n  const handleKeyDown: KeyboardEventHandler = useCallback(\n    (evt) => {\n      if (toggleProseMirrorKeyboardShortcut(editor, evt, shortcutOverrides)) {\n        evt.preventDefault();\n        return;\n      }\n      if (isKeyHotkey('mod+enter', evt) || (!enterForNewline && isKeyHotkey('enter', evt))) {\n        evt.preventDefault();\n        handleSave();\n      }\n    },\n    [editor, enterForNewline, handleSave, shortcutOverrides]\n  );\n\n  const handleKeyUp: KeyboardEventHandler = useCallback(\n    (evt) => {\n      if (isKeyHotkey('escape', evt)) {\n        evt.preventDefault();\n        return;\n      }\n      setAutocompleteQuery(editor.getAutocompleteQuery([AutocompletePrefix.Emoticon]));\n    },\n    [editor, setAutocompleteQuery]\n  );\n\n  const handleEmoticonSelect = (key: string, shortcode: string) => {\n    editor.insertInline(createEmoticonElement(key, shortcode));\n    editor.insertText(' ');\n    setHasChanged(true);\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <SettingTile title=\"About You\" focusId=\"about-you\" description=\"Customize your bio.\" />\n      <Box className={css.BioEditorContainer} direction=\"Column\" style={{ position: 'relative' }}>\n        {autocompleteQuery?.prefix === AutocompletePrefix.Emoticon && (\n          <EmoticonAutocomplete\n            imagePackRooms={imagePackRooms || []}\n            controller={editor}\n            query={autocompleteQuery!}\n            requestClose={handleCloseAutocomplete}\n          />\n        )}\n        <ProseMirrorEditorSurface\n          controller={editor}\n          placeholder=\"Write a bio...\"\n          onDocumentChange={() => {\n            if (!hasChanged) setHasChanged(true);\n          }}\n          onKeyDown={handleKeyDown}\n          onKeyUp={handleKeyUp}\n          maxHeight=\"200px\"\n          variant=\"Background\"\n          bottom={\n            <Box direction=\"Column\" style={{ backgroundColor: 'var(--sable-bg-container)' }}>\n              <MarkdownFormattingToolbarBottom controller={editor} />\n              <Box\n                style={{ padding: config.space.S200, paddingTop: 0 }}\n                alignItems=\"End\"\n                justifyContent=\"SpaceBetween\"\n                gap=\"100\"\n              >\n                <Box gap=\"200\" alignItems=\"Center\">\n                  {hasChanged && (\n                    <Chip\n                      onClick={handleSave}\n                      variant=\"Primary\"\n                      radii=\"Pill\"\n                      disabled={isSaving}\n                      outlined\n                      before={\n                        isSaving ? <Spinner variant=\"Primary\" fill=\"Soft\" size=\"100\" /> : undefined\n                      }\n                    >\n                      <Text size=\"B300\">{isSaving ? 'Saving' : 'Save'}</Text>\n                    </Chip>\n                  )}\n                </Box>\n                <Box gap=\"Inherit\">\n                  <MarkdownFormattingToolbarToggle variant=\"Background\" />\n                  <UseStateProvider initial={undefined}>\n                    {(anchor: RectCords | undefined, setAnchor) => (\n                      <PopOut\n                        anchor={anchor}\n                        alignOffset={-8}\n                        position=\"Top\"\n                        align=\"End\"\n                        content={\n                          <EmojiBoard\n                            imagePackRooms={imagePackRooms ?? []}\n                            returnFocusOnDeactivate={false}\n                            onEmojiSelect={handleEmoticonSelect}\n                            onCustomEmojiSelect={handleEmoticonSelect}\n                            requestClose={() =>\n                              setAnchor((v) => {\n                                if (v) {\n                                  editor.focus();\n                                  return undefined;\n                                }\n                                return v;\n                              })\n                            }\n                          />\n                        }\n                      >\n                        <IconButton\n                          aria-pressed={anchor !== undefined}\n                          variant=\"Background\"\n                          size=\"300\"\n                          radii=\"300\"\n                          onClick={(evt) => setAnchor(evt.currentTarget.getBoundingClientRect())}\n                        >\n                          {composerIcon(Smiley, {\n                            weight: anchor !== undefined ? 'fill' : 'regular',\n                          })}\n                        </IconButton>\n                      </PopOut>\n                    )}\n                  </UseStateProvider>\n                </Box>\n              </Box>\n            </Box>\n          }\n        />\n      </Box>\n    </Box>\n  );\n}\n","import FocusTrap from 'focus-trap-react';\nimport type { RectCords } from 'folds';\nimport { Box, Button, config, Menu, Text } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport type { MouseEventHandler, ReactNode } from 'react';\nimport { useState } from 'react';\nimport { stopPropagation } from '$utils/keyboard';\n\ntype HexColorPickerPopOutProps = {\n  children: (onOpen: MouseEventHandler<HTMLElement>, opened: boolean) => ReactNode;\n  picker: ReactNode;\n  onRemove?: () => void;\n};\nexport function HexColorPickerPopOut({ picker, onRemove, children }: HexColorPickerPopOutProps) {\n  const [cords, setCords] = useState<RectCords>();\n\n  const handleOpen: MouseEventHandler<HTMLElement> = (evt) => {\n    setCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  return (\n    <PopOut\n      anchor={cords}\n      position=\"Bottom\"\n      align=\"Center\"\n      content={\n        <FocusTrap\n          focusTrapOptions={{\n            onDeactivate: () => setCords(undefined),\n            clickOutsideDeactivates: true,\n            escapeDeactivates: stopPropagation,\n          }}\n        >\n          <Menu\n            style={{\n              padding: config.space.S100,\n              borderRadius: config.radii.R500,\n              overflow: 'initial',\n            }}\n          >\n            <Box direction=\"Column\" gap=\"200\">\n              {picker}\n              {onRemove && (\n                <Button\n                  size=\"300\"\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  radii=\"400\"\n                  onClick={() => onRemove()}\n                >\n                  <Text size=\"B300\">Remove</Text>\n                </Button>\n              )}\n            </Box>\n          </Menu>\n        </FocusTrap>\n      }\n    >\n      {children(handleOpen, !!cords)}\n    </PopOut>\n  );\n}\n","import { useState, useEffect } from 'react';\nimport { Box, Button, config, color, Text, Input, IconButton } from 'folds';\nimport { menuIcon, X } from '$components/icons/phosphor';\nimport { HexColorPicker } from 'react-colorful';\nimport { SettingTile } from '$components/setting-tile';\nimport { HexColorPickerPopOut } from '$components/HexColorPickerPopOut';\nimport { isValidHex } from '$hooks/useUserProfile';\n\ntype NameColorEditorProps = {\n  title: string;\n  description?: string;\n  focusId?: string;\n  current?: string;\n  newNameColor?: string;\n  onChange?: (color: string | null) => void;\n  onSave?: (color: string | null) => void;\n  disabled?: boolean;\n};\n\nconst stripQuotes = (str?: string) => {\n  if (!str) return '';\n  // to solve the silly tuwunel\n  return str.replaceAll(/^[\"']|[\"']$/g, '');\n};\n\nexport function NameColorEditor({\n  title,\n  description,\n  focusId,\n  current,\n  newNameColor,\n  onChange,\n  onSave,\n  disabled,\n}: Readonly<NameColorEditorProps>) {\n  const [tempColor, setTempColor] = useState(\n    stripQuotes(newNameColor) || stripQuotes(current) || undefined\n  );\n  const [hasChanged, setHasChanged] = useState(false);\n\n  useEffect(() => {\n    // this condition stops infinite loops on input clear when onChange is changing newColor in outer scope\n    if (!newNameColor && onChange) return;\n    const sanitized = stripQuotes(newNameColor || current);\n    if (sanitized) setTempColor(sanitized);\n    else setTempColor(undefined);\n  }, [current, newNameColor, onChange]);\n\n  useEffect(() => {\n    setHasChanged(newNameColor !== current);\n  }, [newNameColor, current]);\n\n  // Valid in the sense that it should look like an error during input.\n  // It's disruptive to the user to immediately present their input as an error.\n  // We should only present an error if they fail the regex test :)\n  // (Also this change makes the fallback \"undefined\" instead of #fff so this is required)\n  // oxlint-disable-next-line unicorn/consistent-function-scoping\n  const validInput = (testColor: string | undefined) => {\n    if (!testColor) return true;\n    return isValidHex(testColor);\n  };\n\n  const handleUpdate = (newColor: string) => {\n    let sanitized = stripQuotes(newColor);\n    sanitized = sanitized.startsWith('#') ? sanitized : `#${sanitized}`;\n    setTempColor(sanitized);\n    const currentSanitized = stripQuotes(current) || '#ffffff';\n    setHasChanged(sanitized.toUpperCase() !== currentSanitized.toUpperCase());\n  };\n\n  const handleSave = () => {\n    if (!!onSave && !!tempColor && isValidHex(tempColor)) {\n      onSave(tempColor);\n      setHasChanged(false);\n    }\n  };\n\n  const handleReset = () => {\n    if (onChange) onChange(null);\n    if (onSave) onSave(null);\n    setHasChanged(false);\n    setTempColor(undefined);\n  };\n\n  useEffect(() => {\n    const validColor = tempColor !== undefined && isValidHex(tempColor);\n    if (onChange) onChange(validColor ? tempColor : null);\n  }, [onChange, tempColor]);\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <SettingTile\n        title={title}\n        focusId={focusId}\n        description={description}\n        after={\n          <Box\n            alignItems=\"Center\"\n            justifyContent=\"SpaceBetween\"\n            gap=\"300\"\n            style={{\n              padding: config.space.S100,\n              backgroundColor: color.Surface.Container,\n              borderRadius: config.radii.R400,\n            }}\n          >\n            <Box alignItems=\"Center\" gap=\"300\" grow=\"Yes\">\n              {onSave && hasChanged && (\n                <Button\n                  variant=\"Primary\"\n                  size=\"300\"\n                  radii=\"Pill\"\n                  onClick={handleSave}\n                  disabled={!tempColor || !isValidHex(tempColor)}\n                >\n                  <Text size=\"B300\">Save</Text>\n                </Button>\n              )}\n              <HexColorPickerPopOut\n                picker={<HexColorPicker color={tempColor ?? '#FFFFFF'} onChange={handleUpdate} />}\n              >\n                {(onOpen, opened) => (\n                  <Button\n                    onClick={onOpen}\n                    size=\"400\"\n                    variant=\"Secondary\"\n                    fill=\"None\"\n                    radii=\"300\"\n                    disabled={disabled ?? false}\n                    style={{\n                      padding: config.space.S100,\n                      border: `2px solid ${opened ? 'var(--sable-primary-main)' : 'var(--sable-border-focus)'}`,\n                    }}\n                  >\n                    <Box\n                      style={{\n                        width: '32px',\n                        height: '32px',\n                        borderRadius: '50%',\n                        backgroundColor: tempColor ?? '#FFFFFF',\n                        boxShadow: 'inset 0 0 0 1px rgba(0,0,0,0.1)',\n                      }}\n                    />\n                  </Button>\n                )}\n              </HexColorPickerPopOut>\n\n              <Box direction=\"Row\" alignItems=\"Center\" gap=\"100\">\n                <Input\n                  value={tempColor ?? ''}\n                  onChange={(e) => handleUpdate(e.currentTarget.value)}\n                  placeholder=\"#FFFFFF\"\n                  variant={validInput(tempColor) ? 'Background' : 'Critical'}\n                  size=\"300\"\n                  radii=\"300\"\n                  disabled={disabled ?? false}\n                  style={{\n                    textTransform: 'uppercase',\n                    fontFamily: 'monospace',\n                    width: '100px',\n                  }}\n                />\n                {tempColor && (\n                  <IconButton\n                    variant=\"Secondary\"\n                    size=\"300\"\n                    radii=\"300\"\n                    disabled={disabled ?? false}\n                    onClick={handleReset}\n                    title=\"Reset to default\"\n                  >\n                    {menuIcon(X)}\n                  </IconButton>\n                )}\n              </Box>\n            </Box>\n          </Box>\n        }\n      />\n    </Box>\n  );\n}\n","import type { ChangeEventHandler, FormEventHandler } from 'react';\nimport { useEffect, useState } from 'react';\nimport { Box, Text, Button, Input, IconButton, Spinner, config } from 'folds';\nimport { menuIcon, X } from '$components/icons/phosphor';\nimport { SettingTile } from '$components/setting-tile';\n\ntype StatusEditorProps = {\n  current?: string;\n  onSave: (status: string) => Promise<void>;\n};\n\nexport function StatusEditor({ current = '', onSave }: StatusEditorProps) {\n  const [value, setValue] = useState(current);\n  const [saving, setSaving] = useState(false);\n  useEffect(() => {\n    setValue(current);\n  }, [current]);\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    setValue(evt.currentTarget.value);\n  };\n\n  const handleReset = () => {\n    setValue(current);\n  };\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = async (evt) => {\n    evt.preventDefault();\n    if (saving) return;\n\n    if (value === current) return;\n\n    setSaving(true);\n    try {\n      await onSave(value);\n    } finally {\n      setSaving(false);\n    }\n  };\n\n  const hasChanges = value !== current;\n\n  return (\n    <SettingTile title=\"Status\" focusId=\"status\">\n      <Box direction=\"Column\" grow=\"Yes\" gap=\"100\">\n        <Box\n          as=\"form\"\n          onSubmit={handleSubmit}\n          gap=\"200\"\n          aria-disabled={saving}\n          grow=\"Yes\"\n          style={{ minWidth: 0 }}\n        >\n          <Box grow=\"Yes\" direction=\"Column\">\n            <Input\n              name=\"statusInput\"\n              value={value}\n              onChange={handleChange}\n              placeholder=\"What's on your mind?\"\n              variant=\"Secondary\"\n              radii=\"300\"\n              style={{ paddingRight: config.space.S200 }}\n              readOnly={saving}\n              after={\n                hasChanges &&\n                !saving && (\n                  <IconButton\n                    type=\"reset\"\n                    onClick={handleReset}\n                    size=\"300\"\n                    radii=\"300\"\n                    variant=\"Secondary\"\n                  >\n                    {menuIcon(X)}\n                  </IconButton>\n                )\n              }\n            />\n          </Box>\n          <Button\n            size=\"400\"\n            variant={hasChanges ? 'Success' : 'Secondary'}\n            fill={hasChanges ? 'Solid' : 'Soft'}\n            outlined\n            radii=\"300\"\n            disabled={!hasChanges || saving}\n            type=\"submit\"\n          >\n            {saving && <Spinner variant=\"Success\" fill=\"Solid\" size=\"300\" />}\n            <Text size=\"B400\">Save</Text>\n          </Button>\n        </Box>\n      </Box>\n    </SettingTile>\n  );\n}\n","import { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile, SettingToggle } from '$components/setting-tile';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { UserProfile } from '$hooks/useUserProfile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport { showToast } from '$state/toast';\nimport { invalidateUserProfileCache } from '$hooks/useUserProfile';\nimport { Box, IconButton, Input, Text } from 'folds';\nimport { useSetAtom } from 'jotai';\nimport { useCallback, useEffect, useState, type ChangeEvent } from 'react';\nimport * as prefix from '$unstable/prefixes';\nimport { menuIcon, X } from '$components/icons/phosphor';\n\ntype inputProps = {\n  onSave: (newValue: unknown) => void;\n  onReset?: () => void;\n  initialValue?: string;\n  disabled?: boolean;\n  placeholder?: string;\n};\n\nfunction FreeInput({ initialValue: current, onSave, onReset, disabled, placeholder }: inputProps) {\n  const [val, setVal] = useState(current);\n\n  useEffect(() => {\n    setVal(current ?? '');\n  }, [current]);\n\n  const handleSave = () => {\n    if (val === current) return;\n    onSave(val);\n  };\n\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    setVal(e.currentTarget.value);\n  };\n\n  return (\n    <>\n      <Input\n        value={val}\n        size=\"300\"\n        radii=\"300\"\n        disabled={disabled ?? false}\n        variant=\"Secondary\"\n        placeholder={placeholder ?? 'Input...'}\n        onChange={handleChange}\n        onBlur={handleSave}\n        onKeyDown={(e) => e.key === 'Enter' && handleSave()}\n        style={{ width: '232px' }}\n      />\n      <Box gap=\"0\">\n        {onReset && (\n          <IconButton\n            size=\"300\"\n            variant=\"Critical\"\n            fill=\"None\"\n            onClick={() => {\n              onReset();\n              setVal('');\n            }}\n            radii=\"300\"\n            title=\"Reset\"\n            disabled={disabled}\n          >\n            {menuIcon(X)}\n          </IconButton>\n        )}\n      </Box>\n    </>\n  );\n}\n\ntype AnimalCosmeticsProps = {\n  profile: UserProfile;\n  userId: string;\n};\nexport function AnimalCosmetics({ profile, userId }: Readonly<AnimalCosmeticsProps>) {\n  const mx = useMatrixClient();\n  const setGlobalProfiles = useSetAtom(profilesCacheAtom);\n  const [renderAnimals, setRenderAnimals] = useSetting(settingsAtom, 'renderAnimals');\n  const [, setAnimalKind] = useSetting(settingsAtom, 'animalKind');\n\n  const isAnimal = profile.isAnimal;\n  const hasAnimal = profile.hasAnimal;\n  const animalNeed = profile.animalNeed;\n\n  const handleSaveField = useCallback(\n    async (key: string, value: unknown) => {\n      try {\n        await mx.setExtendedProfileProperty?.(key, value);\n      } catch (error) {\n        showToast(\n          `Failed to save profile field: ${error instanceof Error ? error.message : String(error)}`\n        );\n        return;\n      }\n      invalidateUserProfileCache(mx, userId, setGlobalProfiles);\n    },\n    [mx, userId, setGlobalProfiles]\n  );\n  // this is for backwards compatibility, whenever someone will see this again, a long time from now, this will be safe to remove alongside the parent key\n  useEffect(() => {\n    const asyncClean = async () => {\n      const isCat = profile.isCat;\n      if (typeof isCat === 'boolean') {\n        await handleSaveField(\n          prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_CAT_PROPERTY_NAME,\n          null\n        );\n        await handleSaveField(\n          prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_ANIMAL_PROPERTY_NAME,\n          'cat'\n        );\n        setAnimalKind('cat');\n      }\n      const hasCats = profile.hasCats;\n      if (typeof hasCats === 'boolean') {\n        await handleSaveField(\n          prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_CAT_PROPERTY_NAME,\n          null\n        );\n        await handleSaveField(\n          prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_ANIMAL_PROPERTY_NAME,\n          'cats'\n        );\n      }\n    };\n    asyncClean();\n  }, [handleSaveField, profile, setAnimalKind]);\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Animal Identity</Text>\n      <SettingToggle\n        title=\"Render Animals\"\n        focusId=\"render-animals\"\n        description=\"Render animals statuses.\"\n        value={renderAnimals}\n        onChange={setRenderAnimals}\n      />\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Is animal\"\n          focusId=\"is-animal\"\n          description=\"Marks which animals you are.\"\n          after={\n            <FreeInput\n              initialValue={isAnimal}\n              onSave={(newValue) => {\n                handleSaveField(\n                  prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_ANIMAL_PROPERTY_NAME,\n                  newValue\n                );\n                if (typeof newValue === 'string') setAnimalKind(newValue);\n              }}\n              onReset={() => {\n                handleSaveField(\n                  prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_ANIMAL_PROPERTY_NAME,\n                  null\n                );\n                setAnimalKind(undefined);\n              }}\n              placeholder=\"bunny...\"\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Has animals\"\n          focusId=\"has-cats\"\n          description=\"Marks which animals you have\"\n          after={\n            <FreeInput\n              initialValue={hasAnimal}\n              onSave={(newValue) =>\n                handleSaveField(\n                  prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_ANIMAL_PROPERTY_NAME,\n                  newValue\n                )\n              }\n              onReset={() =>\n                handleSaveField(\n                  prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_ANIMAL_PROPERTY_NAME,\n                  null\n                )\n              }\n              placeholder=\"sables...\"\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Requires\"\n          focusId=\"animal-requires\"\n          description=\"What do you need 🥺\"\n          after={\n            <FreeInput\n              initialValue={animalNeed}\n              onSave={(newValue) =>\n                handleSaveField(\n                  prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_ANIMAL_NEED_PROPERTY_NAME,\n                  newValue\n                )\n              }\n              onReset={() =>\n                handleSaveField(\n                  prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_ANIMAL_NEED_PROPERTY_NAME,\n                  null\n                )\n              }\n              placeholder=\"hugs...\"\n            />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import classNames from 'classnames';\nimport { Box, Chip, Header, IconButton, Text, as } from 'folds';\nimport { ArrowLeft, sizedIcon } from '$components/icons/phosphor';\nimport { Image as MediaImage } from '$components/media';\nimport * as css from './ImageEditor.css';\n\ntype ImageEditorProps = {\n  name: string;\n  url: string;\n  requestClose: () => void;\n};\n\nconst handleApply = () => {\n  //\n};\n\nexport const ImageEditor = as<'div', ImageEditorProps>(\n  ({ className, name, url, requestClose, ...props }, ref) => {\n    return (\n      <Box\n        className={classNames(css.ImageEditor, className)}\n        direction=\"Column\"\n        {...props}\n        ref={ref}\n      >\n        <Header className={css.ImageEditorHeader} size=\"400\">\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            <IconButton size=\"300\" radii=\"300\" onClick={requestClose}>\n              {sizedIcon(ArrowLeft, '50')}\n            </IconButton>\n            <Text size=\"T300\" truncate>\n              Image Editor\n            </Text>\n          </Box>\n          <Box shrink=\"No\" alignItems=\"Center\" gap=\"200\">\n            <Chip variant=\"Primary\" radii=\"300\" onClick={handleApply}>\n              <Text size=\"B300\">Save</Text>\n            </Chip>\n          </Box>\n        </Header>\n        <Box\n          grow=\"Yes\"\n          className={css.ImageEditorContent}\n          justifyContent=\"Center\"\n          alignItems=\"Center\"\n        >\n          <MediaImage className={css.Image} src={url} alt={name} />\n        </Box>\n      </Box>\n    );\n  }\n);\n","import { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { Box, Text, Button, Modal } from 'folds';\nimport { SettingTile } from '$components/setting-tile';\nimport { useObjectURL } from '$hooks/useObjectURL';\nimport type { UploadSuccess } from '$state/upload';\nimport { createUploadAtom } from '$state/upload';\nimport { useFilePicker } from '$hooks/useFilePicker';\nimport { CompactUploadCardRenderer } from '$components/upload-card';\nimport { ImageEditor } from '$components/image-editor';\nimport { ModalWide } from '$styles/Modal.css';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { confirm } from '$components/confirm/confirm';\n\nexport type AvatarUploadTileProps = {\n  title: string;\n  focusId?: string;\n  after: ReactNode;\n  disableSetAvatar?: boolean;\n  removeDisabled?: boolean;\n  onUpload: (mxc: string) => void;\n  onRemove: () => void;\n  confirmTitle: string;\n  confirmDescription: string;\n};\n\nexport function AvatarUploadTile({\n  title,\n  focusId,\n  after,\n  disableSetAvatar = false,\n  removeDisabled = false,\n  onUpload,\n  onRemove,\n  confirmTitle,\n  confirmDescription,\n}: AvatarUploadTileProps) {\n  const [imageFile, setImageFile] = useState<File>();\n  const imageFileURL = useObjectURL(imageFile);\n  const uploadAtom = useMemo(() => {\n    if (imageFile) return createUploadAtom(imageFile);\n    return undefined;\n  }, [imageFile]);\n\n  const pickFile = useFilePicker(setImageFile, false);\n\n  const handleRemoveUpload = useCallback(() => {\n    setImageFile(undefined);\n  }, []);\n\n  const handleUploaded = useCallback(\n    (upload: UploadSuccess) => {\n      onUpload(upload.mxc);\n      handleRemoveUpload();\n    },\n    [onUpload, handleRemoveUpload]\n  );\n\n  const handleRemoveAvatar = useCallback(async () => {\n    const ok = await confirm({\n      title: confirmTitle,\n      description: confirmDescription,\n      action: 'Remove',\n      variant: 'Critical',\n    });\n    if (ok) {\n      onRemove();\n    }\n  }, [confirmTitle, confirmDescription, onRemove]);\n\n  return (\n    <SettingTile title={title} focusId={focusId} after={after}>\n      {uploadAtom ? (\n        <Box gap=\"200\" direction=\"Column\">\n          <CompactUploadCardRenderer\n            uploadAtom={uploadAtom}\n            onRemove={handleRemoveUpload}\n            onComplete={handleUploaded}\n          />\n        </Box>\n      ) : (\n        <Box gap=\"200\">\n          <Button\n            onClick={() => pickFile('image/*')}\n            size=\"300\"\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            outlined\n            radii=\"300\"\n            disabled={disableSetAvatar}\n          >\n            <Text size=\"B300\">Upload</Text>\n          </Button>\n          {!removeDisabled && (\n            <Button\n              size=\"300\"\n              variant=\"Critical\"\n              fill=\"None\"\n              radii=\"300\"\n              disabled={disableSetAvatar}\n              onClick={handleRemoveAvatar}\n            >\n              <Text size=\"B300\">Remove</Text>\n            </Button>\n          )}\n        </Box>\n      )}\n\n      {imageFileURL && (\n        <ModalOverlay open={false} requestClose={handleRemoveUpload}>\n          <Modal className={ModalWide} variant=\"Surface\" size=\"500\">\n            <ImageEditor\n              name={imageFile?.name ?? 'Unnamed'}\n              url={imageFileURL}\n              requestClose={handleRemoveUpload}\n            />\n          </Modal>\n        </ModalOverlay>\n      )}\n    </SettingTile>\n  );\n}\n","import type { ChangeEventHandler, FormEventHandler } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Text, IconButton, Input, Avatar, Button, config, Spinner } from 'folds';\nimport { menuIcon, Star, Sun, X } from '$components/icons/phosphor';\nimport { useSetAtom } from 'jotai';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport type { SettingMenuOption } from '$components/setting-menu-selector';\nimport { SettingMenuSelector } from '$components/setting-menu-selector';\nimport { SettingTile } from '$components/setting-tile';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { UserProfile, MSC4440Bio, ColorSet } from '$hooks/useUserProfile';\nimport { invalidateUserProfileCache, useUserProfile } from '$hooks/useUserProfile';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport { UserAvatar } from '$components/user-avatar';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { nameInitials, xor } from '$utils/common';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useFilePicker } from '$hooks/useFilePicker';\nimport { useObjectURL } from '$hooks/useObjectURL';\nimport { toSettingsFocusIdPart } from '$features/settings/settingsLink';\nimport type { UploadSuccess } from '$state/upload';\nimport { createUploadAtom } from '$state/upload';\nimport { CompactUploadCardRenderer } from '$components/upload-card';\nimport { Image as MediaImage } from '$components/media';\nimport { useCapabilities } from '$hooks/useCapabilities';\nimport { profilesCacheAtom } from '$state/userRoomProfile';\nimport { useUserPresence } from '$hooks/useUserPresence';\nimport { useSpecVersions } from '$hooks/useSpecVersions';\nimport { useSetting } from '$state/hooks/settings';\nimport type { ProfileChangePropagation } from '$state/settings';\nimport { settingsAtom } from '$state/settings';\nimport type { MSC1767Text } from '$types/matrix/common';\nimport { setAvatarUrlWithPropagation, setDisplayNameWithPropagation } from '$utils/msc4466';\nimport { TimezoneEditor } from './TimezoneEditor';\nimport { PronounEditor } from './PronounEditor';\nimport { BioEditor } from './BioEditor';\nimport { NameColorEditor } from './NameColorEditor';\nimport { StatusEditor } from './StatusEditor';\nimport { AnimalCosmetics } from './AnimalCosmetics';\nimport * as prefix from '$unstable/prefixes';\nimport { showToast } from '$state/toast';\nimport { confirm } from '$components/confirm/confirm';\nimport { AvatarUploadTile } from '$components/avatar-upload-tile/AvatarUploadTile';\nimport { accessibleColor } from '$plugins/color';\nimport { ThemeKind } from '$hooks/useTheme';\n\ntype PronounSet = {\n  summary: string;\n  language?: string;\n};\n\ntype ProfileProps = {\n  profile: UserProfile;\n  userId: string;\n  propagateTo?: ProfileChangePropagation;\n};\nfunction ProfileAvatar({ profile, userId, propagateTo }: Readonly<ProfileProps>) {\n  const mx = useMatrixClient();\n  const setGlobalProfiles = useSetAtom(profilesCacheAtom);\n  const useAuthentication = useMediaAuthentication();\n  const capabilities = useCapabilities();\n  const disableSetAvatar = capabilities['m.set_avatar_url']?.enabled === false;\n\n  const defaultDisplayName = profile.displayName ?? getMxIdLocalPart(userId) ?? userId;\n  const avatarUrl = profile.avatarUrl\n    ? (mxcUrlToHttp(mx, profile.avatarUrl, useAuthentication, 96, 96, 'crop') ?? undefined)\n    : undefined;\n\n  const handleUploaded = useCallback(\n    async (mxc: string) => {\n      await setAvatarUrlWithPropagation(mx, mxc, propagateTo);\n      setGlobalProfiles((prev) => ({\n        ...prev,\n        [userId]: { ...prev[userId], avatarUrl: mxc },\n      }));\n    },\n    [mx, userId, propagateTo, setGlobalProfiles]\n  );\n\n  const handleRemoveAvatar = useCallback(async () => {\n    await setAvatarUrlWithPropagation(mx, '', propagateTo);\n    setGlobalProfiles((prev) => ({\n      ...prev,\n      [userId]: { ...prev[userId], avatarUrl: undefined },\n    }));\n  }, [mx, userId, propagateTo, setGlobalProfiles]);\n\n  return (\n    <AvatarUploadTile\n      title=\"Avatar\"\n      focusId=\"avatar\"\n      disableSetAvatar={disableSetAvatar}\n      removeDisabled={!avatarUrl}\n      onUpload={handleUploaded}\n      onRemove={handleRemoveAvatar}\n      confirmTitle=\"Remove Avatar\"\n      confirmDescription=\"Are you sure you want to remove profile avatar?\"\n      after={\n        <Avatar size=\"500\" radii=\"300\">\n          <UserAvatar\n            userId={userId}\n            src={avatarUrl}\n            renderFallback={() => <Text size=\"H4\">{nameInitials(defaultDisplayName)}</Text>}\n          />\n        </Avatar>\n      }\n    />\n  );\n}\n\nfunction ProfileBanner({ profile, userId }: Readonly<Pick<ProfileProps, 'profile' | 'userId'>>) {\n  const mx = useMatrixClient();\n  const setGlobalProfiles = useSetAtom(profilesCacheAtom);\n  const useAuthentication = useMediaAuthentication();\n  const [stagedUrl, setStagedUrl] = useState<string>();\n  const [isRemoving, setIsRemoving] = useState(false);\n\n  const bannerUrl = profile.bannerUrl\n    ? (mxcUrlToHttp(mx, profile.bannerUrl, useAuthentication) ?? undefined)\n    : undefined;\n\n  useEffect(() => {\n    if (bannerUrl) {\n      setStagedUrl(undefined);\n    }\n  }, [bannerUrl]);\n\n  const [imageFile, setImageFile] = useState<File>();\n  const imageFileURL = useObjectURL(imageFile);\n\n  const uploadAtom = useMemo(() => {\n    if (imageFile) return createUploadAtom(imageFile);\n    return undefined;\n  }, [imageFile]);\n\n  const pickFile = useFilePicker(setImageFile, false);\n\n  const handlePick = useCallback(() => {\n    setIsRemoving(false);\n    setStagedUrl(undefined);\n    pickFile('image/*');\n  }, [pickFile]);\n\n  const handleRemoveUpload = useCallback(() => {\n    setImageFile(undefined);\n  }, []);\n\n  const handleUploaded = useCallback(\n    async (upload: UploadSuccess) => {\n      const { mxc } = upload;\n\n      if (imageFileURL) setStagedUrl(imageFileURL);\n      setImageFile(undefined);\n\n      try {\n        await mx.setExtendedProfileProperty?.(\n          prefix.MATRIX_UNSTABLE_PROFILE_BANNER_PROPERTY_NAME,\n          mxc\n        );\n      } catch (error) {\n        showToast(\n          `Failed to save profile field: ${error instanceof Error ? error.message : String(error)}`\n        );\n        setStagedUrl(undefined);\n        return;\n      }\n      invalidateUserProfileCache(mx, userId, setGlobalProfiles);\n    },\n    [mx, userId, imageFileURL, setGlobalProfiles]\n  );\n\n  const handleRemoveBanner = async () => {\n    const ok = await confirm({\n      title: 'Remove Banner',\n      description: 'Are you sure you want to remove profile banner?',\n      action: 'Remove',\n      variant: 'Critical',\n    });\n    if (ok) {\n      setIsRemoving(true);\n      setStagedUrl(undefined);\n      setImageFile(undefined);\n      try {\n        await mx.setExtendedProfileProperty?.(\n          prefix.MATRIX_UNSTABLE_PROFILE_BANNER_PROPERTY_NAME,\n          null\n        );\n      } catch (error) {\n        showToast(\n          `Failed to save profile field: ${error instanceof Error ? error.message : String(error)}`\n        );\n        setIsRemoving(false);\n        return;\n      }\n      invalidateUserProfileCache(mx, userId, setGlobalProfiles);\n    }\n  };\n\n  const previewUrl = isRemoving ? undefined : imageFileURL || stagedUrl || bannerUrl;\n\n  return (\n    <SettingTile title=\"Banner\" focusId=\"banner\">\n      <Box direction=\"Column\" gap=\"300\" grow=\"Yes\">\n        <Box\n          style={{\n            height: '100px',\n            width: '100%',\n            borderRadius: config.radii.R400,\n            overflow: 'hidden',\n            backgroundColor: 'var(--sable-surface-container)',\n            position: 'relative',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n          }}\n        >\n          {previewUrl ? (\n            <MediaImage\n              src={previewUrl}\n              key={previewUrl}\n              style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n              alt=\"Banner Preview\"\n            />\n          ) : (\n            <Box justifyContent=\"Center\" alignItems=\"Center\">\n              <Text priority=\"300\" size=\"T200\">\n                No Banner Set\n              </Text>\n            </Box>\n          )}\n        </Box>\n\n        {uploadAtom ? (\n          <Box gap=\"200\" direction=\"Column\">\n            <CompactUploadCardRenderer\n              uploadAtom={uploadAtom}\n              onRemove={handleRemoveUpload}\n              onComplete={handleUploaded}\n            />\n          </Box>\n        ) : (\n          <Box gap=\"200\">\n            <Button\n              onClick={handlePick}\n              size=\"300\"\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              outlined\n              radii=\"300\"\n            >\n              <Text size=\"B300\">{bannerUrl ? 'Change Banner' : 'Upload Banner'}</Text>\n            </Button>\n            {bannerUrl && (\n              <Button\n                size=\"300\"\n                variant=\"Critical\"\n                fill=\"None\"\n                radii=\"300\"\n                onClick={handleRemoveBanner}\n              >\n                <Text size=\"B300\">Remove</Text>\n              </Button>\n            )}\n          </Box>\n        )}\n      </Box>\n    </SettingTile>\n  );\n}\n\nfunction ProfileDisplayName({ profile, userId, propagateTo }: Readonly<ProfileProps>) {\n  const mx = useMatrixClient();\n  const setGlobalProfiles = useSetAtom(profilesCacheAtom);\n  const capabilities = useCapabilities();\n  const disableSetDisplayname = capabilities['m.set_displayname']?.enabled === false;\n\n  const defaultDisplayName = profile.displayName ?? getMxIdLocalPart(userId) ?? userId;\n  const [displayName, setDisplayName] = useState(defaultDisplayName);\n\n  const [changeState, changeDisplayName] = useAsyncCallback(\n    useCallback(\n      async (name: string) => {\n        await setDisplayNameWithPropagation(mx, name, propagateTo);\n        setGlobalProfiles((prev) => ({\n          ...prev,\n          [userId]: { ...prev[userId], displayName: name },\n        }));\n      },\n      [mx, userId, propagateTo, setGlobalProfiles]\n    )\n  );\n  const changingDisplayName = changeState.status === AsyncStatus.Loading;\n\n  useEffect(() => {\n    setDisplayName(defaultDisplayName);\n  }, [defaultDisplayName]);\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const name = evt.currentTarget.value;\n    setDisplayName(name);\n  };\n\n  const handleReset = () => {\n    setDisplayName(defaultDisplayName);\n  };\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (changingDisplayName) return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const displayNameInput = target?.displayNameInput as HTMLInputElement | undefined;\n    const name = displayNameInput?.value;\n    if (!name) return;\n\n    changeDisplayName(name);\n  };\n\n  const hasChanges = displayName !== defaultDisplayName;\n  return (\n    <SettingTile title=\"Display Name\" focusId=\"display-name\">\n      <Box direction=\"Column\" grow=\"Yes\" gap=\"100\">\n        <Box\n          as=\"form\"\n          onSubmit={handleSubmit}\n          gap=\"200\"\n          aria-disabled={changingDisplayName || disableSetDisplayname}\n        >\n          <Box grow=\"Yes\" direction=\"Column\">\n            <Input\n              required\n              name=\"displayNameInput\"\n              value={displayName}\n              onChange={handleChange}\n              variant=\"Secondary\"\n              radii=\"300\"\n              style={{ paddingRight: config.space.S200 }}\n              readOnly={changingDisplayName || disableSetDisplayname}\n              after={\n                hasChanges &&\n                !changingDisplayName && (\n                  <IconButton\n                    type=\"reset\"\n                    onClick={handleReset}\n                    size=\"300\"\n                    radii=\"300\"\n                    variant=\"Secondary\"\n                  >\n                    {menuIcon(X)}\n                  </IconButton>\n                )\n              }\n            />\n          </Box>\n          <Button\n            size=\"400\"\n            variant={hasChanges ? 'Success' : 'Secondary'}\n            fill={hasChanges ? 'Solid' : 'Soft'}\n            outlined\n            radii=\"300\"\n            disabled={!hasChanges || changingDisplayName}\n            type=\"submit\"\n          >\n            {changingDisplayName && <Spinner variant=\"Success\" fill=\"Solid\" size=\"300\" />}\n            <Text size=\"B400\">Save</Text>\n          </Button>\n        </Box>\n      </Box>\n    </SettingTile>\n  );\n}\n\nfunction ProfileChangePropagationSetting({ disabled }: { disabled: boolean }) {\n  const [profileChangePropagation, setProfileChangePropagation] = useSetting(\n    settingsAtom,\n    'profileChangePropagation'\n  );\n  const options: SettingMenuOption<ProfileChangePropagation>[] = [\n    { value: 'all', label: 'All rooms' },\n    { value: 'unchanged', label: 'Unchanged rooms' },\n    { value: 'none', label: 'Global only' },\n  ];\n\n  return (\n    <SequenceCard\n      className={SequenceCardStyle}\n      variant=\"SurfaceVariant\"\n      direction=\"Column\"\n      gap=\"400\"\n      style={{ opacity: disabled ? 0.5 : 1 }}\n    >\n      <SettingTile\n        title=\"Profile change propagation\"\n        focusId=\"profile-change-propagation\"\n        description=\"Choose where global name and avatar changes are applied.\"\n        after={\n          <SettingMenuSelector\n            value={profileChangePropagation}\n            options={options}\n            onSelect={setProfileChangePropagation}\n            disabled={disabled}\n          />\n        }\n      />\n    </SequenceCard>\n  );\n}\n\nfunction ProfileExtended({ profile, userId }: Readonly<ProfileProps>) {\n  const mx = useMatrixClient();\n  const setGlobalProfiles = useSetAtom(profilesCacheAtom);\n\n  const pronouns = (profile.pronouns as PronounSet[]) || [];\n  const presence = useUserPresence(userId);\n  const currentStatus = presence?.status || '';\n\n  // Keys we don't render here nor handle seperately but still need to exclude\n  const EXCLUDED_KEYS = new Set([\n    prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_IS_CAT_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_ANIMAL_IDENTITY_HAS_CAT_PROPERTY_NAME,\n    prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_PROPERTY_NAME,\n  ]);\n\n  // Unknown fields / unimplemented non-matrix-spec fields\n  // Only renders them, can't edit or set\n  const extendedFields = Object.entries(profile.extended || {}).filter(\n    ([key]) => !EXCLUDED_KEYS.has(key)\n  );\n\n  const handleSaveField = useCallback(\n    async (key: string, value: unknown) => {\n      try {\n        await mx.setExtendedProfileProperty?.(key, value);\n      } catch (error) {\n        showToast(\n          `Failed to save profile field: ${error instanceof Error ? error.message : String(error)}`\n        );\n        return;\n      }\n      invalidateUserProfileCache(mx, userId, setGlobalProfiles);\n    },\n    [mx, userId, setGlobalProfiles]\n  );\n\n  const handleSaveStatus = useCallback(\n    async (newStatus: string) => {\n      const currentState = presence?.presence || 'online';\n\n      await mx.setPresence({\n        presence: currentState,\n        status_msg: newStatus,\n      });\n    },\n    [mx, presence]\n  );\n\n  const colorOnDark =\n    profile.nameColors?.on_dark ??\n    (profile.extended?.[prefix.MATRIX_UNSTABLE_COLORS] as ColorSet | undefined)?.on_dark ??\n    null;\n  const colorOnLight =\n    profile.nameColors?.on_light ??\n    (profile.extended?.[prefix.MATRIX_UNSTABLE_COLORS] as ColorSet | undefined)?.on_light ??\n    null;\n  const [newColorOnDark, setNewColorOnDark] = useState<string | null>(null);\n  const [newColorOnLight, setNewColorOnLight] = useState<string | null>(null);\n\n  // Deletes the depricated key, the color specific ones should be depricated too at a later date\n  const legacyColor = profile.nameColor;\n  const migratedLegacyColor = useRef(false);\n  useEffect(() => {\n    if (!legacyColor || migratedLegacyColor.current) return;\n    migratedLegacyColor.current = true;\n\n    const migrate = async () => {\n      if (!colorOnDark || !colorOnLight) {\n        await handleSaveField(prefix.MATRIX_UNSTABLE_COLORS, {\n          on_dark: colorOnDark ?? legacyColor,\n          on_light: colorOnLight ?? legacyColor,\n        });\n      }\n      await handleSaveField(prefix.MATRIX_SABLE_UNSTABLE_NAME_COLOR_PROPERTY_NAME, null);\n    };\n    migrate();\n  }, [legacyColor, colorOnDark, colorOnLight, handleSaveField]);\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Extended Profile</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <StatusEditor current={currentStatus} onSave={handleSaveStatus} />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <NameColorEditor\n          title=\"Dark theme Global Name Color\"\n          description=\"Your name's color for a dark theme user.\"\n          focusId=\"name-color-dark-theme\"\n          current={colorOnDark ?? undefined}\n          newNameColor={newColorOnDark ?? undefined}\n          onChange={setNewColorOnDark}\n          onSave={(color) =>\n            handleSaveField(prefix.MATRIX_UNSTABLE_COLORS, {\n              on_dark: color,\n              on_light: newColorOnLight,\n            })\n          }\n        />\n        <NameColorEditor\n          title=\"Light theme Global Name Color\"\n          description=\"Your name's color for a light theme user.\"\n          focusId=\"name-color-light-theme\"\n          current={colorOnLight ?? undefined}\n          newNameColor={newColorOnLight ?? undefined}\n          onChange={setNewColorOnLight}\n          onSave={(color) =>\n            handleSaveField(prefix.MATRIX_UNSTABLE_COLORS, {\n              on_dark: newColorOnDark,\n              on_light: color,\n            })\n          }\n        />\n        {xor(newColorOnDark, newColorOnLight) && (\n          <Box direction=\"Column\" alignItems=\"End\">\n            {!newColorOnDark && newColorOnLight && (\n              <Button\n                size=\"300\"\n                fill=\"Soft\"\n                onClick={() => {\n                  setNewColorOnDark(accessibleColor(ThemeKind.Dark, newColorOnLight));\n                }}\n              >\n                <Text size=\"T200\">Create new color from light theme</Text>\n              </Button>\n            )}\n            {newColorOnDark && !newColorOnLight && (\n              <Button\n                size=\"300\"\n                fill=\"Soft\"\n                onClick={() => {\n                  setNewColorOnLight(accessibleColor(ThemeKind.Light, newColorOnDark));\n                }}\n              >\n                <Text size=\"T200\">Create new color from dark theme</Text>\n              </Button>\n            )}\n          </Box>\n        )}\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <PronounEditor\n          title=\"Pronouns\"\n          current={pronouns}\n          onSave={(p) => handleSaveField(prefix.MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME, p)}\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <TimezoneEditor\n          current={profile.timezone}\n          onSave={(tz) => {\n            handleSaveField(prefix.MATRIX_UNSTABLE_PROFILE_TIMEZONE_PROPERTY_NAME, tz);\n            handleSaveField(prefix.MATRIX_STABLE_PROFILE_TIMEZONE_PROPERTY_NAME, tz);\n          }}\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <BioEditor\n          value={\n            (\n              profile.extended?.[prefix.MATRIX_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME] as\n                | MSC4440Bio\n                | undefined\n            )?.['m.text']?.[0]?.body ||\n            (profile.extended?.[prefix.MATRIX_SABLE_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME] as\n              | string\n              | undefined) ||\n            (profile.extended?.[prefix.MATRIX_COMMET_UNSTABLE_PROFILE_BIO_PROPERTY_NAME] as\n              | string\n              | undefined) ||\n            profile.bio\n          }\n          onSave={(htmlBio, plainTextBio) => {\n            handleSaveField(prefix.MATRIX_SABLE_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME, htmlBio);\n\n            // MSC4440\n            handleSaveField(prefix.MATRIX_UNSTABLE_PROFILE_BIOGRAPHY_PROPERTY_NAME, {\n              'm.text': [\n                {\n                  body: htmlBio,\n                  mimetype: 'text/html',\n                } satisfies MSC1767Text,\n                {\n                  body: plainTextBio,\n                } satisfies MSC1767Text,\n              ],\n            } satisfies MSC4440Bio);\n\n            const cleanedHtml = htmlBio.replaceAll('<br/></blockquote>', '</blockquote>');\n            handleSaveField(prefix.MATRIX_COMMET_UNSTABLE_PROFILE_BIO_PROPERTY_NAME, {\n              format: 'org.matrix.custom.html',\n              formatted_body: cleanedHtml,\n            });\n          }}\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <NameColorEditor\n          title=\"Background Color\"\n          description=\"The background color that will be used when making your profile card\"\n          focusId=\"user-hero-color\"\n          current={profile?.heroColorScheme?.color}\n          onSave={(color) =>\n            handleSaveField(prefix.MATRIX_COMMET_UNSTABLE_PROFILE_COLOR_SCHEME_PROPERTY_NAME, {\n              color,\n              brightness: color ? profile?.heroColorScheme?.brightness : null,\n            })\n          }\n        />\n        <IconButton\n          variant={profile?.heroColorScheme?.brightness === 'dark' ? 'Primary' : 'Warning'}\n          onClick={() =>\n            handleSaveField(prefix.MATRIX_COMMET_UNSTABLE_PROFILE_COLOR_SCHEME_PROPERTY_NAME, {\n              color: profile?.heroColorScheme?.color,\n              brightness: profile?.heroColorScheme?.brightness === 'dark' ? 'light' : 'dark',\n            })\n          }\n        >\n          <Box gap=\"200\" direction=\"Row\">\n            <Text truncate>\n              {profile?.heroColorScheme?.brightness === 'dark' ? 'Dark Mode' : 'Light Mode'}\n            </Text>\n            {profile?.heroColorScheme?.brightness === 'dark'\n              ? menuIcon(Star, { weight: 'fill' })\n              : menuIcon(Sun)}\n          </Box>\n        </IconButton>\n      </SequenceCard>\n\n      {extendedFields.length > 0 &&\n        extendedFields.map(([key, value]) => {\n          if (\n            typeof value !== 'string' &&\n            typeof value !== 'number' &&\n            typeof value !== 'boolean'\n          ) {\n            return null;\n          }\n\n          const strVal = String(value);\n          if (\n            (typeof value !== 'string' &&\n              typeof value !== 'number' &&\n              typeof value !== 'boolean') ||\n            strVal.length > 256\n          ) {\n            return null;\n          }\n\n          return (\n            <SequenceCard\n              key={key}\n              className={SequenceCardStyle}\n              variant=\"SurfaceVariant\"\n              direction=\"Column\"\n              gap=\"400\"\n            >\n              <SettingTile\n                key={key}\n                focusId={`profile-field-${toSettingsFocusIdPart(key)}`}\n                showSettingLinkAction={false}\n                title={key.split('.').pop() || key}\n                description={key}\n                after={\n                  <Text\n                    size=\"T300\"\n                    style={{\n                      maxWidth: '40vw',\n                      overflow: 'hidden',\n                      textOverflow: 'ellipsis',\n                      whiteSpace: 'nowrap',\n                    }}\n                  >\n                    {strVal}\n                  </Text>\n                }\n              />\n            </SequenceCard>\n          );\n        })}\n    </Box>\n  );\n}\n\nexport function Profile() {\n  const mx = useMatrixClient();\n  const userId = mx.getUserId()!;\n  const profile = useUserProfile(userId);\n  const { unstable_features: unstableFeatures } = useSpecVersions();\n  const supportsProfileChangePropagation =\n    unstableFeatures?.[prefix.MATRIX_UNSTABLE_MSC4466_FEATURE] === true;\n  const [profileChangePropagation] = useSetting(settingsAtom, 'profileChangePropagation');\n  const propagateTo: ProfileChangePropagation | undefined = supportsProfileChangePropagation\n    ? profileChangePropagation\n    : undefined;\n  return (\n    <Box direction=\"Column\" gap=\"700\">\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Profile</Text>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"400\"\n        >\n          <ProfileBanner profile={profile} userId={userId} />\n        </SequenceCard>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"400\"\n        >\n          <ProfileAvatar userId={userId} profile={profile} propagateTo={propagateTo} />\n        </SequenceCard>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"400\"\n        >\n          <ProfileDisplayName userId={userId} profile={profile} propagateTo={propagateTo} />\n        </SequenceCard>\n        <ProfileChangePropagationSetting disabled={!supportsProfileChangePropagation} />\n      </Box>\n      <ProfileExtended userId={userId} profile={profile} />\n      <AnimalCosmetics userId={userId} profile={profile} />\n    </Box>\n  );\n}\n","import { useCallback, useEffect } from 'react';\nimport { Box, Text, Chip } from 'folds';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\n\nexport function ContactInformation() {\n  const mx = useMatrixClient();\n  const [threePIdsState, loadThreePIds] = useAsyncCallback(\n    useCallback(() => mx.getThreePids(), [mx])\n  );\n  const threePIds =\n    threePIdsState.status === AsyncStatus.Success ? threePIdsState.data.threepids : undefined;\n\n  const emailIds = threePIds?.filter((id) => (id.medium as string) === 'email');\n\n  useEffect(() => {\n    loadThreePIds();\n  }, [loadThreePIds]);\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Contact Information</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Email Address\"\n          focusId=\"email-address\"\n          description=\"Email address attached to your account.\"\n        >\n          <Box>\n            {emailIds?.map((email) => (\n              <Chip key={email.address} as=\"span\" variant=\"Secondary\" radii=\"Pill\">\n                <Text size=\"T200\">{email.address}</Text>\n              </Chip>\n            ))}\n          </Box>\n          {/* <Input defaultValue=\"\" variant=\"Secondary\" radii=\"300\" /> */}\n        </SettingTile>\n      </SequenceCard>\n    </Box>\n  );\n}\n","import type { ChangeEventHandler, FormEventHandler } from 'react';\nimport { useCallback, useState } from 'react';\nimport { Box, Button, Chip, IconButton, Input, Spinner, Text, config } from 'folds';\nimport { menuIcon, X } from '$components/icons/phosphor';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { isUserId } from '$utils/matrix';\nimport { useIgnoredUsers } from '$hooks/useIgnoredUsers';\nimport { useAlive } from '$hooks/useAlive';\n\nfunction IgnoreUserInput({ userList }: { userList: string[] }) {\n  const mx = useMatrixClient();\n  const [userId, setUserId] = useState('');\n  const alive = useAlive();\n\n  const [ignoreState, ignore] = useAsyncCallback(\n    useCallback(\n      async (uId: string) => {\n        await mx.setIgnoredUsers([...userList, uId]);\n      },\n      [mx, userList]\n    )\n  );\n  const ignoring = ignoreState.status === AsyncStatus.Loading;\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const uId = evt.currentTarget.value;\n    setUserId(uId);\n  };\n\n  const handleReset = () => {\n    setUserId('');\n  };\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (ignoring) return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const userIdInput = target?.userIdInput as HTMLInputElement | undefined;\n    const uId = userIdInput?.value.trim();\n    if (!uId) return;\n\n    if (!isUserId(uId)) return;\n\n    ignore(uId).then(() => {\n      if (alive()) {\n        setUserId('');\n      }\n    });\n  };\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} gap=\"200\" aria-disabled={ignoring}>\n      <Box grow=\"Yes\" direction=\"Column\">\n        <Input\n          required\n          name=\"userIdInput\"\n          value={userId}\n          onChange={handleChange}\n          variant=\"Secondary\"\n          radii=\"300\"\n          style={{ paddingRight: config.space.S200 }}\n          readOnly={ignoring}\n          after={\n            userId &&\n            !ignoring && (\n              <IconButton\n                type=\"reset\"\n                onClick={handleReset}\n                size=\"300\"\n                radii=\"300\"\n                variant=\"Secondary\"\n              >\n                {menuIcon(X)}\n              </IconButton>\n            )\n          }\n        />\n      </Box>\n      <Button\n        size=\"400\"\n        variant=\"Secondary\"\n        fill=\"Soft\"\n        outlined\n        radii=\"300\"\n        type=\"submit\"\n        disabled={ignoring}\n      >\n        {ignoring && <Spinner variant=\"Secondary\" size=\"300\" />}\n        <Text size=\"B400\">Block</Text>\n      </Button>\n    </Box>\n  );\n}\n\nfunction IgnoredUserChip({ userId, userList }: { userId: string; userList: string[] }) {\n  const mx = useMatrixClient();\n  const [unignoreState, unignore] = useAsyncCallback(\n    useCallback(\n      () => mx.setIgnoredUsers(userList.filter((uId) => uId !== userId)),\n      [mx, userId, userList]\n    )\n  );\n\n  const handleUnignore = () => unignore();\n\n  const unIgnoring = unignoreState.status === AsyncStatus.Loading;\n  return (\n    <Chip\n      variant=\"Secondary\"\n      radii=\"Pill\"\n      after={unIgnoring ? <Spinner variant=\"Secondary\" size=\"100\" /> : menuIcon(X)}\n      onClick={handleUnignore}\n      disabled={unIgnoring}\n    >\n      <Text size=\"T200\" truncate>\n        {userId}\n      </Text>\n    </Chip>\n  );\n}\n\nexport function IgnoredUserList() {\n  const ignoredUsers = useIgnoredUsers();\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\" gap=\"200\">\n        <Text size=\"L400\">Blocked Users</Text>\n      </Box>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Select User\"\n          focusId=\"blocked-users\"\n          description=\"Prevent receiving messages or invites from user by adding their userId.\"\n        >\n          <Box direction=\"Column\" gap=\"300\">\n            <IgnoreUserInput userList={ignoredUsers} />\n            {ignoredUsers.length > 0 && (\n              <Box direction=\"Inherit\" gap=\"100\">\n                <Text size=\"L400\">Users</Text>\n                <Box wrap=\"Wrap\" gap=\"200\">\n                  {ignoredUsers.map((userId) => (\n                    <IgnoredUserChip key={userId} userId={userId} userList={ignoredUsers} />\n                  ))}\n                </Box>\n              </Box>\n            )}\n          </Box>\n        </SettingTile>\n      </SequenceCard>\n    </Box>\n  );\n}\n","import { Box, Scroll } from 'folds';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { MatrixId } from './MatrixId';\nimport { Profile } from './Profile';\nimport { ContactInformation } from './ContactInfo';\nimport { IgnoredUserList } from './IgnoredUserList';\n\ntype AccountProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\nexport function Account({ requestBack, requestClose }: AccountProps) {\n  return (\n    <SettingsSectionPage title=\"Account\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <Profile />\n              <MatrixId />\n              <ContactInformation />\n              <IgnoredUserList />\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Button, config, Dialog, Header, IconButton, Text } from 'folds';\nimport { menuIcon, X } from '$components/icons/phosphor';\n\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\ntype ThemeCatalogOnboardingProps = {\n  open: boolean;\n  onEnable: () => void;\n  onDecline: () => void;\n};\n\nfunction ThemeCatalogOnboarding({ open, onEnable, onDecline }: ThemeCatalogOnboardingProps) {\n  const suppressDeactivateDecline = useRef(false);\n\n  const handleEnableClick = useCallback(() => {\n    suppressDeactivateDecline.current = true;\n    onEnable();\n  }, [onEnable]);\n\n  const handleDeclineClick = useCallback(() => {\n    suppressDeactivateDecline.current = true;\n    onDecline();\n  }, [onDecline]);\n\n  const handleTrapDeactivate = useCallback(() => {\n    if (suppressDeactivateDecline.current) {\n      suppressDeactivateDecline.current = false;\n      return;\n    }\n    onDecline();\n  }, [onDecline]);\n\n  if (!open) return null;\n\n  return (\n    <ModalOverlay requestClose={handleTrapDeactivate} dismissOnClickOutside={false}>\n      <Dialog variant=\"Surface\">\n        <Header\n          style={{\n            padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n            borderBottomWidth: config.borderWidth.B300,\n          }}\n          variant=\"Surface\"\n          size=\"500\"\n        >\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">Remote themes</Text>\n          </Box>\n          <IconButton\n            size=\"300\"\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            outlined\n            radii=\"300\"\n            onClick={handleDeclineClick}\n            aria-label=\"Close\"\n          >\n            {menuIcon(X)}\n          </IconButton>\n        </Header>\n        <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n          <Text priority=\"400\">\n            Load themes from the official Sable theme catalog on GitHub? You can browse previews,\n            save favorites locally, and sync them with light and dark mode. If you choose not to,\n            you can keep using the built-in Light and Dark themes only.\n          </Text>\n          <Box direction=\"Column\" gap=\"200\">\n            <Button\n              variant=\"Primary\"\n              fill=\"Soft\"\n              outlined\n              size=\"300\"\n              radii=\"300\"\n              onClick={handleEnableClick}\n            >\n              <Text size=\"B400\">Yes, use the catalog</Text>\n            </Button>\n            <Button\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              outlined\n              size=\"300\"\n              radii=\"300\"\n              onClick={handleDeclineClick}\n            >\n              <Text size=\"B400\">No, built-in themes only</Text>\n            </Button>\n          </Box>\n        </Box>\n      </Dialog>\n    </ModalOverlay>\n  );\n}\n\nexport function useThemeCatalogOnboardingGate(\n  onboardingDone: boolean,\n  onComplete: (enabled: boolean) => void\n) {\n  const [open, setOpen] = useState(false);\n\n  useEffect(() => {\n    if (!onboardingDone) {\n      setOpen(true);\n    }\n  }, [onboardingDone]);\n\n  const handleEnable = useCallback(() => {\n    setOpen(false);\n    onComplete(true);\n  }, [onComplete]);\n\n  const handleDecline = useCallback(() => {\n    setOpen(false);\n    onComplete(false);\n  }, [onComplete]);\n\n  const openOnboarding = useCallback(() => {\n    setOpen(true);\n  }, []);\n\n  return {\n    open,\n    openOnboarding,\n    dialog: (\n      <ThemeCatalogOnboarding open={open} onEnable={handleEnable} onDecline={handleDecline} />\n    ),\n  };\n}\n","import { copyToClipboard } from '$utils/dom';\n\n/**\n * Shares text via the native share sheet on mobile (Tauri + sharekit),\n * the Web Share API on web (PWA), or falls back to clipboard copy when no\n * share API is available. Returns true if the text was shared or copied;\n * false if the user cancelled the share sheet.\n */\nexport async function shareText(text: string): Promise<boolean> {\n  // 1. Tauri mobile: use sharekit plugin\n  try {\n    const { type: osType } = await import('@tauri-apps/plugin-os');\n    if (osType() === 'android' || osType() === 'ios') {\n      const { shareText: sharekitShare } = await import('@choochmeque/tauri-plugin-sharekit-api');\n      await sharekitShare(text);\n      return true;\n    }\n  } catch {\n    // Tauri plugin not available — fall through\n  }\n\n  // 2. Web: try navigator.share if available (PWA context, not Tauri)\n  if (typeof navigator !== 'undefined' && navigator.share) {\n    try {\n      await navigator.share({ text });\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  // 3. Fallback: clipboard copy when no share API is available\n  return copyToClipboard(text);\n}\n","export const readFileToString = async (file: File): Promise<string> => {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.addEventListener('load', () =>\n      resolve(typeof reader.result === 'string' ? reader.result : '')\n    );\n    reader.addEventListener('error', () => reject(new Error(`Could not read ${file.name}.`)));\n\n    reader.readAsText(file);\n  });\n};\n","import { type ChangeEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Button, config, Dialog, Header, IconButton, Input, Text, toRem } from 'folds';\nimport { menuIcon, X } from '$components/icons/phosphor';\n\nimport { useSetting } from '$state/hooks/settings';\nimport {\n  settingsAtom,\n  type ThemeRemoteFavorite,\n  type ThemeRemoteTweakFavorite,\n} from '$state/settings';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport {\n  processImportedHttpsUrl,\n  processPastedOrUploadedCss,\n  type ProcessedThemeImport,\n} from '../../../theme/processThemeImport';\nimport { pruneThemeFavorites, pruneThemeTweakFavorites } from '../../../theme/themeLibrary';\n\nimport { usePatchSettings } from './themeSettingsPatch';\nimport { readFileToString } from '$app/utils/file';\n\ntype ThemeImportModalProps = {\n  open: boolean;\n  onClose: () => void;\n};\n\nexport function ThemeImportModal({ open, onClose }: ThemeImportModalProps) {\n  const patchSettings = usePatchSettings();\n  const [favorites] = useSetting(settingsAtom, 'themeRemoteFavorites');\n  const [tweakFavorites] = useSetting(settingsAtom, 'themeRemoteTweakFavorites');\n  const [enabledTweakFullUrls] = useSetting(settingsAtom, 'themeRemoteEnabledTweakFullUrls');\n  const [manualRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteManualFullUrl');\n  const [lightRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteLightFullUrl');\n  const [darkRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteDarkFullUrl');\n\n  const [importUrl, setImportUrl] = useState('');\n  const [importPaste, setImportPaste] = useState('');\n  const [uploadedFileCss, setUploadedFileCss] = useState<string | null>(null);\n  const [importError, setImportError] = useState<string | null>(null);\n  const [importBusy, setImportBusy] = useState(false);\n  const [importFileName, setImportFileName] = useState<string | undefined>(undefined);\n  const importFileRef = useRef<HTMLInputElement>(null);\n\n  const activeUrls = useMemo(\n    () =>\n      [manualRemoteFullUrl, lightRemoteFullUrl, darkRemoteFullUrl].filter((u): u is string =>\n        Boolean(u && u.trim().length > 0)\n      ),\n    [darkRemoteFullUrl, lightRemoteFullUrl, manualRemoteFullUrl]\n  );\n\n  useEffect(() => {\n    if (!open) {\n      setImportUrl('');\n      setImportPaste('');\n      setUploadedFileCss(null);\n      setImportError(null);\n      setImportFileName(undefined);\n      if (importFileRef.current) importFileRef.current.value = '';\n    }\n  }, [open]);\n\n  const onImportUrlChange: ChangeEventHandler<HTMLInputElement> = (e) =>\n    setImportUrl(e.target.value);\n\n  const onImportPasteChange: ChangeEventHandler<HTMLTextAreaElement> = (e) =>\n    setImportPaste(e.target.value);\n\n  const addImportedResult = useCallback(\n    (r: Extract<ProcessedThemeImport, { ok: true }>) => {\n      if (r.role === 'tweak') {\n        const existing = tweakFavorites.find((f) => f.fullUrl === r.fullUrl);\n        if (existing) {\n          setImportError('That tweak is already saved.');\n          return;\n        }\n        const next: ThemeRemoteTweakFavorite = {\n          fullUrl: r.fullUrl,\n          displayName: r.displayName,\n          basename: r.basename,\n          pinned: true,\n          importedLocal: r.importedLocal,\n          cssText: r.cssText,\n        };\n        const nextEnabled = enabledTweakFullUrls.includes(r.fullUrl)\n          ? [...enabledTweakFullUrls]\n          : [...enabledTweakFullUrls, r.fullUrl];\n        patchSettings({\n          themeRemoteTweakFavorites: pruneThemeTweakFavorites(\n            [...tweakFavorites, next],\n            nextEnabled\n          ),\n          themeRemoteEnabledTweakFullUrls: nextEnabled,\n        });\n        onClose();\n        return;\n      }\n\n      const existing = favorites.find((f) => f.fullUrl === r.fullUrl);\n      if (existing) {\n        setImportError('That theme is already saved.');\n        return;\n      }\n      const next: ThemeRemoteFavorite = {\n        fullUrl: r.fullUrl,\n        displayName: r.displayName,\n        basename: r.basename,\n        kind: r.kind,\n        pinned: true,\n        importedLocal: r.importedLocal,\n      };\n      const nextActive = Array.from(\n        new Set(\n          [...activeUrls, r.fullUrl].filter((u): u is string => Boolean(u && u.trim().length > 0))\n        )\n      );\n      patchSettings({\n        themeRemoteFavorites: pruneThemeFavorites([...favorites, next], nextActive),\n      });\n      onClose();\n    },\n    [activeUrls, enabledTweakFullUrls, favorites, onClose, patchSettings, tweakFavorites]\n  );\n\n  const onImportFileChange: ChangeEventHandler<HTMLInputElement> = (e) => {\n    const file = e.target.files?.[0];\n    if (!file) return;\n    setImportFileName(file.name);\n    setImportPaste('');\n    readFileToString(file)\n      .then(setUploadedFileCss)\n      .catch((err: Error) => setImportError(err.message));\n  };\n\n  const handleImportTheme = useCallback(async () => {\n    setImportError(null);\n    const urlTrim = importUrl.trim();\n    if (/^https:\\/\\//i.test(urlTrim)) {\n      setImportBusy(true);\n      try {\n        const result = await processImportedHttpsUrl(urlTrim);\n        if (!result.ok) {\n          setImportError(result.error);\n          return;\n        }\n        addImportedResult(result);\n      } finally {\n        setImportBusy(false);\n      }\n      return;\n    }\n    const pasted = importPaste.trim();\n    const fromFile = uploadedFileCss?.trim();\n    const cssToImport = fromFile || pasted;\n    if (!cssToImport) {\n      setImportError('Enter an URL, paste CSS, or choose a file.');\n      return;\n    }\n    setImportBusy(true);\n    try {\n      const result = await processPastedOrUploadedCss(\n        cssToImport,\n        fromFile ? importFileName : undefined\n      );\n      if (!result.ok) {\n        setImportError(result.error);\n        return;\n      }\n      addImportedResult(result);\n    } finally {\n      setImportBusy(false);\n    }\n  }, [addImportedResult, importFileName, importPaste, importUrl, uploadedFileCss]);\n\n  const dismissSafe = useCallback(() => {\n    if (importBusy) return;\n    onClose();\n  }, [importBusy, onClose]);\n\n  if (!open) return null;\n\n  return (\n    <ModalOverlay requestClose={dismissSafe} dismissOnClickOutside={false}>\n      <Dialog variant=\"Surface\" aria-labelledby=\"theme-import-title\">\n        <Header\n          style={{\n            padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n            borderBottomWidth: config.borderWidth.B300,\n          }}\n          variant=\"Surface\"\n          size=\"500\"\n        >\n          <Box grow=\"Yes\">\n            <Text id=\"theme-import-title\" size=\"H4\">\n              Import a theme or tweak\n            </Text>\n          </Box>\n          <IconButton\n            size=\"300\"\n            radii=\"300\"\n            onClick={dismissSafe}\n            disabled={importBusy}\n            aria-label=\"Close\"\n          >\n            {menuIcon(X)}\n          </IconButton>\n        </Header>\n        <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n          <Text priority=\"400\">\n            Paste a link to a <strong>.sable.css</strong> file, or paste CSS / upload a file. Files\n            whose first metadata block uses <strong>@sable-tweak</strong> are saved as tweaks\n            (applied on top of your current theme and turned on immediately). Themes use{' '}\n            <strong>@sable-theme</strong>. If theme CSS includes <strong>fullThemeUrl</strong> and\n            that URL loads, it is used; otherwise the theme is stored only on this device.\n          </Text>\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"300\"\n          >\n            <Input\n              size=\"300\"\n              radii=\"300\"\n              outlined\n              placeholder=\"https://…\"\n              value={importUrl}\n              onChange={onImportUrlChange}\n            />\n            {importFileName && uploadedFileCss !== null && (\n              <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\" wrap=\"Wrap\">\n                <Text size=\"T300\" priority=\"300\">\n                  Loaded file: <strong>{importFileName}</strong>.\n                </Text>\n                <Button\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  size=\"300\"\n                  radii=\"300\"\n                  disabled={importBusy}\n                  onClick={() => {\n                    setUploadedFileCss(null);\n                    setImportFileName(undefined);\n                    if (importFileRef.current) importFileRef.current.value = '';\n                  }}\n                >\n                  <Text size=\"B300\">Clear file</Text>\n                </Button>\n              </Box>\n            )}\n            <textarea\n              value={importPaste}\n              onChange={onImportPasteChange}\n              placeholder=\"Paste .preview.sable.css, .sable.css, or tweak CSS, or pick a file below…\"\n              rows={6}\n              disabled={Boolean(uploadedFileCss)}\n              style={{\n                width: '100%',\n                boxSizing: 'border-box',\n                padding: toRem(10),\n                borderRadius: toRem(8),\n                border: `${toRem(1)} solid var(--sable-surface-container-line)`,\n                background: 'var(--sable-surface-container)',\n                color: 'inherit',\n                font: 'inherit',\n                resize: 'vertical',\n                minHeight: toRem(120),\n              }}\n            />\n            <input\n              ref={importFileRef}\n              type=\"file\"\n              accept=\".css,text/css\"\n              style={{ display: 'none' }}\n              onChange={onImportFileChange}\n            />\n            <Box direction=\"Row\" gap=\"200\" wrap=\"Wrap\" alignItems=\"Center\">\n              <Button\n                variant=\"Secondary\"\n                fill=\"Soft\"\n                outlined\n                size=\"300\"\n                radii=\"300\"\n                disabled={importBusy}\n                onClick={() => importFileRef.current?.click()}\n              >\n                <Text size=\"B300\">Choose .css file</Text>\n              </Button>\n              <Button\n                variant=\"Primary\"\n                fill=\"Soft\"\n                outlined\n                size=\"300\"\n                radii=\"300\"\n                disabled={importBusy}\n                onClick={() => {\n                  handleImportTheme().catch(() => undefined);\n                }}\n              >\n                <Text size=\"B300\">{importBusy ? 'Importing…' : 'Import'}</Text>\n              </Button>\n            </Box>\n            {importError && (\n              <Text size=\"T300\" style={{ color: 'var(--sable-error)' }}>\n                {importError}\n              </Text>\n            )}\n          </SequenceCard>\n        </Box>\n      </Dialog>\n    </ModalOverlay>\n  );\n}\n","/**\n * Parse a raw.githubusercontent.com base URL into API parameters.\n * E.g. https://raw.githubusercontent.com/SableClient/themes/main/themes/\n */\nexport type GithubRawParts = {\n  owner: string;\n  repo: string;\n  ref: string;\n  directoryPath: string;\n};\n\nconst RAW_RE = /^https:\\/\\/raw\\.githubusercontent\\.com\\/([^/]+)\\/([^/]+)\\/([^/]+)(?:\\/(.*))?$/;\n\nexport function parseGithubRawBaseUrl(baseUrl: string): GithubRawParts | null {\n  const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n  const m = trimmed.match(RAW_RE);\n  if (!m || !m[1] || !m[2] || !m[3]) return null;\n  const owner = m[1];\n  const repo = m[2];\n  const ref = m[3];\n  const rest = m[4];\n  const directoryPath = (rest ?? '').replace(/^\\/+|\\/+$/g, '');\n  return { owner, repo, ref, directoryPath };\n}\n\nexport function rawFileUrl(parts: GithubRawParts, fileName: string): string {\n  const dir = parts.directoryPath ? `${parts.directoryPath}/` : '';\n  return `https://raw.githubusercontent.com/${parts.owner}/${parts.repo}/${parts.ref}/${dir}${fileName}`;\n}\n","import { parseGithubRawBaseUrl, rawFileUrl, type GithubRawParts } from './githubRaw';\nimport { fetch } from '$utils/fetch';\n\ntype GithubContentItem = {\n  name: string;\n  path: string;\n  type: 'file' | 'dir';\n  download_url: string | null;\n};\n\nexport type ThemePair = {\n  basename: string;\n  previewUrl: string;\n  fullUrl: string;\n};\n\nexport type TweakCatalogEntry = {\n  basename: string;\n  fullUrl: string;\n};\n\nexport type ThemeCatalogBundle = {\n  themes: ThemePair[];\n  tweaks: TweakCatalogEntry[];\n};\n\nexport type ListThemeCatalogOptions = {\n  manifestUrl?: string | null;\n};\n\nconst PREVIEW_SUFFIX = '.preview.sable.css';\nconst FULL_SUFFIX = '.sable.css';\n\nexport function themeCatalogManifestUrlFromBase(catalogBaseUrl: string): string | null {\n  const trimmed = catalogBaseUrl.trim();\n  if (!trimmed) return null;\n  const base = trimmed.endsWith('/') ? trimmed : `${trimmed}/`;\n  try {\n    return new URL('catalog.json', base).href;\n  } catch {\n    return null;\n  }\n}\n\nfunction parseThemePairRows(themes: unknown[]): ThemePair[] {\n  return themes\n    .map((row) => {\n      if (!row || typeof row !== 'object') return null;\n      const { basename, previewUrl, fullUrl } = row as Record<string, unknown>;\n      if (\n        typeof basename !== 'string' ||\n        typeof previewUrl !== 'string' ||\n        typeof fullUrl !== 'string'\n      ) {\n        return null;\n      }\n      if (!basename || !previewUrl || !fullUrl) return null;\n      return { basename, previewUrl, fullUrl };\n    })\n    .filter((pair): pair is ThemePair => pair !== null);\n}\n\nfunction parseTweakRows(tweaks: unknown[]): TweakCatalogEntry[] {\n  return tweaks\n    .map((row) => {\n      if (!row || typeof row !== 'object') return null;\n      const { basename, fullUrl } = row as Record<string, unknown>;\n      if (typeof basename !== 'string' || typeof fullUrl !== 'string') return null;\n      if (!basename || !fullUrl) return null;\n      return { basename, fullUrl };\n    })\n    .filter((e): e is TweakCatalogEntry => e !== null);\n}\n\nasync function fetchCatalogBundleFromManifest(\n  manifestUrl: string\n): Promise<ThemeCatalogBundle | null> {\n  const res = await fetch(manifestUrl, { mode: 'cors' });\n  if (!res.ok) return null;\n  let data: unknown;\n  try {\n    data = await res.json();\n  } catch {\n    return null;\n  }\n  if (!data || typeof data !== 'object') return null;\n  const { themes, tweaks } = data as Record<string, unknown>;\n  if (!Array.isArray(themes)) return null;\n  const parsedThemes = parseThemePairRows(themes);\n  const parsedTweaks = Array.isArray(tweaks) ? parseTweakRows(tweaks) : [];\n  return { themes: parsedThemes, tweaks: parsedTweaks };\n}\n\n/** Path segments for GET /repos/.../contents/{path} */\nfunction directoryPathToApiSegment(directoryPath: string): string {\n  if (!directoryPath) return '';\n  return directoryPath\n    .split('/')\n    .filter(Boolean)\n    .map((seg) => encodeURIComponent(seg))\n    .join('/');\n}\n\nasync function fetchGithubContents(parts: GithubRawParts): Promise<GithubContentItem[]> {\n  const encoded = directoryPathToApiSegment(parts.directoryPath);\n  const pathSeg = encoded ? `/${encoded}` : '';\n  const apiUrl = `https://api.github.com/repos/${parts.owner}/${parts.repo}/contents${pathSeg}?ref=${encodeURIComponent(parts.ref)}`;\n  const res = await fetch(apiUrl, {\n    headers: { Accept: 'application/vnd.github+json' },\n  });\n  if (!res.ok) {\n    throw new Error(`theme catalog list failed: ${res.status}`);\n  }\n  const data = (await res.json()) as GithubContentItem | GithubContentItem[];\n  return Array.isArray(data) ? data : [data];\n}\n\nasync function listTweakEntriesFromGithub(parts: GithubRawParts): Promise<TweakCatalogEntry[]> {\n  const tweakDir = parts.directoryPath ? `${parts.directoryPath}/tweaks` : 'tweaks';\n  let items: GithubContentItem[];\n  try {\n    items = await fetchGithubContents({ ...parts, directoryPath: tweakDir });\n  } catch {\n    return [];\n  }\n  return items\n    .filter((i) => i.type === 'file' && i.name.endsWith(FULL_SUFFIX))\n    .map((i) => {\n      const basename = i.name.slice(0, -FULL_SUFFIX.length);\n      return {\n        basename,\n        fullUrl: i.download_url ?? rawFileUrl({ ...parts, directoryPath: tweakDir }, i.name),\n      };\n    })\n    .filter((e) => Boolean(e.fullUrl));\n}\n\nasync function listThemePairsFromGithub(parts: GithubRawParts): Promise<ThemePair[]> {\n  const themeDir = parts.directoryPath ? `${parts.directoryPath}/themes` : 'themes';\n  const dirParts: GithubRawParts = { ...parts, directoryPath: themeDir };\n  const items = await fetchGithubContents(dirParts);\n  const previewFiles = items.filter((i) => i.type === 'file' && i.name.endsWith(PREVIEW_SUFFIX));\n  return previewFiles\n    .map((p) => {\n      const basename = p.name.slice(0, -PREVIEW_SUFFIX.length);\n      const fullName = `${basename}${FULL_SUFFIX}`;\n      const full = items.find((i) => i.type === 'file' && i.name === fullName);\n      if (!full) return null;\n      const previewUrl = p.download_url ?? rawFileUrl(dirParts, p.name);\n      const fullUrl = full.download_url ?? rawFileUrl(dirParts, fullName);\n      if (!previewUrl || !fullUrl) return null;\n      return {\n        basename,\n        previewUrl,\n        fullUrl,\n      };\n    })\n    .filter((pair): pair is ThemePair => pair !== null);\n}\n\nexport async function fetchThemeCatalogBundle(\n  baseUrl: string,\n  options?: ListThemeCatalogOptions\n): Promise<ThemeCatalogBundle> {\n  const manifestUrl =\n    options?.manifestUrl?.trim() || themeCatalogManifestUrlFromBase(baseUrl) || undefined;\n  if (manifestUrl) {\n    const fromManifest = await fetchCatalogBundleFromManifest(manifestUrl);\n    if (fromManifest !== null) return fromManifest;\n  }\n\n  const parts = parseGithubRawBaseUrl(baseUrl);\n  if (!parts) return { themes: [], tweaks: [] };\n  const themes = await listThemePairsFromGithub(parts);\n  const tweaks = await listTweakEntriesFromGithub(parts);\n  return { themes, tweaks };\n}\n\nexport async function listThemePairsFromCatalog(\n  baseUrl: string,\n  options?: ListThemeCatalogOptions\n): Promise<ThemePair[]> {\n  const bundle = await fetchThemeCatalogBundle(baseUrl, options);\n  return bundle.themes;\n}\n","import type { ThemeRemoteTweakFavorite } from '$state/settings';\n\nimport { getCachedThemeCss, putCachedThemeCss } from './cache';\nimport { isLocalImportTweakUrl } from './localImportUrls';\n\n/**\n * Restores replicated local tweak CSS to the device-local cache. Cache failures\n * are deliberately ignored: settings sync must work without IndexedDB.\n */\nexport async function hydrateSyncedLocalTweakCss(\n  favorites: ThemeRemoteTweakFavorite[]\n): Promise<void> {\n  await Promise.all(\n    favorites.map(async ({ fullUrl, cssText }) => {\n      if (!isLocalImportTweakUrl(fullUrl) || typeof cssText !== 'string') return;\n      try {\n        await putCachedThemeCss(fullUrl, cssText);\n      } catch {\n        // IndexedDB may be unavailable (for example in private browsing).\n      }\n    })\n  );\n}\n\n/** CSS embedded in settings is only valid for local tweak imports. */\nexport function getEmbeddedLocalTweakCss(\n  favorite: ThemeRemoteTweakFavorite | undefined\n): string | undefined {\n  return favorite && isLocalImportTweakUrl(favorite.fullUrl) ? favorite.cssText : undefined;\n}\n\n/** Resolve saved tweak CSS from cache, with embedded local CSS as a cache-independent fallback. */\nexport async function resolveSavedTweakCss(favorite: ThemeRemoteTweakFavorite): Promise<string> {\n  const embeddedCss = getEmbeddedLocalTweakCss(favorite);\n  if (embeddedCss) {\n    void putCachedThemeCss(favorite.fullUrl, embeddedCss).catch(() => undefined);\n    return embeddedCss;\n  }\n  try {\n    const cachedCss = await getCachedThemeCss(favorite.fullUrl);\n    if (cachedCss) return cachedCss;\n  } catch {\n    // Embedded CSS remains usable when IndexedDB is unavailable.\n  }\n  return '';\n}\n\n/** Restores CSS for pre-sync local favorites from the device cache before upload. */\nexport async function backfillLocalTweakCss(\n  favorites: ThemeRemoteTweakFavorite[]\n): Promise<ThemeRemoteTweakFavorite[]> {\n  return Promise.all(\n    favorites.map(async (favorite) => {\n      if (!isLocalImportTweakUrl(favorite.fullUrl) || typeof favorite.cssText === 'string') {\n        return favorite;\n      }\n      try {\n        const cssText = await getCachedThemeCss(favorite.fullUrl);\n        return typeof cssText === 'string' ? { ...favorite, cssText } : favorite;\n      } catch {\n        return favorite;\n      }\n    })\n  );\n}\n","import { trimTrailingSlash } from '$utils/common';\n\nexport const DEFAULT_THEME_CATALOG_BASE =\n  'https://raw.githubusercontent.com/SableClient/themes/main';\n\nexport function themeCatalogListingBaseUrl(configBaseTrimmed?: string | null): string {\n  const base = trimTrailingSlash(\n    configBaseTrimmed && configBaseTrimmed.length > 0\n      ? configBaseTrimmed\n      : DEFAULT_THEME_CATALOG_BASE\n  );\n  return `${base}/`;\n}\n","import { revalidateCachedThemeCss, type ThemeCacheRevalidationResult } from './cache';\nimport { fetchThemeCatalogBundle } from './catalog';\n\nexport const THEME_CATALOG_AUTO_UPDATE_INTERVAL_MS = 6 * 60 * 60_000;\nconst lastCatalogChecks = new Map<string, number>();\n\nexport type CatalogUpdateSummary = {\n  checked: number;\n  updated: number;\n  unchanged: number;\n  skipped: number;\n  failed: number;\n  results: ThemeCacheRevalidationResult[];\n};\n\nexport type UpdateInstalledCatalogPackagesOptions = {\n  catalogBase: string;\n  manifestUrl?: string;\n  installedThemeUrls: string[];\n  installedTweakUrls: string[];\n  maxAgeMs?: number;\n};\n\nexport async function updateInstalledCatalogPackages({\n  catalogBase,\n  manifestUrl,\n  installedThemeUrls,\n  installedTweakUrls,\n  maxAgeMs = THEME_CATALOG_AUTO_UPDATE_INTERVAL_MS,\n}: UpdateInstalledCatalogPackagesOptions): Promise<CatalogUpdateSummary> {\n  const catalogCheckKey = `${catalogBase}\\n${manifestUrl ?? ''}`;\n  const previousCatalogCheck = lastCatalogChecks.get(catalogCheckKey) ?? 0;\n  if (maxAgeMs > 0 && Date.now() - previousCatalogCheck < maxAgeMs) {\n    return { checked: 0, updated: 0, unchanged: 0, skipped: 0, failed: 0, results: [] };\n  }\n  const bundle = await fetchThemeCatalogBundle(catalogBase, { manifestUrl });\n  const catalogThemeUrls = new Set(bundle.themes.map((theme) => theme.fullUrl));\n  lastCatalogChecks.set(catalogCheckKey, Date.now());\n  const catalogTweakUrls = new Set(bundle.tweaks.map((tweak) => tweak.fullUrl));\n\n  const installed = new Set([\n    ...installedThemeUrls.filter((url) => catalogThemeUrls.has(url)),\n    ...installedTweakUrls.filter((url) => catalogTweakUrls.has(url)),\n  ]);\n  const results = await Promise.all(\n    Array.from(installed, (url) => revalidateCachedThemeCss(url, maxAgeMs))\n  );\n\n  return {\n    checked: results.filter((result) => result.status !== 'skipped').length,\n    updated: results.filter((result) => result.status === 'updated').length,\n    unchanged: results.filter((result) => result.status === 'unchanged').length,\n    skipped: results.filter((result) => result.status === 'skipped').length,\n    failed: results.filter((result) => result.status === 'failed').length,\n    results,\n  };\n}\n","import { type ChangeEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTimeoutToggle } from '$hooks/useTimeoutToggle';\nimport { downloadTextFile } from '$utils/dom';\nimport { shareText } from '$utils/share';\nimport { fetch } from '$utils/fetch';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport {\n  Box,\n  Button,\n  Chip,\n  IconButton,\n  Input,\n  Scroll,\n  Spinner,\n  Switch,\n  Text,\n  config,\n  toRem,\n} from 'folds';\nimport { Check, Download, Link, menuIcon, Star } from '$components/icons/phosphor';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { ThemeKind } from '$hooks/useTheme';\nimport { useSetting } from '$state/hooks/settings';\nimport {\n  settingsAtom,\n  type Settings,\n  type ThemeRemoteFavorite,\n  type ThemeRemoteTweakFavorite,\n} from '$state/settings';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile, SettingToggle } from '$components/setting-tile';\nimport { ThemePreviewCard } from '$components/theme/ThemePreviewCard';\nimport { usePatchSettings } from './themeSettingsPatch';\nimport { ThemeImportModal } from './ThemeImportModal';\nimport { getCachedThemeCss, putCachedThemeCss } from '../../../theme/cache';\nimport {\n  fetchThemeCatalogBundle,\n  type ThemePair,\n  type TweakCatalogEntry,\n} from '../../../theme/catalog';\nimport {\n  isLocalImportBundledUrl,\n  isLocalImportThemeUrl,\n  isLocalImportTweakUrl,\n} from '../../../theme/localImportUrls';\nimport { resolveSavedTweakCss } from '../../../theme/syncedTweakCss';\nimport { isThirdPartyThemeUrl } from '../../../theme/themeApproval';\nimport { themeCatalogListingBaseUrl } from '../../../theme/catalogDefaults';\nimport {\n  extractFullThemeUrlFromPreview,\n  parseSableThemeMetadata,\n  parseSableTweakMetadata,\n  type SableThemeContrast,\n} from '../../../theme/metadata';\nimport { previewUrlFromFullThemeUrl } from '../../../theme/previewUrls';\nimport { updateInstalledCatalogPackages } from '../../../theme/catalogUpdater';\nimport {\n  pruneThemeFavorites,\n  pruneThemeTweakFavorites,\n  themeSourceLabel,\n  themeUrlHostLabel,\n} from '../../../theme/themeLibrary';\nimport { CssViewerButton } from '$components/theme/CssViewerButton';\nimport * as css from './ThemeCatalogSettings.css';\n\ntype CatalogPreviewRow = ThemePair & {\n  previewText: string;\n  displayName: string;\n  author?: string;\n  kind: ThemeKind;\n  contrast: SableThemeContrast;\n  tags: string[];\n  fullInstallUrl: string;\n};\n\ntype LocalPreviewRow = ThemeRemoteFavorite & {\n  previewUrl: string;\n  previewText: string;\n  fullCssText: string;\n  displayName: string;\n  author?: string;\n  contrast: SableThemeContrast;\n  tags: string[];\n  importedLocal?: boolean;\n};\n\ntype CatalogTweakRow = TweakCatalogEntry & {\n  fullCssText: string;\n  displayName: string;\n  description?: string;\n  author?: string;\n  tags: string[];\n};\n\ntype LocalTweakRow = ThemeRemoteTweakFavorite & {\n  fullCssText: string;\n  description?: string;\n  author?: string;\n  tags: string[];\n};\n\ntype ThemeCatalogSettingsMode = 'local' | 'appearance';\n\ntype ThemeCatalogSettingsProps = {\n  mode: ThemeCatalogSettingsMode;\n  onBrowseOpenChange?: (open: boolean) => void;\n};\n\ntype CatalogTweakCardProps = {\n  displayName: string;\n  description: string;\n  copyUrl?: string;\n  thirdPartyChip: boolean;\n  isFavorited: boolean;\n  onToggleFavorite: () => void | Promise<void>;\n  isOn: boolean;\n  onSetApplied: (v: boolean) => void;\n  onExport?: () => void;\n  cssText: string;\n  sourceLabel: string;\n};\n\nfunction CatalogTweakCard({\n  displayName,\n  description,\n  copyUrl,\n  thirdPartyChip,\n  isFavorited,\n  onToggleFavorite,\n  isOn,\n  onSetApplied,\n  onExport,\n  cssText,\n  sourceLabel,\n}: CatalogTweakCardProps) {\n  const [copied, setCopied] = useTimeoutToggle();\n  const handleCopy = useCallback(async () => {\n    if (!copyUrl) return;\n    if (await shareText(copyUrl)) setCopied();\n  }, [copyUrl, setCopied]);\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"200\"\n      style={{\n        padding: toRem(12),\n        borderRadius: config.radii.R300,\n        border: `${toRem(1)} solid var(--sable-surface-container-line)`,\n        background: 'var(--sable-surface-container)',\n      }}\n    >\n      <Box direction=\"Row\" alignItems=\"Start\" justifyContent=\"SpaceBetween\" gap=\"200\">\n        <Box direction=\"Column\" gap=\"100\" grow=\"Yes\" style={{ minWidth: 0 }}>\n          <Box direction=\"Row\" justifyContent=\"SpaceBetween\" alignContent=\"Center\">\n            <Text size=\"H6\">{displayName}</Text>\n            <Box direction=\"Row\" gap=\"100\" alignItems=\"Center\" shrink=\"No\">\n              <CssViewerButton\n                title={`${displayName} — CSS`}\n                cssText={cssText}\n                ariaLabel=\"View tweak CSS\"\n              />\n              {copyUrl && (\n                <IconButton\n                  size=\"300\"\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  radii=\"300\"\n                  aria-label={copied ? 'Copied tweak link' : 'Copy tweak link'}\n                  onClick={() => {\n                    handleCopy().catch(() => undefined);\n                  }}\n                >\n                  {menuIcon(copied ? Check : Link)}\n                </IconButton>\n              )}\n              {onExport && (\n                <IconButton\n                  size=\"300\"\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  radii=\"300\"\n                  aria-label=\"Export tweak CSS\"\n                  onClick={() => {\n                    onExport();\n                  }}\n                >\n                  {menuIcon(Download)}\n                </IconButton>\n              )}\n              <IconButton\n                size=\"300\"\n                variant={isFavorited ? 'Primary' : 'Secondary'}\n                fill=\"Soft\"\n                outlined\n                radii=\"300\"\n                aria-label={isFavorited ? 'Remove tweak from saved' : 'Save tweak'}\n                onClick={() => {\n                  Promise.resolve(onToggleFavorite()).catch(() => undefined);\n                }}\n              >\n                {menuIcon(Star, { weight: isFavorited ? 'fill' : 'regular' })}\n              </IconButton>\n              <Switch variant=\"Primary\" value={isOn} onChange={onSetApplied} />\n            </Box>\n          </Box>\n          <Text size=\"T200\" priority=\"300\" style={{ wordBreak: 'break-word' }}>\n            {description}\n          </Text>\n          <Text size=\"T200\" priority=\"300\">\n            Source: {sourceLabel}\n          </Text>\n        </Box>\n        <Box direction=\"Column\" gap=\"100\" alignItems=\"End\" shrink=\"No\">\n          {thirdPartyChip && (\n            <Chip variant=\"Critical\" outlined radii=\"Pill\">\n              <Text size=\"B300\">Third-party URL</Text>\n            </Chip>\n          )}\n        </Box>\n      </Box>\n    </Box>\n  );\n}\n\nexport function ThemeCatalogSettings({ mode, onBrowseOpenChange }: ThemeCatalogSettingsProps) {\n  const clientConfig = useClientConfig();\n  const patchSettings = usePatchSettings();\n  const queryClient = useQueryClient();\n  const configBase = clientConfig.themeCatalogBaseUrl?.trim();\n  const catalogBase = themeCatalogListingBaseUrl(configBase);\n  const catalogManifestUrl = clientConfig.themeCatalogManifestUrl?.trim() || undefined;\n\n  const isAppearanceMode = mode === 'appearance';\n  const [browseOpen, setBrowseOpen] = useState(false);\n  const [importModalOpen, setImportModalOpen] = useState(false);\n\n  const appearanceCatalogBrowseWasOpenRef = useRef(false);\n  const tweakFavoritesSnapshotAtAppearanceCatalogOpenRef = useRef<Set<string>>(new Set());\n\n  useEffect(() => {\n    if (isAppearanceMode) {\n      onBrowseOpenChange?.(browseOpen);\n    }\n  }, [browseOpen, isAppearanceMode, onBrowseOpenChange]);\n\n  const isRemoteMode = isAppearanceMode && browseOpen;\n  const isChatMode = isAppearanceMode && !browseOpen;\n  const showAssignmentChrome = mode === 'local' || (isAppearanceMode && !browseOpen);\n  const showSavedLibrary = !(isAppearanceMode && browseOpen);\n\n  const [getFavorites] = useSetting(settingsAtom, 'themeRemoteFavorites');\n  const [favorites, setFavorites] = useState(getFavorites ? getFavorites : []);\n  const [tweakFavorites] = useSetting(settingsAtom, 'themeRemoteTweakFavorites');\n  const [enabledTweakFullUrls] = useSetting(settingsAtom, 'themeRemoteEnabledTweakFullUrls');\n  const [systemTheme, setSystemTheme] = useSetting(settingsAtom, 'useSystemTheme');\n  const [manualRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteManualFullUrl');\n  const [lightRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteLightFullUrl');\n  const [darkRemoteFullUrl] = useSetting(settingsAtom, 'themeRemoteDarkFullUrl');\n  const [sableChatWidgets, setSableChatWidgets] = useSetting(\n    settingsAtom,\n    'themeChatSableWidgetsEnabled'\n  );\n  const [autoPreviewApprovedUrls, setAutoPreviewApprovedUrls] = useSetting(\n    settingsAtom,\n    'themeChatAutoPreviewApprovedUrls'\n  );\n  const [autoPreviewAnyUrl, setAutoPreviewAnyUrl] = useSetting(\n    settingsAtom,\n    'themeChatAutoPreviewAnyUrl'\n  );\n\n  useEffect(() => {\n    if (!isAppearanceMode) {\n      appearanceCatalogBrowseWasOpenRef.current = false;\n      return;\n    }\n    if (browseOpen && !appearanceCatalogBrowseWasOpenRef.current) {\n      tweakFavoritesSnapshotAtAppearanceCatalogOpenRef.current = new Set(\n        tweakFavorites.map((f) => f.fullUrl.trim()).filter(Boolean)\n      );\n    }\n    appearanceCatalogBrowseWasOpenRef.current = browseOpen;\n  }, [browseOpen, isAppearanceMode, tweakFavorites]);\n\n  const [themeSearch, setThemeSearch] = useState('');\n  const [tweakSearch, setTweakSearch] = useState('');\n  const [savedSection, setSavedSection] = useState<'themes' | 'tweaks'>('themes');\n  const [catalogSection, setCatalogSection] = useState<'themes' | 'tweaks'>('themes');\n  const [kindFilter, setKindFilter] = useState<'all' | 'light' | 'dark'>('all');\n  const [contrastFilter, setContrastFilter] = useState<'all' | SableThemeContrast>('all');\n  const [tweakApplyFilter, setTweakApplyFilter] = useState<'all' | 'enabled' | 'disabled'>('all');\n  const [catalogUpdateStatus, setCatalogUpdateStatus] = useState<\n    'idle' | 'checking' | 'updated' | 'unchanged' | 'failed'\n  >('idle');\n  const [catalogUpdateMessage, setCatalogUpdateMessage] = useState(\n    'Automatically checks installed catalog themes and tweaks for CSS changes.'\n  );\n  useEffect(() => setFavorites(getFavorites ? getFavorites : []), [getFavorites]);\n\n  const onThemeSearchChange: ChangeEventHandler<HTMLInputElement> = (e) =>\n    setThemeSearch(e.target.value);\n  const onTweakSearchChange: ChangeEventHandler<HTMLInputElement> = (e) =>\n    setTweakSearch(e.target.value);\n\n  const activeUrls = useMemo(\n    () =>\n      [manualRemoteFullUrl, lightRemoteFullUrl, darkRemoteFullUrl].filter((u): u is string =>\n        Boolean(u && u.trim().length > 0)\n      ),\n    [darkRemoteFullUrl, lightRemoteFullUrl, manualRemoteFullUrl]\n  );\n\n  const checkInstalledCatalogUpdates = useCallback(async () => {\n    if (catalogUpdateStatus === 'checking') return;\n    setCatalogUpdateStatus('checking');\n    setCatalogUpdateMessage('Checking installed catalog themes and tweaks…');\n    try {\n      const summary = await updateInstalledCatalogPackages({\n        catalogBase,\n        manifestUrl: catalogManifestUrl,\n        installedThemeUrls: Array.from(\n          new Set([...favorites.map((favorite) => favorite.fullUrl), ...activeUrls])\n        ),\n        installedTweakUrls: Array.from(\n          new Set([...tweakFavorites.map((favorite) => favorite.fullUrl), ...enabledTweakFullUrls])\n        ),\n        maxAgeMs: 0,\n      });\n      if (summary.updated > 0) {\n        setCatalogUpdateStatus('updated');\n        setCatalogUpdateMessage(\n          `Updated ${summary.updated} catalog ${summary.updated === 1 ? 'package' : 'packages'}.`\n        );\n      } else if (summary.failed > 0) {\n        setCatalogUpdateStatus('failed');\n        setCatalogUpdateMessage(\n          `Could not check ${summary.failed} ${summary.failed === 1 ? 'package' : 'packages'}. Cached CSS is still active.`\n        );\n      } else {\n        setCatalogUpdateStatus('unchanged');\n        setCatalogUpdateMessage(\n          summary.checked === 0\n            ? 'No installed themes or tweaks belong to the current catalog.'\n            : 'Installed catalog themes and tweaks are up to date.'\n        );\n      }\n      await Promise.all([\n        queryClient.invalidateQueries({ queryKey: ['theme-local-previews'] }),\n        queryClient.invalidateQueries({ queryKey: ['theme-local-tweaks'] }),\n      ]);\n    } catch {\n      setCatalogUpdateStatus('failed');\n      setCatalogUpdateMessage('Could not check the catalog. Cached CSS is still active.');\n    }\n  }, [\n    activeUrls,\n    catalogBase,\n    catalogManifestUrl,\n    catalogUpdateStatus,\n    enabledTweakFullUrls,\n    favorites,\n    queryClient,\n    tweakFavorites,\n  ]);\n\n  const clearAssignmentsIfMatch = useCallback(\n    (fullUrl: string) => {\n      const partial: Partial<Settings> = {};\n      if (lightRemoteFullUrl === fullUrl) {\n        partial.themeRemoteLightFullUrl = undefined;\n        partial.themeRemoteLightKind = undefined;\n      }\n      if (darkRemoteFullUrl === fullUrl) {\n        partial.themeRemoteDarkFullUrl = undefined;\n        partial.themeRemoteDarkKind = undefined;\n      }\n      if (manualRemoteFullUrl === fullUrl) {\n        partial.themeRemoteManualFullUrl = undefined;\n        partial.themeRemoteManualKind = undefined;\n      }\n      return partial;\n    },\n    [darkRemoteFullUrl, lightRemoteFullUrl, manualRemoteFullUrl]\n  );\n\n  const catalogQuery = useQuery({\n    queryKey: ['theme-catalog-bundle', catalogBase, catalogManifestUrl ?? ''],\n    queryFn: () => fetchThemeCatalogBundle(catalogBase, { manifestUrl: catalogManifestUrl }),\n    enabled: isRemoteMode,\n    staleTime: 5 * 60_000,\n  });\n\n  const previewsQuery = useQuery({\n    queryKey: [\n      'theme-catalog-previews',\n      catalogBase,\n      catalogQuery.data?.themes?.map((p) => p.previewUrl).join('|') ?? '',\n    ],\n    queryFn: async (): Promise<CatalogPreviewRow[]> => {\n      const pairs = catalogQuery.data?.themes ?? [];\n      const rows = await Promise.all(\n        pairs.map(async (pair) => {\n          const res = await fetch(pair.previewUrl, { mode: 'cors' });\n          let previewText = res.ok ? await res.text() : '';\n          if (!previewText) {\n            try {\n              const fullResponse = await fetch(pair.fullUrl, { mode: 'cors' });\n              if (fullResponse.ok) previewText = await fullResponse.text();\n            } catch {\n              // Keep the catalog row visible even when neither CSS file is currently reachable.\n            }\n          }\n          const meta = parseSableThemeMetadata(previewText);\n          const fullFromMeta = extractFullThemeUrlFromPreview(previewText);\n          const fullInstallUrl =\n            fullFromMeta && /^https:\\/\\//i.test(fullFromMeta) ? fullFromMeta : pair.fullUrl;\n          const kind = meta.kind ?? ThemeKind.Light;\n          const contrast: SableThemeContrast = meta.contrast === 'high' ? 'high' : 'low';\n          return {\n            ...pair,\n            previewText,\n            displayName: meta.name?.trim() || pair.basename,\n            author: meta.author?.trim() || undefined,\n            kind,\n            contrast,\n            tags: meta.tags ?? [],\n            fullInstallUrl,\n          };\n        })\n      );\n      return rows;\n    },\n    enabled: isRemoteMode && Boolean(catalogQuery.data?.themes?.length),\n    staleTime: 10 * 60_000,\n  });\n\n  const tweakDetailsQuery = useQuery({\n    queryKey: [\n      'theme-catalog-tweak-details',\n      catalogBase,\n      catalogQuery.data?.tweaks?.map((t) => t.fullUrl).join('|') ?? '',\n    ],\n    queryFn: async (): Promise<CatalogTweakRow[]> => {\n      const tweaks = catalogQuery.data?.tweaks ?? [];\n      const rows = await Promise.all(\n        tweaks.map(async (entry) => {\n          try {\n            let text: string;\n            if (isLocalImportBundledUrl(entry.fullUrl)) {\n              text = (await getCachedThemeCss(entry.fullUrl)) ?? '';\n            } else {\n              const res = await fetch(entry.fullUrl, { mode: 'cors' });\n              text = res.ok ? await res.text() : '';\n            }\n            const meta = parseSableTweakMetadata(text);\n            return {\n              ...entry,\n              fullCssText: text,\n              displayName: meta.name?.trim() || entry.basename,\n              description: meta.description?.trim() || undefined,\n              author: meta.author?.trim() || undefined,\n              tags: meta.tags ?? [],\n            };\n          } catch {\n            return {\n              ...entry,\n              fullCssText: '',\n              displayName: entry.basename,\n              tags: [],\n            };\n          }\n        })\n      );\n      return rows;\n    },\n    enabled: isRemoteMode && Boolean(catalogQuery.data?.tweaks?.length),\n    staleTime: 10 * 60_000,\n  });\n\n  const filteredTweakRows = useMemo(() => {\n    const rows = tweakDetailsQuery.data ?? [];\n    const q = tweakSearch.trim().toLowerCase();\n    if (!q) return rows;\n    return rows.filter((row) => {\n      const hay =\n        `${row.displayName} ${row.basename} ${row.description ?? ''} ${row.tags.join(' ')}`.toLowerCase();\n      return hay.includes(q);\n    });\n  }, [tweakDetailsQuery.data, tweakSearch]);\n\n  const catalogTweaksAfterApplyFilter = useMemo(() => {\n    if (tweakApplyFilter === 'all') return filteredTweakRows;\n    if (tweakApplyFilter === 'enabled') {\n      return filteredTweakRows.filter((r) => enabledTweakFullUrls.includes(r.fullUrl));\n    }\n    return filteredTweakRows.filter((r) => !enabledTweakFullUrls.includes(r.fullUrl));\n  }, [filteredTweakRows, enabledTweakFullUrls, tweakApplyFilter]);\n\n  const filteredRows = useMemo(() => {\n    const rows = previewsQuery.data ?? [];\n    const q = themeSearch.trim().toLowerCase();\n    return rows.filter((row) => {\n      if (kindFilter !== 'all') {\n        const want = kindFilter === 'dark' ? ThemeKind.Dark : ThemeKind.Light;\n        if (row.kind !== want) return false;\n      }\n      if (contrastFilter !== 'all' && row.contrast !== contrastFilter) return false;\n      if (q) {\n        const hay = `${row.displayName} ${row.basename} ${row.tags.join(' ')}`.toLowerCase();\n        if (!hay.includes(q)) return false;\n      }\n      return true;\n    });\n  }, [previewsQuery.data, themeSearch, kindFilter, contrastFilter]);\n\n  const localPreviewsQuery = useQuery({\n    queryKey: ['theme-local-previews', favorites.map((f) => f.fullUrl).join('|')],\n    enabled: showSavedLibrary && favorites.length > 0,\n    staleTime: 10 * 60_000,\n    queryFn: async (): Promise<LocalPreviewRow[]> => {\n      const rows = await Promise.all(\n        favorites.map(async (fav) => {\n          const previewUrl = previewUrlFromFullThemeUrl(fav.fullUrl) ?? fav.fullUrl;\n\n          try {\n            let fullCssText = (await getCachedThemeCss(fav.fullUrl)) ?? '';\n            if (!isLocalImportBundledUrl(fav.fullUrl)) {\n              try {\n                const fullRes = await fetch(fav.fullUrl, { mode: 'cors' });\n                if (fullRes.ok) fullCssText = await fullRes.text();\n              } catch {\n                // Cached full CSS keeps saved themes usable while offline.\n              }\n            }\n\n            let previewText = '';\n            if (previewUrl === fav.fullUrl) {\n              previewText = fullCssText;\n            } else if (isLocalImportThemeUrl(previewUrl)) {\n              previewText = (await getCachedThemeCss(previewUrl)) ?? fullCssText;\n            } else {\n              try {\n                const previewRes = await fetch(previewUrl, { mode: 'cors' });\n                previewText = previewRes.ok ? await previewRes.text() : fullCssText;\n              } catch {\n                previewText = fullCssText;\n              }\n            }\n            if (!previewText && !fullCssText) return undefined;\n            const metadataCss = previewText || fullCssText;\n            const meta = parseSableThemeMetadata(metadataCss);\n            const displayName = meta.name?.trim() || fav.displayName || fav.basename;\n            const contrast: SableThemeContrast = meta.contrast === 'high' ? 'high' : 'low';\n            const authorTrim = meta.author?.trim();\n            const row: LocalPreviewRow = {\n              ...fav,\n              previewUrl,\n              previewText,\n              fullCssText,\n              displayName,\n              contrast,\n              tags: meta.tags ?? [],\n              importedLocal: fav.importedLocal,\n              ...(authorTrim ? { author: authorTrim } : {}),\n            };\n            return row;\n          } catch {\n            return undefined;\n          }\n        })\n      );\n\n      return rows.filter((r): r is LocalPreviewRow => Boolean(r));\n    },\n  });\n\n  const localTweaksQuery = useQuery({\n    queryKey: [\n      'theme-local-tweaks',\n      tweakFavorites.map((f) => `${f.fullUrl}:${f.cssText ?? ''}`).join('|'),\n    ],\n    enabled: showSavedLibrary && tweakFavorites.length > 0,\n    staleTime: 10 * 60_000,\n    queryFn: async (): Promise<LocalTweakRow[]> => {\n      const rows = await Promise.all(\n        tweakFavorites.map(async (fav) => {\n          try {\n            let text = await resolveSavedTweakCss(fav);\n            if (!isLocalImportBundledUrl(fav.fullUrl)) {\n              try {\n                const res = await fetch(fav.fullUrl, { mode: 'cors' });\n                if (res.ok) text = await res.text();\n              } catch {\n                // Cached tweak CSS keeps the saved library available while offline.\n              }\n            }\n            if (!text) return undefined;\n            const meta = parseSableTweakMetadata(text);\n            const authorTrim = meta.author?.trim();\n            const row: LocalTweakRow = {\n              ...fav,\n              fullCssText: text,\n              displayName: meta.name?.trim() || fav.displayName || fav.basename,\n              description: meta.description?.trim() || undefined,\n              tags: meta.tags ?? [],\n              importedLocal: fav.importedLocal,\n              ...(authorTrim ? { author: authorTrim } : {}),\n            };\n            return row;\n          } catch {\n            return undefined;\n          }\n        })\n      );\n      return rows.filter((r): r is LocalTweakRow => Boolean(r));\n    },\n  });\n  const resolvedTweakUrls = new Set(\n    localTweaksQuery.isSuccess ? localTweaksQuery.data.map((row) => row.fullUrl) : []\n  );\n  const provisionalTweakCount = tweakFavorites.filter(\n    (favorite) => !isLocalImportTweakUrl(favorite.fullUrl) || Boolean(favorite.cssText)\n  ).length;\n  const savedTweakCount = localTweaksQuery.isSuccess\n    ? resolvedTweakUrls.size\n    : provisionalTweakCount;\n  const unresolvedLegacyTweakCount = localTweaksQuery.isSuccess\n    ? tweakFavorites.filter(\n        (favorite) =>\n          isLocalImportTweakUrl(favorite.fullUrl) &&\n          !favorite.cssText &&\n          !resolvedTweakUrls.has(favorite.fullUrl)\n      ).length\n    : 0;\n\n  const removeFavorite = useCallback(\n    (fullUrl: string) => {\n      const nextFavorites = favorites.filter((f) => f.fullUrl !== fullUrl);\n      const cleared = clearAssignmentsIfMatch(fullUrl);\n      const nextActive = [manualRemoteFullUrl, lightRemoteFullUrl, darkRemoteFullUrl]\n        .filter((u): u is string => Boolean(u && u.trim().length > 0))\n        .filter((u) => u !== fullUrl);\n      patchSettings({\n        ...cleared,\n        themeRemoteFavorites: pruneThemeFavorites(nextFavorites, nextActive),\n      });\n    },\n    [\n      clearAssignmentsIfMatch,\n      darkRemoteFullUrl,\n      favorites,\n      lightRemoteFullUrl,\n      manualRemoteFullUrl,\n      patchSettings,\n    ]\n  );\n\n  const applyFavoriteToLight = useCallback(\n    (row: LocalPreviewRow) => {\n      patchSettings({\n        themeRemoteLightFullUrl: row.fullUrl,\n        themeRemoteLightKind: row.kind,\n      });\n    },\n    [patchSettings]\n  );\n\n  const applyFavoriteToDark = useCallback(\n    (row: LocalPreviewRow) => {\n      patchSettings({\n        themeRemoteDarkFullUrl: row.fullUrl,\n        themeRemoteDarkKind: row.kind,\n      });\n    },\n    [patchSettings]\n  );\n\n  const applyFavoriteToManual = useCallback(\n    (row: LocalPreviewRow) => {\n      patchSettings({\n        themeRemoteManualFullUrl: row.fullUrl,\n        themeRemoteManualKind: row.kind,\n      });\n    },\n    [patchSettings]\n  );\n\n  const useBuiltinForLightSlot = useCallback(\n    () =>\n      patchSettings({\n        themeRemoteLightFullUrl: undefined,\n        themeRemoteLightKind: undefined,\n      }),\n    [patchSettings]\n  );\n\n  const useBuiltinForDarkSlot = useCallback(\n    () =>\n      patchSettings({\n        themeRemoteDarkFullUrl: undefined,\n        themeRemoteDarkKind: undefined,\n      }),\n    [patchSettings]\n  );\n\n  const useBuiltinForManualLight = useCallback(\n    () =>\n      patchSettings({\n        themeRemoteManualFullUrl: undefined,\n        themeRemoteManualKind: undefined,\n        themeId: 'light-theme',\n      }),\n    [patchSettings]\n  );\n\n  const useBuiltinForManualDark = useCallback(\n    () =>\n      patchSettings({\n        themeRemoteManualFullUrl: undefined,\n        themeRemoteManualKind: undefined,\n        themeId: 'dark-theme',\n      }),\n    [patchSettings]\n  );\n\n  const prefetchFull = useCallback(async (url: string): Promise<boolean> => {\n    try {\n      if (isLocalImportBundledUrl(url)) {\n        const cached = await getCachedThemeCss(url);\n        return Boolean(cached);\n      }\n      const res = await fetch(url, { mode: 'cors' });\n      if (!res.ok) return false;\n      const text = await res.text();\n      await putCachedThemeCss(url, text);\n      return true;\n    } catch {\n      return false;\n    }\n  }, []);\n\n  const loadFullCssText = useCallback(async (url: string): Promise<string> => {\n    const cached = await getCachedThemeCss(url);\n    if (cached) return cached;\n    if (isLocalImportBundledUrl(url)) throw new Error('Theme CSS is not cached.');\n    const response = await fetch(url, { mode: 'cors' });\n    if (!response.ok) throw new Error(`Theme CSS fetch failed: ${response.status}`);\n    const text = await response.text();\n    await putCachedThemeCss(url, text);\n    return text;\n  }, []);\n\n  const toggleFavorite = useCallback(\n    async (row: CatalogPreviewRow) => {\n      const existing = favorites.find((f: ThemeRemoteFavorite) => f.fullUrl === row.fullInstallUrl);\n      if (existing) {\n        const nextFavorites = favorites.filter((f) => f.fullUrl !== row.fullInstallUrl);\n        const cleared = clearAssignmentsIfMatch(row.fullInstallUrl);\n        const nextActive = activeUrls.filter((u) => u !== row.fullInstallUrl);\n        patchSettings({\n          ...cleared,\n          themeRemoteFavorites: pruneThemeFavorites(nextFavorites, nextActive),\n        });\n        return;\n      }\n      const ok = await prefetchFull(row.fullInstallUrl);\n      if (!ok) return;\n      const kind: 'light' | 'dark' = row.kind === ThemeKind.Dark ? 'dark' : 'light';\n      const next: ThemeRemoteFavorite = {\n        fullUrl: row.fullInstallUrl,\n        displayName: row.displayName,\n        basename: row.basename,\n        kind,\n        pinned: true,\n      };\n      patchSettings({\n        themeRemoteFavorites: [...favorites, next],\n      });\n    },\n    [activeUrls, clearAssignmentsIfMatch, favorites, patchSettings, prefetchFull]\n  );\n\n  const installFromCatalogLight = useCallback(\n    async (row: CatalogPreviewRow) => {\n      const kind: 'light' | 'dark' = row.kind === ThemeKind.Dark ? 'dark' : 'light';\n      const nextActive = Array.from(\n        new Set(\n          [manualRemoteFullUrl, darkRemoteFullUrl, row.fullInstallUrl].filter(Boolean) as string[]\n        )\n      );\n\n      let nextFavorites = favorites;\n      const existing = favorites.find((f) => f.fullUrl === row.fullInstallUrl);\n      if (!existing) {\n        const ok = await prefetchFull(row.fullInstallUrl);\n        if (!ok) return;\n        nextFavorites = [\n          ...favorites,\n          {\n            fullUrl: row.fullInstallUrl,\n            displayName: row.displayName,\n            basename: row.basename,\n            kind,\n            pinned: false,\n          },\n        ];\n      }\n\n      patchSettings({\n        themeRemoteLightFullUrl: row.fullInstallUrl,\n        themeRemoteLightKind: kind,\n        themeRemoteFavorites: pruneThemeFavorites(nextFavorites, nextActive),\n      });\n    },\n    [darkRemoteFullUrl, favorites, manualRemoteFullUrl, patchSettings, prefetchFull]\n  );\n\n  const installFromCatalogDark = useCallback(\n    async (row: CatalogPreviewRow) => {\n      const kind: 'light' | 'dark' = row.kind === ThemeKind.Dark ? 'dark' : 'light';\n      const nextActive = Array.from(\n        new Set(\n          [manualRemoteFullUrl, lightRemoteFullUrl, row.fullInstallUrl].filter(Boolean) as string[]\n        )\n      );\n\n      let nextFavorites = favorites;\n      const existing = favorites.find((f) => f.fullUrl === row.fullInstallUrl);\n      if (!existing) {\n        const ok = await prefetchFull(row.fullInstallUrl);\n        if (!ok) return;\n        nextFavorites = [\n          ...favorites,\n          {\n            fullUrl: row.fullInstallUrl,\n            displayName: row.displayName,\n            basename: row.basename,\n            kind,\n            pinned: false,\n          },\n        ];\n      }\n\n      patchSettings({\n        themeRemoteDarkFullUrl: row.fullInstallUrl,\n        themeRemoteDarkKind: kind,\n        themeRemoteFavorites: pruneThemeFavorites(nextFavorites, nextActive),\n      });\n    },\n    [favorites, lightRemoteFullUrl, manualRemoteFullUrl, patchSettings, prefetchFull]\n  );\n\n  const installFromCatalogManual = useCallback(\n    async (row: CatalogPreviewRow) => {\n      const kind: 'light' | 'dark' = row.kind === ThemeKind.Dark ? 'dark' : 'light';\n      const nextActive = Array.from(\n        new Set(\n          [lightRemoteFullUrl, darkRemoteFullUrl, row.fullInstallUrl].filter(Boolean) as string[]\n        )\n      );\n\n      let nextFavorites = favorites;\n      const existing = favorites.find((f) => f.fullUrl === row.fullInstallUrl);\n      if (!existing) {\n        const ok = await prefetchFull(row.fullInstallUrl);\n        if (!ok) return;\n        nextFavorites = [\n          ...favorites,\n          {\n            fullUrl: row.fullInstallUrl,\n            displayName: row.displayName,\n            basename: row.basename,\n            kind,\n            pinned: false,\n          },\n        ];\n      }\n\n      patchSettings({\n        themeRemoteManualFullUrl: row.fullInstallUrl,\n        themeRemoteManualKind: kind,\n        themeRemoteFavorites: pruneThemeFavorites(nextFavorites, nextActive),\n      });\n    },\n    [darkRemoteFullUrl, favorites, lightRemoteFullUrl, patchSettings, prefetchFull]\n  );\n\n  const clearRemote = useCallback(() => {\n    patchSettings({\n      themeRemoteManualFullUrl: undefined,\n      themeRemoteManualKind: undefined,\n      themeRemoteLightFullUrl: undefined,\n      themeRemoteLightKind: undefined,\n      themeRemoteDarkFullUrl: undefined,\n      themeRemoteDarkKind: undefined,\n    });\n  }, [patchSettings]);\n\n  const setTweakApplied = useCallback(\n    async (\n      fullUrl: string,\n      apply: boolean,\n      hint?: {\n        displayName?: string;\n        basename?: string;\n        pruneUnpinnedFavoriteOnDisable?: boolean;\n      }\n    ) => {\n      const trimmed = fullUrl.trim();\n      if (!trimmed) return;\n\n      if (apply) {\n        const ok = await prefetchFull(trimmed);\n        if (!ok) return;\n        const nextEnabled = enabledTweakFullUrls.includes(trimmed)\n          ? [...enabledTweakFullUrls]\n          : [...enabledTweakFullUrls, trimmed];\n        const nextFavs = [...tweakFavorites];\n        if (!nextFavs.some((f) => f.fullUrl === trimmed)) {\n          const cached = (await getCachedThemeCss(trimmed)) ?? '';\n          const meta = parseSableTweakMetadata(cached);\n          const base =\n            trimmed\n              .replace(/\\.sable\\.css(\\?.*)?$/i, '')\n              .split('/')\n              .pop() ?? 'tweak';\n          nextFavs.push({\n            fullUrl: trimmed,\n            displayName: hint?.displayName ?? meta.name?.trim() ?? base,\n            basename: hint?.basename ?? meta.id?.trim() ?? base,\n            pinned: false,\n          });\n        }\n        patchSettings({\n          themeRemoteEnabledTweakFullUrls: nextEnabled,\n          themeRemoteTweakFavorites: pruneThemeTweakFavorites(nextFavs, nextEnabled),\n        });\n      } else {\n        const nextEnabled = enabledTweakFullUrls.filter((u) => u !== trimmed);\n        if (hint?.pruneUnpinnedFavoriteOnDisable) {\n          const enabledSet = new Set(nextEnabled);\n          const inLibraryBeforeThisCatalogVisit =\n            tweakFavoritesSnapshotAtAppearanceCatalogOpenRef.current;\n          const nextTweakFavs = tweakFavorites.filter(\n            (f) =>\n              f.pinned === true ||\n              enabledSet.has(f.fullUrl) ||\n              inLibraryBeforeThisCatalogVisit.has(f.fullUrl.trim())\n          );\n          patchSettings({\n            themeRemoteEnabledTweakFullUrls: nextEnabled,\n            themeRemoteTweakFavorites: nextTweakFavs,\n          });\n        } else {\n          patchSettings({\n            themeRemoteEnabledTweakFullUrls: nextEnabled,\n          });\n        }\n      }\n    },\n    [enabledTweakFullUrls, patchSettings, prefetchFull, tweakFavorites]\n  );\n\n  const toggleCatalogTweakFavorite = useCallback(\n    async (row: CatalogTweakRow) => {\n      const existing = tweakFavorites.find((f) => f.fullUrl === row.fullUrl);\n      if (existing) {\n        const nextFavs = tweakFavorites.filter((f) => f.fullUrl !== row.fullUrl);\n        const nextEnabled = enabledTweakFullUrls.filter((u) => u !== row.fullUrl);\n        patchSettings({\n          themeRemoteTweakFavorites: pruneThemeTweakFavorites(nextFavs, nextEnabled),\n          themeRemoteEnabledTweakFullUrls: nextEnabled,\n        });\n        return;\n      }\n      const ok = await prefetchFull(row.fullUrl);\n      if (!ok) return;\n      const next: ThemeRemoteTweakFavorite = {\n        fullUrl: row.fullUrl,\n        displayName: row.displayName,\n        basename: row.basename,\n        pinned: true,\n      };\n      patchSettings({\n        themeRemoteTweakFavorites: pruneThemeTweakFavorites(\n          [...tweakFavorites, next],\n          enabledTweakFullUrls\n        ),\n      });\n    },\n    [enabledTweakFullUrls, patchSettings, prefetchFull, tweakFavorites]\n  );\n\n  const removeTweakFavorite = useCallback(\n    (fullUrl: string) => {\n      const nextFavs = tweakFavorites.filter((f) => f.fullUrl !== fullUrl);\n      const nextEnabled = enabledTweakFullUrls.filter((u) => u !== fullUrl);\n      patchSettings({\n        themeRemoteTweakFavorites: pruneThemeTweakFavorites(nextFavs, nextEnabled),\n        themeRemoteEnabledTweakFullUrls: nextEnabled,\n      });\n    },\n    [enabledTweakFullUrls, patchSettings, tweakFavorites]\n  );\n\n  const downloadThemeFile = useCallback((row: LocalPreviewRow) => {\n    const filename = `${row.basename || 'theme'}.sable.css`;\n    downloadTextFile(row.fullCssText, filename);\n  }, []);\n\n  const downloadTweakFile = useCallback((row: LocalTweakRow) => {\n    const filename = `${row.basename || 'tweak'}.sable.css`;\n    downloadTextFile(row.fullCssText, filename);\n  }, []);\n\n  const catalogBundle = catalogQuery.data;\n  const catalogThemeCount = catalogBundle?.themes.length ?? 0;\n  const catalogTweakCount = catalogBundle?.tweaks.length ?? 0;\n  const catalogHasEntries = catalogThemeCount + catalogTweakCount > 0;\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      {showAssignmentChrome && (\n        <>\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"400\"\n          >\n            <SettingTile\n              title=\"Sync with system theme\"\n              focusId=\"theme-local-sync-system\"\n              description=\"When enabled, use different themes for OS light vs dark mode. When disabled, one manual theme is used.\"\n              after={<Switch variant=\"Primary\" value={systemTheme} onChange={setSystemTheme} />}\n            />\n\n            {systemTheme ? (\n              <Box direction=\"Row\" gap=\"200\" wrap=\"Wrap\" alignItems=\"Center\">\n                <Button\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={useBuiltinForLightSlot}\n                >\n                  <Text size=\"B300\">Built-in (OS light)</Text>\n                </Button>\n                <Button\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={useBuiltinForDarkSlot}\n                >\n                  <Text size=\"B300\">Built-in (OS dark)</Text>\n                </Button>\n              </Box>\n            ) : (\n              <Box direction=\"Row\" gap=\"200\" wrap=\"Wrap\" alignItems=\"Center\">\n                <Button\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={useBuiltinForManualLight}\n                >\n                  <Text size=\"B300\">Built-in Light</Text>\n                </Button>\n                <Button\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={useBuiltinForManualDark}\n                >\n                  <Text size=\"B300\">Built-in Dark</Text>\n                </Button>\n              </Box>\n            )}\n          </SequenceCard>\n        </>\n      )}\n\n      {showSavedLibrary && (\n        <>\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"400\"\n          >\n            <Box\n              direction=\"Row\"\n              gap=\"200\"\n              alignItems=\"Center\"\n              justifyContent=\"SpaceBetween\"\n              wrap=\"Wrap\"\n            >\n              <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\" wrap=\"Wrap\">\n                <Text size=\"T300\">Saved</Text>\n                <Chip\n                  type=\"button\"\n                  variant={savedSection === 'themes' ? 'Primary' : 'Secondary'}\n                  outlined={savedSection === 'themes'}\n                  radii=\"Pill\"\n                  onClick={() => setSavedSection('themes')}\n                >\n                  <Text size=\"B300\">Themes ({favorites.length})</Text>\n                </Chip>\n                <Chip\n                  type=\"button\"\n                  variant={savedSection === 'tweaks' ? 'Primary' : 'Secondary'}\n                  outlined={savedSection === 'tweaks'}\n                  radii=\"Pill\"\n                  onClick={() => setSavedSection('tweaks')}\n                >\n                  <Text size=\"B300\">Tweaks ({savedTweakCount})</Text>\n                </Chip>\n              </Box>\n              <Box direction=\"Row\" gap=\"100\" alignItems=\"Center\">\n                <Chip\n                  type=\"button\"\n                  variant={catalogUpdateStatus === 'failed' ? 'Critical' : 'Secondary'}\n                  radii=\"Pill\"\n                  disabled={catalogUpdateStatus === 'checking'}\n                  onClick={() => {\n                    checkInstalledCatalogUpdates().catch(() => undefined);\n                  }}\n                >\n                  <Text size=\"B300\">\n                    {catalogUpdateStatus === 'checking' ? 'Checking…' : 'Check updates'}\n                  </Text>\n                </Chip>\n                <Chip\n                  type=\"button\"\n                  variant=\"Secondary\"\n                  radii=\"Pill\"\n                  disabled={activeUrls.length === 0}\n                  onClick={clearRemote}\n                >\n                  <Text size=\"B300\">Reset</Text>\n                </Chip>\n              </Box>\n            </Box>\n\n            {catalogUpdateStatus !== 'idle' && catalogUpdateStatus !== 'checking' && (\n              <Text size=\"T200\" priority=\"300\">\n                {catalogUpdateMessage}\n              </Text>\n            )}\n\n            {savedSection === 'themes' && (\n              <Box direction=\"Column\" gap=\"300\">\n                {localPreviewsQuery.isPending && favorites.length > 0 && (\n                  <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\">\n                    <Spinner variant=\"Primary\" size=\"400\" />\n                    <Text size=\"T300\">Loading local previews…</Text>\n                  </Box>\n                )}\n\n                {favorites.length === 0 && (\n                  <Text size=\"T300\" priority=\"300\">\n                    No saved themes yet. Star themes in the catalog to download them locally.\n                  </Text>\n                )}\n\n                {localPreviewsQuery.isSuccess && favorites.length > 0 && (\n                  <>\n                    {localPreviewsQuery.data.length === 0 ? (\n                      <Text size=\"T300\" priority=\"300\">\n                        Could not load local previews. If this happens, the theme preview file may\n                        be missing or not paired as `*.preview.sable.css`.\n                      </Text>\n                    ) : (\n                      <Box\n                        className={css.themeCardGrid}\n                        style={{\n                          maxHeight: 'min(68dvh, 44rem)',\n                          overflowY: 'auto',\n                          paddingRight: toRem(4),\n                        }}\n                      >\n                        {localPreviewsQuery.data.map((row) => {\n                          const slug = row.basename.replace(/[^a-zA-Z0-9_-]/g, '-') || 'theme';\n                          const kindLabel = row.kind === 'dark' ? 'Dark' : 'Light';\n                          const line1 = `${kindLabel} · ${row.contrast} contrast`;\n                          const line2 = `${row.author ? `by ${row.author}` : ''}${\n                            row.tags.length > 0\n                              ? `${row.author ? ' · ' : ''}${row.tags.join(', ')}`\n                              : ''\n                          }`.trim();\n                          const subtitle = (\n                            <>\n                              {line1}\n                              {line2 ? (\n                                <>\n                                  <br />\n                                  {line2}\n                                </>\n                              ) : null}\n                            </>\n                          );\n                          return (\n                            <ThemePreviewCard\n                              key={row.fullUrl}\n                              title={row.displayName}\n                              subtitle={subtitle}\n                              previewCssText={row.previewText}\n                              fullCssText={row.fullCssText}\n                              scopeSlug={`local-${slug}`}\n                              sourceLabel={themeSourceLabel({\n                                importedLocal: row.importedLocal,\n                                official:\n                                  !row.importedLocal &&\n                                  !isThirdPartyThemeUrl(\n                                    row.fullUrl,\n                                    clientConfig.themeCatalogApprovedHostPrefixes\n                                  ),\n                                url: row.fullUrl,\n                              })}\n                              copyText={row.importedLocal ? undefined : row.previewUrl}\n                              thirdParty={\n                                !row.importedLocal &&\n                                isThirdPartyThemeUrl(\n                                  row.fullUrl,\n                                  clientConfig.themeCatalogApprovedHostPrefixes\n                                )\n                              }\n                              isFavorited\n                              onToggleFavorite={() => removeFavorite(row.fullUrl)}\n                              onExport={() => downloadThemeFile(row)}\n                              systemTheme={systemTheme}\n                              onApplyLight={\n                                systemTheme ? () => applyFavoriteToLight(row) : undefined\n                              }\n                              onApplyDark={systemTheme ? () => applyFavoriteToDark(row) : undefined}\n                              onApplyManual={\n                                !systemTheme ? () => applyFavoriteToManual(row) : undefined\n                              }\n                              isAppliedLight={lightRemoteFullUrl === row.fullUrl}\n                              isAppliedDark={darkRemoteFullUrl === row.fullUrl}\n                              isAppliedManual={manualRemoteFullUrl === row.fullUrl}\n                            />\n                          );\n                        })}\n                      </Box>\n                    )}\n                  </>\n                )}\n              </Box>\n            )}\n\n            {savedSection === 'tweaks' && (\n              <Box direction=\"Column\" gap=\"300\">\n                {localTweaksQuery.isPending && tweakFavorites.length > 0 && (\n                  <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\">\n                    <Spinner variant=\"Primary\" size=\"400\" />\n                    <Text size=\"T300\">Loading tweaks…</Text>\n                  </Box>\n                )}\n                {tweakFavorites.length === 0 && (\n                  <Text size=\"T300\" priority=\"300\">\n                    No saved tweaks. Favorite tweaks in the catalog to keep them here, or enable a\n                    tweak to cache it automatically.\n                  </Text>\n                )}\n                {localTweaksQuery.isSuccess && tweakFavorites.length > 0 && (\n                  <Box\n                    direction=\"Column\"\n                    gap=\"200\"\n                    style={{\n                      maxHeight: 'min(68dvh, 44rem)',\n                      overflowY: 'auto',\n                      paddingRight: toRem(4),\n                    }}\n                  >\n                    {localTweaksQuery.data.length > 0 && unresolvedLegacyTweakCount > 0 && (\n                      <Text size=\"T300\" priority=\"300\">\n                        {unresolvedLegacyTweakCount} saved local tweak\n                        {unresolvedLegacyTweakCount === 1 ? ' is' : 's are'} waiting to migrate.\n                      </Text>\n                    )}\n                    {localTweaksQuery.data.length === 0 ? (\n                      <Text size=\"T300\" priority=\"300\">\n                        {unresolvedLegacyTweakCount === tweakFavorites.length\n                          ? 'Some saved local tweaks are waiting to migrate. Open Sable on a device that still has them to finish syncing.'\n                          : 'Could not load tweak CSS. Check the URL or your connection.'}\n                      </Text>\n                    ) : (\n                      localTweaksQuery.data.map((row) => {\n                        const isOn = enabledTweakFullUrls.includes(row.fullUrl);\n                        const descParts = [\n                          row.description,\n                          row.author ? `by ${row.author}` : '',\n                          row.tags.length > 0 ? row.tags.join(', ') : '',\n                        ].filter(Boolean);\n                        const desc =\n                          descParts.join(' · ') ||\n                          'Applies on top of your current theme after it loads.';\n                        return (\n                          <CatalogTweakCard\n                            key={row.fullUrl}\n                            displayName={row.displayName}\n                            description={desc}\n                            copyUrl={row.importedLocal ? undefined : row.fullUrl}\n                            thirdPartyChip={\n                              !row.importedLocal &&\n                              isThirdPartyThemeUrl(\n                                row.fullUrl,\n                                clientConfig.themeCatalogApprovedHostPrefixes\n                              )\n                            }\n                            isFavorited\n                            onToggleFavorite={() => removeTweakFavorite(row.fullUrl)}\n                            onExport={() => downloadTweakFile(row)}\n                            cssText={row.fullCssText}\n                            sourceLabel={themeSourceLabel({\n                              importedLocal: row.importedLocal,\n                              official:\n                                !row.importedLocal &&\n                                !isThirdPartyThemeUrl(\n                                  row.fullUrl,\n                                  clientConfig.themeCatalogApprovedHostPrefixes\n                                ),\n                              url: row.fullUrl,\n                            })}\n                            isOn={isOn}\n                            onSetApplied={(v) =>\n                              setTweakApplied(row.fullUrl, v, {\n                                displayName: row.displayName,\n                                basename: row.basename,\n                              })\n                            }\n                          />\n                        );\n                      })\n                    )}\n                  </Box>\n                )}\n              </Box>\n            )}\n          </SequenceCard>\n        </>\n      )}\n\n      {isAppearanceMode && !browseOpen && (\n        <>\n          <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n            <SettingTile\n              title=\"Browse catalog\"\n              focusId=\"theme-browse-remote\"\n              description=\"Download themes and tweaks from the official catalog.\"\n              after={\n                <Button\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => setBrowseOpen(true)}\n                >\n                  <Text size=\"B300\">Browse catalog…</Text>\n                </Button>\n              }\n            />\n          </SequenceCard>\n          <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n            <SettingTile\n              title=\"Import a theme or tweak\"\n              focusId=\"theme-import-open\"\n              description=\"Add a theme or @sable-tweak overlay from a link or a CSS file on your device.\"\n              after={\n                <Button\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => setImportModalOpen(true)}\n                >\n                  <Text size=\"B300\">Import…</Text>\n                </Button>\n              }\n            />\n          </SequenceCard>\n\n          <ThemeImportModal open={importModalOpen} onClose={() => setImportModalOpen(false)} />\n        </>\n      )}\n\n      {isRemoteMode && (\n        <>\n          {!isAppearanceMode && <Text size=\"L400\">Browse catalog</Text>}\n\n          {(isAppearanceMode && browseOpen) ||\n          catalogQuery.isPending ||\n          catalogQuery.isError ||\n          (catalogQuery.isSuccess &&\n            ((catalogThemeCount > 0 && previewsQuery.isPending) ||\n              (catalogTweakCount > 0 && tweakDetailsQuery.isPending))) ? (\n            <SequenceCard\n              className={SequenceCardStyle}\n              variant=\"SurfaceVariant\"\n              direction=\"Column\"\n              gap=\"400\"\n              style={{ overflowX: 'hidden', minWidth: 0 }}\n            >\n              {isAppearanceMode && browseOpen && (\n                <Box direction=\"Column\" gap=\"300\">\n                  <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\" gap=\"200\">\n                    <Box direction=\"Column\" gap=\"100\">\n                      <Text size=\"T300\">Browse catalog</Text>\n                      <Text size=\"T200\" priority=\"300\">\n                        Find, preview, and save catalog CSS.\n                      </Text>\n                    </Box>\n                    <Box direction=\"Row\" gap=\"100\" alignItems=\"Center\" shrink=\"No\">\n                      <Button\n                        variant=\"Secondary\"\n                        fill=\"Soft\"\n                        outlined\n                        size=\"300\"\n                        radii=\"300\"\n                        onClick={() =>\n                          queryClient.invalidateQueries({ queryKey: ['theme-catalog-bundle'] })\n                        }\n                      >\n                        <Text size=\"B300\">Refresh</Text>\n                      </Button>\n                      <Button\n                        variant=\"Secondary\"\n                        fill=\"Soft\"\n                        outlined\n                        size=\"300\"\n                        radii=\"300\"\n                        onClick={() => setBrowseOpen(false)}\n                      >\n                        <Text size=\"B300\">Back</Text>\n                      </Button>\n                    </Box>\n                  </Box>\n                  <Box direction=\"Row\" gap=\"200\">\n                    <Chip\n                      type=\"button\"\n                      variant={catalogSection === 'themes' ? 'Primary' : 'Secondary'}\n                      outlined={catalogSection === 'themes'}\n                      radii=\"Pill\"\n                      onClick={() => setCatalogSection('themes')}\n                    >\n                      <Text size=\"B300\">Themes ({catalogThemeCount})</Text>\n                    </Chip>\n                    <Chip\n                      type=\"button\"\n                      variant={catalogSection === 'tweaks' ? 'Primary' : 'Secondary'}\n                      outlined={catalogSection === 'tweaks'}\n                      radii=\"Pill\"\n                      onClick={() => setCatalogSection('tweaks')}\n                    >\n                      <Text size=\"B300\">Tweaks ({catalogTweakCount})</Text>\n                    </Chip>\n                  </Box>\n                </Box>\n              )}\n\n              {(catalogQuery.isPending || catalogQuery.isError) && (\n                <Box direction=\"Column\" gap=\"200\">\n                  {catalogQuery.isPending && (\n                    <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\">\n                      <Spinner variant=\"Primary\" size=\"400\" />\n                      <Text size=\"T300\">Loading catalog…</Text>\n                    </Box>\n                  )}\n                  {catalogQuery.isError && (\n                    <Text size=\"T300\" style={{ color: 'var(--sable-crit-main)' }}>\n                      {catalogQuery.error?.message ?? 'Failed to load catalog'}\n                    </Text>\n                  )}\n                </Box>\n              )}\n\n              {catalogQuery.isSuccess && catalogThemeCount > 0 && previewsQuery.isPending && (\n                <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\">\n                  <Spinner variant=\"Primary\" size=\"400\" />\n                  <Text size=\"T300\">Loading previews…</Text>\n                </Box>\n              )}\n\n              {catalogQuery.isSuccess && catalogTweakCount > 0 && tweakDetailsQuery.isPending && (\n                <Box direction=\"Row\" gap=\"200\" alignItems=\"Center\">\n                  <Spinner variant=\"Primary\" size=\"400\" />\n                  <Text size=\"T300\">Loading tweaks…</Text>\n                </Box>\n              )}\n            </SequenceCard>\n          ) : null}\n\n          {catalogQuery.isSuccess &&\n            catalogHasEntries &&\n            catalogThemeCount > 0 &&\n            (!isAppearanceMode || catalogSection === 'themes') &&\n            previewsQuery.isSuccess && (\n              <SequenceCard\n                className={SequenceCardStyle}\n                variant=\"SurfaceVariant\"\n                direction=\"Column\"\n                gap=\"300\"\n              >\n                {!isAppearanceMode && <SettingTile title=\"Themes\" focusId=\"catalog-themes\" />}\n                <Input\n                  size=\"300\"\n                  radii=\"300\"\n                  outlined\n                  placeholder=\"Search themes…\"\n                  value={themeSearch}\n                  onChange={onThemeSearchChange}\n                />\n                <Box direction=\"Row\" gap=\"200\" wrap=\"Wrap\" alignItems=\"Center\">\n                  <Text size=\"T300\">Kind:</Text>\n                  {(['all', 'light', 'dark'] as const).map((k) => (\n                    <Chip\n                      key={k}\n                      type=\"button\"\n                      variant={kindFilter === k ? 'Primary' : 'Secondary'}\n                      outlined={kindFilter === k}\n                      radii=\"Pill\"\n                      onClick={() => setKindFilter(k)}\n                    >\n                      <Text size=\"B300\">{k === 'all' ? 'All' : k}</Text>\n                    </Chip>\n                  ))}\n                  <Text size=\"T300\">Contrast:</Text>\n                  {(['all', 'low', 'high'] as const).map((c) => (\n                    <Chip\n                      key={c}\n                      type=\"button\"\n                      variant={contrastFilter === c ? 'Primary' : 'Secondary'}\n                      outlined={contrastFilter === c}\n                      radii=\"Pill\"\n                      onClick={() => setContrastFilter(c)}\n                    >\n                      <Text size=\"B300\">{c === 'all' ? 'All' : c}</Text>\n                    </Chip>\n                  ))}\n                </Box>\n                <Scroll\n                  direction=\"Vertical\"\n                  size=\"300\"\n                  hideTrack\n                  visibility=\"Hover\"\n                  style={{\n                    height: 'min(68dvh, 44rem)',\n                    minHeight: 0,\n                    maxWidth: '100%',\n                  }}\n                >\n                  <Box direction=\"Column\" gap=\"400\">\n                    <Box className={css.themeCardGrid}>\n                      {filteredRows.map((row) => {\n                        const slug = row.basename.replace(/[^a-zA-Z0-9_-]/g, '-') || 'theme';\n                        const kindLabel = row.kind === ThemeKind.Dark ? 'Dark' : 'Light';\n                        const isFav = favorites.some((f) => f.fullUrl === row.fullInstallUrl);\n                        const line1 = `${kindLabel} · ${row.contrast} contrast`;\n                        const line2 = `${row.author ? `by ${row.author}` : ''}${\n                          row.tags.length > 0\n                            ? `${row.author ? ' · ' : ''}${row.tags.join(', ')}`\n                            : ''\n                        }`.trim();\n                        const subtitle = (\n                          <>\n                            {line1}\n                            {line2 ? (\n                              <>\n                                <br />\n                                {line2}\n                              </>\n                            ) : null}\n                          </>\n                        );\n                        return (\n                          <ThemePreviewCard\n                            key={row.basename}\n                            title={row.displayName}\n                            subtitle={subtitle}\n                            previewCssText={row.previewText}\n                            loadFullCssText={() => loadFullCssText(row.fullInstallUrl)}\n                            scopeSlug={`catalog-${slug}`}\n                            sourceLabel={\n                              isThirdPartyThemeUrl(\n                                row.previewUrl,\n                                clientConfig.themeCatalogApprovedHostPrefixes\n                              )\n                                ? themeUrlHostLabel(row.previewUrl)\n                                : 'Official catalog'\n                            }\n                            copyText={row.previewUrl}\n                            thirdParty={isThirdPartyThemeUrl(\n                              row.previewUrl,\n                              clientConfig.themeCatalogApprovedHostPrefixes\n                            )}\n                            isFavorited={isFav}\n                            onToggleFavorite={() => toggleFavorite(row)}\n                            systemTheme={systemTheme}\n                            onApplyLight={\n                              systemTheme ? () => installFromCatalogLight(row) : undefined\n                            }\n                            onApplyDark={\n                              systemTheme ? () => installFromCatalogDark(row) : undefined\n                            }\n                            onApplyManual={\n                              !systemTheme ? () => installFromCatalogManual(row) : undefined\n                            }\n                            isAppliedLight={lightRemoteFullUrl === row.fullInstallUrl}\n                            isAppliedDark={darkRemoteFullUrl === row.fullInstallUrl}\n                            isAppliedManual={manualRemoteFullUrl === row.fullInstallUrl}\n                          />\n                        );\n                      })}\n                    </Box>\n\n                    {filteredRows.length === 0 && (\n                      <Text size=\"T300\" priority=\"300\">\n                        No themes match filters.\n                      </Text>\n                    )}\n                  </Box>\n                </Scroll>\n              </SequenceCard>\n            )}\n\n          {catalogQuery.isSuccess &&\n            catalogHasEntries &&\n            catalogTweakCount > 0 &&\n            (!isAppearanceMode || catalogSection === 'tweaks') &&\n            tweakDetailsQuery.isSuccess && (\n              <SequenceCard\n                className={SequenceCardStyle}\n                variant=\"SurfaceVariant\"\n                direction=\"Column\"\n                gap=\"300\"\n              >\n                {!isAppearanceMode && <SettingTile title=\"Tweaks\" focusId=\"catalog-tweaks\" />}\n                <Input\n                  size=\"300\"\n                  radii=\"300\"\n                  outlined\n                  placeholder=\"Search tweaks…\"\n                  value={tweakSearch}\n                  onChange={onTweakSearchChange}\n                />\n                <Box direction=\"Row\" gap=\"200\" wrap=\"Wrap\" alignItems=\"Center\">\n                  <Text size=\"T300\">Status:</Text>\n                  {(['all', 'enabled', 'disabled'] as const).map((f) => (\n                    <Chip\n                      key={f}\n                      type=\"button\"\n                      variant={tweakApplyFilter === f ? 'Primary' : 'Secondary'}\n                      outlined={tweakApplyFilter === f}\n                      radii=\"Pill\"\n                      onClick={() => setTweakApplyFilter(f)}\n                    >\n                      <Text size=\"B300\">\n                        {\n                          {\n                            all: 'All',\n                            enabled: 'Enabled',\n                            disabled: 'Disabled',\n                          }[f]\n                        }\n                      </Text>\n                    </Chip>\n                  ))}\n                </Box>\n                <Scroll\n                  direction=\"Vertical\"\n                  size=\"300\"\n                  hideTrack\n                  visibility=\"Hover\"\n                  style={{\n                    height: 'min(68dvh, 44rem)',\n                    minHeight: 0,\n                    maxWidth: '100%',\n                  }}\n                >\n                  <Box direction=\"Column\" gap=\"200\">\n                    {catalogTweaksAfterApplyFilter.map((row) => {\n                      const isFav = tweakFavorites.some((f) => f.fullUrl === row.fullUrl);\n                      const isOn = enabledTweakFullUrls.includes(row.fullUrl);\n                      const descParts = [\n                        row.description,\n                        row.author ? `by ${row.author}` : '',\n                        row.tags.length > 0 ? row.tags.join(', ') : '',\n                      ].filter(Boolean);\n                      const desc =\n                        descParts.join(' · ') ||\n                        'Applies on top of your current theme after it loads.';\n                      return (\n                        <CatalogTweakCard\n                          key={row.fullUrl}\n                          displayName={row.displayName}\n                          description={desc}\n                          copyUrl={row.fullUrl}\n                          thirdPartyChip={isThirdPartyThemeUrl(\n                            row.fullUrl,\n                            clientConfig.themeCatalogApprovedHostPrefixes\n                          )}\n                          isFavorited={isFav}\n                          onToggleFavorite={() => toggleCatalogTweakFavorite(row)}\n                          isOn={isOn}\n                          onSetApplied={(v) =>\n                            setTweakApplied(row.fullUrl, v, {\n                              displayName: row.displayName,\n                              basename: row.basename,\n                              pruneUnpinnedFavoriteOnDisable: true,\n                            })\n                          }\n                          cssText={row.fullCssText}\n                          sourceLabel={\n                            isThirdPartyThemeUrl(\n                              row.fullUrl,\n                              clientConfig.themeCatalogApprovedHostPrefixes\n                            )\n                              ? themeUrlHostLabel(row.fullUrl)\n                              : 'Official catalog'\n                          }\n                        />\n                      );\n                    })}\n                    {filteredTweakRows.length === 0 && (\n                      <Text size=\"T300\" priority=\"300\">\n                        No tweaks match your search.\n                      </Text>\n                    )}\n                    {filteredTweakRows.length > 0 && catalogTweaksAfterApplyFilter.length === 0 && (\n                      <Text size=\"T300\" priority=\"300\">\n                        No tweaks match this status filter.\n                      </Text>\n                    )}\n                  </Box>\n                </Scroll>\n              </SequenceCard>\n            )}\n        </>\n      )}\n\n      {isChatMode && (\n        <>\n          <SettingToggle\n            title=\"Theme & tweak cards\"\n            focusId=\"theme-chat-sable-widgets\"\n            description=\"Show interactive Sable CSS cards instead of plain links.\"\n            value={sableChatWidgets}\n            onChange={setSableChatWidgets}\n          />\n          <SettingToggle\n            title=\"Auto-load approved URLs\"\n            focusId=\"theme-chat-auto-approved\"\n            description=\"Automatically fetch previews from approved catalog hosts.\"\n            value={autoPreviewApprovedUrls}\n            onChange={setAutoPreviewApprovedUrls}\n            disabled={!sableChatWidgets}\n          />\n          <SettingToggle\n            title=\"Auto-load any URL\"\n            focusId=\"theme-chat-auto-any\"\n            description=\"Not recommended. Automatically fetch potentially unsafe third-party links.\"\n            value={autoPreviewAnyUrl}\n            onChange={setAutoPreviewAnyUrl}\n            disabled={!sableChatWidgets}\n          />\n        </>\n      )}\n    </Box>\n  );\n}\n","import { useCallback, useEffect } from 'react';\nimport { Box, Button, Switch, Text } from 'folds';\n\nimport { SettingMenuSelector } from '$components/setting-menu-selector';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport type { Theme } from '$hooks/useTheme';\nimport { DarkTheme, LightTheme, ThemeKind, useThemeNames, useThemes } from '$hooks/useTheme';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useStore } from 'jotai/react';\n\nimport { useThemeCatalogOnboardingGate } from './ThemeCatalogOnboarding';\nimport { ThemeCatalogSettings } from './ThemeCatalogSettings';\n\nfunction makeThemeOptions(themes: Theme[], themeNames: Record<string, string>) {\n  return themes.map((theme) => ({\n    value: theme.id,\n    label: themeNames[theme.id] ?? theme.id,\n  }));\n}\n\nfunction SelectTheme({ disabled }: Readonly<{ disabled?: boolean }>) {\n  const themes = useThemes();\n  const themeNames = useThemeNames();\n  const [themeId, setThemeId] = useSetting(settingsAtom, 'themeId');\n\n  const themeOptions = makeThemeOptions(themes, themeNames);\n  const selectedThemeId =\n    themeOptions.find((theme) => theme.value === themeId)?.value ?? LightTheme.id;\n\n  return (\n    <SettingMenuSelector\n      value={selectedThemeId}\n      options={themeOptions}\n      onSelect={setThemeId}\n      disabled={disabled}\n    />\n  );\n}\n\nfunction SystemThemePreferences() {\n  const themeNames = useThemeNames();\n  const themes = useThemes();\n  const [lightThemeId, setLightThemeId] = useSetting(settingsAtom, 'lightThemeId');\n  const [darkThemeId, setDarkThemeId] = useSetting(settingsAtom, 'darkThemeId');\n\n  const lightThemes = themes.filter((theme) => theme.kind === ThemeKind.Light);\n  const darkThemes = themes.filter((theme) => theme.kind === ThemeKind.Dark);\n  const lightThemeOptions = makeThemeOptions(lightThemes, themeNames);\n  const darkThemeOptions = makeThemeOptions(darkThemes, themeNames);\n\n  const selectedLightThemeId =\n    lightThemeOptions.find((theme) => theme.value === lightThemeId)?.value ?? LightTheme.id;\n  const selectedDarkThemeId =\n    darkThemeOptions.find((theme) => theme.value === darkThemeId)?.value ?? DarkTheme.id;\n\n  return (\n    <Box wrap=\"Wrap\" gap=\"400\">\n      <SettingTile\n        title=\"Light Theme:\"\n        focusId=\"light-theme\"\n        after={\n          <SettingMenuSelector\n            value={selectedLightThemeId}\n            options={lightThemeOptions}\n            onSelect={setLightThemeId}\n          />\n        }\n      />\n      <SettingTile\n        title=\"Dark Theme:\"\n        focusId=\"dark-theme\"\n        after={\n          <SettingMenuSelector\n            value={selectedDarkThemeId}\n            options={darkThemeOptions}\n            onSelect={setDarkThemeId}\n          />\n        }\n      />\n    </Box>\n  );\n}\n\nfunction ClassicThemeSection({ onRequestCatalogEnable }: { onRequestCatalogEnable: () => void }) {\n  const [systemTheme, setSystemTheme] = useSetting(settingsAtom, 'useSystemTheme');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"System Theme\"\n          focusId=\"system-theme\"\n          description=\"Sync with your device's light/dark mode.\"\n          after={<Switch variant=\"Primary\" value={systemTheme} onChange={setSystemTheme} />}\n        />\n        {systemTheme && <SystemThemePreferences />}\n      </SequenceCard>\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Manual Theme\"\n          focusId=\"manual-theme\"\n          description=\"Active when System Theme is disabled.\"\n          after={<SelectTheme disabled={systemTheme} />}\n        />\n      </SequenceCard>\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Enable catalog\"\n          focusId=\"browse-remote-catalog\"\n          description=\"Load remote themes and tweaks from the official catalog. You will be asked to confirm before any catalog content is fetched.\"\n          after={\n            <Button\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              outlined\n              size=\"300\"\n              radii=\"300\"\n              onClick={onRequestCatalogEnable}\n            >\n              <Text size=\"B300\">Enable catalog</Text>\n            </Button>\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n\nfunction RemoteCatalogThemeSection({\n  onBrowseOpenChange,\n}: {\n  onBrowseOpenChange?: (open: boolean) => void;\n}) {\n  return <ThemeCatalogSettings mode=\"appearance\" onBrowseOpenChange={onBrowseOpenChange} />;\n}\n\nexport function ThemeAppearanceSection({\n  onBrowseOpenChange,\n}: {\n  onBrowseOpenChange?: (open: boolean) => void;\n} = {}) {\n  const store = useStore();\n  const [onboardingDone] = useSetting(settingsAtom, 'themeCatalogOnboardingDone');\n  const [catalogEnabled] = useSetting(settingsAtom, 'themeRemoteCatalogEnabled');\n\n  useEffect(() => {\n    if (!catalogEnabled) onBrowseOpenChange?.(false);\n  }, [catalogEnabled, onBrowseOpenChange]);\n\n  const completeOnboarding = useCallback(\n    (enabled: boolean) => {\n      const next = { ...store.get(settingsAtom), themeCatalogOnboardingDone: true };\n      next.themeRemoteCatalogEnabled = enabled;\n      store.set(settingsAtom, next);\n    },\n    [store]\n  );\n\n  const { dialog, openOnboarding } = useThemeCatalogOnboardingGate(\n    onboardingDone,\n    completeOnboarding\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Theme</Text>\n      {dialog}\n      {catalogEnabled ? (\n        <RemoteCatalogThemeSection onBrowseOpenChange={onBrowseOpenChange} />\n      ) : (\n        <ClassicThemeSection onRequestCatalogEnable={openOnboarding} />\n      )}\n    </Box>\n  );\n}\n","import { Box, Text, Scroll } from 'folds';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useRoom } from '$hooks/useRoom';\n\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport {\n  PER_ROOM_SHOW_ROOM_ICON_OPTIONS,\n  SHOW_ROOM_ICON_DEFAULT,\n  SettingMenuSelector,\n  type ShowRoomIconValue,\n} from '$components/setting-menu-selector';\n\nexport function SelectShowPerRoomRoomIcon({ roomId }: { roomId: string }) {\n  const [showRoomIconArray, setShowRoomIconArray] = useSetting(settingsAtom, 'perRoomShowRoomIcon');\n  const showRoomIcon = showRoomIconArray?.find((item) => item.roomId === roomId)?.display;\n\n  const handleSelect = (position: ShowRoomIconValue) => {\n    let newShowRoomIconArray = showRoomIconArray.filter((item) => item.roomId !== roomId);\n    if (position !== SHOW_ROOM_ICON_DEFAULT)\n      newShowRoomIconArray = [...newShowRoomIconArray, { roomId, display: position }];\n    setShowRoomIconArray(newShowRoomIconArray);\n  };\n\n  return (\n    <SettingMenuSelector\n      value={showRoomIcon ?? SHOW_ROOM_ICON_DEFAULT}\n      options={PER_ROOM_SHOW_ROOM_ICON_OPTIONS}\n      onSelect={handleSelect}\n      renderOption={({ option, selected }) => (\n        <Box grow=\"Yes\">\n          <Text size=\"T300\">{selected ? <b>{option.label}</b> : option.label}</Text>\n        </Box>\n      )}\n    />\n  );\n}\n\ntype AppearanceProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\nexport function Appearance({ requestBack, requestClose }: AppearanceProps) {\n  const room = useRoom();\n\n  return (\n    <SettingsSectionPage title=\"Appearance\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Visual Tweaks</Text>\n                <SequenceCard\n                  className={SequenceCardStyle}\n                  variant=\"SurfaceVariant\"\n                  direction=\"Column\"\n                >\n                  <SettingTile\n                    title=\"Show Room Icons In Sidebar\"\n                    description=\"When do you want to show the specific room icons in the sidebar within this space?\"\n                    after={<SelectShowPerRoomRoomIcon roomId={room.roomId} />}\n                  />\n                </SequenceCard>\n              </Box>\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import type { ChangeEventHandler, KeyboardEventHandler } from 'react';\nimport { type MouseEventHandler, useEffect, useMemo, useState } from 'react';\nimport { Box, Chip, Input, Switch, Text, toRem } from 'folds';\nimport { CaretDown, menuIcon } from '$components/icons/phosphor';\nimport { isKeyHotkey } from 'is-hotkey';\n\nimport {\n  PANEL_SIZE_OPTIONS,\n  SHOW_ROOM_ICON_OPTIONS,\n  SettingMenuSelector,\n  type PanelSizeKey,\n  type SettingMenuOption,\n} from '$components/setting-menu-selector';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile, SettingToggle } from '$components/setting-tile';\nimport {\n  DEFAULT_ARBORIUM_DARK_THEME,\n  DEFAULT_ARBORIUM_LIGHT_THEME,\n  getArboriumThemeLabel,\n  getArboriumThemeOptions,\n} from '$plugins/arborium';\nimport { ThemeKind, useActiveTheme } from '$hooks/useTheme';\nimport { useSetting } from '$state/hooks/settings';\nimport type { PixelatedImageRenderingMode } from '$state/settings';\nimport { ShowRoomIcon } from '$state/settings';\nimport { settingsAtom } from '$state/settings';\nimport { ThemeAppearanceSection } from './ThemeAppearanceSection';\nimport { SelectShowPerRoomRoomIcon } from '$features/common-settings/appearance/Appearance';\n\nconst clampIncomingInlineImageHeight = (n: number) => Math.max(1, Math.min(4096, n));\n\nfunction makeArboriumThemeOptions(kind?: 'light' | 'dark') {\n  const themes = kind\n    ? getArboriumThemeOptions(kind)\n    : [...getArboriumThemeOptions('light'), ...getArboriumThemeOptions('dark')];\n\n  return themes.map((theme) => ({\n    value: theme.id,\n    label: getArboriumThemeLabel(theme.id),\n  }));\n}\n\nfunction ThemeTrigger({\n  selectedLabel,\n  onClick,\n  active,\n  disabled,\n}: {\n  selectedLabel: string;\n  onClick: MouseEventHandler<HTMLButtonElement>;\n  active: boolean;\n  disabled?: boolean;\n}) {\n  return (\n    <Chip\n      type=\"button\"\n      variant={active ? 'Primary' : 'Secondary'}\n      outlined={active}\n      radii=\"Pill\"\n      after={menuIcon(CaretDown)}\n      onClick={onClick}\n      disabled={disabled}\n    >\n      <Text size=\"B300\">{selectedLabel}</Text>\n    </Chip>\n  );\n}\n\nfunction SelectCodeBlockTheme({ disabled }: Readonly<{ disabled?: boolean }>) {\n  const activeTheme = useActiveTheme();\n  const [arboriumThemeId, setArboriumThemeId] = useSetting(settingsAtom, 'arboriumThemeId');\n  const [arboriumLightTheme] = useSetting(settingsAtom, 'arboriumLightTheme');\n  const [arboriumDarkTheme] = useSetting(settingsAtom, 'arboriumDarkTheme');\n\n  const arboriumThemeOptions = makeArboriumThemeOptions();\n  const selectedSystemThemeId =\n    activeTheme.kind === ThemeKind.Dark\n      ? (makeArboriumThemeOptions('dark').find((theme) => theme.value === arboriumDarkTheme)\n          ?.value ?? DEFAULT_ARBORIUM_DARK_THEME)\n      : (makeArboriumThemeOptions('light').find((theme) => theme.value === arboriumLightTheme)\n          ?.value ?? DEFAULT_ARBORIUM_LIGHT_THEME);\n  const selectedArboriumThemeId =\n    arboriumThemeOptions.find((theme) => theme.value === arboriumThemeId)?.value ??\n    selectedSystemThemeId;\n\n  return (\n    <SettingMenuSelector\n      value={selectedArboriumThemeId}\n      options={arboriumThemeOptions}\n      onSelect={setArboriumThemeId}\n      disabled={disabled}\n    />\n  );\n}\n\nfunction CodeBlockSystemThemePreferences() {\n  const activeTheme = useActiveTheme();\n  const [arboriumLightTheme, setArboriumLightTheme] = useSetting(\n    settingsAtom,\n    'arboriumLightTheme'\n  );\n  const [arboriumDarkTheme, setArboriumDarkTheme] = useSetting(settingsAtom, 'arboriumDarkTheme');\n\n  const arboriumLightThemeOptions = makeArboriumThemeOptions('light');\n  const arboriumDarkThemeOptions = makeArboriumThemeOptions('dark');\n  const selectedArboriumLightTheme =\n    arboriumLightThemeOptions.find((theme) => theme.value === arboriumLightTheme)?.value ??\n    DEFAULT_ARBORIUM_LIGHT_THEME;\n  const selectedArboriumDarkTheme =\n    arboriumDarkThemeOptions.find((theme) => theme.value === arboriumDarkTheme)?.value ??\n    DEFAULT_ARBORIUM_DARK_THEME;\n\n  return (\n    <Box wrap=\"Wrap\" gap=\"400\">\n      <SettingTile\n        title=\"Light Theme:\"\n        focusId=\"code-block-light-theme\"\n        after={\n          <SettingMenuSelector\n            value={selectedArboriumLightTheme}\n            options={arboriumLightThemeOptions}\n            onSelect={setArboriumLightTheme}\n            renderTrigger={({ selectedOption, openMenu, disabled }) => (\n              <ThemeTrigger\n                selectedLabel={selectedOption.label}\n                onClick={openMenu}\n                active={activeTheme.kind === ThemeKind.Light}\n                disabled={disabled}\n              />\n            )}\n          />\n        }\n      />\n      <SettingTile\n        title=\"Dark Theme:\"\n        focusId=\"code-block-dark-theme\"\n        after={\n          <SettingMenuSelector\n            value={selectedArboriumDarkTheme}\n            options={arboriumDarkThemeOptions}\n            onSelect={setArboriumDarkTheme}\n            renderTrigger={({ selectedOption, openMenu, disabled }) => (\n              <ThemeTrigger\n                selectedLabel={selectedOption.label}\n                onClick={openMenu}\n                active={activeTheme.kind === ThemeKind.Dark}\n                disabled={disabled}\n              />\n            )}\n          />\n        }\n      />\n    </Box>\n  );\n}\n\nfunction CodeBlockThemeSettings() {\n  const [useSystemArboriumTheme, setUseSystemArboriumTheme] = useSetting(\n    settingsAtom,\n    'useSystemArboriumTheme'\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Code Block Theme</Text>\n\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"System Theme\"\n          focusId=\"code-block-system-theme\"\n          description=\"Sync highlighted code with the app's active light/dark theme.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={useSystemArboriumTheme}\n              onChange={setUseSystemArboriumTheme}\n            />\n          }\n        />\n        {useSystemArboriumTheme && <CodeBlockSystemThemePreferences />}\n      </SequenceCard>\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Manual Theme\"\n          focusId=\"code-block-manual-theme\"\n          description=\"Active when System Theme is disabled.\"\n          after={<SelectCodeBlockTheme disabled={useSystemArboriumTheme} />}\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n\nconst onNumberInputKeyDown =\n  (reset: () => void): KeyboardEventHandler<HTMLInputElement> =>\n  (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      evt.stopPropagation();\n      reset();\n      (evt.target as HTMLInputElement).blur();\n    }\n    if (isKeyHotkey('enter', evt)) {\n      (evt.target as HTMLInputElement).blur();\n    }\n  };\n\nfunction ThemeVisualPreferences() {\n  const [oldSidebar, setOldSidebar] = useSetting(settingsAtom, 'oldSidebar');\n  const [pixelatedImageRendering, setPixelatedImageRendering] = useSetting(\n    settingsAtom,\n    'pixelatedImageRendering'\n  );\n  const pixelatedImageRenderingOptions: SettingMenuOption<PixelatedImageRenderingMode>[] = [\n    { value: 'always', label: 'Always' },\n    { value: 'smart', label: 'Smart' },\n    { value: 'never', label: 'never' },\n  ];\n  const [incomingInlineImagesDefaultHeight, setIncomingInlineImagesDefaultHeight] = useSetting(\n    settingsAtom,\n    'incomingInlineImagesDefaultHeight'\n  );\n  const [incomingInlineImagesMaxHeight, setIncomingInlineImagesMaxHeight] = useSetting(\n    settingsAtom,\n    'incomingInlineImagesMaxHeight'\n  );\n  const [linkPreviewImageMaxHeight, setLinkPreviewImageMaxHeight] = useSetting(\n    settingsAtom,\n    'linkPreviewImageMaxHeight'\n  );\n  const [incomingDefaultHeightInput, setIncomingDefaultHeightInput] = useState(\n    incomingInlineImagesDefaultHeight.toString()\n  );\n  const [incomingMaxHeightInput, setIncomingMaxHeightInput] = useState(\n    incomingInlineImagesMaxHeight.toString()\n  );\n  const [linkPreviewMaxHeightInput, setLinkPreviewMaxHeightInput] = useState(\n    linkPreviewImageMaxHeight.toString()\n  );\n  const [showRoomBanners, setShowRoomBanners] = useSetting(settingsAtom, 'showRoomBanners');\n\n  const handleIncomingDefaultHeightChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setIncomingDefaultHeightInput(val);\n    const parsed = Number.parseInt(val, 10);\n    if (!Number.isNaN(parsed))\n      setIncomingInlineImagesDefaultHeight(clampIncomingInlineImageHeight(parsed));\n  };\n  const handleIncomingMaxHeightChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setIncomingMaxHeightInput(val);\n    const parsed = Number.parseInt(val, 10);\n    if (!Number.isNaN(parsed))\n      setIncomingInlineImagesMaxHeight(clampIncomingInlineImageHeight(parsed));\n  };\n  const handleLinkPreviewMaxHeightChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setLinkPreviewMaxHeightInput(val);\n    const parsed = Number.parseInt(val, 10);\n    if (!Number.isNaN(parsed)) setLinkPreviewImageMaxHeight(clampIncomingInlineImageHeight(parsed));\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Display</Text>\n\n      <SettingToggle\n        title=\"Go back to old sidebar\"\n        focusId=\"old-sidebar\"\n        description=\"Reset the sidebar to its old style\"\n        value={oldSidebar}\n        onChange={setOldSidebar}\n      />\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Pixelated image scaling\"\n          focusId=\"pixelated-image-rendering\"\n          description=\"Use crisp nearest-neighbor scaling where selected. Improves pixel art but makes normal images worse.\"\n          after={\n            <SettingMenuSelector\n              value={pixelatedImageRendering}\n              options={pixelatedImageRenderingOptions}\n              onSelect={setPixelatedImageRendering}\n            />\n          }\n        />\n      </SequenceCard>\n      <SettingToggle\n        title=\"Display Room banners\"\n        focusId=\"display-room-banners\"\n        value={showRoomBanners}\n        onChange={setShowRoomBanners}\n      />\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Incoming inline images default height\"\n          focusId=\"incoming-inline-images-default-height\"\n          description={`Default height for incoming inline images that don't specify a height.`}\n          after={\n            <Input\n              style={{ width: toRem(100) }}\n              variant={\n                Number.parseInt(incomingDefaultHeightInput, 10) ===\n                incomingInlineImagesDefaultHeight\n                  ? 'Secondary'\n                  : 'Success'\n              }\n              size=\"300\"\n              radii=\"300\"\n              type=\"number\"\n              min=\"1\"\n              max=\"4096\"\n              value={incomingDefaultHeightInput}\n              onChange={handleIncomingDefaultHeightChange}\n              onKeyDown={onNumberInputKeyDown(() =>\n                setIncomingDefaultHeightInput(incomingInlineImagesDefaultHeight.toString())\n              )}\n              after={<Text size=\"T300\">px</Text>}\n              outlined\n            />\n          }\n        />\n      </SequenceCard>\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Incoming inline images max height\"\n          focusId=\"incoming-inline-images-max-height\"\n          description={`Maximum height for incoming inline images. Any incoming height above this is clamped down.`}\n          after={\n            <Input\n              style={{ width: toRem(100) }}\n              variant={\n                Number.parseInt(incomingMaxHeightInput, 10) === incomingInlineImagesMaxHeight\n                  ? 'Secondary'\n                  : 'Success'\n              }\n              size=\"300\"\n              radii=\"300\"\n              type=\"number\"\n              min=\"1\"\n              max=\"4096\"\n              value={incomingMaxHeightInput}\n              onChange={handleIncomingMaxHeightChange}\n              onKeyDown={onNumberInputKeyDown(() =>\n                setIncomingMaxHeightInput(incomingInlineImagesMaxHeight.toString())\n              )}\n              after={<Text size=\"T300\">px</Text>}\n              outlined\n            />\n          }\n        />\n      </SequenceCard>\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Link preview image max height\"\n          focusId=\"link-preview-image-max-height\"\n          description=\"Maximum height for URL / Open Graph preview media (image or playable og:video), including bundled previews.\"\n          after={\n            <Input\n              style={{ width: toRem(100) }}\n              variant={\n                Number.parseInt(linkPreviewMaxHeightInput, 10) === linkPreviewImageMaxHeight\n                  ? 'Secondary'\n                  : 'Success'\n              }\n              size=\"300\"\n              radii=\"300\"\n              type=\"number\"\n              min=\"1\"\n              max=\"4096\"\n              value={linkPreviewMaxHeightInput}\n              onChange={handleLinkPreviewMaxHeightChange}\n              onKeyDown={onNumberInputKeyDown(() =>\n                setLinkPreviewMaxHeightInput(linkPreviewImageMaxHeight.toString())\n              )}\n              after={<Text size=\"T300\">px</Text>}\n              outlined\n            />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n\nfunction SubnestedSpaceLinkDepthInput() {\n  const [subspaceHierarchyLimit, setSubspaceHierarchyLimit] = useSetting(\n    settingsAtom,\n    'subspaceHierarchyLimit'\n  );\n  const [inputValue, setInputValue] = useState(subspaceHierarchyLimit.toString());\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setInputValue(val);\n\n    const parsed = parseInt(val, 10);\n    if (!Number.isNaN(parsed) && parsed >= 2 && parsed <= 10) {\n      setSubspaceHierarchyLimit(parsed);\n    }\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      evt.stopPropagation();\n      setInputValue(subspaceHierarchyLimit.toString());\n      (evt.target as HTMLInputElement).blur();\n    }\n\n    if (isKeyHotkey('enter', evt)) {\n      (evt.target as HTMLInputElement).blur();\n    }\n  };\n\n  return (\n    <Input\n      style={{ width: toRem(80) }}\n      variant={parseInt(inputValue, 10) === subspaceHierarchyLimit ? 'Secondary' : 'Success'}\n      size=\"300\"\n      radii=\"300\"\n      type=\"number\"\n      min=\"1\"\n      max=\"10\"\n      value={inputValue}\n      onChange={handleChange}\n      onKeyDown={handleKeyDown}\n      outlined\n    />\n  );\n}\n\nfunction PageZoomInput() {\n  const [pageZoom, setPageZoom] = useSetting(settingsAtom, 'pageZoom');\n  const [currentZoom, setCurrentZoom] = useState(`${pageZoom}`);\n\n  const handleZoomChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    setCurrentZoom(evt.target.value);\n  };\n\n  const handleZoomEnter: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      evt.stopPropagation();\n      setCurrentZoom(pageZoom.toString());\n    }\n    if (\n      isKeyHotkey('enter', evt) &&\n      'value' in evt.target &&\n      typeof evt.target.value === 'string'\n    ) {\n      const newZoom = Number.parseInt(evt.target.value, 10);\n      if (Number.isNaN(newZoom)) return;\n      const safeZoom = Math.max(Math.min(newZoom, 150), 75);\n      setPageZoom(safeZoom);\n      setCurrentZoom(safeZoom.toString());\n    }\n  };\n\n  return (\n    <Input\n      style={{ width: toRem(100) }}\n      variant={pageZoom === Number.parseInt(currentZoom, 10) ? 'Secondary' : 'Success'}\n      size=\"300\"\n      radii=\"300\"\n      type=\"number\"\n      min=\"75\"\n      max=\"150\"\n      value={currentZoom}\n      onChange={handleZoomChange}\n      onKeyDown={handleZoomEnter}\n      after={<Text size=\"T300\">%</Text>}\n      outlined\n    />\n  );\n}\n\nfunction PanelSelector({\n  sidebarSelector,\n  setSidebarSelector,\n}: {\n  sidebarSelector: PanelSizeKey;\n  setSidebarSelector: (key: PanelSizeKey) => void;\n}) {\n  return (\n    <SettingMenuSelector\n      value={sidebarSelector}\n      options={PANEL_SIZE_OPTIONS}\n      onSelect={setSidebarSelector}\n    />\n  );\n}\nfunction SidebarWidth({ sidebarSelector }: { sidebarSelector: PanelSizeKey }) {\n  const [roomSidebarWidth, setRoomSidebarWidth] = useSetting(settingsAtom, 'roomSidebarWidth');\n  const [memberSidebarWidth, setMemberSidebarWidth] = useSetting(\n    settingsAtom,\n    'memberSidebarWidth'\n  );\n  const [threadSidebarWidth, setThreadSidebarWidth] = useSetting(\n    settingsAtom,\n    'threadSidebarWidth'\n  );\n  const [threadRootHeight, setThreadRootHeight] = useSetting(settingsAtom, 'threadRootHeight');\n  const [vcmsgSidebarWidth, setvcmsgSidebarWidth] = useSetting(settingsAtom, 'vcmsgSidebarWidth');\n  const [widgetSidebarWidth, setWidgetSidebarWidth] = useSetting(\n    settingsAtom,\n    'widgetSidebarWidth'\n  );\n  const [roomBannerHeight, setRoomBannerHeight] = useSetting(settingsAtom, 'roomBannerHeight');\n\n  // Yandere style code but it works  and is as straight forward as can be :shrug:\n  const getCurValue = useMemo(() => {\n    if (sidebarSelector === 'roomSidebarWidth') return roomSidebarWidth;\n    if (sidebarSelector === 'memberSidebarWidth') return memberSidebarWidth;\n    if (sidebarSelector === 'threadSidebarWidth') return threadSidebarWidth;\n    if (sidebarSelector === 'threadRootHeight') return threadRootHeight;\n    if (sidebarSelector === 'vcmsgSidebarWidth') return vcmsgSidebarWidth;\n    if (sidebarSelector === 'widgetSidebarWidth') return widgetSidebarWidth;\n    if (sidebarSelector === 'roomBannerHeight') return roomBannerHeight;\n    return undefined;\n  }, [\n    sidebarSelector,\n    roomSidebarWidth,\n    memberSidebarWidth,\n    threadSidebarWidth,\n    threadRootHeight,\n    vcmsgSidebarWidth,\n    widgetSidebarWidth,\n    roomBannerHeight,\n  ]);\n  const [curValue, setCurValue] = useState(getCurValue);\n  const setValue = (value: number) => {\n    if (sidebarSelector === 'roomSidebarWidth') setRoomSidebarWidth(value);\n    if (sidebarSelector === 'memberSidebarWidth') setMemberSidebarWidth(value);\n    if (sidebarSelector === 'threadSidebarWidth') setThreadSidebarWidth(value);\n    if (sidebarSelector === 'threadRootHeight') setThreadRootHeight(value);\n    if (sidebarSelector === 'vcmsgSidebarWidth') setvcmsgSidebarWidth(value);\n    if (sidebarSelector === 'widgetSidebarWidth') setWidgetSidebarWidth(value);\n    if (sidebarSelector === 'roomBannerHeight') setRoomBannerHeight(value);\n  };\n\n  useEffect(() => {\n    setInputValue(curValue?.toString());\n  }, [curValue]);\n  useEffect(() => {\n    setCurValue(getCurValue);\n  }, [getCurValue]);\n\n  const [inputValue, setInputValue] = useState(curValue?.toString());\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setInputValue(val);\n\n    const parsed = parseInt(val, 10);\n    if (!Number.isNaN(parsed)) {\n      setValue(parsed);\n    }\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      evt.stopPropagation();\n      setInputValue(curValue?.toString());\n      (evt.target as HTMLInputElement).blur();\n    }\n\n    if (isKeyHotkey('enter', evt)) {\n      (evt.target as HTMLInputElement).blur();\n    }\n  };\n\n  return (\n    <Input\n      style={{ width: toRem(80) }}\n      variant={parseInt(inputValue ?? '', 10) === curValue ? 'Secondary' : 'Success'}\n      size=\"300\"\n      radii=\"300\"\n      type=\"number\"\n      min=\"0\"\n      max=\"1000\"\n      value={inputValue}\n      onChange={handleChange}\n      onKeyDown={handleKeyDown}\n      outlined\n    />\n  );\n}\n\nfunction SelectShowRoomIcon() {\n  const [showRoomIcon, setShowRoomIcon] = useSetting(settingsAtom, 'showRoomIcon');\n\n  return (\n    <SettingMenuSelector\n      value={showRoomIcon}\n      options={SHOW_ROOM_ICON_OPTIONS}\n      onSelect={setShowRoomIcon}\n    />\n  );\n}\nexport function Appearance({\n  onThemeBrowserOpenChange,\n}: {\n  onThemeBrowserOpenChange?: (open: boolean) => void;\n} = {}) {\n  const [sidebarSelector, setSidebarSelector] = useState<PanelSizeKey>('roomSidebarWidth');\n  const [twitterEmoji, setTwitterEmoji] = useSetting(settingsAtom, 'twitterEmoji');\n  const [customDMCards, setCustomDMCards] = useSetting(settingsAtom, 'customDMCards');\n  const [showEasterEggs, setShowEasterEggs] = useSetting(settingsAtom, 'showEasterEggs');\n  const [showRoomIcon] = useSetting(settingsAtom, 'showRoomIcon');\n  const [themeBrowserOpen, setThemeBrowserOpen] = useState(false);\n  const [closeFoldersByDefault, setCloseFoldersByDefault] = useSetting(\n    settingsAtom,\n    'closeFoldersByDefault'\n  );\n  const [roomIconOverlay, setRoomIconOverlay] = useSetting(settingsAtom, 'roomIconOverlay');\n\n  return (\n    <Box direction=\"Column\" gap=\"700\">\n      <ThemeAppearanceSection\n        onBrowseOpenChange={(open) => {\n          setThemeBrowserOpen(open);\n          onThemeBrowserOpenChange?.(open);\n        }}\n      />\n      {!themeBrowserOpen && (\n        <>\n          <ThemeVisualPreferences />\n          <CodeBlockThemeSettings />\n\n          <Box direction=\"Column\" gap=\"100\">\n            <Text size=\"L400\">Visual Tweaks</Text>\n\n            <SettingToggle\n              title=\"Twitter Emoji\"\n              focusId=\"twitter-emoji\"\n              description=\"Use Twitter-style emojis instead of system native ones.\"\n              value={twitterEmoji}\n              onChange={setTwitterEmoji}\n            />\n\n            <SettingToggle\n              title=\"Close Space Folders by Default\"\n              focusId=\"collapse-folders-by-default\"\n              description=\"Collapse sidebar folders upon loading.\"\n              value={closeFoldersByDefault}\n              onChange={setCloseFoldersByDefault}\n            />\n\n            <SettingToggle\n              title=\"Customize DM cards\"\n              focusId=\"customize-dm-cards\"\n              description=\"Show a custom DM card instead of the DM-ed's details\"\n              value={customDMCards}\n              onChange={setCustomDMCards}\n            />\n\n            <SettingToggle\n              title=\"Allow Whimsy\"\n              focusId=\"show-easter-eggs\"\n              description=\"Lets the interface keep a little mischief turned on.\"\n              value={showEasterEggs}\n              onChange={setShowEasterEggs}\n            />\n\n            <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n              <SettingTile title=\"Page Zoom\" focusId=\"page-zoom\" after={<PageZoomInput />} />\n            </SequenceCard>\n\n            <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n              <SettingTile\n                title=\"Subspace Hierarchy Limit\"\n                focusId=\"subspace-hierarchy-limit\"\n                description=\"The maximum nesting depth for Subspaces in the sidebar. Once this limit is reached, deeper Subspaces appear as links instead of nested folders.\"\n                after={<SubnestedSpaceLinkDepthInput />}\n              />\n            </SequenceCard>\n\n            <SettingToggle\n              title=\"Overlay Room Privacy Icons\"\n              focusId=\"room-icon-overlay\"\n              description=\"When enabled, public and private rooms show a globe or lock badge over the room hash icon in the sidebar. When disabled, show the globe or lock icon alone.\"\n              value={roomIconOverlay}\n              onChange={setRoomIconOverlay}\n            />\n\n            <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n              <SettingTile\n                title=\"Show Room Icons In Sidebars\"\n                focusId=\"show-room-icons\"\n                description={\n                  <>\n                    <Text size=\"T200\">\n                      When do you want to show the specific room icons in the sidebar?\n                    </Text>\n                    {(showRoomIcon === ShowRoomIcon.Always &&\n                      'Always show icons, and fallback to initials') ||\n                      (showRoomIcon === ShowRoomIcon.Strict &&\n                        'Show icons when available, but fallback to hashes') ||\n                      (showRoomIcon === ShowRoomIcon.Smart &&\n                        'Show icons only when sidebar is minimized, else icons.') ||\n                      (showRoomIcon === ShowRoomIcon.Never &&\n                        'Never show icons, always only the hashes.') ||\n                      ''}\n                    <span style={{ opacity: '50%' }}>{' (current)'}</span>\n                  </>\n                }\n                after={<SelectShowRoomIcon />}\n              />\n            </SequenceCard>\n            {/*THIS SHOULD BE MOVED TO A NEW SETTINGS MENU INSIDE OF THE HOME SETTINGS AS SOON AS THERE IS A REASON TO CREATE A HOME MENU SETTINGS PANEL\n              it is currently here because it would be eerie to have an entire home settings menu for just one single setting*/}\n            <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n              <SettingTile\n                title=\"Show Room Icons In Home menu sidebar\"\n                focusId=\"show-room-home-icons\"\n                description=\"Show Room icons in the home menu? (overrides setting above if set)\"\n                after={<SelectShowPerRoomRoomIcon roomId={'Home'} />}\n              />\n            </SequenceCard>\n\n            <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n              <SettingTile\n                title=\"Sidebar Size\"\n                focusId=\"sidebar-size\"\n                description=\"The Size of the sidebar, it can be changed either here numerically or by hovering and dragging the lighting bar\"\n                after={\n                  <>\n                    <PanelSelector\n                      sidebarSelector={sidebarSelector}\n                      setSidebarSelector={setSidebarSelector}\n                    />\n                    <SidebarWidth sidebarSelector={sidebarSelector} />\n                  </>\n                }\n              />\n            </SequenceCard>\n          </Box>\n        </>\n      )}\n    </Box>\n  );\n}\n","import { Box, Input, Switch, Text } from 'folds';\nimport { SettingTile } from '$components/setting-tile';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { useEffect, useState } from 'react';\nimport { getSettings, setSettings } from '$state/settings';\n\ntype LanguageSpecificPronounsConfig = {\n  enabled?: boolean | string;\n  languages?: string[];\n};\n\nconst resolveLanguageSpecificPronounsEnabled = (\n  enabled: LanguageSpecificPronounsConfig['enabled']\n): boolean => {\n  if (enabled === undefined) return false;\n  if (typeof enabled === 'boolean') return enabled;\n  const normalized = enabled.trim().toLowerCase();\n  if (normalized === 'false' || normalized === '0' || normalized === 'off' || normalized === 'no')\n    return false;\n  if (normalized === 'true' || normalized === '1' || normalized === 'on' || normalized === 'yes')\n    return true;\n  return false;\n};\n\n// utility function to split a comma separated list of languages and trim whitespace\nfunction splitAndTrimLanguages(languages: string): string[] {\n  return languages\n    .split(',')\n    .map((lang) => lang.trim())\n    .filter((lang) => lang.length > 0);\n}\n\n// MSC4247 allows users to set pronouns in different languages\nexport function LanguageSpecificPronouns() {\n  const [useLanguageSpecificPronouns, setEnabled] = useState(false);\n  const [languageList, setLanguageList] = useState('');\n\n  // common handler for saving changes to the language specific pronouns settings\n  const handleSave = (enabled: boolean, languages: string) => {\n    const currentSettings = getSettings();\n    setSettings({\n      ...currentSettings,\n      filterPronounsBasedOnLanguage: enabled,\n      filterPronounsLanguages: splitAndTrimLanguages(languages),\n    });\n  };\n\n  // handler for when the language list input changes\n  const handleLanguageListChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const val = e.target.value.trim();\n    setLanguageList(val);\n    // save the new language list to the client config, keeping the enabled state unchanged\n    handleSave(getSettings().filterPronounsBasedOnLanguage ?? false, val);\n  };\n\n  useEffect(() => {\n    setEnabled(\n      resolveLanguageSpecificPronounsEnabled(getSettings().filterPronounsBasedOnLanguage ?? false)\n    );\n    setLanguageList(getSettings().filterPronounsLanguages?.join(',') || '');\n  }, []);\n\n  // handler for toggling the enabled state of language specific pronouns\n  const handleSetEnabled = (enabled: boolean) => {\n    handleSave(enabled, getSettings().filterPronounsLanguages?.join(',') || '');\n    setEnabled(enabled);\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Language Specific Pronouns</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"100\"\n      >\n        <SettingTile\n          title=\"Show pronouns only in selected language\"\n          focusId=\"show-pronouns-only-in-selected-language\"\n          description=\"If enabled, pronouns are only shown when they match your selected language. This helps if your contacts set pronouns in different languages. It doesn't affect how your pronouns are shared with others.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={useLanguageSpecificPronouns}\n              onChange={handleSetEnabled}\n            />\n          }\n        />\n        {useLanguageSpecificPronouns && (\n          <SettingTile\n            title=\"Selected language for pronouns\"\n            focusId=\"selected-language-for-pronouns\"\n            description=\"The language to show pronouns for when the above setting is enabled.\"\n            after={\n              <Input\n                value={languageList}\n                size=\"300\"\n                radii=\"300\"\n                variant=\"Secondary\"\n                // input should be a comma separated list of language codes, e.g. \"en\", \"de\", \"en,de\"\n                placeholder=\"Language code (e.g. 'en', 'de', 'en,de')\"\n                disabled={!useLanguageSpecificPronouns}\n                onChange={handleLanguageListChange}\n                style={{ width: '232px' }}\n              />\n            }\n          />\n        )}\n      </SequenceCard>\n    </Box>\n  );\n}\n","export default \"__VITE_ASSET__NHJ6QB3ZVMf35ip30RyL0A__\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%20512%20512'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3clinearGradient%20id='g1'%3e%3cstop%20stop-color='%23000'/%3e%3cstop%20offset='.075'%20stop-color='%23676767'/%3e%3cstop%20offset='.15'%20stop-color='%23cdcdcd'/%3e%3cstop%20offset='.185'%20stop-color='%23e6e6e6'/%3e%3cstop%20offset='.22'%20stop-color='%23fff'/%3e%3cstop%20offset='.25'%20stop-color='%23fff'/%3e%3cstop%20offset='.28'%20stop-color='%23fff'/%3e%3cstop%20offset='.39'%20stop-color='%23e4efc9'/%3e%3cstop%20offset='.5'%20stop-color='%23baf484'/%3e%3cstop%20offset='.61'%20stop-color='%23e4efc9'/%3e%3cstop%20offset='.72'%20stop-color='%23fff'/%3e%3cstop%20offset='.75'%20stop-color='%23fff'/%3e%3cstop%20offset='.78'%20stop-color='%23fff'/%3e%3cstop%20offset='.815'%20stop-color='%23e6e6e6'/%3e%3cstop%20offset='.85'%20stop-color='%23cdcdcd'/%3e%3cstop%20offset='.925'%20stop-color='%23676767'/%3e%3cstop%20offset='1'%20stop-color='%23000'/%3e%3c/linearGradient%3e%3c/defs%3e%3ccircle%20fill='%231a1c28'%20cx='256'%20cy='256'%20r='256'/%3e%3cpath%20fill='url(%23g1)'%20d='M281.22266%2061.638672C252.51454%2062.340869%20242.25%2096.445312%20242.25%2096.445312s21.86199-.227888%2038.08398%202c19.65916%202.699828%2036.77735%208.470708%2036.77735%208.470708s-12.11665-45.858806-35.88867-45.277348zm-104.77735%2017.472656c-48.18496%202.028265-80.827932%2069.713192-12.08398%20159.111332.80656%201.04883-3.85279%202.3732-12.25-6.08399-14.29505-14.39719-25.27735-39.58398-25.27735-39.58398s-30.436281%2090.74068-54.556636%20125.36133c-11.322288%2016.25087-23.296412%2029.36278-34.673828%2040.0664%2036.151472%2077.35634%20112.144354%20132.24302%20201.664064%20138.37696.39018-1.71398.87261-3.37593%201.17773-5.13672%2012.03483-69.44913%2043.76694-131.34524%20116.10938-144.72266%2087.13409-16.11287%20100.05664-65.19531%20100.05664-65.19531s-22.84799-6.68744-23.72266-24.47071c-.72761-14.76952%2026.44531-16%2026.44531-16s-16.78002-12.90506-42.25-31.02929c-14.15717-10.07649-23.71663-44.74674-63.55664-75.52735-42.51354-32.84961-109.55468-29.36132-109.55468-29.36132s11.18932%2019.49626%2011.88867%2025.47265c1.15061%209.83808-4.14406.85935-4.80664-.19336-20.4065-35.136179-46.82452-50.026406-69.88867-51.083982-1.58601-.07268-3.16642-.06541-4.72071%200zm155.22071%20121.777342c11.37691-.77289%2021.73754%206.54405%2024.80664%2017.52735l.88867%206.47265c0%2012.65369-9.79136%2023.13771-22.41602%2024-12.62504.86151-23.7539-8.18586-25.47265-20.72265-1.71877-12.53682%206.55284-24.26336%2018.94336-26.83204a23.47%2023.47%200%20013.25-.44531z'/%3e%3cpath%20fill='%231a1c28'%20d='M177.84845%20197.13285s-44.43023-63.57598-8.46796-99.538252c26.21392-26.213922%2064.86752%2030.516502%2064.86752%2030.516502s-40.50667-3.42071-42.97866%2011.82315c-1.00026%206.16799%2014.37955%2010.70468%2014.37955%2010.70468s-10.86453%2014.69916-15.49793%2022.44815c-4.63345%207.74898-12.30252%2024.04577-12.30252%2024.04577z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%20512%20512'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3clinearGradient%20id='g1'%3e%3cstop%20stop-color='%23ff0080'/%3e%3cstop%20offset='.25'%20stop-color='%23c8259d'/%3e%3cstop%20offset='.5'%20stop-color='%238c4799'/%3e%3cstop%20offset='.75'%20stop-color='%23442e9f'/%3e%3cstop%20offset='1'%20stop-color='%230032a0'/%3e%3c/linearGradient%3e%3c/defs%3e%3ccircle%20fill='%231a1c28'%20cx='256'%20cy='256'%20r='256'/%3e%3cpath%20fill='url(%23g1)'%20d='M281.22266%2061.638672C252.51454%2062.340869%20242.25%2096.445312%20242.25%2096.445312s21.86199-.227888%2038.08398%202c19.65916%202.699828%2036.77735%208.470708%2036.77735%208.470708s-12.11665-45.858806-35.88867-45.277348zm-104.77735%2017.472656c-48.18496%202.028265-80.827932%2069.713192-12.08398%20159.111332.80656%201.04883-3.85279%202.3732-12.25-6.08399-14.29505-14.39719-25.27735-39.58398-25.27735-39.58398s-30.436281%2090.74068-54.556636%20125.36133c-11.322288%2016.25087-23.296412%2029.36278-34.673828%2040.0664%2036.151472%2077.35634%20112.144354%20132.24302%20201.664064%20138.37696.39018-1.71398.87261-3.37593%201.17773-5.13672%2012.03483-69.44913%2043.76694-131.34524%20116.10938-144.72266%2087.13409-16.11287%20100.05664-65.19531%20100.05664-65.19531s-22.84799-6.68744-23.72266-24.47071c-.72761-14.76952%2026.44531-16%2026.44531-16s-16.78002-12.90506-42.25-31.02929c-14.15717-10.07649-23.71663-44.74674-63.55664-75.52735-42.51354-32.84961-109.55468-29.36132-109.55468-29.36132s11.18932%2019.49626%2011.88867%2025.47265c1.15061%209.83808-4.14406.85935-4.80664-.19336-20.4065-35.136179-46.82452-50.026406-69.88867-51.083982-1.58601-.07268-3.16642-.06541-4.72071%200zm155.22071%20121.777342c11.37691-.77289%2021.73754%206.54405%2024.80664%2017.52735l.88867%206.47265c0%2012.65369-9.79136%2023.13771-22.41602%2024-12.62504.86151-23.7539-8.18586-25.47265-20.72265-1.71877-12.53682%206.55284-24.26336%2018.94336-26.83204a23.47%2023.47%200%20013.25-.44531z'/%3e%3cpath%20fill='%231a1c28'%20d='M177.84845%20197.13285s-44.43023-63.57598-8.46796-99.538252c26.21392-26.213922%2064.86752%2030.516502%2064.86752%2030.516502s-40.50667-3.42071-42.97866%2011.82315c-1.00026%206.16799%2014.37955%2010.70468%2014.37955%2010.70468s-10.86453%2014.69916-15.49793%2022.44815c-4.63345%207.74898-12.30252%2024.04577-12.30252%2024.04577z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%20512%20512'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3clinearGradient%20id='g1'%3e%3cstop%20stop-color='%2355cdfc'/%3e%3cstop%20offset='.25'%20stop-color='%23b39de9'/%3e%3cstop%20offset='.5'%20stop-color='%23f7a8b8'/%3e%3cstop%20offset='.75'%20stop-color='%23f6d8dd'/%3e%3cstop%20offset='1'%20stop-color='%23fff'/%3e%3c/linearGradient%3e%3c/defs%3e%3ccircle%20fill='%231a1c28'%20cx='256'%20cy='256'%20r='256'/%3e%3cpath%20fill='url(%23g1)'%20d='M281.22266%2061.638672C252.51454%2062.340869%20242.25%2096.445312%20242.25%2096.445312s21.86199-.227888%2038.08398%202c19.65916%202.699828%2036.77735%208.470708%2036.77735%208.470708s-12.11665-45.858806-35.88867-45.277348zm-104.77735%2017.472656c-48.18496%202.028265-80.827932%2069.713192-12.08398%20159.111332.80656%201.04883-3.85279%202.3732-12.25-6.08399-14.29505-14.39719-25.27735-39.58398-25.27735-39.58398s-30.436281%2090.74068-54.556636%20125.36133c-11.322288%2016.25087-23.296412%2029.36278-34.673828%2040.0664%2036.151472%2077.35634%20112.144354%20132.24302%20201.664064%20138.37696.39018-1.71398.87261-3.37593%201.17773-5.13672%2012.03483-69.44913%2043.76694-131.34524%20116.10938-144.72266%2087.13409-16.11287%20100.05664-65.19531%20100.05664-65.19531s-22.84799-6.68744-23.72266-24.47071c-.72761-14.76952%2026.44531-16%2026.44531-16s-16.78002-12.90506-42.25-31.02929c-14.15717-10.07649-23.71663-44.74674-63.55664-75.52735-42.51354-32.84961-109.55468-29.36132-109.55468-29.36132s11.18932%2019.49626%2011.88867%2025.47265c1.15061%209.83808-4.14406.85935-4.80664-.19336-20.4065-35.136179-46.82452-50.026406-69.88867-51.083982-1.58601-.07268-3.16642-.06541-4.72071%200zm155.22071%20121.777342c11.37691-.77289%2021.73754%206.54405%2024.80664%2017.52735l.88867%206.47265c0%2012.65369-9.79136%2023.13771-22.41602%2024-12.62504.86151-23.7539-8.18586-25.47265-20.72265-1.71877-12.53682%206.55284-24.26336%2018.94336-26.83204a23.47%2023.47%200%20013.25-.44531z'/%3e%3cpath%20fill='%231a1c28'%20d='M177.84845%20197.13285s-44.43023-63.57598-8.46796-99.538252c26.21392-26.213922%2064.86752%2030.516502%2064.86752%2030.516502s-40.50667-3.42071-42.97866%2011.82315c-1.00026%206.16799%2014.37955%2010.70468%2014.37955%2010.70468s-10.86453%2014.69916-15.49793%2022.44815c-4.63345%207.74898-12.30252%2024.04577-12.30252%2024.04577z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%20512%20512'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3clinearGradient%20id='g1'%3e%3cstop%20stop-color='%23ffd900'/%3e%3cstop%20offset='.5'%20stop-color='%23e63661'/%3e%3cstop%20offset='1'%20stop-color='%239d00fd'/%3e%3c/linearGradient%3e%3c/defs%3e%3ccircle%20fill='%231a1c28'%20cx='256'%20cy='256'%20r='256'/%3e%3cpath%20fill='url(%23g1)'%20d='M281.22266%2061.638672C252.51454%2062.340869%20242.25%2096.445312%20242.25%2096.445312s21.86199-.227888%2038.08398%202c19.65916%202.699828%2036.77735%208.470708%2036.77735%208.470708s-12.11665-45.858806-35.88867-45.277348zm-104.77735%2017.472656c-48.18496%202.028265-80.827932%2069.713192-12.08398%20159.111332.80656%201.04883-3.85279%202.3732-12.25-6.08399-14.29505-14.39719-25.27735-39.58398-25.27735-39.58398s-30.436281%2090.74068-54.556636%20125.36133c-11.322288%2016.25087-23.296412%2029.36278-34.673828%2040.0664%2036.151472%2077.35634%20112.144354%20132.24302%20201.664064%20138.37696.39018-1.71398.87261-3.37593%201.17773-5.13672%2012.03483-69.44913%2043.76694-131.34524%20116.10938-144.72266%2087.13409-16.11287%20100.05664-65.19531%20100.05664-65.19531s-22.84799-6.68744-23.72266-24.47071c-.72761-14.76952%2026.44531-16%2026.44531-16s-16.78002-12.90506-42.25-31.02929c-14.15717-10.07649-23.71663-44.74674-63.55664-75.52735-42.51354-32.84961-109.55468-29.36132-109.55468-29.36132s11.18932%2019.49626%2011.88867%2025.47265c1.15061%209.83808-4.14406.85935-4.80664-.19336-20.4065-35.136179-46.82452-50.026406-69.88867-51.083982-1.58601-.07268-3.16642-.06541-4.72071%200zm155.22071%20121.777342c11.37691-.77289%2021.73754%206.54405%2024.80664%2017.52735l.88867%206.47265c0%2012.65369-9.79136%2023.13771-22.41602%2024-12.62504.86151-23.7539-8.18586-25.47265-20.72265-1.71877-12.53682%206.55284-24.26336%2018.94336-26.83204a23.47%2023.47%200%20013.25-.44531z'/%3e%3cpath%20fill='%231a1c28'%20d='M177.84845%20197.13285s-44.43023-63.57598-8.46796-99.538252c26.21392-26.213922%2064.86752%2030.516502%2064.86752%2030.516502s-40.50667-3.42071-42.97866%2011.82315c-1.00026%206.16799%2014.37955%2010.70468%2014.37955%2010.70468s-10.86453%2014.69916-15.49793%2022.44815c-4.63345%207.74898-12.30252%2024.04577-12.30252%2024.04577z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%20512%20512'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3clinearGradient%20id='g1'%3e%3cstop%20stop-color='%23d52c00'/%3e%3cstop%20offset='.225'%20stop-color='%23e29688'/%3e%3cstop%20offset='.45'%20stop-color='%23fff'/%3e%3cstop%20offset='.5'%20stop-color='%23fff'/%3e%3cstop%20offset='.55'%20stop-color='%23fff'/%3e%3cstop%20offset='.775'%20stop-color='%23d27fa4'/%3e%3cstop%20offset='1'%20stop-color='%23a20262'/%3e%3c/linearGradient%3e%3c/defs%3e%3ccircle%20fill='%231a1c28'%20cx='256'%20cy='256'%20r='256'/%3e%3cpath%20fill='url(%23g1)'%20d='M281.22266%2061.638672C252.51454%2062.340869%20242.25%2096.445312%20242.25%2096.445312s21.86199-.227888%2038.08398%202c19.65916%202.699828%2036.77735%208.470708%2036.77735%208.470708s-12.11665-45.858806-35.88867-45.277348zm-104.77735%2017.472656c-48.18496%202.028265-80.827932%2069.713192-12.08398%20159.111332.80656%201.04883-3.85279%202.3732-12.25-6.08399-14.29505-14.39719-25.27735-39.58398-25.27735-39.58398s-30.436281%2090.74068-54.556636%20125.36133c-11.322288%2016.25087-23.296412%2029.36278-34.673828%2040.0664%2036.151472%2077.35634%20112.144354%20132.24302%20201.664064%20138.37696.39018-1.71398.87261-3.37593%201.17773-5.13672%2012.03483-69.44913%2043.76694-131.34524%20116.10938-144.72266%2087.13409-16.11287%20100.05664-65.19531%20100.05664-65.19531s-22.84799-6.68744-23.72266-24.47071c-.72761-14.76952%2026.44531-16%2026.44531-16s-16.78002-12.90506-42.25-31.02929c-14.15717-10.07649-23.71663-44.74674-63.55664-75.52735-42.51354-32.84961-109.55468-29.36132-109.55468-29.36132s11.18932%2019.49626%2011.88867%2025.47265c1.15061%209.83808-4.14406.85935-4.80664-.19336-20.4065-35.136179-46.82452-50.026406-69.88867-51.083982-1.58601-.07268-3.16642-.06541-4.72071%200zm155.22071%20121.777342c11.37691-.77289%2021.73754%206.54405%2024.80664%2017.52735l.88867%206.47265c0%2012.65369-9.79136%2023.13771-22.41602%2024-12.62504.86151-23.7539-8.18586-25.47265-20.72265-1.71877-12.53682%206.55284-24.26336%2018.94336-26.83204a23.47%2023.47%200%20013.25-.44531z'/%3e%3cpath%20fill='%231a1c28'%20d='M177.84845%20197.13285s-44.43023-63.57598-8.46796-99.538252c26.21392-26.213922%2064.86752%2030.516502%2064.86752%2030.516502s-40.50667-3.42071-42.97866%2011.82315c-1.00026%206.16799%2014.37955%2010.70468%2014.37955%2010.70468s-10.86453%2014.69916-15.49793%2022.44815c-4.63345%207.74898-12.30252%2024.04577-12.30252%2024.04577z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%20512%20512'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3clinearGradient%20id='g1'%3e%3cstop%20stop-color='%23078d6f'/%3e%3cstop%20offset='.225'%20stop-color='%2398ca99'/%3e%3cstop%20offset='.45'%20stop-color='%23fff'/%3e%3cstop%20offset='.5'%20stop-color='%23fff'/%3e%3cstop%20offset='.55'%20stop-color='%23fff'/%3e%3cstop%20offset='.625'%20stop-color='%23cdd0ea'/%3e%3cstop%20offset='.7'%20stop-color='%237bade2'/%3e%3cstop%20offset='.85'%20stop-color='%23454cbd'/%3e%3cstop%20offset='1'%20stop-color='%233f1a79'/%3e%3c/linearGradient%3e%3c/defs%3e%3ccircle%20fill='%231a1c28'%20cx='256'%20cy='256'%20r='256'/%3e%3cpath%20fill='url(%23g1)'%20d='M281.22266%2061.638672C252.51454%2062.340869%20242.25%2096.445312%20242.25%2096.445312s21.86199-.227888%2038.08398%202c19.65916%202.699828%2036.77735%208.470708%2036.77735%208.470708s-12.11665-45.858806-35.88867-45.277348zm-104.77735%2017.472656c-48.18496%202.028265-80.827932%2069.713192-12.08398%20159.111332.80656%201.04883-3.85279%202.3732-12.25-6.08399-14.29505-14.39719-25.27735-39.58398-25.27735-39.58398s-30.436281%2090.74068-54.556636%20125.36133c-11.322288%2016.25087-23.296412%2029.36278-34.673828%2040.0664%2036.151472%2077.35634%20112.144354%20132.24302%20201.664064%20138.37696.39018-1.71398.87261-3.37593%201.17773-5.13672%2012.03483-69.44913%2043.76694-131.34524%20116.10938-144.72266%2087.13409-16.11287%20100.05664-65.19531%20100.05664-65.19531s-22.84799-6.68744-23.72266-24.47071c-.72761-14.76952%2026.44531-16%2026.44531-16s-16.78002-12.90506-42.25-31.02929c-14.15717-10.07649-23.71663-44.74674-63.55664-75.52735-42.51354-32.84961-109.55468-29.36132-109.55468-29.36132s11.18932%2019.49626%2011.88867%2025.47265c1.15061%209.83808-4.14406.85935-4.80664-.19336-20.4065-35.136179-46.82452-50.026406-69.88867-51.083982-1.58601-.07268-3.16642-.06541-4.72071%200zm155.22071%20121.777342c11.37691-.77289%2021.73754%206.54405%2024.80664%2017.52735l.88867%206.47265c0%2012.65369-9.79136%2023.13771-22.41602%2024-12.62504.86151-23.7539-8.18586-25.47265-20.72265-1.71877-12.53682%206.55284-24.26336%2018.94336-26.83204a23.47%2023.47%200%20013.25-.44531z'/%3e%3cpath%20fill='%231a1c28'%20d='M177.84845%20197.13285s-44.43023-63.57598-8.46796-99.538252c26.21392-26.213922%2064.86752%2030.516502%2064.86752%2030.516502s-40.50667-3.42071-42.97866%2011.82315c-1.00026%206.16799%2014.37955%2010.70468%2014.37955%2010.70468s-10.86453%2014.69916-15.49793%2022.44815c-4.63345%207.74898-12.30252%2024.04577-12.30252%2024.04577z'/%3e%3c/svg%3e\"","export default \"__VITE_ASSET__4QeQqVAUdwGwQIvMHnqk_g__\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%20512%20512'%20xmlns='http://www.w3.org/2000/svg'%3e%3cdefs%3e%3clinearGradient%20id='g1'%3e%3cstop%20stop-color='%23ed2224'/%3e%3cstop%20offset='.068'%20stop-color='%23f35b22'/%3e%3cstop%20offset='.135'%20stop-color='%23f99621'/%3e%3cstop%20offset='.203'%20stop-color='%23f5c11e'/%3e%3cstop%20offset='.27'%20stop-color='%23f1eb1b'/%3e%3cstop%20offset='.3'%20stop-color='%23f1eb1b'/%3e%3cstop%20offset='.33'%20stop-color='%23f1eb1b'/%3e%3cstop%20offset='.442'%20stop-color='%2363c720'/%3e%3cstop%20offset='.553'%20stop-color='%230c9b49'/%3e%3cstop%20offset='.665'%20stop-color='%2321878d'/%3e%3cstop%20offset='.777'%20stop-color='%233954a5'/%3e%3cstop%20offset='.888'%20stop-color='%2361379b'/%3e%3cstop%20offset='1'%20stop-color='%2393288e'/%3e%3c/linearGradient%3e%3c/defs%3e%3ccircle%20fill='%231a1c28'%20cx='256'%20cy='256'%20r='256'/%3e%3cpath%20fill='url(%23g1)'%20d='M281.22266%2061.638672C252.51454%2062.340869%20242.25%2096.445312%20242.25%2096.445312s21.86199-.227888%2038.08398%202c19.65916%202.699828%2036.77735%208.470708%2036.77735%208.470708s-12.11665-45.858806-35.88867-45.277348zm-104.77735%2017.472656c-48.18496%202.028265-80.827932%2069.713192-12.08398%20159.111332.80656%201.04883-3.85279%202.3732-12.25-6.08399-14.29505-14.39719-25.27735-39.58398-25.27735-39.58398s-30.436281%2090.74068-54.556636%20125.36133c-11.322288%2016.25087-23.296412%2029.36278-34.673828%2040.0664%2036.151472%2077.35634%20112.144354%20132.24302%20201.664064%20138.37696.39018-1.71398.87261-3.37593%201.17773-5.13672%2012.03483-69.44913%2043.76694-131.34524%20116.10938-144.72266%2087.13409-16.11287%20100.05664-65.19531%20100.05664-65.19531s-22.84799-6.68744-23.72266-24.47071c-.72761-14.76952%2026.44531-16%2026.44531-16s-16.78002-12.90506-42.25-31.02929c-14.15717-10.07649-23.71663-44.74674-63.55664-75.52735-42.51354-32.84961-109.55468-29.36132-109.55468-29.36132s11.18932%2019.49626%2011.88867%2025.47265c1.15061%209.83808-4.14406.85935-4.80664-.19336-20.4065-35.136179-46.82452-50.026406-69.88867-51.083982-1.58601-.07268-3.16642-.06541-4.72071%200zm155.22071%20121.777342c11.37691-.77289%2021.73754%206.54405%2024.80664%2017.52735l.88867%206.47265c0%2012.65369-9.79136%2023.13771-22.41602%2024-12.62504.86151-23.7539-8.18586-25.47265-20.72265-1.71877-12.53682%206.55284-24.26336%2018.94336-26.83204a23.47%2023.47%200%20013.25-.44531z'/%3e%3cpath%20fill='%231a1c28'%20d='M177.84845%20197.13285s-44.43023-63.57598-8.46796-99.538252c26.21392-26.213922%2064.86752%2030.516502%2064.86752%2030.516502s-40.50667-3.42071-42.97866%2011.82315c-1.00026%206.16799%2014.37955%2010.70468%2014.37955%2010.70468s-10.86453%2014.69916-15.49793%2022.44815c-4.63345%207.74898-12.30252%2024.04577-12.30252%2024.04577z'/%3e%3c/svg%3e\"","export default \"__VITE_ASSET__J_$Mq9pTS5J3cvi72Dvpzw__\"","import { invoke } from '@tauri-apps/api/core';\nimport { useEffect, useState } from 'react';\n\nimport { SettingMenuSelector } from '$components/setting-menu-selector';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { isAndroidTauri, isMobileTauri } from '$utils/platform';\nimport defaultIcon from './app-icons/default.png';\nimport agenderIcon from '../../../../../src-tauri/icons/app-icons/agender.svg';\nimport bisexualIcon from '../../../../../src-tauri/icons/app-icons/bisexual.svg';\nimport transGradientIcon from '../../../../../src-tauri/icons/app-icons/trans-gradient.svg';\nimport intersexIcon from '../../../../../src-tauri/icons/app-icons/intersex.svg';\nimport lesbianIcon from '../../../../../src-tauri/icons/app-icons/lesbian.svg';\nimport mlmIcon from '../../../../../src-tauri/icons/app-icons/mlm.svg';\nimport propellerIcon from './app-icons/propeller.png';\nimport prideIcon from '../../../../../src-tauri/icons/app-icons/pride.svg';\nimport transIcon from './app-icons/trans.png';\n\nconst PRIMARY_ICON = 'primary';\nconst PROPELLER_ICON = 'propeller';\nconst APP_ICON_PREVIEWS: Record<string, string> = {\n  [PRIMARY_ICON]: defaultIcon,\n  [PROPELLER_ICON]: propellerIcon,\n  agender: agenderIcon,\n  bisexual: bisexualIcon,\n  trans: transIcon,\n  transgradient: transGradientIcon,\n  intersex: intersexIcon,\n  lesbian: lesbianIcon,\n  mlm: mlmIcon,\n  pride: prideIcon,\n};\nconst APP_ICON_LABELS: Record<string, string> = {\n  agender: 'Agender',\n  bisexual: 'Bisexual',\n  trans: 'Trans',\n  transgradient: 'Trans (Gradient)',\n  intersex: 'Intersex',\n  lesbian: 'Lesbian',\n  mlm: 'MLM',\n  pride: 'Pride',\n  [PROPELLER_ICON]: 'Propeller',\n};\n\nfunction AppIconPreview({ icon }: { icon: string }) {\n  const src = APP_ICON_PREVIEWS[icon];\n  if (!src) return null;\n\n  return (\n    <img\n      src={src}\n      alt=\"\"\n      aria-hidden\n      data-testid={`app-icon-preview-${icon}`}\n      width={48}\n      height={48}\n      style={{ borderRadius: isAndroidTauri() ? '50%' : '22.5%' }}\n    />\n  );\n}\n\nexport function AppIconSettings() {\n  const [appIconId, setAppIconId] = useState<string>();\n  const [icons, setIcons] = useState<string[]>();\n  const [changing, setChanging] = useState(false);\n\n  useEffect(() => {\n    if (!isMobileTauri()) return;\n\n    let cancelled = false;\n    Promise.all([\n      invoke<string[]>('plugin:app-icon|get_available_icons'),\n      invoke<string | null>('plugin:app-icon|get_current_icon'),\n    ])\n      .then(([availableIcons, currentIcon]) => {\n        if (cancelled) return;\n        setIcons(availableIcons);\n        setAppIconId(currentIcon && availableIcons.includes(currentIcon) ? currentIcon : undefined);\n      })\n      .catch(() => {\n        if (!cancelled) setIcons([]);\n      });\n\n    return () => {\n      cancelled = true;\n    };\n  }, []);\n\n  if (!icons?.length) return null;\n\n  const options = [\n    { value: PRIMARY_ICON, label: 'Default', icon: <AppIconPreview icon={PRIMARY_ICON} /> },\n    ...icons.map((icon) => ({\n      value: icon,\n      label: APP_ICON_LABELS[icon] ?? icon,\n      icon: <AppIconPreview icon={icon} />,\n    })),\n  ];\n  const selectedIcon = icons.includes(appIconId ?? '') ? appIconId! : PRIMARY_ICON;\n\n  const selectIcon = async (icon: string) => {\n    if (changing || icon === selectedIcon) return;\n\n    setChanging(true);\n    try {\n      await invoke('plugin:app-icon|set_icon', {\n        request: { icon: icon === PRIMARY_ICON ? null : icon },\n      });\n      setAppIconId(icon === PRIMARY_ICON ? undefined : icon);\n    } finally {\n      setChanging(false);\n    }\n  };\n\n  return (\n    <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n      <SettingTile\n        title=\"App Icon\"\n        description=\"Choose the icon shown on your device's home screen.\"\n        focusId=\"app-icon\"\n        after={\n          <SettingMenuSelector\n            value={selectedIcon}\n            options={options}\n            onSelect={selectIcon}\n            loading={changing}\n            optionStyle={{ height: 'auto', minHeight: 64, padding: '8px 12px' }}\n          />\n        }\n      />\n    </SequenceCard>\n  );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { ChangeEventHandler, KeyboardEventHandler, MouseEventHandler } from 'react';\nimport type { RectCords } from 'folds';\nimport { Box, Button, config, Input, Menu, MenuItem, Scroll, Text, toRem } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { CaretDown, composerIcon } from '$components/icons/phosphor';\nimport { isKeyHotkey } from 'is-hotkey';\nimport FocusTrap from 'focus-trap-react';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { useSetting } from '$state/hooks/settings';\nimport type { JumboEmojiSize, RenderUserCardsMode } from '$state/settings';\nimport { settingsAtom } from '$state/settings';\nimport { SettingTile, SettingToggle } from '$components/setting-tile';\nimport { stopPropagation } from '$utils/keyboard';\nimport { Appearance } from './Themes';\nimport { LanguageSpecificPronouns } from './LanguageSpecificPronouns';\nimport { AppIconSettings } from './AppIconSettings';\n\nfunction PronounPillMaxCountInput({ disabled }: { disabled: boolean }) {\n  const [maxCount, setMaxCount] = useSetting(settingsAtom, 'pronounPillMaxCount');\n  const [inputValue, setInputValue] = useState(maxCount.toString());\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setInputValue(val);\n\n    const parsed = Number.parseInt(val, 10);\n    if (!Number.isNaN(parsed) && parsed >= 1 && parsed <= 10) {\n      setMaxCount(parsed);\n    }\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      evt.stopPropagation();\n      setInputValue(maxCount.toString());\n      (evt.target as HTMLInputElement).blur();\n    }\n\n    if (isKeyHotkey('enter', evt)) {\n      (evt.target as HTMLInputElement).blur();\n    }\n  };\n\n  return (\n    <Input\n      style={{ width: toRem(80) }}\n      variant={Number.parseInt(inputValue, 10) === maxCount ? 'Secondary' : 'Success'}\n      size=\"300\"\n      radii=\"300\"\n      type=\"number\"\n      min=\"1\"\n      max=\"10\"\n      value={inputValue}\n      onChange={handleChange}\n      onKeyDown={handleKeyDown}\n      disabled={disabled}\n      outlined\n    />\n  );\n}\n\nfunction PronounPillMaxLengthInput({ disabled }: { disabled: boolean }) {\n  const [maxLength, setMaxLength] = useSetting(settingsAtom, 'pronounPillMaxLength');\n  const [inputValue, setInputValue] = useState(maxLength.toString());\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setInputValue(val);\n\n    const parsed = Number.parseInt(val, 10);\n    if (!Number.isNaN(parsed) && parsed >= 1 && parsed <= 64) {\n      setMaxLength(parsed);\n    }\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      evt.stopPropagation();\n      setInputValue(maxLength.toString());\n      (evt.target as HTMLInputElement).blur();\n    }\n\n    if (isKeyHotkey('enter', evt)) {\n      (evt.target as HTMLInputElement).blur();\n    }\n  };\n\n  return (\n    <Input\n      style={{ width: toRem(80) }}\n      variant={Number.parseInt(inputValue, 10) === maxLength ? 'Secondary' : 'Success'}\n      size=\"300\"\n      radii=\"300\"\n      type=\"number\"\n      min=\"1\"\n      max=\"64\"\n      value={inputValue}\n      onChange={handleChange}\n      onKeyDown={handleKeyDown}\n      disabled={disabled}\n      outlined\n    />\n  );\n}\n\nfunction IconSizePxInput({\n  settingKey,\n  disabled,\n}: {\n  settingKey: 'iconCompactSizePx' | 'iconInlineSizePx' | 'iconToolbarSizePx' | 'iconEmptySizePx';\n  disabled?: boolean;\n}) {\n  const [sizePx, setSizePx] = useSetting(settingsAtom, settingKey);\n  const [inputValue, setInputValue] = useState(sizePx.toString());\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setInputValue(val);\n\n    const parsed = Number.parseInt(val, 10);\n    if (!Number.isNaN(parsed) && parsed >= 0) {\n      setSizePx(parsed);\n    }\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      evt.stopPropagation();\n      setInputValue(sizePx.toString());\n      (evt.target as HTMLInputElement).blur();\n    }\n\n    if (isKeyHotkey('enter', evt)) {\n      (evt.target as HTMLInputElement).blur();\n    }\n  };\n\n  return (\n    <Input\n      style={{ width: toRem(80) }}\n      variant={Number.parseInt(inputValue, 10) === sizePx ? 'Secondary' : 'Success'}\n      size=\"300\"\n      radii=\"300\"\n      type=\"number\"\n      min=\"0\"\n      value={inputValue}\n      onChange={handleChange}\n      onKeyDown={handleKeyDown}\n      disabled={disabled}\n      outlined\n    />\n  );\n}\n\nfunction IconSizeSettings() {\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Icon Sizes</Text>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Compact Icon Size\"\n          focusId=\"icon-compact-size\"\n          description=\"Small icons such as profile chips (default 16px).\"\n          after={<IconSizePxInput settingKey=\"iconCompactSizePx\" />}\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Inline Icon Size\"\n          focusId=\"icon-inline-size\"\n          description=\"Menu items and timeline events (default 20px).\"\n          after={<IconSizePxInput settingKey=\"iconInlineSizePx\" />}\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Toolbar Icon Size\"\n          focusId=\"icon-toolbar-size\"\n          description=\"Composer controls and header icons (default 24px).\"\n          after={<IconSizePxInput settingKey=\"iconToolbarSizePx\" />}\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Empty State Icon Size\"\n          focusId=\"icon-empty-size\"\n          description=\"Other stuff (default 32px).\"\n          after={<IconSizePxInput settingKey=\"iconEmptySizePx\" />}\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n\nconst emojiSizeItems = [\n  { id: 'none', name: 'None (Same size as text)' },\n  { id: 'extraSmall', name: 'Extra Small' },\n  { id: 'small', name: 'Small' },\n  { id: 'normal', name: 'Normal' },\n  { id: 'large', name: 'Large' },\n  { id: 'extraLarge', name: 'Extra Large' },\n];\n\nfunction SelectJumboEmojiSize() {\n  const [menuCords, setMenuCords] = useState<RectCords>();\n  const [jumboEmojiSize, setJumboEmojiSize] = useSetting(settingsAtom, 'jumboEmojiSize');\n\n  const handleMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setMenuCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const handleSelect = (sizeId: string) => {\n    setJumboEmojiSize(sizeId as JumboEmojiSize);\n    setMenuCords(undefined);\n  };\n\n  const currentSizeName = emojiSizeItems.find((i) => i.id === jumboEmojiSize)?.name ?? 'Normal';\n\n  return (\n    <>\n      <Button\n        size=\"300\"\n        variant=\"Secondary\"\n        outlined\n        fill=\"Soft\"\n        radii=\"300\"\n        after={composerIcon(CaretDown)}\n        onClick={handleMenu}\n      >\n        <Text size=\"T300\">{currentSizeName}</Text>\n      </Button>\n      <PopOut\n        anchor={menuCords}\n        offset={5}\n        position=\"Bottom\"\n        align=\"End\"\n        content={\n          <FocusTrap\n            focusTrapOptions={{\n              initialFocus: false,\n              onDeactivate: () => setMenuCords(undefined),\n              clickOutsideDeactivates: true,\n              isKeyForward: (evt: KeyboardEvent) =>\n                evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n              isKeyBackward: (evt: KeyboardEvent) =>\n                evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n              escapeDeactivates: stopPropagation,\n            }}\n          >\n            <Menu>\n              <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                {emojiSizeItems.map((item) => (\n                  <MenuItem\n                    key={item.id}\n                    size=\"300\"\n                    variant={jumboEmojiSize === item.id ? 'Primary' : 'Surface'}\n                    radii=\"300\"\n                    onClick={() => handleSelect(item.id)}\n                  >\n                    <Text size=\"T300\">{item.name}</Text>\n                  </MenuItem>\n                ))}\n              </Box>\n            </Menu>\n          </FocusTrap>\n        }\n      />\n    </>\n  );\n}\n\nconst profileCardRenderItems: { id: RenderUserCardsMode; name: string }[] = [\n  { id: 'both', name: 'Light & dark' },\n  { id: 'light', name: 'Light only' },\n  { id: 'dark', name: 'Dark only' },\n  { id: 'none', name: 'Off' },\n];\n\nfunction SelectRenderCustomProfileCards() {\n  const [menuCords, setMenuCords] = useState<RectCords>();\n  const [renderUserCardsMode, setRenderUserCardsMode] = useSetting(settingsAtom, 'renderUserCards');\n\n  const handleMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setMenuCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const handleSelect = (mode: RenderUserCardsMode) => {\n    setRenderUserCardsMode(mode);\n    setMenuCords(undefined);\n  };\n\n  const currentLabel =\n    profileCardRenderItems.find((i) => i.id === renderUserCardsMode)?.name ?? 'Light & dark';\n\n  return (\n    <>\n      <Button\n        size=\"300\"\n        variant=\"Secondary\"\n        outlined\n        fill=\"Soft\"\n        radii=\"300\"\n        after={composerIcon(CaretDown)}\n        onClick={handleMenu}\n      >\n        <Text size=\"T300\">{currentLabel}</Text>\n      </Button>\n      <PopOut\n        anchor={menuCords}\n        offset={5}\n        position=\"Bottom\"\n        align=\"End\"\n        content={\n          <FocusTrap\n            focusTrapOptions={{\n              initialFocus: false,\n              onDeactivate: () => setMenuCords(undefined),\n              clickOutsideDeactivates: true,\n              isKeyForward: (evt: KeyboardEvent) =>\n                evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n              isKeyBackward: (evt: KeyboardEvent) =>\n                evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n              escapeDeactivates: stopPropagation,\n            }}\n          >\n            <Menu>\n              <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                {profileCardRenderItems.map((item) => (\n                  <MenuItem\n                    key={item.id}\n                    size=\"300\"\n                    variant={renderUserCardsMode === item.id ? 'Primary' : 'Surface'}\n                    radii=\"300\"\n                    onClick={() => handleSelect(item.id)}\n                  >\n                    <Text size=\"T300\">{item.name}</Text>\n                  </MenuItem>\n                ))}\n              </Box>\n            </Menu>\n          </FocusTrap>\n        }\n      />\n    </>\n  );\n}\n\nfunction JumboEmoji() {\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Jumbo Emoji</Text>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Jumbo Emoji Size\"\n          focusId=\"jumbo-emoji-size\"\n          description=\"Adjust the size of emojis sent without text.\"\n          after={<SelectJumboEmojiSize />}\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n\nfunction Privacy() {\n  const [privacyBlur, setPrivacyBlur] = useSetting(settingsAtom, 'privacyBlur');\n  const [privacyBlurAvatars, setPrivacyBlurAvatars] = useSetting(\n    settingsAtom,\n    'privacyBlurAvatars'\n  );\n  const [privacyBlurEmotes, setPrivacyBlurEmotes] = useSetting(settingsAtom, 'privacyBlurEmotes');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Privacy & Security</Text>\n\n      <SettingToggle\n        title=\"Blur Media\"\n        focusId=\"blur-media\"\n        description=\"Blurs images and videos in the timeline.\"\n        value={privacyBlur}\n        onChange={setPrivacyBlur}\n      />\n\n      <SettingToggle\n        title=\"Blur Avatars\"\n        focusId=\"blur-avatars\"\n        description=\"Blurs user profile pictures and room icons.\"\n        value={privacyBlurAvatars}\n        onChange={setPrivacyBlurAvatars}\n      />\n\n      <SettingToggle\n        title=\"Blur Emotes\"\n        focusId=\"blur-emotes\"\n        description=\"Blurs emoticons within messages.\"\n        value={privacyBlurEmotes}\n        onChange={setPrivacyBlurEmotes}\n      />\n    </Box>\n  );\n}\n\nfunction IdentityCosmetics() {\n  const [legacyUsernameColor, setLegacyUsernameColor] = useSetting(\n    settingsAtom,\n    'legacyUsernameColor'\n  );\n  const [showPronouns, setShowPronouns] = useSetting(settingsAtom, 'showPronouns');\n  const [parsePronouns, setParsePronouns] = useSetting(settingsAtom, 'parsePronouns');\n  const [uniformIcons, setUniformIcons] = useSetting(settingsAtom, 'uniformIcons');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Identity</Text>\n      <SettingToggle\n        title=\"Colorful Names\"\n        focusId=\"colorful-names\"\n        description=\"Assign unique colors to users based on their ID. Does not override room/space custom colors. Will override default role colors.\"\n        value={legacyUsernameColor}\n        onChange={setLegacyUsernameColor}\n      />\n      <SettingToggle\n        title=\"Show Pronoun Pills\"\n        focusId=\"show-pronoun-pills\"\n        description=\"Display user pronouns in the message timeline.\"\n        value={showPronouns}\n        onChange={setShowPronouns}\n      />\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showPronouns ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Max Pronoun Pills\"\n          focusId=\"pronoun-pill-max-count\"\n          description=\"Maximum number of pronoun pills shown per user in the timeline. Additional pronouns appear behind the ... pill.\"\n          after={<PronounPillMaxCountInput disabled={!showPronouns} />}\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showPronouns ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Max Pronoun Pill Length\"\n          focusId=\"pronoun-pill-max-length\"\n          description=\"Maximum characters shown in each pronoun pill before truncation.\"\n          after={<PronounPillMaxLengthInput disabled={!showPronouns} />}\n        />\n      </SequenceCard>\n      <SettingToggle\n        title=\"Pronoun Pills for All\"\n        focusId=\"pronoun-pills-for-all\"\n        description=\"Attempts to convert pronouns in names into pills (e.g. [they/them] or (it/its) turns into a pill).\"\n        value={parsePronouns}\n        onChange={setParsePronouns}\n      />\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Render Custom Profile Cards\"\n          focusId=\"custom-profile-cards\"\n          description=\"Choose whose profile card colors to show: everyone with a scheme, only light or dark schemes, or hide them.\"\n          after={<SelectRenderCustomProfileCards />}\n        />\n      </SequenceCard>\n      <SettingToggle\n        title=\"Consistent Icon Style\"\n        focusId=\"consistent-icon-style\"\n        description=\"Harmonize icon appearance with background fill\"\n        value={uniformIcons}\n        onChange={setUniformIcons}\n      />\n    </Box>\n  );\n}\n\ntype CosmeticsProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\n\nexport function Cosmetics({ requestBack, requestClose }: CosmeticsProps) {\n  const [themeBrowserOpen, setThemeBrowserOpen] = useState(false);\n  const appearanceScrollRef = useRef<HTMLDivElement | null>(null);\n\n  useEffect(() => {\n    let timeoutId: number | undefined;\n    const el = appearanceScrollRef.current;\n\n    if (themeBrowserOpen && el) {\n      const scrollToTop = () => {\n        el.scrollTop = 0;\n      };\n\n      scrollToTop();\n      requestAnimationFrame(scrollToTop);\n      timeoutId = window.setTimeout(scrollToTop, 0);\n    }\n\n    return () => {\n      if (timeoutId !== undefined) {\n        window.clearTimeout(timeoutId);\n      }\n    };\n  }, [themeBrowserOpen]);\n\n  return (\n    <SettingsSectionPage title=\"Appearance\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll ref={appearanceScrollRef} hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <Appearance onThemeBrowserOpenChange={setThemeBrowserOpen} />\n              {!themeBrowserOpen && (\n                <>\n                  <IdentityCosmetics />\n                  <AppIconSettings />\n                  <IconSizeSettings />\n                  <JumboEmoji />\n                  <Privacy />\n                  <LanguageSpecificPronouns />\n                </>\n              )}\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","export type CursorDirection = 'forward' | 'backward' | 'none';\n\nexport class Cursor {\n  public readonly start: number;\n\n  public readonly end: number;\n\n  public readonly direction: CursorDirection;\n\n  constructor(start: number, end: number, direction: CursorDirection) {\n    this.start = start;\n    this.end = end;\n    this.direction = direction;\n  }\n\n  static fromTextAreaElement(element: HTMLTextAreaElement) {\n    return new Cursor(element.selectionStart, element.selectionEnd, element.selectionDirection);\n  }\n\n  public get selection() {\n    return this.start !== this.end;\n  }\n\n  public get length() {\n    return this.end - this.start;\n  }\n}\n","import { Cursor } from '$plugins/text-area/Cursor';\nimport type { Operations } from '$plugins/text-area/Operations';\nimport type { TextArea } from '$plugins/text-area/TextArea';\n\nexport class Intent {\n  public readonly textArea: TextArea;\n\n  public readonly operations: Operations;\n\n  public readonly size: number;\n\n  public readonly str: string;\n\n  private intentReg: RegExp;\n\n  constructor(size: number, textArea: TextArea, operations: Operations) {\n    this.textArea = textArea;\n    this.operations = operations;\n    this.size = size;\n    this.intentReg = /^\\s*/;\n\n    this.str = '';\n    for (let i = 0; i < size; i += 1) this.str += ' ';\n  }\n\n  private lineIntent(cursor: Cursor): string {\n    const lines = this.textArea.cursorLines(cursor);\n    const selection = this.textArea.selection(lines);\n    const match = selection.match(this.intentReg);\n    if (!match) return '';\n    return match[0];\n  }\n\n  public moveForward(cursor: Cursor): Cursor {\n    const linesCursor = this.textArea.cursorLines(cursor);\n\n    const selection = this.textArea.selection(linesCursor);\n    const lines = selection.split('\\n');\n\n    const intentLines = lines.map((line) => `${this.str}${line}`);\n    this.operations.insert(linesCursor, intentLines.join('\\n'));\n\n    const addedIntentLength = lines.length * this.str.length;\n    return new Cursor(\n      cursor.start === linesCursor.start ? cursor.start : cursor.start + this.str.length,\n      cursor.end + addedIntentLength,\n      cursor.direction\n    );\n  }\n\n  public moveBackward(cursor: Cursor): Cursor {\n    const linesCursor = this.textArea.cursorLines(cursor);\n\n    const selection = this.textArea.selection(linesCursor);\n    const lines = selection.split('\\n');\n\n    const intentLines = lines.map((line) => {\n      if (line.startsWith(this.str)) return line.substring(this.str.length);\n      return line.replace(this.intentReg, '');\n    });\n    const intentCursor = this.operations.insert(linesCursor, intentLines.join('\\n'));\n\n    const firstLineTrimLength = (lines[0]?.length ?? 0) - (intentLines[0]?.length ?? 0);\n    const lastLine = this.textArea.cursorLines(\n      new Cursor(intentCursor.end, intentCursor.end, 'none')\n    );\n\n    const start = Math.max(cursor.start - firstLineTrimLength, linesCursor.start);\n    const trimmedContentLength = linesCursor.length - intentCursor.length;\n    const end = Math.max(lastLine.start, cursor.end - trimmedContentLength);\n    return new Cursor(start, end, cursor.direction);\n  }\n\n  public addNewLine(cursor: Cursor): Cursor {\n    const lineIntent = this.lineIntent(cursor);\n    const line = `\\n${lineIntent}`;\n\n    const insertCursor = this.operations.insert(cursor, line);\n    return new Cursor(insertCursor.end, insertCursor.end, 'none');\n  }\n\n  public addNextLine(cursor: Cursor): Cursor {\n    const lineIntent = this.lineIntent(cursor);\n    const line = `\\n${lineIntent}`;\n\n    const currentLine = this.textArea.cursorLines(cursor);\n    const lineCursor = new Cursor(currentLine.end, currentLine.end, 'none');\n    const insertCursor = this.operations.insert(lineCursor, line);\n    return new Cursor(insertCursor.end, insertCursor.end, 'none');\n  }\n\n  public addPreviousLine(cursor: Cursor): Cursor {\n    const lineIntent = this.lineIntent(cursor);\n    const line = `\\n${lineIntent}`;\n\n    const prevLine = this.textArea.prevLine(cursor);\n    const insertIndex = prevLine?.end ?? 0;\n    const lineCursor = new Cursor(insertIndex, insertIndex, 'none');\n    const insertCursor = this.operations.insert(lineCursor, line);\n    return new Cursor(insertCursor.end, insertCursor.end, 'none');\n  }\n}\n","import { Cursor } from './Cursor';\nimport type { GetTarget } from './type';\n\nexport class TextArea {\n  private readonly getTarget: GetTarget;\n\n  constructor(getTarget: GetTarget) {\n    this.getTarget = getTarget;\n  }\n\n  get target() {\n    return this.getTarget();\n  }\n\n  public selection(cursor: Cursor): string {\n    return this.target.value.substring(cursor.start, cursor.end);\n  }\n\n  public lineBeginIndex(cursor: Cursor): number {\n    const beforeValue = this.target.value.substring(0, cursor.start);\n    const lineEndIndex = beforeValue.lastIndexOf('\\n');\n    return lineEndIndex + 1;\n  }\n\n  public lineEndIndex(cursor: Cursor): number {\n    const afterValue = this.target.value.substring(cursor.end);\n    const lineEndIndex = afterValue.indexOf('\\n');\n    return cursor.end + (lineEndIndex === -1 ? afterValue.length : lineEndIndex);\n  }\n\n  public cursorLines(cursor: Cursor): Cursor {\n    const lineBeginIndex = this.lineBeginIndex(cursor);\n    const lineEndIndex = this.lineEndIndex(cursor);\n\n    const linesCursor = new Cursor(lineBeginIndex, lineEndIndex, 'none');\n    return linesCursor;\n  }\n\n  public prevLine(cursor: Cursor): Cursor | undefined {\n    const currentLineIndex = this.lineBeginIndex(cursor);\n    const prevIndex = currentLineIndex - 1;\n\n    if (prevIndex < 0) return undefined;\n\n    const lineCursor = this.cursorLines(new Cursor(prevIndex, prevIndex, 'none'));\n    return lineCursor;\n  }\n\n  public nextLine(cursor: Cursor): Cursor | undefined {\n    const currentLineIndex = this.lineEndIndex(cursor);\n    const nextIndex = currentLineIndex + 1;\n\n    if (nextIndex > this.target.value.length) return undefined;\n\n    const lineCursor = this.cursorLines(new Cursor(nextIndex, nextIndex, 'none'));\n    return lineCursor;\n  }\n}\n","import { Cursor } from './Cursor';\nimport type { Operations } from './Operations';\nimport type { GetTarget } from './type';\n\nexport class TextAreaOperations implements Operations {\n  private readonly getTarget: GetTarget;\n\n  constructor(getTarget: GetTarget) {\n    this.getTarget = getTarget;\n  }\n\n  get target() {\n    return this.getTarget();\n  }\n\n  public select(cursor: Cursor) {\n    this.target.setSelectionRange(cursor.start, cursor.end, cursor.direction);\n  }\n\n  public deselect(cursor: Cursor) {\n    if (cursor.direction === 'backward') {\n      this.target.setSelectionRange(cursor.start, cursor.start, 'none');\n      return;\n    }\n    this.target.setSelectionRange(cursor.end, cursor.end, 'none');\n  }\n\n  public insert(cursor: Cursor, text: string): Cursor {\n    const { value } = this.target;\n    this.target.value = `${value.substring(0, cursor.start)}${text}${value.substring(cursor.end)}`;\n\n    return new Cursor(cursor.start, cursor.start + text.length, cursor.direction);\n  }\n}\n","import { isKeyHotkey } from 'is-hotkey';\nimport type { KeyboardEventHandler } from 'react';\nimport { useCallback } from 'react';\nimport type { Intent, Operations, TextArea } from '$plugins/text-area';\nimport { Cursor } from '$plugins/text-area';\n\nexport const useTextAreaIntentHandler = (\n  textArea: TextArea,\n  operations: Operations,\n  intent: Intent\n) => {\n  const handler: KeyboardEventHandler<HTMLTextAreaElement> = useCallback(\n    (evt) => {\n      const target = evt.currentTarget;\n\n      if (isKeyHotkey('tab', evt)) {\n        evt.preventDefault();\n\n        const cursor = Cursor.fromTextAreaElement(target);\n        if (textArea.selection(cursor)) {\n          operations.select(intent.moveForward(cursor));\n        } else {\n          operations.deselect(operations.insert(cursor, intent.str));\n        }\n\n        target.focus();\n      }\n      if (isKeyHotkey('shift+tab', evt)) {\n        evt.preventDefault();\n        const cursor = Cursor.fromTextAreaElement(target);\n        const intentCursor = intent.moveBackward(cursor);\n        if (textArea.selection(cursor)) {\n          operations.select(intentCursor);\n        } else {\n          operations.deselect(intentCursor);\n        }\n\n        target.focus();\n      }\n      if (isKeyHotkey('enter', evt) || isKeyHotkey('shift+enter', evt)) {\n        evt.preventDefault();\n        const cursor = Cursor.fromTextAreaElement(target);\n        operations.select(intent.addNewLine(cursor));\n      }\n      if (isKeyHotkey('mod+enter', evt)) {\n        evt.preventDefault();\n        const cursor = Cursor.fromTextAreaElement(target);\n        operations.select(intent.addNextLine(cursor));\n      }\n      if (isKeyHotkey('mod+shift+enter', evt)) {\n        evt.preventDefault();\n        const cursor = Cursor.fromTextAreaElement(target);\n        operations.select(intent.addPreviousLine(cursor));\n      }\n    },\n    [textArea, operations, intent]\n  );\n\n  return handler;\n};\n","import type { KeyboardEventHandler, MutableRefObject } from 'react';\nimport { useMemo, useCallback } from 'react';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { TextArea, Intent, TextAreaOperations, Cursor } from '$plugins/text-area';\nimport type { GetTarget } from '$plugins/text-area/type';\nimport { useTextAreaIntentHandler } from './useTextAreaIntent';\n\nexport const useTextAreaCodeEditor = (\n  textAreaRef: MutableRefObject<HTMLTextAreaElement | null>,\n  intentSpaceCount: number\n) => {\n  const getTarget: GetTarget = useCallback(() => {\n    const target = textAreaRef.current;\n    if (!target) throw new Error('TextArea element not found!');\n    return target;\n  }, [textAreaRef]);\n\n  const { textArea, operations, intent } = useMemo(() => {\n    const ta = new TextArea(getTarget);\n    const op = new TextAreaOperations(getTarget);\n    return {\n      textArea: ta,\n      operations: op,\n      intent: new Intent(intentSpaceCount, ta, op),\n    };\n  }, [getTarget, intentSpaceCount]);\n\n  const intentHandler = useTextAreaIntentHandler(textArea, operations, intent);\n\n  const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = (evt) => {\n    intentHandler(evt);\n    if (isKeyHotkey('escape', evt)) {\n      const cursor = Cursor.fromTextAreaElement(getTarget());\n      operations.deselect(cursor);\n    }\n  };\n\n  return {\n    handleKeyDown,\n    textArea,\n    intent,\n    getTarget,\n    operations,\n  };\n};\n","import type { FormEventHandler } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n  Box,\n  Text,\n  IconButton,\n  Input,\n  TextArea as TextAreaComponent,\n  color,\n  Chip,\n  Scroll,\n  config,\n} from 'folds';\nimport { ArrowLeft, composerIcon, sizedIcon, X } from '$components/icons/phosphor';\nimport type { MatrixError } from '$types/matrix-sdk';\nimport { Cursor } from '$plugins/text-area';\nimport { syntaxErrorPosition } from '$utils/dom';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { AsyncError } from '$components/AsyncError';\nimport { useAlive } from '$hooks/useAlive';\nimport { useTextAreaCodeEditor } from '$hooks/useTextAreaCodeEditor';\nimport { Page, PageHeader } from './page';\nimport { SequenceCard } from './sequence-card';\nimport { TextViewerContent } from './text-viewer';\nimport { Button } from '$components/button';\n\nconst EDITOR_INTENT_SPACE_COUNT = 2;\n\nexport type AccountDataSubmitCallback = (type: string, content: object) => Promise<void>;\n\ntype AccountDataInfo = {\n  type: string;\n  content: object;\n};\n\ntype AccountDataEditProps = {\n  type: string;\n  defaultContent: string;\n  submitChange: AccountDataSubmitCallback;\n  onCancel: () => void;\n  onSave: (info: AccountDataInfo) => void;\n};\nfunction AccountDataEdit({\n  type,\n  defaultContent,\n  submitChange,\n  onCancel,\n  onSave,\n}: AccountDataEditProps) {\n  const alive = useAlive();\n\n  const textAreaRef = useRef<HTMLTextAreaElement>(null);\n  const [jsonError, setJSONError] = useState<SyntaxError>();\n\n  const { handleKeyDown, operations, getTarget } = useTextAreaCodeEditor(\n    textAreaRef,\n    EDITOR_INTENT_SPACE_COUNT\n  );\n\n  const [submitState, submit] = useAsyncCallback<void, MatrixError, [string, object]>(submitChange);\n  const submitting = submitState.status === AsyncStatus.Loading;\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (submitting) return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const typeInput = target?.typeInput as HTMLInputElement | undefined;\n    const contentTextArea = target?.contentTextArea as HTMLTextAreaElement | undefined;\n    if (!typeInput || !contentTextArea) return;\n\n    const typeStr = typeInput.value.trim();\n    const contentStr = contentTextArea.value.trim();\n\n    let parsedContent: object;\n    try {\n      parsedContent = JSON.parse(contentStr);\n    } catch (e) {\n      setJSONError(e as SyntaxError);\n      return;\n    }\n    setJSONError(undefined);\n\n    if (\n      !typeStr ||\n      parsedContent === null ||\n      defaultContent === JSON.stringify(parsedContent, null, EDITOR_INTENT_SPACE_COUNT)\n    ) {\n      return;\n    }\n\n    submit(typeStr, parsedContent).then(() => {\n      if (alive()) {\n        onSave({\n          type: typeStr,\n          content: parsedContent,\n        });\n      }\n    });\n  };\n\n  useEffect(() => {\n    if (jsonError) {\n      const errorPosition = syntaxErrorPosition(jsonError) ?? 0;\n      const cursor = new Cursor(errorPosition, errorPosition, 'none');\n      operations.select(cursor);\n      getTarget()?.focus();\n    }\n  }, [jsonError, operations, getTarget]);\n\n  return (\n    <Box\n      as=\"form\"\n      onSubmit={handleSubmit}\n      grow=\"Yes\"\n      style={{\n        padding: config.space.S400,\n      }}\n      direction=\"Column\"\n      gap=\"400\"\n      aria-disabled={submitting}\n    >\n      <Box shrink=\"No\" direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Account Data</Text>\n        <Box gap=\"300\">\n          <Box grow=\"Yes\" direction=\"Column\">\n            <Input\n              variant={type.length > 0 || submitting ? 'SurfaceVariant' : 'Background'}\n              name=\"typeInput\"\n              size=\"400\"\n              radii=\"300\"\n              readOnly={type.length > 0 || submitting}\n              defaultValue={type}\n              required\n            />\n          </Box>\n          <Button\n            variant=\"Success\"\n            size=\"400\"\n            radii=\"300\"\n            type=\"submit\"\n            loading={submitting}\n            spinnerSize=\"300\"\n            spinnerVariant=\"Primary\"\n            spinnerFill=\"Solid\"\n          >\n            <Text size=\"B400\">Save</Text>\n          </Button>\n          <Button\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            size=\"400\"\n            radii=\"300\"\n            type=\"button\"\n            onClick={onCancel}\n            disabled={submitting}\n          >\n            <Text size=\"B400\">Cancel</Text>\n          </Button>\n        </Box>\n\n        <AsyncError state={submitState} bold />\n      </Box>\n      <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n        <Box shrink=\"No\">\n          <Text size=\"L400\">JSON Content</Text>\n        </Box>\n        <TextAreaComponent\n          ref={textAreaRef}\n          name=\"contentTextArea\"\n          style={{\n            fontFamily: 'var(--font-monospace)',\n          }}\n          onKeyDown={handleKeyDown}\n          defaultValue={defaultContent}\n          resize=\"None\"\n          spellCheck=\"false\"\n          required\n          readOnly={submitting}\n        />\n        {jsonError && (\n          <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n            <b>\n              {jsonError.name}: {jsonError.message}\n            </b>\n          </Text>\n        )}\n      </Box>\n    </Box>\n  );\n}\n\ntype AccountDataViewProps = {\n  type: string;\n  defaultContent: string;\n  onEdit: () => void;\n};\nfunction AccountDataView({ type, defaultContent, onEdit }: AccountDataViewProps) {\n  return (\n    <Box\n      direction=\"Column\"\n      style={{\n        padding: config.space.S400,\n      }}\n      gap=\"400\"\n    >\n      <Box shrink=\"No\" gap=\"300\" alignItems=\"End\">\n        <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n          <Text size=\"L400\">Account Data</Text>\n          <Input\n            variant=\"SurfaceVariant\"\n            size=\"400\"\n            radii=\"300\"\n            readOnly\n            defaultValue={type}\n            required\n          />\n        </Box>\n        <Button variant=\"Secondary\" size=\"400\" radii=\"300\" onClick={onEdit}>\n          <Text size=\"B400\">Edit</Text>\n        </Button>\n      </Box>\n      <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">JSON Content</Text>\n        <SequenceCard variant=\"SurfaceVariant\">\n          <Scroll visibility=\"Always\" size=\"300\" hideTrack>\n            <TextViewerContent\n              size=\"T300\"\n              style={{\n                padding: `${config.space.S300} ${config.space.S100} ${config.space.S300} ${config.space.S300}`,\n              }}\n              text={defaultContent}\n              langName=\"JSON\"\n            />\n          </Scroll>\n        </SequenceCard>\n      </Box>\n    </Box>\n  );\n}\n\nexport type AccountDataEditorProps = {\n  type?: string;\n  content?: object;\n  submitChange: AccountDataSubmitCallback;\n  requestClose: () => void;\n};\n\nexport function AccountDataEditor({\n  type,\n  content,\n  submitChange,\n  requestClose,\n}: AccountDataEditorProps) {\n  const [data, setData] = useState<AccountDataInfo>({\n    type: type ?? '',\n    content: content ?? {},\n  });\n\n  const [edit, setEdit] = useState(!type);\n\n  const closeEdit = useCallback(() => {\n    if (!type) {\n      requestClose();\n      return;\n    }\n    setEdit(false);\n  }, [type, requestClose]);\n\n  const handleSave = useCallback((info: AccountDataInfo) => {\n    setData(info);\n    setEdit(false);\n  }, []);\n\n  const contentJSONStr = useMemo(\n    () => JSON.stringify(data.content, null, EDITOR_INTENT_SPACE_COUNT),\n    [data.content]\n  );\n\n  return (\n    <Page>\n      <PageHeader outlined={false} balance>\n        <Box alignItems=\"Center\" grow=\"Yes\" gap=\"200\">\n          <Box alignItems=\"Inherit\" grow=\"Yes\" gap=\"200\">\n            <Chip\n              size=\"500\"\n              radii=\"Pill\"\n              onClick={requestClose}\n              before={sizedIcon(ArrowLeft, '100')}\n            >\n              <Text size=\"T300\">Developer Tools</Text>\n            </Chip>\n          </Box>\n          <Box shrink=\"No\">\n            <IconButton onClick={requestClose} variant=\"Surface\">\n              {composerIcon(X)}\n            </IconButton>\n          </Box>\n        </Box>\n      </PageHeader>\n      <Box grow=\"Yes\" direction=\"Column\">\n        {edit ? (\n          <AccountDataEdit\n            type={data.type}\n            defaultContent={contentJSONStr}\n            submitChange={submitChange}\n            onCancel={closeEdit}\n            onSave={handleSave}\n          />\n        ) : (\n          <AccountDataView\n            type={data.type}\n            defaultContent={contentJSONStr}\n            onEdit={() => setEdit(true)}\n          />\n        )}\n      </Box>\n    </Page>\n  );\n}\n","import { useCallback, useState } from 'react';\nimport { Box, Text, Button, MenuItem } from 'folds';\nimport {\n  CaretDown,\n  CaretRight,\n  CaretUp,\n  chipIcon,\n  menuIcon,\n  Plus,\n} from '$components/icons/phosphor';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useAccountDataCallback } from '$hooks/useAccountDataCallback';\nimport { CutoutCard } from '$components/cutout-card';\n\ntype AccountDataProps = {\n  expand: boolean;\n  onExpandToggle: (expand: boolean) => void;\n  onSelect: (type: string | null) => void;\n};\nexport function AccountData({ expand, onExpandToggle, onSelect }: AccountDataProps) {\n  const mx = useMatrixClient();\n  const [accountDataTypes, setAccountDataKeys] = useState<string[]>(() =>\n    // TODO: tighten this once account data event typing is standardized.\n    Array.from(mx.store.accountData.keys())\n  );\n\n  useAccountDataCallback(\n    mx,\n    useCallback(() => {\n      // TODO: tighten this once account data event typing is standardized.\n      setAccountDataKeys(Array.from(mx.store.accountData.keys()));\n    }, [mx])\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Account Data</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Global\"\n          focusId=\"global-account-data\"\n          description=\"Data stored in your global account data.\"\n          after={\n            <Button\n              onClick={() => onExpandToggle(!expand)}\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              size=\"300\"\n              radii=\"300\"\n              outlined\n              before={menuIcon(expand ? CaretUp : CaretDown, { weight: 'fill' })}\n            >\n              <Text size=\"B300\">{expand ? 'Collapse' : 'Expand'}</Text>\n            </Button>\n          }\n        />\n        {expand && (\n          <Box direction=\"Column\" gap=\"100\">\n            <Box justifyContent=\"SpaceBetween\">\n              <Text size=\"L400\">Events</Text>\n              <Text size=\"L400\">Total: {accountDataTypes.length}</Text>\n            </Box>\n            <CutoutCard>\n              <MenuItem\n                variant=\"Surface\"\n                fill=\"None\"\n                size=\"300\"\n                radii=\"0\"\n                before={chipIcon(Plus)}\n                onClick={() => onSelect(null)}\n              >\n                <Box grow=\"Yes\">\n                  <Text size=\"T200\" truncate>\n                    Add New\n                  </Text>\n                </Box>\n              </MenuItem>\n              {accountDataTypes.toSorted().map((type) => (\n                <MenuItem\n                  key={type}\n                  variant=\"Surface\"\n                  fill=\"None\"\n                  size=\"300\"\n                  radii=\"0\"\n                  after={chipIcon(CaretRight)}\n                  onClick={() => onSelect(type)}\n                >\n                  <Box grow=\"Yes\">\n                    <Text size=\"T200\" truncate>\n                      {type}\n                    </Text>\n                  </Box>\n                </MenuItem>\n              ))}\n            </CutoutCard>\n          </Box>\n        )}\n      </SequenceCard>\n    </Box>\n  );\n}\n","import * as Sentry from '@sentry/react';\nimport { createDebugLogger } from './debugLogger';\n\nexport type MediaLoadKind = 'room_banner' | 'room_card_banner' | 'room_banner_preview';\n\nconst debugLog = createDebugLogger('media');\nconst failureCounts = new Map<MediaLoadKind, number>();\n\nexport const reportMediaLoadFailure = (kind: MediaLoadKind): void => {\n  failureCounts.set(kind, (failureCounts.get(kind) ?? 0) + 1);\n  debugLog.warn('network', 'Media failed to load', { kind });\n  Sentry.metrics.count('sable.media.load_error', 1, { attributes: { kind } });\n};\n\nexport const getMediaLoadFailureCounts = (): ReadonlyMap<MediaLoadKind, number> =>\n  new Map(failureCounts);\n","import { useEffect, useState } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { Box, Button, Text } from 'folds';\nimport { CaretDown, CaretUp, menuIcon } from '$components/icons/phosphor';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { getClientSyncDiagnostics } from '$client/initMatrix';\nimport type { Room } from '$types/matrix-sdk';\nimport { Direction, EventType, NotificationCountType, KnownMembership } from '$types/matrix-sdk';\n\nimport { getUnreadInfo, isNotificationEvent } from '$utils/room/unread';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { allInvitesAtom } from '$state/room-list/inviteList';\nimport { getMediaLoadFailureCounts } from '$utils/mediaLoadDiagnostics';\n\ntype RoomRenderingDiagnostics = {\n  totalRooms: number;\n  joinedRooms: number;\n  inviteRooms: number;\n  roomsMissingName: number;\n  roomsMissingAvatar: number;\n  roomsWithoutLiveEvents: number;\n  roomsWithBackPagination: number;\n};\n\ntype UnreadDriftRoom = {\n  roomId: string;\n  roomName: string;\n  sdkTotal: number;\n  sdkHighlight: number;\n  latestNotificationEventId: string | null;\n  readUpToEventId: string | null;\n  fullyReadEventId: string | null;\n};\n\nconst getRoomRenderingDiagnostics = (rooms: Room[]): RoomRenderingDiagnostics => {\n  let joinedRooms = 0;\n  let inviteRooms = 0;\n  let roomsMissingName = 0;\n  let roomsMissingAvatar = 0;\n  let roomsWithoutLiveEvents = 0;\n  let roomsWithBackPagination = 0;\n\n  rooms.forEach((room) => {\n    const membership = room.getMyMembership();\n    if (membership === (KnownMembership.Join as string)) joinedRooms += 1;\n    if (membership === (KnownMembership.Invite as string)) inviteRooms += 1;\n\n    if (!room.name || room.name.trim().length === 0) roomsMissingName += 1;\n\n    const roomAvatar = room.getMxcAvatarUrl();\n    const fallbackAvatar = room.getAvatarFallbackMember()?.getMxcAvatarUrl();\n    if (!roomAvatar && !fallbackAvatar) roomsMissingAvatar += 1;\n\n    const liveTimeline = room.getLiveTimeline();\n    if (liveTimeline.getEvents().length === 0) roomsWithoutLiveEvents += 1;\n    if (liveTimeline.getPaginationToken(Direction.Backward)) roomsWithBackPagination += 1;\n  });\n\n  return {\n    totalRooms: rooms.length,\n    joinedRooms,\n    inviteRooms,\n    roomsMissingName,\n    roomsMissingAvatar,\n    roomsWithoutLiveEvents,\n    roomsWithBackPagination,\n  };\n};\n\nconst getUnreadDriftRooms = (mx: ReturnType<typeof useMatrixClient>): UnreadDriftRoom[] => {\n  const userId = mx.getUserId();\n  if (!userId) return [];\n\n  return mx\n    .getRooms()\n    .filter(\n      (room) => !room.isSpaceRoom() && room.getMyMembership() === (KnownMembership.Join as string)\n    )\n    .reduce<UnreadDriftRoom[]>((driftRooms, room) => {\n      const reconciledUnread = getUnreadInfo(room);\n      const sdkTotal = room.getUnreadNotificationCount(NotificationCountType.Total);\n      const sdkHighlight = room.getUnreadNotificationCount(NotificationCountType.Highlight);\n      if (sdkTotal <= 0 && sdkHighlight <= 0) return driftRooms;\n      if (reconciledUnread.total <= 0 && reconciledUnread.highlight <= 0) return driftRooms;\n\n      const latestNotificationEvent = [...room.getLiveTimeline().getEvents()]\n        .toReversed()\n        .find((event) => !event.isSending() && isNotificationEvent(event));\n      const latestNotificationEventId = latestNotificationEvent?.getId() ?? null;\n      if (!latestNotificationEventId) return driftRooms;\n\n      const hasReadLatestNotification = room.hasUserReadEvent(userId, latestNotificationEventId);\n      if (!hasReadLatestNotification || sdkHighlight > 0) return driftRooms;\n\n      const readUpToEventId = room.getEventReadUpTo(userId) ?? null;\n      const fullyReadEventId =\n        room.getAccountData(EventType.FullyRead)?.getContent<{ event_id?: string }>()?.event_id ??\n        null;\n\n      driftRooms.push({\n        roomId: room.roomId,\n        roomName: room.name || room.roomId,\n        sdkTotal,\n        sdkHighlight,\n        latestNotificationEventId,\n        readUpToEventId,\n        fullyReadEventId,\n      });\n      return driftRooms;\n    }, []);\n};\n\nconst formatListCoverage = (knownCount: number, rangeEnd: number): string => {\n  if (knownCount <= 0) return '0/0';\n  const loadedCount = Math.max(0, Math.min(knownCount, rangeEnd + 1));\n  return `${loadedCount}/${knownCount}`;\n};\n\nexport function SyncDiagnostics() {\n  const mx = useMatrixClient();\n  const listedJoinedRoomIds = useAtomValue(allRoomsAtom);\n  const listedInviteRoomIds = useAtomValue(allInvitesAtom);\n  const [, setTick] = useState(0);\n  const [expandSliding, setExpandSliding] = useState(false);\n\n  useEffect(() => {\n    const intervalId = window.setInterval(() => setTick((v) => v + 1), 1000);\n    return () => window.clearInterval(intervalId);\n  }, []);\n\n  const diagnostics = getClientSyncDiagnostics(mx);\n  const roomDiagnostics = getRoomRenderingDiagnostics(mx.getRooms());\n  const unreadDriftRooms = getUnreadDriftRooms(mx);\n  const listedJoinedRoomIdSet = new Set(listedJoinedRoomIds);\n  const sdkRoomsMissingFromList = mx\n    .getRooms()\n    .filter(\n      (room) =>\n        room.getMyMembership() === (KnownMembership.Join as string) &&\n        !listedJoinedRoomIdSet.has(room.roomId)\n    );\n  const mediaLoadFailures = [...getMediaLoadFailureCounts()];\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Sync Diagnostics</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"100\"\n      >\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: '12px' }}>\n          <Text size=\"T300\">Transport: {diagnostics.transport}</Text>\n          <Text size=\"T300\">State: {diagnostics.syncState ?? 'null'}</Text>\n          <Text size=\"T300\">\n            Room counts: {roomDiagnostics.totalRooms} total, {roomDiagnostics.joinedRooms} joined,{' '}\n            {roomDiagnostics.inviteRooms} invites\n          </Text>\n          <Text size=\"T300\">\n            Room-list atoms: {listedJoinedRoomIds.length} joined, {listedInviteRoomIds.length}{' '}\n            invites\n          </Text>\n          <Text size=\"T300\">\n            SDK joined rooms missing from room list: {sdkRoomsMissingFromList.length}\n          </Text>\n          {sdkRoomsMissingFromList.slice(0, 10).map((room) => (\n            <Text key={room.roomId} size=\"T200\" priority=\"300\">\n              {room.name || room.roomId} ({room.roomId})\n            </Text>\n          ))}\n          <Text size=\"T300\">\n            Media load failures this session:{' '}\n            {mediaLoadFailures.length === 0\n              ? 'none'\n              : mediaLoadFailures.map(([kind, count]) => `${kind}: ${count}`).join(', ')}\n          </Text>\n          <Text size=\"T300\">Rooms missing name: {roomDiagnostics.roomsMissingName}</Text>\n          <Text size=\"T300\">Rooms missing avatar: {roomDiagnostics.roomsMissingAvatar}</Text>\n          <Text size=\"T300\">\n            Rooms without live events: {roomDiagnostics.roomsWithoutLiveEvents}\n          </Text>\n          <Text size=\"T300\">\n            Rooms with additional history available: {roomDiagnostics.roomsWithBackPagination}\n          </Text>\n          <Text size=\"T300\">Unread drift rooms: {unreadDriftRooms.length}</Text>\n          {unreadDriftRooms.slice(0, 10).map((room) => (\n            <Text key={room.roomId} size=\"T200\" priority=\"300\">\n              {room.roomName}: sdk {room.sdkTotal}/{room.sdkHighlight} | latest{' '}\n              {room.latestNotificationEventId ?? 'null'} | readUpTo {room.readUpToEventId ?? 'null'}{' '}\n              | fullyRead {room.fullyReadEventId ?? 'null'}\n            </Text>\n          ))}\n\n          {diagnostics.sliding && (\n            <Box direction=\"Column\" gap=\"100\">\n              <Box justifyContent=\"SpaceBetween\" alignItems=\"Center\">\n                <Text size=\"T300\">Sliding Sync</Text>\n                <Button\n                  size=\"300\"\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  outlined\n                  radii=\"300\"\n                  before={menuIcon(expandSliding ? CaretUp : CaretDown)}\n                  onClick={() => setExpandSliding((v) => !v)}\n                >\n                  <Text size=\"B300\">{expandSliding ? 'Collapse' : 'Expand'}</Text>\n                </Button>\n              </Box>\n              {expandSliding && (\n                <Box direction=\"Column\" gap=\"100\">\n                  <Text size=\"T300\">Sliding sync base URL: {diagnostics.sliding.baseUrl}</Text>\n                  <Text size=\"T300\">Room timeline limit: {diagnostics.sliding.timelineLimit}</Text>\n                  {diagnostics.sliding.lists.map((list) => (\n                    <Text size=\"T300\" key={list.key}>\n                      List `{list.key}` coverage:{' '}\n                      {formatListCoverage(list.knownCount, list.rangeEnd)}\n                      {list.requestedRangeEnd > list.rangeEnd\n                        ? ` (requested through ${list.requestedRangeEnd + 1})`\n                        : ''}\n                    </Text>\n                  ))}\n                </Box>\n              )}\n            </Box>\n          )}\n        </Box>\n      </SequenceCard>\n    </Box>\n  );\n}\n","/**\n * Jotai atoms for debug logger state management\n */\nimport { atom } from 'jotai';\nimport { atomWithRefresh } from 'jotai/utils';\nimport { getDebugLogger } from '$utils/debugLogger';\n\nconst debugLogger = getDebugLogger();\n\n/**\n * Atom for retrieving debug logs with refresh capability\n */\nexport const debugLogsAtom = atomWithRefresh(() => debugLogger.getLogs());\n\n/**\n * Atom for enabling/disabling debug logging\n */\nexport const debugLoggerEnabledAtom = atom(\n  debugLogger.isEnabled(),\n  (get, set, enabled: boolean) => {\n    debugLogger.setEnabled(enabled);\n    set(debugLoggerEnabledAtom, enabled);\n    set(debugLogsAtom);\n  }\n);\n\nexport const diagnosticCaptureActiveAtom = atom(\n  debugLogger.isCaptureActive(),\n  (_, set, active: boolean) => {\n    if (active && !debugLogger.isCaptureActive()) debugLogger.startCapture();\n    if (!active && debugLogger.isCaptureActive()) debugLogger.stopCapture();\n    set(diagnosticCaptureActiveAtom, active);\n    set(debugLogsAtom);\n  }\n);\n\n/**\n * Action to clear all debug logs\n */\nexport const clearDebugLogsAtom = atom(null, (_, set) => {\n  debugLogger.clear();\n  set(debugLogsAtom);\n});\n","import type { MouseEventHandler } from 'react';\nimport { useEffect, useState, useCallback, useMemo, useRef } from 'react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport type { RectCords } from 'folds';\nimport { Box, Text, Button, color, config, Badge, Menu, MenuItem } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\n\nimport { debugLoggerEnabledAtom, debugLogsAtom, clearDebugLogsAtom } from '$state/debugLogger';\nimport type { LogEntry, LogLevel, LogCategory } from '$utils/debugLogger';\nimport { getDebugLogger } from '$utils/debugLogger';\nimport { copyToClipboard } from '$utils/dom';\nimport { saveFileToDevice } from '$utils/download';\n\nconst formatTimestamp = (timestamp: number): string => {\n  const date = new Date(timestamp);\n  return date.toLocaleTimeString('en-US', {\n    hour12: false,\n    hour: '2-digit',\n    minute: '2-digit',\n    second: '2-digit',\n    fractionalSecondDigits: 3,\n  });\n};\n\nconst getLevelColor = (level: string): string => {\n  switch (level) {\n    case 'error':\n      return color.Critical.Main;\n    case 'warn':\n      return color.Warning.Main;\n    case 'info':\n      return color.Success.Main;\n    default:\n      return color.Secondary.Main;\n  }\n};\n\nconst getCategoryBadgeVariant = (\n  category: string\n): 'Primary' | 'Secondary' | 'Success' | 'Warning' | 'Critical' => {\n  switch (category) {\n    case 'error':\n      return 'Critical';\n    case 'sync':\n      return 'Primary';\n    case 'notification':\n      return 'Success';\n    case 'message':\n      return 'Secondary';\n    case 'call':\n      return 'Warning';\n    default:\n      return 'Secondary';\n  }\n};\n\nfunction LogEntryItem({ entry }: { entry: LogEntry }) {\n  const [expanded, setExpanded] = useState(false);\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"100\"\n      style={{\n        padding: config.space.S200,\n        backgroundColor: color.Surface.Container,\n        borderRadius: config.radii.R300,\n        fontSize: '11px',\n        fontFamily: 'monospace',\n      }}\n    >\n      <Box gap=\"200\" alignItems=\"Center\" justifyContent=\"SpaceBetween\">\n        <Box gap=\"200\" alignItems=\"Center\">\n          <Text\n            size=\"T200\"\n            style={{\n              color: getLevelColor(entry.level),\n              fontWeight: 'bold',\n              minWidth: '50px',\n            }}\n          >\n            {entry.level.toUpperCase()}\n          </Text>\n          <Badge variant={getCategoryBadgeVariant(entry.category)} fill=\"Soft\" size=\"300\">\n            <Text size=\"T200\">{entry.category}</Text>\n          </Badge>\n          <Text size=\"T200\" style={{ opacity: 0.6 }}>\n            {formatTimestamp(entry.timestamp)}\n          </Text>\n          <Text size=\"T200\" style={{ opacity: 0.8 }}>\n            [{entry.namespace}]\n          </Text>\n        </Box>\n        {entry.data != null && (\n          <Button\n            variant=\"Secondary\"\n            fill=\"None\"\n            size=\"300\"\n            radii=\"300\"\n            onClick={() => setExpanded(!expanded)}\n          >\n            <Text size=\"T200\">{expanded ? 'Hide' : 'Show'} Data</Text>\n          </Button>\n        )}\n      </Box>\n      <Text size=\"T200\" style={{ wordBreak: 'break-word' }}>\n        {entry.message}\n      </Text>\n      {expanded && entry.data != null && (\n        <Box\n          direction=\"Column\"\n          style={{\n            padding: config.space.S200,\n            backgroundColor: color.Surface.ContainerActive,\n            borderRadius: config.radii.R300,\n            maxHeight: '200px',\n            overflow: 'auto',\n          }}\n        >\n          <Text\n            as=\"pre\"\n            size=\"T200\"\n            style={{\n              whiteSpace: 'pre-wrap',\n              wordBreak: 'break-word',\n              margin: 0,\n            }}\n          >\n            {JSON.stringify(entry.data, null, 2)}\n          </Text>\n        </Box>\n      )}\n    </Box>\n  );\n}\n\nexport function DebugLogViewer() {\n  const [enabled, setEnabled] = useAtom(debugLoggerEnabledAtom);\n  const logs = useAtomValue(debugLogsAtom);\n  const clearLogs = useSetAtom(clearDebugLogsAtom);\n  const [autoScroll, setAutoScroll] = useState(true);\n  const scrollRef = useRef<HTMLDivElement | null>(null);\n  const [filterLevel, setFilterLevel] = useState<LogLevel | 'all'>('all');\n  const [filterCategory, setFilterCategory] = useState<LogCategory | 'all'>('all');\n  const [categoryAnchor, setCategoryAnchor] = useState<RectCords | undefined>();\n  const [levelAnchor, setLevelAnchor] = useState<RectCords | undefined>();\n  const refreshLogs = useSetAtom(debugLogsAtom);\n\n  const handleOpenCategoryMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    evt.stopPropagation();\n    setCategoryAnchor(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const handleOpenLevelMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    evt.stopPropagation();\n    setLevelAnchor(evt.currentTarget.getBoundingClientRect());\n  };\n\n  // Filter logs based on current filters\n  const filteredLogs = useMemo(() => {\n    if (filterLevel === 'all' && filterCategory === 'all') {\n      return logs;\n    }\n\n    const debugLogger = getDebugLogger();\n    return debugLogger.getFilteredLogs({\n      level: filterLevel !== 'all' ? filterLevel : undefined,\n      category: filterCategory !== 'all' ? filterCategory : undefined,\n    });\n  }, [logs, filterLevel, filterCategory]);\n\n  // Auto-refresh logs when new entries arrive\n  useEffect(() => {\n    if (!enabled) return undefined;\n\n    const debugLogger = getDebugLogger();\n    const unsubscribe = debugLogger.addListener(() => {\n      refreshLogs();\n    });\n\n    return unsubscribe;\n  }, [enabled, refreshLogs]);\n\n  // Auto-scroll to bottom when new logs arrive\n  useEffect(() => {\n    if (autoScroll && scrollRef.current) {\n      scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n    }\n  }, [filteredLogs, autoScroll]);\n\n  const handleExportLogs = useCallback(\n    (filtered: boolean) => {\n      const debugLogger = getDebugLogger();\n      let jsonData: string;\n\n      if (filtered && (filterLevel !== 'all' || filterCategory !== 'all')) {\n        // Export filtered logs\n        const logsToExport = debugLogger.getFilteredLogs({\n          level: filterLevel !== 'all' ? filterLevel : undefined,\n          category: filterCategory !== 'all' ? filterCategory : undefined,\n        });\n        jsonData = JSON.stringify(\n          {\n            exportedAt: new Date().toISOString(),\n            build: `v${APP_VERSION}${BUILD_HASH ? ` (${BUILD_HASH})` : ''}`,\n            filters: {\n              level: filterLevel !== 'all' ? filterLevel : 'none',\n              category: filterCategory !== 'all' ? filterCategory : 'none',\n            },\n            logsCount: logsToExport.length,\n            logs: logsToExport.map((log) => ({\n              ...log,\n              timestamp: new Date(log.timestamp).toISOString(),\n            })),\n          },\n          null,\n          2\n        );\n      } else {\n        jsonData = debugLogger.exportLogs();\n      }\n\n      const filterSuffix =\n        filtered && (filterLevel !== 'all' || filterCategory !== 'all')\n          ? `-${filterCategory !== 'all' ? filterCategory : 'all'}-${filterLevel !== 'all' ? filterLevel : 'all'}`\n          : '';\n      void saveFileToDevice(\n        new Blob([jsonData], { type: 'application/json' }),\n        `sable-debug-logs${filterSuffix}-${Date.now()}.json`,\n        'application/json'\n      );\n    },\n    [filterLevel, filterCategory]\n  );\n\n  const handleCopyToClipboard = useCallback(\n    (filtered: boolean) => {\n      const debugLogger = getDebugLogger();\n      let jsonData: string;\n\n      if (filtered && (filterLevel !== 'all' || filterCategory !== 'all')) {\n        const logsToExport = debugLogger.getFilteredLogs({\n          level: filterLevel !== 'all' ? filterLevel : undefined,\n          category: filterCategory !== 'all' ? filterCategory : undefined,\n        });\n        jsonData = JSON.stringify(\n          {\n            exportedAt: new Date().toISOString(),\n            build: `v${APP_VERSION}${BUILD_HASH ? ` (${BUILD_HASH})` : ''}`,\n            filters: {\n              level: filterLevel !== 'all' ? filterLevel : 'none',\n              category: filterCategory !== 'all' ? filterCategory : 'none',\n            },\n            logsCount: logsToExport.length,\n            logs: logsToExport.map((log) => ({\n              ...log,\n              timestamp: new Date(log.timestamp).toISOString(),\n            })),\n          },\n          null,\n          2\n        );\n      } else {\n        jsonData = debugLogger.exportLogs();\n      }\n\n      void copyToClipboard(jsonData);\n    },\n    [filterLevel, filterCategory]\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Box style={{ display: 'flex', flexDirection: 'column', gap: config.space.S400 }}>\n        <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\">\n          <Text size=\"L400\">Debug Log Status</Text>\n          <Badge variant={enabled ? 'Success' : 'Secondary'} fill=\"Solid\">\n            <Text size=\"B300\">{enabled ? 'Active' : 'Inactive'}</Text>\n          </Badge>\n        </Box>\n\n        <Text size=\"T300\" style={{ opacity: 0.8 }}>\n          Internal debug logging captures sync state, network events, notifications, messages,\n          calls, UI component lifecycle, and timeline operations. Logs are stored in memory (max\n          1000 entries) and cleared when you close the app.\n        </Text>\n\n        {/* Filter Controls */}\n        <Box gap=\"200\" alignItems=\"Center\" style={{ flexWrap: 'wrap' }}>\n          <Text size=\"T300\" style={{ opacity: 0.8 }}>\n            Filters:\n          </Text>\n          <PopOut\n            anchor={categoryAnchor}\n            offset={4}\n            alignOffset={-4}\n            position=\"Bottom\"\n            align=\"Start\"\n            content={\n              <Menu>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('all');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'all'}\n                >\n                  <Text size=\"T300\">All Categories</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('sync');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'sync'}\n                >\n                  <Text size=\"T300\">Sync</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('network');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'network'}\n                >\n                  <Text size=\"T300\">Network</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('notification');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'notification'}\n                >\n                  <Text size=\"T300\">Notification</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('message');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'message'}\n                >\n                  <Text size=\"T300\">Message</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('media');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'media'}\n                >\n                  <Text size=\"T300\">Media</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('call');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'call'}\n                >\n                  <Text size=\"T300\">Call</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('ui');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'ui'}\n                >\n                  <Text size=\"T300\">UI</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('timeline');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'timeline'}\n                >\n                  <Text size=\"T300\">Timeline</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('general');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'general'}\n                >\n                  <Text size=\"T300\">General</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterCategory('error');\n                    setCategoryAnchor(undefined);\n                  }}\n                  disabled={filterCategory === 'error'}\n                >\n                  <Text size=\"T300\">Error</Text>\n                </MenuItem>\n              </Menu>\n            }\n          >\n            <Button\n              onClick={handleOpenCategoryMenu}\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              size=\"300\"\n              radii=\"300\"\n            >\n              <Text size=\"B300\">Category: {filterCategory === 'all' ? 'All' : filterCategory}</Text>\n            </Button>\n          </PopOut>\n\n          <PopOut\n            anchor={levelAnchor}\n            offset={4}\n            alignOffset={-4}\n            position=\"Bottom\"\n            align=\"Start\"\n            content={\n              <Menu>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterLevel('all');\n                    setLevelAnchor(undefined);\n                  }}\n                  disabled={filterLevel === 'all'}\n                >\n                  <Text size=\"T300\">All Levels</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterLevel('debug');\n                    setLevelAnchor(undefined);\n                  }}\n                  disabled={filterLevel === 'debug'}\n                >\n                  <Text size=\"T300\">Debug</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterLevel('info');\n                    setLevelAnchor(undefined);\n                  }}\n                  disabled={filterLevel === 'info'}\n                >\n                  <Text size=\"T300\">Info</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterLevel('warn');\n                    setLevelAnchor(undefined);\n                  }}\n                  disabled={filterLevel === 'warn'}\n                >\n                  <Text size=\"T300\">Warning</Text>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  radii=\"300\"\n                  onClick={() => {\n                    setFilterLevel('error');\n                    setLevelAnchor(undefined);\n                  }}\n                  disabled={filterLevel === 'error'}\n                >\n                  <Text size=\"T300\">Error</Text>\n                </MenuItem>\n              </Menu>\n            }\n          >\n            <Button\n              onClick={handleOpenLevelMenu}\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              size=\"300\"\n              radii=\"300\"\n            >\n              <Text size=\"B300\">Level: {filterLevel === 'all' ? 'All' : filterLevel}</Text>\n            </Button>\n          </PopOut>\n\n          {(filterLevel !== 'all' || filterCategory !== 'all') && (\n            <Button\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              size=\"300\"\n              radii=\"300\"\n              onClick={() => {\n                setFilterLevel('all');\n                setFilterCategory('all');\n              }}\n            >\n              <Text size=\"B300\">Clear Filters</Text>\n            </Button>\n          )}\n        </Box>\n\n        <Box gap=\"200\" style={{ flexWrap: 'wrap' }}>\n          <Button\n            variant={enabled ? 'Critical' : 'Success'}\n            fill=\"Soft\"\n            size=\"300\"\n            radii=\"300\"\n            onClick={() => setEnabled(!enabled)}\n          >\n            <Text size=\"B300\">{enabled ? 'Disable Logging' : 'Enable Logging'}</Text>\n          </Button>\n          <Button\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            size=\"300\"\n            radii=\"300\"\n            onClick={() => handleExportLogs(false)}\n            disabled={logs.length === 0}\n          >\n            <Text size=\"B300\">Export All</Text>\n          </Button>\n          <Button\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            size=\"300\"\n            radii=\"300\"\n            onClick={() => handleExportLogs(true)}\n            disabled={filteredLogs.length === 0}\n          >\n            <Text size=\"B300\">Export Filtered ({filteredLogs.length})</Text>\n          </Button>\n          <Button\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            size=\"300\"\n            radii=\"300\"\n            onClick={() => handleCopyToClipboard(true)}\n            disabled={filteredLogs.length === 0}\n          >\n            <Text size=\"B300\">Copy Filtered</Text>\n          </Button>\n          <Button\n            variant=\"Critical\"\n            fill=\"Soft\"\n            size=\"300\"\n            radii=\"300\"\n            onClick={clearLogs}\n            disabled={logs.length === 0}\n          >\n            <Text size=\"B300\">Clear Logs ({logs.length})</Text>\n          </Button>\n        </Box>\n\n        {enabled && (\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"200\"\n          >\n            <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\">\n              <Text size=\"L400\">\n                Recent Logs (\n                {filterLevel !== 'all' || filterCategory !== 'all'\n                  ? `${filteredLogs.length}/${logs.length}`\n                  : `${logs.length}/1000`}\n                )\n              </Text>\n              <Button\n                variant=\"Secondary\"\n                fill=\"None\"\n                size=\"300\"\n                radii=\"300\"\n                onClick={() => setAutoScroll(!autoScroll)}\n              >\n                <Text size=\"T200\">Auto-scroll: {autoScroll ? 'On' : 'Off'}</Text>\n              </Button>\n            </Box>\n\n            <Box\n              ref={scrollRef}\n              direction=\"Column\"\n              gap=\"200\"\n              style={{\n                maxHeight: '500px',\n                overflow: 'auto',\n                padding: config.space.S200,\n              }}\n            >\n              {filteredLogs.length === 0 ? (\n                <Box\n                  style={{\n                    padding: config.space.S700,\n                    textAlign: 'center',\n                    opacity: 0.6,\n                  }}\n                >\n                  <Text size=\"T300\">\n                    {logs.length === 0\n                      ? 'No logs captured yet. Use the app to generate log entries.'\n                      : 'No logs match the current filters.'}\n                  </Text>\n                </Box>\n              ) : (\n                filteredLogs.map((log) => (\n                  <LogEntryItem key={`${log.timestamp}-${log.namespace}`} entry={log} />\n                ))\n              )}\n            </Box>\n          </SequenceCard>\n        )}\n      </Box>\n    </Box>\n  );\n}\n","import { useState, useEffect } from 'react';\nimport { Box, Text, Switch, Button } from 'folds';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { toSettingsFocusIdPart } from '$features/settings/settingsLink';\nimport type { LogCategory } from '$utils/debugLogger';\nimport { getDebugLogger } from '$utils/debugLogger';\nimport { saveFileToDevice } from '$utils/download';\n\nconst ALL_CATEGORIES: LogCategory[] = [\n  'sync',\n  'network',\n  'notification',\n  'message',\n  'media',\n  'call',\n  'ui',\n  'timeline',\n  'error',\n  'general',\n];\n\nconst handleExportLogs = () => {\n  void saveFileToDevice(\n    new Blob([getDebugLogger().exportLogs()], { type: 'application/json' }),\n    `sable-debug-logs-${Date.now()}.json`,\n    'application/json'\n  );\n};\n\nexport function SentrySettings() {\n  const [categoryEnabled, setCategoryEnabled] = useState<Record<LogCategory, boolean>>(() => {\n    const logger = getDebugLogger();\n    return Object.fromEntries(\n      ALL_CATEGORIES.map((c) => [c, logger.getBreadcrumbCategoryEnabled(c)])\n    ) as Record<LogCategory, boolean>;\n  });\n  const [sentryStats, setSentryStats] = useState(() => getDebugLogger().getSentryStats());\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      setSentryStats(getDebugLogger().getSentryStats());\n    }, 5000);\n    return () => clearInterval(interval);\n  }, []);\n\n  const handleCategoryToggle = (category: LogCategory, enabled: boolean) => {\n    getDebugLogger().setBreadcrumbCategoryEnabled(category, enabled);\n    setCategoryEnabled((prev) => ({ ...prev, [category]: enabled }));\n  };\n\n  const isSentryConfigured = Boolean(import.meta.env.VITE_SENTRY_DSN);\n  const sentryEnabled = localStorage.getItem('sable_sentry_enabled') === 'true';\n  const environment = import.meta.env.VITE_SENTRY_ENVIRONMENT || import.meta.env.MODE;\n  const isProd = environment === 'production';\n  const traceSampleRate = isProd ? '10%' : '100%';\n  const replaySampleRate = isProd ? '10%' : '100%';\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Error Tracking (Sentry)</Text>\n      <Text size=\"T200\" style={{ opacity: 0.7 }}>\n        Error reporting toggles are in <strong>Settings → General → Diagnostics & Privacy</strong>.\n      </Text>\n      {!isSentryConfigured && (\n        <Box\n          style={{\n            padding: '12px',\n            backgroundColor: 'rgba(255, 193, 7, 0.1)',\n            borderRadius: '8px',\n          }}\n        >\n          <Text size=\"T300\" style={{ color: 'orange' }}>\n            Sentry is not configured. Set VITE_SENTRY_DSN to enable error tracking.\n          </Text>\n        </Box>\n      )}\n\n      {isSentryConfigured && sentryEnabled && (\n        <>\n          <Text size=\"L400\">Performance Metrics</Text>\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"400\"\n          >\n            <SettingTile\n              title=\"Traces &amp; Profiles\"\n              focusId=\"traces-profiles\"\n              description={`Current environment: ${environment}. Sample rate: ${traceSampleRate}`}\n            />\n            <SettingTile\n              title=\"Session Replay\"\n              focusId=\"session-replay\"\n              description={`Session sample rate: ${replaySampleRate} · On-error rate: 100%`}\n            />\n            <SettingTile\n              title=\"Session Error Budget\"\n              focusId=\"session-error-budget\"\n              description=\"At most 50 error events are forwarded to Sentry per page load to prevent quota exhaustion.\"\n            />\n          </SequenceCard>\n\n          <Text size=\"L400\">Breadcrumb Categories</Text>\n          <Text size=\"T200\" style={{ opacity: 0.7 }}>\n            Control which log categories are included as breadcrumbs in Sentry error reports.\n            Disabling a category reduces noise without affecting error capture.\n          </Text>\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"400\"\n          >\n            {ALL_CATEGORIES.map((cat) => (\n              <SettingTile\n                key={cat}\n                focusId={`sentry-category-${toSettingsFocusIdPart(cat)}`}\n                title={cat.charAt(0).toUpperCase() + cat.slice(1)}\n                after={\n                  <Switch\n                    variant=\"Primary\"\n                    value={categoryEnabled[cat]}\n                    onChange={(v) => handleCategoryToggle(cat, v)}\n                  />\n                }\n              />\n            ))}\n          </SequenceCard>\n\n          <Text size=\"L400\">Debug Logs</Text>\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"400\"\n          >\n            <SettingTile\n              title=\"Session Activity\"\n              focusId=\"session-activity\"\n              description={`Errors captured: ${sentryStats.errors} · Warnings captured: ${sentryStats.warnings} (updates every 5 s)`}\n            />\n            <SettingTile\n              title=\"Export Debug Logs\"\n              focusId=\"export-debug-logs\"\n              description=\"Download the current in-memory debug log buffer as a JSON file for offline analysis.\"\n              after={\n                <Button variant=\"Secondary\" size=\"300\" onClick={handleExportLogs}>\n                  Export JSON\n                </Button>\n              }\n            />\n          </SequenceCard>\n        </>\n      )}\n    </Box>\n  );\n}\n","import { useCallback, useState } from 'react';\nimport { Box, Text, Scroll, Switch, Button } from 'folds';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { AccountDataSubmitCallback } from '$components/AccountDataEditor';\nimport { AccountDataEditor } from '$components/AccountDataEditor';\nimport { copyToClipboard } from '$utils/dom';\nimport { AccountData } from './AccountData';\nimport { SyncDiagnostics } from './SyncDiagnostics';\nimport { DebugLogViewer } from './DebugLogViewer';\nimport { SentrySettings } from './SentrySettings';\n\ntype DeveloperToolsProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\nexport function DeveloperTools({ requestBack, requestClose }: DeveloperToolsProps) {\n  const mx = useMatrixClient();\n  const [developerTools, setDeveloperTools] = useSetting(settingsAtom, 'developerTools');\n  const [expand, setExpend] = useState(false);\n  const [accountDataType, setAccountDataType] = useState<string | null>();\n\n  const submitAccountData: AccountDataSubmitCallback = useCallback(\n    async (type, content) => {\n      // TODO: remove cast once account data typing is unified.\n      await mx.setAccountData(type as never, content as never);\n    },\n    [mx]\n  );\n\n  if (accountDataType !== undefined) {\n    return (\n      <AccountDataEditor\n        type={accountDataType ?? undefined}\n        content={\n          accountDataType\n            ? // TODO: remove cast once account data typing is unified.\n              mx.getAccountData(accountDataType as never)?.getContent()\n            : undefined\n        }\n        submitChange={submitAccountData}\n        requestClose={() => setAccountDataType(undefined)}\n      />\n    );\n  }\n\n  return (\n    <SettingsSectionPage\n      title=\"Developer Tools\"\n      requestBack={requestBack}\n      requestClose={requestClose}\n    >\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Options</Text>\n                <SequenceCard\n                  className={SequenceCardStyle}\n                  variant=\"SurfaceVariant\"\n                  direction=\"Column\"\n                  gap=\"400\"\n                >\n                  <SettingTile\n                    title=\"Enable Developer Tools\"\n                    focusId=\"enable-developer-tools\"\n                    after={\n                      <Switch\n                        variant=\"Primary\"\n                        value={developerTools}\n                        onChange={setDeveloperTools}\n                      />\n                    }\n                  />\n                </SequenceCard>\n                {developerTools && (\n                  <SequenceCard\n                    className={SequenceCardStyle}\n                    variant=\"SurfaceVariant\"\n                    direction=\"Column\"\n                    gap=\"400\"\n                  >\n                    <SettingTile\n                      title=\"Access Token\"\n                      focusId=\"access-token\"\n                      description=\"Copy access token to clipboard.\"\n                      after={\n                        <Button\n                          onClick={() =>\n                            copyToClipboard(mx.getAccessToken() ?? '<NO_ACCESS_TOKEN_FOUND>')\n                          }\n                          variant=\"Secondary\"\n                          fill=\"Soft\"\n                          size=\"300\"\n                          radii=\"300\"\n                          outlined\n                        >\n                          <Text size=\"B300\">Copy</Text>\n                        </Button>\n                      }\n                    />\n                  </SequenceCard>\n                )}\n              </Box>\n              {developerTools && <SyncDiagnostics />}\n              {developerTools && (\n                <AccountData\n                  expand={expand}\n                  onExpandToggle={setExpend}\n                  onSelect={setAccountDataType}\n                />\n              )}\n              {developerTools && (\n                <Box direction=\"Column\" gap=\"100\">\n                  <DebugLogViewer />\n                </Box>\n              )}\n              {developerTools && (\n                <Box direction=\"Column\" gap=\"100\">\n                  <SentrySettings />\n                </Box>\n              )}\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { useEffect, useCallback, useMemo } from 'react';\nimport type { IMyDevice, CryptoEventHandlerMap } from '$types/matrix-sdk';\nimport { CryptoEvent } from '$types/matrix-sdk';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport const useDeviceListChange = (\n  onChange: CryptoEventHandlerMap[CryptoEvent.DevicesUpdated]\n) => {\n  const mx = useMatrixClient();\n  useEffect(() => {\n    mx.on(CryptoEvent.DevicesUpdated, onChange);\n    return () => {\n      mx.removeListener(CryptoEvent.DevicesUpdated, onChange);\n    };\n  }, [mx, onChange]);\n};\n\nconst DEVICES_QUERY_KEY = ['devices'];\n\nexport function useDeviceList(): [undefined | IMyDevice[], () => Promise<void>] {\n  const mx = useMatrixClient();\n\n  const fetchDevices = useCallback(async () => {\n    const data = await mx.getDevices();\n    return data.devices ?? [];\n  }, [mx]);\n\n  const { data: deviceList, refetch } = useQuery({\n    queryKey: DEVICES_QUERY_KEY,\n    queryFn: fetchDevices,\n    staleTime: 0,\n    gcTime: Infinity,\n    refetchOnMount: 'always',\n  });\n\n  const refreshDeviceList = useCallback(async () => {\n    await refetch();\n  }, [refetch]);\n\n  useDeviceListChange(\n    useCallback(\n      (users) => {\n        const userId = mx.getUserId();\n        if (userId && users.includes(userId)) {\n          refreshDeviceList();\n        }\n      },\n      [mx, refreshDeviceList]\n    )\n  );\n\n  return [deviceList ?? undefined, refreshDeviceList];\n}\n\nexport const useDeviceIds = (devices: IMyDevice[] | undefined): string[] => {\n  const devicesId = useMemo(() => devices?.map((device) => device.device_id) ?? [], [devices]);\n\n  return devicesId;\n};\n\nexport const useSplitCurrentDevice = (\n  devices: IMyDevice[] | undefined\n): [IMyDevice | undefined, IMyDevice[] | undefined] => {\n  const mx = useMatrixClient();\n  const currentDeviceId = mx.getDeviceId();\n  const currentDevice = useMemo(\n    () => devices?.find((d) => d.device_id === currentDeviceId),\n    [devices, currentDeviceId]\n  );\n  const otherDevices = useMemo(\n    () => devices?.filter((device) => device.device_id !== currentDeviceId),\n    [devices, currentDeviceId]\n  );\n\n  return [currentDevice, otherDevices];\n};\n","import type {\n  SecretStorageDefaultKeyContent,\n  SecretStorageKeyContent,\n} from '$types/matrix/accountData';\n\nimport { useAccountData } from './useAccountData';\n\nconst getSecretStorageKeyEventType = (key: string): string => `m.secret_storage.key.${key}`;\n\nexport const useSecretStorageDefaultKeyId = (): string | undefined => {\n  const defaultKeyEvent = useAccountData('m.secret_storage.default_key');\n  const defaultKeyId = defaultKeyEvent?.getContent<SecretStorageDefaultKeyContent>().key;\n\n  return defaultKeyId;\n};\n\nexport const useSecretStorageKeyContent = (keyId: string): SecretStorageKeyContent | undefined => {\n  const keyEvent = useAccountData(getSecretStorageKeyEventType(keyId));\n  const secretStorageKey = keyEvent?.getContent<SecretStorageKeyContent>();\n\n  return secretStorageKey;\n};\n","import { atom } from 'jotai';\nimport type { ImportRoomKeyProgressData } from '$types/matrix-sdk';\nimport { ImportRoomKeyStage } from '$types/matrix-sdk';\n\nexport enum BackupProgressStatus {\n  Idle,\n  Fetching,\n  Loading,\n  Done,\n}\ntype ProgressData = {\n  downloaded: number;\n  successes: number;\n  failures: number;\n  total: number;\n};\ntype IBackupProgress =\n  | {\n      status: BackupProgressStatus.Idle;\n    }\n  | {\n      status: BackupProgressStatus.Fetching;\n    }\n  | {\n      status: BackupProgressStatus.Loading;\n      data: ProgressData;\n    }\n  | {\n      status: BackupProgressStatus.Done;\n    };\n\nconst baseBackupRestoreProgressAtom = atom<IBackupProgress>({\n  status: BackupProgressStatus.Idle,\n});\n\nexport const backupRestoreErrorAtom = atom<string | undefined>(undefined);\n\n// Progress sticks at Fetching if a restore throws after it starts importing, and\n// both atoms outlive an account switch since there is no jotai Provider.\nexport const resetBackupRestoreAtom = atom(null, (_get, set) => {\n  set(baseBackupRestoreProgressAtom, { status: BackupProgressStatus.Idle });\n  set(backupRestoreErrorAtom, undefined);\n});\n\nexport const isMissingBackupKeyError = (error: unknown): boolean => {\n  if (error === undefined || error === null) return false;\n  const message = error instanceof Error ? error.message : typeof error === 'string' ? error : '';\n  return message.toLowerCase().includes('no decryption key found');\n};\n\nexport const backupRestoreProgressAtom = atom<\n  IBackupProgress,\n  [ImportRoomKeyProgressData],\n  undefined\n>(\n  (get) => get(baseBackupRestoreProgressAtom),\n  (get, set, progress) => {\n    if (progress.stage === ImportRoomKeyStage.Fetch) {\n      set(baseBackupRestoreProgressAtom, {\n        status: BackupProgressStatus.Fetching,\n      });\n      return;\n    }\n\n    if (progress.stage === ImportRoomKeyStage.LoadKeys) {\n      const { total, successes, failures } = progress;\n\n      const downloaded = successes + failures;\n      if (downloaded === total) {\n        set(baseBackupRestoreProgressAtom, {\n          status: BackupProgressStatus.Done,\n        });\n        return;\n      }\n      set(baseBackupRestoreProgressAtom, {\n        status: BackupProgressStatus.Loading,\n        data: {\n          downloaded,\n          successes,\n          failures,\n          total,\n        },\n      });\n    }\n  }\n);\n","import type {\n  BackupTrustInfo,\n  CryptoApi,\n  CryptoEventHandlerMap,\n  KeyBackupInfo,\n} from '$types/matrix-sdk';\nimport { CryptoEvent } from '$types/matrix-sdk';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport * as Sentry from '@sentry/react';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useMatrixEvent } from './useMatrixEvent';\nimport { useAlive } from './useAlive';\n\nconst useKeyBackupStatusChange = (onChange: CryptoEventHandlerMap[CryptoEvent.KeyBackupStatus]) => {\n  const mx = useMatrixClient();\n\n  useMatrixEvent(mx, CryptoEvent.KeyBackupStatus, onChange);\n};\n\nexport const useKeyBackupStatus = (crypto: CryptoApi): boolean => {\n  const alive = useAlive();\n  const [status, setStatus] = useState(false);\n\n  useEffect(() => {\n    crypto.getActiveSessionBackupVersion().then((v) => {\n      if (alive()) {\n        setStatus(typeof v === 'string');\n      }\n    });\n  }, [crypto, alive]);\n\n  useKeyBackupStatusChange(setStatus);\n\n  return status;\n};\n\nconst useKeyBackupSessionsRemainingChange = (\n  onChange: CryptoEventHandlerMap[CryptoEvent.KeyBackupSessionsRemaining]\n) => {\n  const mx = useMatrixClient();\n\n  useMatrixEvent(mx, CryptoEvent.KeyBackupSessionsRemaining, onChange);\n};\n\nconst useKeyBackupFailedChange = (onChange: CryptoEventHandlerMap[CryptoEvent.KeyBackupFailed]) => {\n  const mx = useMatrixClient();\n\n  useMatrixEvent(mx, CryptoEvent.KeyBackupFailed, onChange);\n};\n\nexport const useKeyBackupDecryptionKeyCached = (\n  onChange: CryptoEventHandlerMap[CryptoEvent.KeyBackupDecryptionKeyCached]\n) => {\n  const mx = useMatrixClient();\n\n  useMatrixEvent(mx, CryptoEvent.KeyBackupDecryptionKeyCached, onChange);\n};\n\n/**\n * Whether this device can actually restore from backup. `restoreKeyBackup`\n * requires BOTH a decryption key and a backup version in the store — it raises\n * the same \"No decryption key found in crypto store\" for either being absent,\n * while `getSessionBackupPrivateKey` only reports on the key. `undefined` while\n * unknown (first lookup in flight, or the lookup failed).\n */\nexport const useSessionBackupKeyUsable = (crypto: CryptoApi): boolean | undefined => {\n  const alive = useAlive();\n  const [usable, setUsable] = useState<boolean>();\n  const requestRef = useRef(0);\n\n  const fetchUsable = useCallback(() => {\n    requestRef.current += 1;\n    const request = requestRef.current;\n    Promise.all([crypto.getSessionBackupPrivateKey(), crypto.getActiveSessionBackupVersion()])\n      .then(([key, version]) => {\n        // A later lookup already answered; this one is stale.\n        if (alive() && request === requestRef.current) {\n          const nextUsable = key !== null && version !== null;\n          setUsable((current) => {\n            if (current === true && !nextUsable) {\n              Sentry.addBreadcrumb({\n                category: 'crypto',\n                message: 'Session backup key became unavailable',\n                level: 'warning',\n              });\n              Sentry.metrics.count('sable.crypto.session_backup_key_lost', 1);\n            }\n            return nextUsable;\n          });\n        }\n      })\n      .catch(() => {\n        if (alive() && request === requestRef.current) {\n          setUsable((current) => {\n            if (current === true) {\n              Sentry.addBreadcrumb({\n                category: 'crypto',\n                message: 'Session backup key lookup failed',\n                level: 'warning',\n              });\n              Sentry.metrics.count('sable.crypto.session_backup_key_lookup_failed', 1);\n            }\n            return undefined;\n          });\n        }\n      });\n  }, [crypto, alive]);\n\n  useEffect(() => {\n    fetchUsable();\n  }, [fetchUsable]);\n\n  useKeyBackupStatusChange(fetchUsable);\n  useKeyBackupDecryptionKeyCached(fetchUsable);\n\n  return usable;\n};\n\nexport const useKeyBackupSync = (): [number, string | undefined] => {\n  const [remaining, setRemaining] = useState(0);\n  const [failure, setFailure] = useState<string>();\n\n  useKeyBackupSessionsRemainingChange(\n    useCallback((count) => {\n      setRemaining(count);\n      setFailure(undefined);\n    }, [])\n  );\n\n  useKeyBackupFailedChange(\n    useCallback((f) => {\n      if (typeof f === 'string') {\n        Sentry.addBreadcrumb({\n          category: 'crypto',\n          message: 'Key backup failed',\n          level: 'error',\n          data: { errcode: f },\n        });\n        Sentry.metrics.count('sable.crypto.key_backup_failures', 1, {\n          attributes: { errcode: f },\n        });\n        setFailure(f);\n        setRemaining(0);\n      }\n    }, [])\n  );\n\n  return [remaining, failure];\n};\n\nexport const useKeyBackupInfo = (crypto: CryptoApi): KeyBackupInfo | undefined | null => {\n  const alive = useAlive();\n  const [info, setInfo] = useState<KeyBackupInfo | null>();\n\n  const fetchInfo = useCallback(() => {\n    crypto.getKeyBackupInfo().then((i) => {\n      if (alive()) {\n        setInfo(i);\n      }\n    });\n  }, [crypto, alive]);\n\n  useEffect(() => {\n    fetchInfo();\n  }, [fetchInfo]);\n\n  useKeyBackupStatusChange(fetchInfo);\n\n  useKeyBackupSessionsRemainingChange(\n    useCallback(\n      (remainingCount) => {\n        if (remainingCount === 0) {\n          fetchInfo();\n        }\n      },\n      [fetchInfo]\n    )\n  );\n\n  return info;\n};\n\nexport const useKeyBackupTrust = (\n  crypto: CryptoApi,\n  backupInfo: KeyBackupInfo\n): BackupTrustInfo | undefined => {\n  const alive = useAlive();\n  const [trust, setTrust] = useState<BackupTrustInfo>();\n\n  const fetchTrust = useCallback(() => {\n    crypto.isKeyBackupTrusted(backupInfo).then((t) => {\n      if (alive()) {\n        setTrust(t);\n      }\n    });\n  }, [crypto, alive, backupInfo]);\n\n  useEffect(() => {\n    fetchTrust();\n  }, [fetchTrust]);\n\n  useKeyBackupStatusChange(fetchTrust);\n\n  useKeyBackupDecryptionKeyCached(fetchTrust);\n\n  return trust;\n};\n","import type { FormEventHandler } from 'react';\nimport { useCallback } from 'react';\nimport { Box, Text } from 'folds';\nimport { decodeRecoveryKey, deriveRecoveryKeyFromPassphrase } from '$types/matrix-sdk';\nimport type {\n  SecretStorageKeyContent,\n  SecretStoragePassphraseContent,\n} from '$types/matrix/accountData';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncError } from '$components/AsyncError';\nimport { useAlive } from '$hooks/useAlive';\nimport { PasswordInput } from './password-input';\nimport { Button } from '$components/button';\n\nexport enum SecretStorageKeyMethod {\n  RecoveryPassphrase = 'passphrase',\n  RecoveryKey = 'key',\n}\n\ntype SecretStorageRecoveryPassphraseProps = {\n  processing?: boolean;\n  keyContent: SecretStorageKeyContent;\n  passphraseContent: SecretStoragePassphraseContent;\n  onDecodedRecoveryKey: (recoveryKey: Uint8Array) => void;\n};\nexport function SecretStorageRecoveryPassphrase({\n  processing,\n  keyContent,\n  passphraseContent,\n  onDecodedRecoveryKey,\n}: SecretStorageRecoveryPassphraseProps) {\n  const mx = useMatrixClient();\n  const alive = useAlive();\n\n  const [driveKeyState, submitPassphrase] = useAsyncCallback<\n    Uint8Array,\n    Error,\n    Parameters<typeof deriveRecoveryKeyFromPassphrase>\n  >(\n    useCallback(\n      async (passphrase, salt, iterations, bits) => {\n        const decodedRecoveryKey = await deriveRecoveryKeyFromPassphrase(\n          passphrase,\n          salt,\n          iterations,\n          bits\n        );\n\n        const match = await mx.secretStorage.checkKey(decodedRecoveryKey, keyContent as never);\n\n        if (!match) {\n          throw new Error('Invalid recovery passphrase.');\n        }\n\n        return decodedRecoveryKey;\n      },\n      [mx, keyContent]\n    )\n  );\n\n  const drivingKey = driveKeyState.status === AsyncStatus.Loading;\n  const loading = drivingKey || processing;\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    if (loading) return;\n    evt.preventDefault();\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const recoveryPassphraseInput = target?.recoveryPassphraseInput as HTMLInputElement | undefined;\n    if (!recoveryPassphraseInput) return;\n    const recoveryPassphrase = recoveryPassphraseInput.value.trim();\n    if (!recoveryPassphrase) return;\n\n    const { salt, iterations, bits } = passphraseContent;\n    submitPassphrase(recoveryPassphrase, salt, iterations, bits).then((decodedRecoveryKey) => {\n      if (alive() && decodedRecoveryKey instanceof Uint8Array) {\n        recoveryPassphraseInput.value = '';\n        onDecodedRecoveryKey(decodedRecoveryKey);\n      }\n    });\n  };\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} direction=\"Column\" gap=\"100\">\n      <Box gap=\"200\" alignItems=\"End\">\n        <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n          <Text size=\"L400\">Recovery Passphrase</Text>\n          <PasswordInput\n            name=\"recoveryPassphraseInput\"\n            size=\"400\"\n            variant=\"Secondary\"\n            radii=\"300\"\n            autoFocus\n            required\n            outlined\n            readOnly={loading}\n          />\n        </Box>\n        <Box shrink=\"No\" gap=\"200\">\n          <Button\n            type=\"submit\"\n            variant=\"Success\"\n            size=\"400\"\n            radii=\"300\"\n            loading={loading}\n            spinnerSize=\"200\"\n            spinnerVariant=\"Success\"\n          >\n            <Text as=\"span\" size=\"B400\">\n              Verify\n            </Text>\n          </Button>\n        </Box>\n      </Box>\n      <AsyncError state={driveKeyState} bold />\n    </Box>\n  );\n}\n\ntype SecretStorageKeyPromptProps = {\n  method: SecretStorageKeyMethod;\n  processing?: boolean;\n  keyContent: SecretStorageKeyContent;\n  onDecodedRecoveryKey: (recoveryKey: Uint8Array) => void;\n};\nexport function SecretStorageKeyPrompt({\n  method,\n  processing,\n  keyContent,\n  onDecodedRecoveryKey,\n}: SecretStorageKeyPromptProps) {\n  if (method === SecretStorageKeyMethod.RecoveryPassphrase && keyContent.passphrase) {\n    return (\n      <SecretStorageRecoveryPassphrase\n        processing={processing}\n        keyContent={keyContent}\n        passphraseContent={keyContent.passphrase}\n        onDecodedRecoveryKey={onDecodedRecoveryKey}\n      />\n    );\n  }\n\n  return (\n    <SecretStorageRecoveryKey\n      processing={processing}\n      keyContent={keyContent}\n      onDecodedRecoveryKey={onDecodedRecoveryKey}\n    />\n  );\n}\n\ntype SecretStorageRecoveryKeyProps = {\n  processing?: boolean;\n  keyContent: SecretStorageKeyContent;\n  onDecodedRecoveryKey: (recoveryKey: Uint8Array) => void;\n};\nexport function SecretStorageRecoveryKey({\n  processing,\n  keyContent,\n  onDecodedRecoveryKey,\n}: SecretStorageRecoveryKeyProps) {\n  const mx = useMatrixClient();\n  const alive = useAlive();\n\n  const [driveKeyState, submitRecoveryKey] = useAsyncCallback<Uint8Array, Error, [string]>(\n    useCallback(\n      async (recoveryKey) => {\n        const decodedRecoveryKey = decodeRecoveryKey(recoveryKey);\n\n        const match = await mx.secretStorage.checkKey(decodedRecoveryKey, keyContent as never);\n\n        if (!match) {\n          throw new Error('Invalid recovery key.');\n        }\n\n        return decodedRecoveryKey;\n      },\n      [mx, keyContent]\n    )\n  );\n\n  const drivingKey = driveKeyState.status === AsyncStatus.Loading;\n  const loading = drivingKey || processing;\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const recoveryKeyInput = target?.recoveryKeyInput as HTMLInputElement | undefined;\n    if (!recoveryKeyInput) return;\n    const recoveryKey = recoveryKeyInput.value.trim();\n    if (!recoveryKey) return;\n\n    submitRecoveryKey(recoveryKey).then((decodedRecoveryKey) => {\n      if (alive() && decodedRecoveryKey instanceof Uint8Array) {\n        recoveryKeyInput.value = '';\n        onDecodedRecoveryKey(decodedRecoveryKey);\n      }\n    });\n  };\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} direction=\"Column\" gap=\"100\">\n      <Box gap=\"200\" alignItems=\"End\">\n        <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n          <Text size=\"L400\">Recovery Key</Text>\n          <PasswordInput\n            name=\"recoveryKeyInput\"\n            size=\"400\"\n            variant=\"Secondary\"\n            radii=\"300\"\n            autoFocus\n            required\n            outlined\n            readOnly={loading}\n          />\n        </Box>\n        <Box shrink=\"No\" gap=\"200\">\n          <Button\n            type=\"submit\"\n            variant=\"Success\"\n            size=\"400\"\n            radii=\"300\"\n            loading={loading}\n            spinnerSize=\"200\"\n            spinnerVariant=\"Success\"\n          >\n            <Text as=\"span\" size=\"B400\">\n              Verify\n            </Text>\n          </Button>\n        </Box>\n      </Box>\n      <AsyncError state={driveKeyState} bold />\n    </Box>\n  );\n}\n","import { useSetAtom } from 'jotai';\nimport { useCallback } from 'react';\nimport * as Sentry from '@sentry/react';\nimport {\n  backupRestoreErrorAtom,\n  backupRestoreProgressAtom,\n  resetBackupRestoreAtom,\n} from '$state/backupRestore';\nimport { useMatrixClient } from './useMatrixClient';\nimport { useKeyBackupDecryptionKeyCached } from './useKeyBackup';\n\nexport const useRestoreBackupOnVerification = () => {\n  const setRestoreProgress = useSetAtom(backupRestoreProgressAtom);\n  const setRestoreError = useSetAtom(backupRestoreErrorAtom);\n  const resetRestore = useSetAtom(resetBackupRestoreAtom);\n\n  const mx = useMatrixClient();\n\n  useKeyBackupDecryptionKeyCached(\n    useCallback(() => {\n      const crypto = mx.getCrypto();\n      if (!crypto) return;\n\n      resetRestore();\n      crypto\n        .restoreKeyBackup({\n          progressCallback(progress) {\n            setRestoreProgress(progress);\n          },\n        })\n        .catch((err: unknown) => {\n          const message = err instanceof Error ? err.message : String(err);\n          Sentry.addBreadcrumb({\n            category: 'crypto',\n            message: 'Key backup restore failed',\n            level: 'error',\n            data: { error: message },\n          });\n          Sentry.metrics.count('sable.crypto.key_backup_restore_failures', 1);\n          // Progress stays at Fetching if the import threw partway.\n          resetRestore();\n          setRestoreError(message);\n        });\n    }, [mx, setRestoreProgress, setRestoreError, resetRestore])\n  );\n};\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useState } from 'react';\nimport { useAtom, useAtomValue } from 'jotai';\nimport type { CryptoApi, CryptoBackend, KeyBackupInfo } from '$types/matrix-sdk';\nimport type { RectCords } from 'folds';\nimport {\n  Badge,\n  Box,\n  Button,\n  Chip,\n  color,\n  config,\n  IconButton,\n  Menu,\n  percent,\n  ProgressBar,\n  Spinner,\n  Text,\n} from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport FocusTrap from 'focus-trap-react';\nimport type { SecretStorageKeyContent } from '$types/matrix/accountData';\nimport { storePrivateKey } from '$client/secretStorageKeys';\nimport {\n  BackupProgressStatus,\n  backupRestoreErrorAtom,\n  backupRestoreProgressAtom,\n  isMissingBackupKeyError,\n} from '$state/backupRestore';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport {\n  useKeyBackupInfo,\n  useKeyBackupStatus,\n  useKeyBackupSync,\n  useKeyBackupTrust,\n  useSessionBackupKeyUsable,\n} from '$hooks/useKeyBackup';\nimport { SecretStorageKeyMethod, SecretStorageKeyPrompt } from './SecretStorage';\nimport { stopPropagation } from '$utils/keyboard';\nimport { useRestoreBackupOnVerification } from '$hooks/useRestoreBackupOnVerification';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport {\n  Download,\n  DotsThreeOutlineVerticalIcon,\n  sizedIcon,\n  menuIcon,\n} from '$components/icons/phosphor';\nimport { InfoCard } from './info-card';\n\ntype BackupKeyRecoveryProps = {\n  crypto: CryptoApi;\n  secretStorageKeyId: string;\n  secretStorageKeyContent: SecretStorageKeyContent;\n};\nfunction BackupKeyRecovery({\n  crypto,\n  secretStorageKeyId,\n  secretStorageKeyContent,\n}: BackupKeyRecoveryProps) {\n  const mx = useMatrixClient();\n  const cryptoBackend = crypto as CryptoBackend;\n  const hasPassphrase = !!secretStorageKeyContent.passphrase;\n  const [method, setMethod] = useState(\n    hasPassphrase ? SecretStorageKeyMethod.RecoveryPassphrase : SecretStorageKeyMethod.RecoveryKey\n  );\n\n  const [unlockState, unlockBackup] = useAsyncCallback<void, Error, [Uint8Array]>(\n    useCallback(\n      async (recoveryKey: Uint8Array) => {\n        storePrivateKey(secretStorageKeyId, recoveryKey);\n\n        await cryptoBackend.processDeviceLists({ changed: [mx.getSafeUserId()] });\n        await cryptoBackend.bootstrapCrossSigning({});\n        await cryptoBackend.bootstrapSecretStorage({});\n\n        const deviceId = mx.getDeviceId();\n        if (!deviceId) {\n          throw new Error('Unexpected Error! Current device ID not found.');\n        }\n        await cryptoBackend.setDeviceVerified(mx.getSafeUserId(), deviceId);\n\n        // Emits KeyBackupDecryptionKeyCached, which drives the restore.\n        await crypto.loadSessionBackupPrivateKeyFromSecretStorage();\n      },\n      [crypto, cryptoBackend, mx, secretStorageKeyId]\n    )\n  );\n\n  const otherMethod =\n    method === SecretStorageKeyMethod.RecoveryPassphrase\n      ? SecretStorageKeyMethod.RecoveryKey\n      : SecretStorageKeyMethod.RecoveryPassphrase;\n\n  return (\n    <Box direction=\"Column\" gap=\"200\">\n      <Text size=\"T200\">\n        This device does not hold the backup decryption key. Provide your recovery details to\n        restore device verification and unlock the backup.\n      </Text>\n      <SecretStorageKeyPrompt\n        method={method}\n        processing={unlockState.status === AsyncStatus.Loading}\n        keyContent={secretStorageKeyContent}\n        onDecodedRecoveryKey={unlockBackup}\n      />\n      {hasPassphrase && (\n        <Box>\n          <Chip\n            type=\"button\"\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            radii=\"Pill\"\n            onClick={() => setMethod(otherMethod)}\n          >\n            <Text as=\"span\" size=\"B300\">\n              {otherMethod === SecretStorageKeyMethod.RecoveryPassphrase\n                ? 'Use Recovery Passphrase'\n                : 'Use Recovery Key'}\n            </Text>\n          </Chip>\n        </Box>\n      )}\n      {unlockState.status === AsyncStatus.Error && (\n        <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n          <b>{unlockState.error.message}</b>\n        </Text>\n      )}\n    </Box>\n  );\n}\n\ntype BackupStatusProps = {\n  enabled: boolean;\n};\nfunction BackupStatus({ enabled }: BackupStatusProps) {\n  return (\n    <Box as=\"span\" gap=\"100\" alignItems=\"Center\">\n      <Badge variant={enabled ? 'Success' : 'Critical'} fill=\"Solid\" size=\"200\" radii=\"Pill\" />\n      <Text\n        as=\"span\"\n        size=\"L400\"\n        style={{ color: enabled ? color.Success.Main : color.Critical.Main }}\n      >\n        {enabled ? 'Connected' : 'Disconnected'}\n      </Text>\n    </Box>\n  );\n}\ntype BackupSyncingProps = {\n  count: number;\n};\nfunction BackupSyncing({ count }: BackupSyncingProps) {\n  return (\n    <Box as=\"span\" gap=\"100\" alignItems=\"Center\">\n      <Spinner size=\"50\" variant=\"Primary\" fill=\"Soft\" />\n      <Text as=\"span\" size=\"L400\" style={{ color: color.Primary.Main }}>\n        Syncing ({count})\n      </Text>\n    </Box>\n  );\n}\n\nfunction BackupProgressFetching() {\n  return (\n    <Box grow=\"Yes\" gap=\"200\" alignItems=\"Center\">\n      <Badge variant=\"Secondary\" fill=\"Solid\" radii=\"300\">\n        <Text size=\"L400\">Restoring: 0%</Text>\n      </Badge>\n      <Box grow=\"Yes\" direction=\"Column\">\n        <ProgressBar variant=\"Secondary\" size=\"300\" min={0} max={1} value={0} />\n      </Box>\n      <Spinner size=\"50\" variant=\"Secondary\" fill=\"Soft\" />\n    </Box>\n  );\n}\n\ntype BackupProgressProps = {\n  total: number;\n  downloaded: number;\n};\nfunction BackupProgress({ total, downloaded }: BackupProgressProps) {\n  return (\n    <Box grow=\"Yes\" gap=\"200\" alignItems=\"Center\">\n      <Badge variant=\"Secondary\" fill=\"Solid\" radii=\"300\">\n        <Text size=\"L400\">Restoring: {`${Math.round(percent(0, total, downloaded))}%`}</Text>\n      </Badge>\n      <Box grow=\"Yes\" direction=\"Column\">\n        <ProgressBar variant=\"Secondary\" size=\"300\" min={0} max={total} value={downloaded} />\n      </Box>\n      <Badge variant=\"Secondary\" fill=\"Soft\" radii=\"Pill\">\n        <Text size=\"L400\">\n          {downloaded} / {total}\n        </Text>\n      </Badge>\n    </Box>\n  );\n}\n\ntype BackupTrustInfoProps = {\n  crypto: CryptoApi;\n  backupInfo: KeyBackupInfo;\n};\nfunction BackupTrustInfo({ crypto, backupInfo }: BackupTrustInfoProps) {\n  const trust = useKeyBackupTrust(crypto, backupInfo);\n\n  if (!trust) return null;\n\n  return (\n    <Box direction=\"Column\">\n      {trust.matchesDecryptionKey ? (\n        <Text size=\"T200\" style={{ color: color.Success.Main }}>\n          <b>Backup has trusted decryption key.</b>\n        </Text>\n      ) : (\n        <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n          <b>Backup does not have trusted decryption key!</b>\n        </Text>\n      )}\n      {trust.trusted ? (\n        <Text size=\"T200\" style={{ color: color.Success.Main }}>\n          <b>Backup has trusted by signature.</b>\n        </Text>\n      ) : (\n        <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n          <b>Backup does not have trusted signature!</b>\n        </Text>\n      )}\n    </Box>\n  );\n}\n\ntype BackupRestoreTileProps = {\n  crypto: CryptoApi;\n  secretStorageKeyId?: string;\n  secretStorageKeyContent?: SecretStorageKeyContent;\n};\nexport function BackupRestoreTile({\n  crypto,\n  secretStorageKeyId,\n  secretStorageKeyContent,\n}: BackupRestoreTileProps) {\n  const [restoreProgress, setRestoreProgress] = useAtom(backupRestoreProgressAtom);\n  const autoRestoreError = useAtomValue(backupRestoreErrorAtom);\n  const restoring =\n    restoreProgress.status === BackupProgressStatus.Fetching ||\n    restoreProgress.status === BackupProgressStatus.Loading;\n\n  const backupEnabled = useKeyBackupStatus(crypto);\n  const backupInfo = useKeyBackupInfo(crypto);\n  const backupKeyUsable = useSessionBackupKeyUsable(crypto);\n  const [remainingSession, syncFailure] = useKeyBackupSync();\n\n  const [menuCords, setMenuCords] = useState<RectCords>();\n\n  const handleMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setMenuCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const [restoreState, restoreBackup] = useAsyncCallback<void, Error, []>(\n    useCallback(async () => {\n      await crypto.restoreKeyBackup({\n        progressCallback(progress) {\n          setRestoreProgress(progress);\n        },\n      });\n    }, [crypto, setRestoreProgress])\n  );\n\n  const handleRestore = () => {\n    setMenuCords(undefined);\n    restoreBackup();\n  };\n\n  // backupKeyUsable is the structural signal; the error match only covers a\n  // restore that failed for this reason before the lookup settled.\n  const needsBackupKey =\n    !!backupInfo &&\n    (backupKeyUsable === false ||\n      (restoreState.status === AsyncStatus.Error && isMissingBackupKeyError(restoreState.error)));\n\n  return (\n    <InfoCard\n      variant=\"Surface\"\n      title=\"Encryption Backup\"\n      after={\n        <Box alignItems=\"Center\" gap=\"200\">\n          {remainingSession === 0 ? (\n            <BackupStatus enabled={backupEnabled} />\n          ) : (\n            <BackupSyncing count={remainingSession} />\n          )}\n          <IconButton\n            aria-pressed={!!menuCords}\n            size=\"300\"\n            variant=\"Surface\"\n            radii=\"300\"\n            onClick={handleMenu}\n          >\n            {menuIcon(DotsThreeOutlineVerticalIcon, { weight: menuCords ? 'fill' : 'regular' })}\n          </IconButton>\n          <PopOut\n            anchor={menuCords}\n            offset={5}\n            position=\"Bottom\"\n            align=\"End\"\n            content={\n              <FocusTrap\n                focusTrapOptions={{\n                  initialFocus: false,\n                  onDeactivate: () => setMenuCords(undefined),\n                  clickOutsideDeactivates: true,\n                  isKeyForward: (evt: KeyboardEvent) =>\n                    evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n                  isKeyBackward: (evt: KeyboardEvent) =>\n                    evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n                  escapeDeactivates: stopPropagation,\n                }}\n              >\n                <Menu\n                  style={{\n                    padding: config.space.S100,\n                  }}\n                >\n                  <Box direction=\"Column\" gap=\"100\">\n                    <Box direction=\"Column\" gap=\"200\">\n                      <InfoCard\n                        variant=\"SurfaceVariant\"\n                        title=\"Backup Details\"\n                        description={\n                          <>\n                            <span>Version: {backupInfo?.version ?? 'NIL'}</span>\n                            <br />\n                            <span>Keys: {backupInfo?.count ?? 'NIL'}</span>\n                          </>\n                        }\n                      />\n                    </Box>\n                    <Button\n                      size=\"300\"\n                      variant=\"Success\"\n                      radii=\"300\"\n                      aria-disabled={restoreState.status === AsyncStatus.Loading || restoring}\n                      onClick={\n                        restoreState.status === AsyncStatus.Loading || restoring\n                          ? undefined\n                          : handleRestore\n                      }\n                      before={sizedIcon(Download, '100')}\n                    >\n                      <Text size=\"B300\">Restore Backup</Text>\n                    </Button>\n                  </Box>\n                </Menu>\n              </FocusTrap>\n            }\n          />\n        </Box>\n      }\n    >\n      {syncFailure && (\n        <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n          <b>{syncFailure}</b>\n        </Text>\n      )}\n      {!backupEnabled && backupInfo === null && (\n        <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n          <b>No backup present on server!</b>\n        </Text>\n      )}\n      {!syncFailure && !backupEnabled && backupInfo && (\n        <BackupTrustInfo crypto={crypto} backupInfo={backupInfo} />\n      )}\n      {restoreState.status === AsyncStatus.Loading && !restoring && <BackupProgressFetching />}\n      {restoreProgress.status === BackupProgressStatus.Fetching && <BackupProgressFetching />}\n      {restoreProgress.status === BackupProgressStatus.Loading && (\n        <BackupProgress\n          total={restoreProgress.data.total}\n          downloaded={restoreProgress.data.downloaded}\n        />\n      )}\n      {restoreState.status === AsyncStatus.Error && (\n        <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n          <b>{restoreState.error.message}</b>\n        </Text>\n      )}\n      {autoRestoreError && (\n        <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n          <b>{autoRestoreError}</b>\n        </Text>\n      )}\n      {needsBackupKey && secretStorageKeyId && secretStorageKeyContent && (\n        <BackupKeyRecovery\n          crypto={crypto}\n          secretStorageKeyId={secretStorageKeyId}\n          secretStorageKeyContent={secretStorageKeyContent}\n        />\n      )}\n    </InfoCard>\n  );\n}\n\nexport function AutoRestoreBackupOnVerification() {\n  useRestoreBackupOnVerification();\n\n  return null;\n}\n","// https://github.com/element-hq/element-web/blob/a5b63d582fde59ea4dd3c7fdcad7266ab70dd695/apps/web/src/utils/MegolmExportEncryption.ts\n\nimport { createLogger } from './debug';\n\nconst logger = createLogger('MegolmExportEncryption');\nconst subtleCrypto = globalThis.crypto.subtle;\n\nexport class FriendlyError extends Error {\n  public friendlyText: string;\n\n  constructor(message: string, friendlyText: string) {\n    super(message);\n    this.friendlyText = friendlyText;\n    this.name = 'FriendlyError';\n  }\n}\n\n/**\n * Make an Error object which has a friendlyText property which is already\n * translated and suitable for showing to the user.\n *\n * @param {string} message message for the exception\n * @param {string} friendlyText\n * @returns {FriendlyError}\n */\nfunction friendlyError(message: string, friendlyText: string): FriendlyError {\n  return new FriendlyError(message, friendlyText);\n}\n\nfunction cryptoFailMsg(): string {\n  return 'Your browser does not support the required cryptography extensions';\n}\n\nfunction toArrayBufferView(data: Uint8Array): Uint8Array<ArrayBuffer> {\n  const buffer = new ArrayBuffer(data.byteLength);\n  const view = new Uint8Array(buffer);\n  view.set(data);\n  return view;\n}\n\n/**\n * Encode a typed array of uint8 as base64.\n * @param {Uint8Array} uint8Array The data to encode.\n * @return {string} The base64.\n */\nfunction encodeBase64(uint8Array: Uint8Array): string {\n  // Misinterpt the Uint8Array as Latin-1.\n  // window.btoa expects a unicode string with codepoints in the range 0-255.\n  const latin1String = String.fromCodePoint.apply(null, Array.from(uint8Array));\n  // Use the builtin base64 encoder.\n  return globalThis.btoa(latin1String);\n}\n\n/**\n * Decode a base64 string to a typed array of uint8.\n * @param {string} base64 The base64 to decode.\n * @return {Uint8Array} The decoded data.\n */\nfunction decodeBase64(base64: string): Uint8Array<ArrayBuffer> {\n  // window.atob returns a unicode string with codepoints in the range 0-255.\n  const latin1String = globalThis.atob(base64);\n  // Encode the string as a Uint8Array\n  const uint8Array = new Uint8Array(new ArrayBuffer(latin1String.length));\n  for (let i = 0; i < latin1String.length; i += 1) {\n    uint8Array[i] = latin1String.charCodeAt(i);\n  }\n  return uint8Array;\n}\n\nconst HEADER_LINE = '-----BEGIN MEGOLM SESSION DATA-----';\nconst TRAILER_LINE = '-----END MEGOLM SESSION DATA-----';\n\n/**\n * Unbase64 an ascii-armoured megolm key file\n *\n * Strips the header and trailer lines, and unbase64s the content\n *\n * @param {ArrayBuffer} data  input file\n * @return {Uint8Array} unbase64ed content\n */\nfunction unpackMegolmKeyFile(data: ArrayBuffer): Uint8Array<ArrayBuffer> {\n  // parse the file as a great big String. This should be safe, because there\n  // should be no non-ASCII characters, and it means that we can do string\n  // comparisons to find the header and footer, and feed it into window.atob.\n  const fileStr = new TextDecoder().decode(new Uint8Array(data));\n\n  // look for the start line\n  let lineStart = 0;\n  for (;;) {\n    const lineEnd = fileStr.indexOf('\\n', lineStart);\n    if (lineEnd < 0) {\n      throw new Error('Header line not found');\n    }\n    const line = fileStr.slice(lineStart, lineEnd).trim();\n\n    // start the next line after the newline\n    lineStart = lineEnd + 1;\n\n    if (line === HEADER_LINE) {\n      break;\n    }\n  }\n\n  const dataStart = lineStart;\n\n  // look for the end line\n  for (;;) {\n    const lineEnd = fileStr.indexOf('\\n', lineStart);\n    const line = fileStr.slice(lineStart, lineEnd < 0 ? undefined : lineEnd).trim();\n    if (line === TRAILER_LINE) {\n      break;\n    }\n\n    if (lineEnd < 0) {\n      throw new Error('Trailer line not found');\n    }\n\n    // start the next line after the newline\n    lineStart = lineEnd + 1;\n  }\n\n  const dataEnd = lineStart;\n  return decodeBase64(fileStr.slice(dataStart, dataEnd));\n}\n\n/**\n * ascii-armour a  megolm key file\n *\n * base64s the content, and adds header and trailer lines\n *\n * @param {Uint8Array} data  raw data\n * @return {ArrayBuffer} formatted file\n */\nfunction packMegolmKeyFile(data: Uint8Array): ArrayBuffer {\n  // we split into lines before base64ing, because encodeBase64 doesn't deal\n  // terribly well with large arrays.\n  const LINE_LENGTH = (72 * 4) / 3;\n  const nLines = Math.ceil(data.length / LINE_LENGTH);\n  const lines = Array.from<string>({ length: nLines + 3 });\n  lines[0] = HEADER_LINE;\n  let o = 0;\n  let i;\n  for (i = 1; i <= nLines; i += 1) {\n    lines[i] = encodeBase64(data.subarray(o, o + LINE_LENGTH));\n    o += LINE_LENGTH;\n  }\n  lines[i++] = TRAILER_LINE;\n  lines[i] = '';\n  return new TextEncoder().encode(lines.join('\\n')).buffer;\n}\n\n/**\n * Derive the AES and HMAC-SHA-256 keys for the file\n *\n * @param {Unit8Array} salt  salt for pbkdf\n * @param {Number} iterations number of pbkdf iterations\n * @param {String} password  password\n * @return {Promise<[CryptoKey, CryptoKey]>} promise for [aes key, hmac key]\n */\nasync function deriveKeys(\n  salt: Uint8Array<ArrayBuffer>,\n  iterations: number,\n  password: string\n): Promise<[CryptoKey, CryptoKey]> {\n  const start = new Date();\n\n  let key;\n  try {\n    key = await subtleCrypto.importKey(\n      'raw',\n      new TextEncoder().encode(password),\n      { name: 'PBKDF2' },\n      false,\n      ['deriveBits']\n    );\n  } catch (error) {\n    throw friendlyError(`subtleCrypto.importKey failed: ${String(error)}`, cryptoFailMsg());\n  }\n\n  let keyBits;\n  try {\n    keyBits = await subtleCrypto.deriveBits(\n      {\n        name: 'PBKDF2',\n        salt,\n        iterations,\n        hash: 'SHA-512',\n      },\n      key,\n      512\n    );\n  } catch (error) {\n    throw friendlyError(`subtleCrypto.deriveBits failed: ${String(error)}`, cryptoFailMsg());\n  }\n\n  const now = new Date();\n  logger.log(`E2e import/export: deriveKeys took ${now.getTime() - start.getTime()}ms`);\n\n  const aesKey = keyBits.slice(0, 32);\n  const hmacKey = keyBits.slice(32);\n\n  const aesProm = subtleCrypto\n    .importKey('raw', aesKey, { name: 'AES-CTR' }, false, ['encrypt', 'decrypt'])\n    .catch((error) => {\n      throw friendlyError(\n        `subtleCrypto.importKey failed for AES key: ${String(error)}`,\n        cryptoFailMsg()\n      );\n    });\n\n  const hmacProm = subtleCrypto\n    .importKey(\n      'raw',\n      hmacKey,\n      {\n        name: 'HMAC',\n        hash: { name: 'SHA-256' },\n      },\n      false,\n      ['sign', 'verify']\n    )\n    .catch((error) => {\n      throw friendlyError(\n        `subtleCrypto.importKey failed for HMAC key: ${String(error)}`,\n        cryptoFailMsg()\n      );\n    });\n\n  return Promise.all([aesProm, hmacProm]);\n}\n\n/**\n * Decrypt a megolm key file\n *\n * @param {ArrayBuffer} data file to decrypt\n * @param {String} password\n * @return {Promise<String>} promise for decrypted output\n */\nexport async function decryptMegolmKeyFile(data: ArrayBuffer, password: string): Promise<string> {\n  const body = unpackMegolmKeyFile(data);\n\n  // check we have a version byte\n  if (body.length < 1) {\n    throw friendlyError('Invalid file: too short', 'Not a valid keyfile');\n  }\n\n  const version = body[0];\n  if (version !== 1) {\n    throw friendlyError('Unsupported version', 'Not a valid keyfile');\n  }\n\n  const ciphertextLength = body.length - (1 + 16 + 16 + 4 + 32);\n  if (ciphertextLength < 0) {\n    throw friendlyError('Invalid file: too short', 'Not a valid keyfile');\n  }\n\n  const salt = toArrayBufferView(body.subarray(1, 17));\n  const iv = toArrayBufferView(body.subarray(17, 33));\n  const iterations = new DataView(body.buffer, body.byteOffset + 33, 4).getInt32(0);\n  const ciphertext = toArrayBufferView(body.subarray(37, 37 + ciphertextLength));\n  const hmac = toArrayBufferView(body.subarray(-32));\n\n  const [aesKey, hmacKey] = await deriveKeys(salt, iterations, password);\n  const toVerify = toArrayBufferView(body.subarray(0, -32));\n\n  let isValid;\n  try {\n    isValid = await subtleCrypto.verify({ name: 'HMAC' }, hmacKey, hmac, toVerify);\n  } catch (error) {\n    throw friendlyError(`subtleCrypto.verify failed: ${String(error)}`, cryptoFailMsg());\n  }\n  if (!isValid) {\n    throw friendlyError('hmac mismatch', 'Authentication check failed: Incorrect password?');\n  }\n\n  let plaintext;\n  try {\n    plaintext = await subtleCrypto.decrypt(\n      {\n        name: 'AES-CTR',\n        counter: iv,\n        length: 64,\n      },\n      aesKey,\n      ciphertext\n    );\n  } catch (error) {\n    throw friendlyError(`subtleCrypto.decrypt failed: ${String(error)}`, cryptoFailMsg());\n  }\n\n  return new TextDecoder().decode(new Uint8Array(plaintext));\n}\n\n/**\n * Encrypt a megolm key file\n *\n * @param {String} data\n * @param {String} password\n * @param {Object=} options\n * @param {Number=} options.kdf_rounds Number of iterations to perform of the\n *    key-derivation function.\n * @return {Promise<ArrayBuffer>} promise for encrypted output\n */\nexport async function encryptMegolmKeyFile(\n  data: string,\n  password: string,\n  options?: { kdf_rounds?: number }\n): Promise<ArrayBuffer> {\n  const normalizedOptions = options ?? {};\n  const kdfRounds = normalizedOptions.kdf_rounds || 500000;\n\n  const salt = new Uint8Array(new ArrayBuffer(16));\n  globalThis.crypto.getRandomValues(salt);\n\n  const iv = new Uint8Array(new ArrayBuffer(16));\n  globalThis.crypto.getRandomValues(iv);\n\n  // clear bit 63 of the IV to stop us hitting the 64-bit counter boundary\n  // (which would mean we wouldn't be able to decrypt on Android). The loss\n  // of a single bit of iv is a price we have to pay.\n  iv[8]! &= 0x7f;\n\n  const [aesKey, hmacKey] = await deriveKeys(salt, kdfRounds, password);\n  const encodedData = toArrayBufferView(new TextEncoder().encode(data));\n\n  let ciphertext;\n  try {\n    ciphertext = await subtleCrypto.encrypt(\n      {\n        name: 'AES-CTR',\n        counter: iv,\n        length: 64,\n      },\n      aesKey,\n      encodedData\n    );\n  } catch (error) {\n    throw friendlyError(`subtleCrypto.encrypt failed: ${String(error)}`, cryptoFailMsg());\n  }\n\n  const cipherArray = new Uint8Array(ciphertext);\n  const bodyLength = 1 + salt.length + iv.length + 4 + cipherArray.length + 32;\n  const resultBuffer = new Uint8Array(new ArrayBuffer(bodyLength));\n  let idx = 0;\n  resultBuffer[idx++] = 1; // version\n  resultBuffer.set(salt, idx);\n  idx += salt.length;\n  resultBuffer.set(iv, idx);\n  idx += iv.length;\n  resultBuffer[idx++] = kdfRounds >> 24;\n  resultBuffer[idx++] = (kdfRounds >> 16) & 0xff;\n  resultBuffer[idx++] = (kdfRounds >> 8) & 0xff;\n  resultBuffer[idx++] = kdfRounds & 0xff;\n  resultBuffer.set(cipherArray, idx);\n  idx += cipherArray.length;\n\n  const toSign = toArrayBufferView(resultBuffer.subarray(0, idx));\n\n  let hmac;\n  try {\n    hmac = await subtleCrypto.sign({ name: 'HMAC' }, hmacKey, toSign);\n  } catch (error) {\n    throw friendlyError(`subtleCrypto.sign failed: ${String(error)}`, cryptoFailMsg());\n  }\n\n  const hmacArray = new Uint8Array(hmac);\n  resultBuffer.set(hmacArray, idx);\n  return packMegolmKeyFile(resultBuffer);\n}\n","import type { FormEventHandler } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { Box, color, Text, toRem } from 'folds';\nimport { ArrowRight, CaretDown, CaretUp, File, menuIcon, X } from '$components/icons/phosphor';\nimport { saveFileToDevice } from '$utils/download';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { PasswordInput } from '$components/password-input';\nimport { ConfirmPasswordMatch } from '$components/ConfirmPasswordMatch';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport {\n  decryptMegolmKeyFile,\n  encryptMegolmKeyFile,\n  type FriendlyError,\n} from '$utils/MegolmExportEncryption';\nimport { useAlive } from '$hooks/useAlive';\nimport { useFilePicker } from '$hooks/useFilePicker';\nimport { Button } from '$components/button';\n\ntype LocalBackupError = Error | FriendlyError;\n\nfunction getErrorMessage(error: LocalBackupError): string {\n  if ('friendlyText' in error) {\n    return error.friendlyText;\n  }\n\n  return error.message;\n}\n\nfunction ExportKeys() {\n  const mx = useMatrixClient();\n  const alive = useAlive();\n\n  const [exportState, exportKeys] = useAsyncCallback<void, LocalBackupError, [string]>(\n    useCallback(\n      async (password) => {\n        const crypto = mx.getCrypto();\n        if (!crypto) throw new Error('Unexpected Error! Crypto module not found!');\n        const keysJSON = await crypto.exportRoomKeysAsJson();\n\n        const encKeys = await encryptMegolmKeyFile(keysJSON, password);\n\n        const blob = new Blob([encKeys], {\n          type: 'text/plain;charset=us-ascii',\n        });\n        await saveFileToDevice(blob, 'cinny-keys.txt');\n      },\n      [mx]\n    )\n  );\n\n  const exporting = exportState.status === AsyncStatus.Loading;\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (exporting) return;\n\n    const { passwordInput, confirmPasswordInput } = evt.target as HTMLFormElement & {\n      passwordInput: HTMLInputElement;\n      confirmPasswordInput: HTMLInputElement;\n    };\n\n    const password = passwordInput.value;\n    const confirmPassword = confirmPasswordInput.value;\n\n    if (password !== confirmPassword) return;\n\n    exportKeys(password).then(() => {\n      if (alive()) {\n        passwordInput.value = '';\n        confirmPasswordInput.value = '';\n      }\n    });\n  };\n\n  return (\n    <SettingTile focusId=\"export-messages-data\">\n      <Box as=\"form\" onSubmit={handleSubmit} direction=\"Column\" gap=\"100\">\n        <Box gap=\"200\" alignItems=\"End\">\n          <ConfirmPasswordMatch initialValue>\n            {(match, doMatch, passRef, confPassRef) => (\n              <>\n                <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n                  <Text size=\"L400\">New Password</Text>\n                  <PasswordInput\n                    ref={passRef}\n                    name=\"passwordInput\"\n                    size=\"400\"\n                    variant=\"Secondary\"\n                    radii=\"300\"\n                    required\n                    onChange={doMatch}\n                    readOnly={exporting}\n                    autoFocus\n                  />\n                </Box>\n                <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n                  <Text size=\"L400\">Confirm Password</Text>\n                  <PasswordInput\n                    ref={confPassRef}\n                    style={{ color: match ? undefined : color.Critical.Main }}\n                    name=\"confirmPasswordInput\"\n                    size=\"400\"\n                    variant=\"Secondary\"\n                    radii=\"300\"\n                    required\n                    onChange={doMatch}\n                    readOnly={exporting}\n                  />\n                </Box>\n              </>\n            )}\n          </ConfirmPasswordMatch>\n          <Button\n            type=\"submit\"\n            size=\"400\"\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            outlined\n            radii=\"300\"\n            loading={exporting}\n            spinnerSize=\"200\"\n            spinnerVariant=\"Secondary\"\n            spinnerFill=\"Soft\"\n          >\n            <Text as=\"span\" size=\"B400\">\n              Export\n            </Text>\n          </Button>\n        </Box>\n        {exportState.status === AsyncStatus.Error && (\n          <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n            <b>{getErrorMessage(exportState.error)}</b>\n          </Text>\n        )}\n      </Box>\n    </SettingTile>\n  );\n}\n\nfunction ExportKeysTile() {\n  const [expand, setExpand] = useState(false);\n\n  return (\n    <>\n      <SettingTile\n        title=\"Export Messages Data\"\n        focusId=\"export-messages-data\"\n        description=\"Save password protected copy of encryption data on your device to decrypt messages later.\"\n        after={\n          <Box>\n            <Button\n              type=\"button\"\n              onClick={() => setExpand(!expand)}\n              size=\"300\"\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              outlined\n              radii=\"300\"\n              before={menuIcon(expand ? CaretUp : CaretDown, { weight: 'fill' })}\n            >\n              <Text as=\"span\" size=\"B300\" truncate>\n                {expand ? 'Collapse' : 'Expand'}\n              </Text>\n            </Button>\n          </Box>\n        }\n      />\n      {expand && <ExportKeys />}\n    </>\n  );\n}\n\ntype ImportKeysProps = {\n  file: File;\n  onDone?: () => void;\n};\nfunction ImportKeys({ file, onDone }: ImportKeysProps) {\n  const mx = useMatrixClient();\n  const alive = useAlive();\n\n  const [decryptState, decryptFile] = useAsyncCallback<void, LocalBackupError, [string]>(\n    useCallback(\n      async (password) => {\n        const crypto = mx.getCrypto();\n        if (!crypto) throw new Error('Unexpected Error! Crypto module not found!');\n\n        const arrayBuffer = await file.arrayBuffer();\n        const keys = await decryptMegolmKeyFile(arrayBuffer, password);\n\n        await crypto.importRoomKeysAsJson(keys);\n      },\n      [file, mx]\n    )\n  );\n\n  const decrypting = decryptState.status === AsyncStatus.Loading;\n\n  useEffect(() => {\n    if (decryptState.status === AsyncStatus.Success) {\n      onDone?.();\n    }\n  }, [onDone, decryptState]);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (decrypting) return;\n\n    const { passwordInput } = evt.target as HTMLFormElement & {\n      passwordInput: HTMLInputElement;\n    };\n\n    const password = passwordInput.value;\n\n    if (!password) return;\n    decryptFile(password).then(() => {\n      if (alive()) {\n        passwordInput.value = '';\n      }\n    });\n  };\n\n  return (\n    <SettingTile focusId=\"import-messages-data\">\n      <Box as=\"form\" onSubmit={handleSubmit} direction=\"Column\" gap=\"100\">\n        <Box gap=\"200\" alignItems=\"End\">\n          <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n            <Text size=\"L400\">Password</Text>\n            <PasswordInput\n              name=\"passwordInput\"\n              size=\"400\"\n              variant=\"Secondary\"\n              radii=\"300\"\n              required\n              autoFocus\n              readOnly={decrypting}\n            />\n          </Box>\n          <Button\n            type=\"submit\"\n            size=\"400\"\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            outlined\n            radii=\"300\"\n            loading={decrypting}\n            spinnerSize=\"200\"\n            spinnerVariant=\"Secondary\"\n            spinnerFill=\"Soft\"\n          >\n            <Text as=\"span\" size=\"B400\">\n              Decrypt\n            </Text>\n          </Button>\n        </Box>\n        {decryptState.status === AsyncStatus.Error && (\n          <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n            <b>{getErrorMessage(decryptState.error)}</b>\n          </Text>\n        )}\n      </Box>\n    </SettingTile>\n  );\n}\n\nfunction ImportKeysTile() {\n  const [file, setFile] = useState<File>();\n  const pickFile = useFilePicker(setFile);\n\n  const handleDone = useCallback(() => {\n    setFile(undefined);\n  }, []);\n\n  return (\n    <>\n      <SettingTile\n        title=\"Import Messages Data\"\n        focusId=\"import-messages-data\"\n        description=\"Load password protected copy of encryption data from device to decrypt your messages.\"\n        after={\n          <Box>\n            {file ? (\n              <Button\n                style={{ maxWidth: toRem(200) }}\n                type=\"button\"\n                onClick={() => setFile(undefined)}\n                size=\"300\"\n                variant=\"Warning\"\n                fill=\"Solid\"\n                radii=\"300\"\n                before={menuIcon(File, { weight: 'fill' })}\n                after={menuIcon(X)}\n              >\n                <Text as=\"span\" size=\"B300\" truncate>\n                  {file.name}\n                </Text>\n              </Button>\n            ) : (\n              <Button\n                type=\"button\"\n                onClick={() => pickFile('text/plain')}\n                size=\"300\"\n                variant=\"Secondary\"\n                fill=\"Soft\"\n                outlined\n                radii=\"300\"\n                before={menuIcon(ArrowRight)}\n              >\n                <Text as=\"span\" size=\"B300\">\n                  Import\n                </Text>\n              </Button>\n            )}\n          </Box>\n        }\n      />\n      {file && <ImportKeys file={file} onDone={handleDone} />}\n    </>\n  );\n}\n\nexport function LocalBackup() {\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Local Backup</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <ExportKeysTile />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <ImportKeysTile />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import type { FormEventHandler, ReactNode } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { Box, Text, IconButton, Chip, Input, Button, color, Spinner, toRem } from 'folds';\nimport { CaretDown, CaretRight, chipIcon, Trash } from '$components/icons/phosphor';\nimport type { CryptoApi, IMyDevice, MatrixError } from '$types/matrix-sdk';\nimport { SettingTile } from '$components/setting-tile';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { timeDayMonYear, timeHourMinute, today, yesterday } from '$utils/time';\nimport { BreakWord } from '$styles/Text.css';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { LogoutDialogOverlay } from '$components/LogoutDialogOverlay';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { toSettingsFocusIdPart } from '$features/settings/settingsLink';\n\nexport function DeviceTilePlaceholder() {\n  return (\n    <SequenceCard\n      className={SequenceCardStyle}\n      style={{ height: toRem(66) }}\n      variant=\"SurfaceVariant\"\n      direction=\"Column\"\n      gap=\"400\"\n    />\n  );\n}\n\nfunction DeviceActiveTime({ ts }: { ts: number }) {\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n  const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n\n  return (\n    <Text className={BreakWord} size=\"T200\">\n      <Text size=\"Inherit\" as=\"span\" priority=\"300\">\n        {'Last activity: '}\n      </Text>\n      <>\n        {today(ts) && 'Today'}\n        {yesterday(ts) && 'Yesterday'}\n        {!today(ts) && !yesterday(ts) && timeDayMonYear(ts, dateFormatString)}{' '}\n        {timeHourMinute(ts, hour24Clock)}\n      </>\n    </Text>\n  );\n}\n\nfunction DeviceDetails({ device }: { device: IMyDevice }) {\n  return (\n    <>\n      {typeof device.device_id === 'string' && (\n        <Text className={BreakWord} size=\"T200\" priority=\"300\">\n          Device ID: <i>{device.device_id}</i>\n        </Text>\n      )}\n      {typeof device.last_seen_ip === 'string' && (\n        <Text className={BreakWord} size=\"T200\" priority=\"300\">\n          IP Address: <i>{device.last_seen_ip}</i>\n        </Text>\n      )}\n    </>\n  );\n}\n\ntype DeviceKeyDetailsProps = {\n  crypto: CryptoApi;\n};\nexport function DeviceKeyDetails({ crypto }: DeviceKeyDetailsProps) {\n  const [keysState, loadKeys] = useAsyncCallback(\n    useCallback(() => {\n      const keys = crypto.getOwnDeviceKeys();\n      return keys;\n    }, [crypto])\n  );\n\n  useEffect(() => {\n    loadKeys();\n  }, [loadKeys]);\n\n  if (keysState.status === AsyncStatus.Error) return null;\n\n  return (\n    <Text className={BreakWord} size=\"T200\" priority=\"300\">\n      Device Key:{' '}\n      <i>{keysState.status === AsyncStatus.Success ? keysState.data.ed25519 : 'loading...'}</i>\n    </Text>\n  );\n}\n\ntype DeviceRenameProps = {\n  device: IMyDevice;\n  onCancel: () => void;\n  onRename: () => void;\n  refreshDeviceList: () => Promise<void>;\n};\nfunction DeviceRename({ device, onCancel, onRename, refreshDeviceList }: DeviceRenameProps) {\n  const mx = useMatrixClient();\n\n  const [renameState, rename] = useAsyncCallback<void, MatrixError, [string]>(\n    useCallback(\n      async (name: string) => {\n        await mx.setDeviceDetails(device.device_id, { display_name: name });\n        await refreshDeviceList();\n      },\n      [mx, device.device_id, refreshDeviceList]\n    )\n  );\n\n  const renaming = renameState.status === AsyncStatus.Loading;\n\n  useEffect(() => {\n    if (renameState.status === AsyncStatus.Success) {\n      onRename();\n    }\n  }, [renameState, onRename]);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (renaming) return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const nameInput = target?.nameInput as HTMLInputElement | undefined;\n    if (!nameInput) return;\n    const deviceName = nameInput.value.trim();\n    if (!deviceName || deviceName === device.display_name) return;\n\n    rename(deviceName);\n  };\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Device Name</Text>\n      <Box gap=\"200\">\n        <Box grow=\"Yes\" direction=\"Column\">\n          <Input\n            name=\"nameInput\"\n            size=\"300\"\n            variant=\"Secondary\"\n            radii=\"300\"\n            defaultValue={device.display_name}\n            autoFocus\n            required\n            readOnly={renaming}\n          />\n        </Box>\n        <Box shrink=\"No\" gap=\"200\">\n          <Button\n            type=\"submit\"\n            size=\"300\"\n            variant=\"Success\"\n            radii=\"300\"\n            fill=\"Solid\"\n            disabled={renaming}\n            before={renaming && <Spinner size=\"100\" variant=\"Success\" fill=\"Solid\" />}\n          >\n            <Text size=\"B300\">Save</Text>\n          </Button>\n          <Button\n            type=\"button\"\n            size=\"300\"\n            variant=\"Secondary\"\n            radii=\"300\"\n            fill=\"Soft\"\n            onClick={onCancel}\n            disabled={renaming}\n          >\n            <Text size=\"B300\">Cancel</Text>\n          </Button>\n        </Box>\n      </Box>\n      {renameState.status === AsyncStatus.Error ? (\n        <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n          {renameState.error.message}\n        </Text>\n      ) : (\n        <Text size=\"T200\">Device names are visible to public.</Text>\n      )}\n    </Box>\n  );\n}\n\nexport function DeviceLogoutBtn() {\n  const [prompt, setPrompt] = useState(false);\n\n  const handleClose = () => setPrompt(false);\n\n  return (\n    <>\n      <Chip variant=\"Secondary\" fill=\"Soft\" radii=\"Pill\" onClick={() => setPrompt(true)}>\n        <Text size=\"B300\">Logout</Text>\n      </Chip>\n      {prompt && <LogoutDialogOverlay requestClose={handleClose} />}\n    </>\n  );\n}\n\ntype DeviceDeleteBtnProps = {\n  deviceId: string;\n  deleted: boolean;\n  onDeleteToggle: (deviceId: string) => void;\n  disabled?: boolean;\n};\nexport function DeviceDeleteBtn({\n  deviceId,\n  deleted,\n  onDeleteToggle,\n  disabled,\n}: DeviceDeleteBtnProps) {\n  return deleted ? (\n    <Chip\n      variant=\"Critical\"\n      fill=\"None\"\n      radii=\"Pill\"\n      onClick={() => onDeleteToggle(deviceId)}\n      disabled={disabled}\n    >\n      <Text size=\"B300\">Undo</Text>\n    </Chip>\n  ) : (\n    <Chip\n      variant=\"Secondary\"\n      fill=\"None\"\n      radii=\"Pill\"\n      onClick={() => onDeleteToggle(deviceId)}\n      disabled={disabled}\n    >\n      {chipIcon(Trash)}\n    </Chip>\n  );\n}\n\ntype DeviceTileProps = {\n  device: IMyDevice;\n  deleted?: boolean;\n  refreshDeviceList: () => Promise<void>;\n  disabled?: boolean;\n  options?: ReactNode;\n  children?: ReactNode;\n};\nexport function DeviceTile({\n  device,\n  deleted,\n  refreshDeviceList,\n  disabled,\n  options,\n  children,\n}: DeviceTileProps) {\n  const activeTs = device.last_seen_ts;\n  const [details, setDetails] = useState(false);\n  const [edit, setEdit] = useState(false);\n\n  const handleRename = useCallback(() => {\n    setEdit(false);\n  }, []);\n\n  return (\n    <>\n      <SettingTile\n        focusId={`device-${toSettingsFocusIdPart(device.device_id)}`}\n        showSettingLinkAction={false}\n        before={\n          <IconButton\n            variant={deleted ? 'Critical' : 'Secondary'}\n            outlined={deleted}\n            radii=\"300\"\n            onClick={() => setDetails(!details)}\n          >\n            {chipIcon(details ? CaretDown : CaretRight)}\n          </IconButton>\n        }\n        after={\n          !edit && (\n            <Box shrink=\"No\" alignItems=\"Center\" gap=\"200\">\n              {options}\n              {!deleted && (\n                <Chip\n                  variant=\"Secondary\"\n                  radii=\"Pill\"\n                  onClick={() => setEdit(true)}\n                  disabled={disabled}\n                >\n                  <Text size=\"B300\">Edit</Text>\n                </Chip>\n              )}\n            </Box>\n          )\n        }\n      >\n        <Text size=\"T300\">{device.display_name ?? device.device_id}</Text>\n        <Box direction=\"Column\">\n          {typeof activeTs === 'number' && <DeviceActiveTime ts={activeTs} />}\n          {details && (\n            <>\n              <DeviceDetails device={device} />\n              {children}\n            </>\n          )}\n        </Box>\n      </SettingTile>\n      {edit && (\n        <DeviceRename\n          device={device}\n          onCancel={() => setEdit(false)}\n          onRename={handleRename}\n          refreshDeviceList={refreshDeviceList}\n        />\n      )}\n    </>\n  );\n}\n","import type { ReactNode } from 'react';\nimport type { AuthDict, IAuthData, UIAFlow } from '$types/matrix-sdk';\nimport { AuthType } from '$types/matrix-sdk';\nimport { getUIAFlowForStages } from '$utils/matrix-uia';\nimport { useSupportedUIAFlows, useUIACompleted, useUIAFlow } from '$hooks/useUIAFlows';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { UIAFlowOverlay } from './UIAFlowOverlay';\nimport { OAuthStage, PasswordStage, SSOStage } from './uia-stages';\n\n// MSC4312 unstable prefix for m.oauth.\nexport const OAUTH_UNSTABLE_STAGE = 'org.matrix.cross_signing_reset';\n\nconst SUPPORTED_IN_APP_UIA_STAGES = [\n  AuthType.Password,\n  AuthType.Sso,\n  AuthType.OAuth,\n  OAUTH_UNSTABLE_STAGE,\n];\n\nconst pickUIAFlow = (uiaFlows: UIAFlow[]): UIAFlow | undefined => {\n  const passwordFlow = getUIAFlowForStages(uiaFlows, [AuthType.Password]);\n  if (passwordFlow) return passwordFlow;\n  const oauthFlow =\n    getUIAFlowForStages(uiaFlows, [AuthType.OAuth]) ??\n    getUIAFlowForStages(uiaFlows, [OAUTH_UNSTABLE_STAGE]);\n  if (oauthFlow) return oauthFlow;\n  return getUIAFlowForStages(uiaFlows, [AuthType.Sso]);\n};\n\ntype ActionUIAProps = {\n  authData: IAuthData;\n  ongoingFlow: UIAFlow;\n  action: (authDict: AuthDict) => void;\n  onCancel: () => void;\n};\nexport function ActionUIA({ authData, ongoingFlow, action, onCancel }: ActionUIAProps) {\n  const mx = useMatrixClient();\n  const completed = useUIACompleted(authData);\n  const { getStageToComplete } = useUIAFlow(authData, ongoingFlow);\n\n  const stageToComplete = getStageToComplete();\n\n  if (!stageToComplete) return null;\n  return (\n    <UIAFlowOverlay\n      currentStep={completed.length + 1}\n      stepCount={ongoingFlow.stages.length}\n      onCancel={onCancel}\n    >\n      {stageToComplete.type === (AuthType.Password as string) && (\n        <PasswordStage\n          userId={mx.getUserId()!}\n          stageData={stageToComplete}\n          onCancel={onCancel}\n          submitAuthDict={action}\n        />\n      )}\n      {stageToComplete.type === (AuthType.Sso as string) && stageToComplete.session && (\n        <SSOStage\n          ssoRedirectURL={mx.getFallbackAuthUrl(AuthType.Sso, stageToComplete.session)}\n          stageData={stageToComplete}\n          onCancel={onCancel}\n          submitAuthDict={action}\n        />\n      )}\n      {(stageToComplete.type === (AuthType.OAuth as string) ||\n        stageToComplete.type === OAUTH_UNSTABLE_STAGE) &&\n        stageToComplete.session && (\n          <OAuthStage stageData={stageToComplete} onCancel={onCancel} submitAuthDict={action} />\n        )}\n    </UIAFlowOverlay>\n  );\n}\n\ntype ActionUIAFlowsLoaderProps = {\n  authData: IAuthData;\n  unsupported: () => ReactNode;\n  children: (ongoingFlow: UIAFlow) => ReactNode;\n};\nexport function ActionUIAFlowsLoader({\n  authData,\n  unsupported,\n  children,\n}: ActionUIAFlowsLoaderProps) {\n  const supportedFlows = useSupportedUIAFlows(authData.flows ?? [], SUPPORTED_IN_APP_UIA_STAGES);\n  const ongoingFlow = supportedFlows.length > 0 ? pickUIAFlow(supportedFlows) : undefined;\n\n  if (!ongoingFlow) return unsupported();\n\n  return children(ongoingFlow);\n}\n","import type { ReactNode } from 'react';\nimport type { CryptoApi } from '$types/matrix-sdk';\nimport type { VerificationStatus } from '$hooks/useDeviceVerificationStatus';\nimport { useDeviceVerificationStatus } from '$hooks/useDeviceVerificationStatus';\n\ntype DeviceVerificationStatusProps = {\n  crypto?: CryptoApi;\n  userId: string;\n  deviceId: string;\n  children: (verificationStatus: VerificationStatus) => ReactNode;\n};\n\nexport function DeviceVerificationStatus({\n  crypto,\n  userId,\n  deviceId,\n  children,\n}: DeviceVerificationStatusProps) {\n  const status = useDeviceVerificationStatus(crypto, userId, deviceId);\n\n  return children(status);\n}\n","import type { ValidatedAuthMetadata } from '$types/matrix-sdk';\nimport type { Session } from '$state/sessions';\nimport { createContext, useContext } from 'react';\n\nconst AuthMetadataContext = createContext<ValidatedAuthMetadata | undefined>(undefined);\n\nexport const AuthMetadataProvider = AuthMetadataContext.Provider;\n\nexport const getSessionAuthMetadata = (\n  metadata: ValidatedAuthMetadata | undefined,\n  session: Session | undefined\n): ValidatedAuthMetadata | undefined => (session?.oidc ? metadata : undefined);\n\nexport const useAuthMetadata = (): ValidatedAuthMetadata | undefined => {\n  const metadata = useContext(AuthMetadataContext);\n\n  return metadata;\n};\n","import { useMemo } from 'react';\nimport type { ValidatedAuthMetadata } from '$types/matrix-sdk';\n\nexport const getAccountManagementUrl = (\n  metadata: ValidatedAuthMetadata | undefined,\n  action: string,\n  deviceId?: string,\n  homeserverUrl?: string\n): string | undefined => {\n  if (!metadata?.account_management_uri) return undefined;\n\n  const url = new URL(metadata.account_management_uri, homeserverUrl);\n  if (metadata.account_management_actions_supported?.includes(action)) {\n    url.searchParams.set('action', action);\n    if (deviceId) url.searchParams.set('device_id', deviceId);\n  }\n  return url.toString();\n};\n\nexport const useAccountManagementActions = () => {\n  const actions = useMemo(\n    () => ({\n      profile: 'org.matrix.profile',\n      sessionsList: 'org.matrix.devices_list',\n      sessionView: 'org.matrix.device_view',\n      sessionEnd: 'org.matrix.device_delete',\n      accountDeactivate: 'org.matrix.account_deactivate',\n      crossSigningReset: 'org.matrix.cross_signing_reset',\n    }),\n    []\n  );\n\n  return actions;\n};\n","import type { MouseEventHandler, ReactNode } from 'react';\nimport { useCallback, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport { Box, Text, Chip, Menu, config, MenuItem, color } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { CaretDown, sizedIcon } from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport type { SecretStorageKeyContent } from '$types/matrix/accountData';\nimport type { CryptoBackend } from '$types/matrix-sdk';\nimport { storePrivateKey } from '$client/secretStorageKeys';\nimport { stopPropagation } from '$utils/keyboard';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRefreshDeviceVerificationStatus } from '$hooks/useDeviceVerificationStatus';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { AsyncError } from '$components/AsyncError';\nimport { SettingTile } from './setting-tile';\nimport { SecretStorageKeyMethod, SecretStorageKeyPrompt } from './SecretStorage';\n\ntype ManualVerificationMethodSwitcherProps = {\n  value: SecretStorageKeyMethod;\n  onChange: (value: SecretStorageKeyMethod) => void;\n};\nfunction ManualVerificationMethodSwitcher({\n  value,\n  onChange,\n}: ManualVerificationMethodSwitcherProps) {\n  const [menuCords, setMenuCords] = useState<RectCords>();\n\n  const handleMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setMenuCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const handleSelect = (method: SecretStorageKeyMethod) => {\n    setMenuCords(undefined);\n    onChange(method);\n  };\n\n  return (\n    <>\n      <Chip\n        type=\"button\"\n        variant=\"Secondary\"\n        fill=\"Soft\"\n        radii=\"Pill\"\n        before={sizedIcon(CaretDown, '100')}\n        onClick={handleMenu}\n      >\n        <Text as=\"span\" size=\"B300\">\n          {value === SecretStorageKeyMethod.RecoveryPassphrase && 'Recovery Passphrase'}\n          {value === SecretStorageKeyMethod.RecoveryKey && 'Recovery Key'}\n        </Text>\n      </Chip>\n      <PopOut\n        anchor={menuCords}\n        offset={5}\n        position=\"Bottom\"\n        align=\"End\"\n        content={\n          <FocusTrap\n            focusTrapOptions={{\n              initialFocus: false,\n              onDeactivate: () => setMenuCords(undefined),\n              clickOutsideDeactivates: true,\n              isKeyForward: (evt: KeyboardEvent) =>\n                evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n              isKeyBackward: (evt: KeyboardEvent) =>\n                evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n              escapeDeactivates: stopPropagation,\n            }}\n          >\n            <Menu>\n              <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                <MenuItem\n                  size=\"300\"\n                  variant=\"Surface\"\n                  aria-selected={value === SecretStorageKeyMethod.RecoveryPassphrase}\n                  radii=\"300\"\n                  onClick={() => handleSelect(SecretStorageKeyMethod.RecoveryPassphrase)}\n                >\n                  <Box grow=\"Yes\">\n                    <Text size=\"T300\">Recovery Passphrase</Text>\n                  </Box>\n                </MenuItem>\n                <MenuItem\n                  size=\"300\"\n                  variant=\"Surface\"\n                  aria-selected={value === SecretStorageKeyMethod.RecoveryKey}\n                  radii=\"300\"\n                  onClick={() => handleSelect(SecretStorageKeyMethod.RecoveryKey)}\n                >\n                  <Box grow=\"Yes\">\n                    <Text size=\"T300\">Recovery Key</Text>\n                  </Box>\n                </MenuItem>\n              </Box>\n            </Menu>\n          </FocusTrap>\n        }\n      />\n    </>\n  );\n}\n\ntype ManualVerificationTileProps = {\n  secretStorageKeyId: string;\n  secretStorageKeyContent: SecretStorageKeyContent;\n  options?: ReactNode;\n};\nexport function ManualVerificationTile({\n  secretStorageKeyId,\n  secretStorageKeyContent,\n  options,\n}: ManualVerificationTileProps) {\n  const mx = useMatrixClient();\n\n  const hasPassphrase = !!secretStorageKeyContent.passphrase;\n  const [method, setMethod] = useState(\n    hasPassphrase ? SecretStorageKeyMethod.RecoveryPassphrase : SecretStorageKeyMethod.RecoveryKey\n  );\n\n  const refreshVerificationStatus = useRefreshDeviceVerificationStatus();\n\n  const verifyAndRestoreBackup = useCallback(\n    async (recoveryKey: Uint8Array) => {\n      const crypto = mx.getCrypto() as CryptoBackend | undefined;\n      if (!crypto) {\n        throw new Error('Unexpected Error! Crypto object not found.');\n      }\n\n      storePrivateKey(secretStorageKeyId, recoveryKey);\n\n      await crypto.processDeviceLists({ changed: [mx.getSafeUserId()] });\n      await crypto.bootstrapCrossSigning({});\n      await crypto.bootstrapSecretStorage({});\n\n      const deviceId = mx.getDeviceId();\n      if (!deviceId) {\n        throw new Error('Unexpected Error! Current device ID not found.');\n      }\n      await crypto.setDeviceVerified(mx.getSafeUserId(), deviceId);\n\n      await crypto.loadSessionBackupPrivateKeyFromSecretStorage();\n\n      refreshVerificationStatus();\n    },\n    [mx, secretStorageKeyId, refreshVerificationStatus]\n  );\n\n  const [verifyState, handleDecodedRecoveryKey] = useAsyncCallback<void, Error, [Uint8Array]>(\n    verifyAndRestoreBackup\n  );\n  const verifying = verifyState.status === AsyncStatus.Loading;\n\n  return (\n    <Box direction=\"Column\" gap=\"200\">\n      <SettingTile\n        title=\"Verify Manually\"\n        description={hasPassphrase ? 'Select a verification method.' : 'Provide recovery key.'}\n        after={\n          <Box alignItems=\"Center\" gap=\"200\">\n            {hasPassphrase && (\n              <ManualVerificationMethodSwitcher value={method} onChange={setMethod} />\n            )}\n            {options}\n          </Box>\n        }\n      />\n      {verifyState.status === AsyncStatus.Success ? (\n        <Text size=\"T200\" style={{ color: color.Success.Main }}>\n          <b>Device verified!</b>\n        </Text>\n      ) : (\n        <Box direction=\"Column\" gap=\"100\">\n          <SecretStorageKeyPrompt\n            method={method}\n            processing={verifying}\n            keyContent={secretStorageKeyContent}\n            onDecodedRecoveryKey={handleDecodedRecoveryKey}\n          />\n          <AsyncError state={verifyState} bold />\n        </Box>\n      )}\n    </Box>\n  );\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type {\n  CryptoEventHandlerMap,\n  VerificationPhase,\n  VerificationRequest,\n  VerificationRequestEventHandlerMap,\n  Verifier,\n  VerifierEventHandlerMap,\n} from '$types/matrix-sdk';\nimport { CryptoEvent, VerificationRequestEvent, VerifierEvent } from '$types/matrix-sdk';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport const useVerificationRequestReceived = (\n  onRequest: CryptoEventHandlerMap[CryptoEvent.VerificationRequestReceived]\n) => {\n  const mx = useMatrixClient();\n\n  useEffect(() => {\n    mx.on(CryptoEvent.VerificationRequestReceived, onRequest);\n    return () => {\n      mx.removeListener(CryptoEvent.VerificationRequestReceived, onRequest);\n    };\n  }, [mx, onRequest]);\n};\n\nconst useVerificationRequestChange = (\n  request: VerificationRequest,\n  onChange: VerificationRequestEventHandlerMap[VerificationRequestEvent.Change]\n) => {\n  useEffect(() => {\n    request.on(VerificationRequestEvent.Change, onChange);\n    return () => {\n      request.removeListener(VerificationRequestEvent.Change, onChange);\n    };\n  }, [request, onChange]);\n};\n\nexport const useVerificationRequestPhase = (request: VerificationRequest): VerificationPhase => {\n  const [phase, setPhase] = useState(() => request.phase);\n\n  useVerificationRequestChange(\n    request,\n    useCallback(() => {\n      setPhase(request.phase);\n    }, [request])\n  );\n\n  return phase;\n};\n\nexport const useVerifierCancel = (\n  verifier: Verifier,\n  onCallback: VerifierEventHandlerMap[VerifierEvent.Cancel]\n) => {\n  useEffect(() => {\n    verifier.on(VerifierEvent.Cancel, onCallback);\n    return () => {\n      verifier.removeListener(VerifierEvent.Cancel, onCallback);\n    };\n  }, [verifier, onCallback]);\n};\n\nexport const useVerifierShowSas = (\n  verifier: Verifier,\n  onCallback: VerifierEventHandlerMap[VerifierEvent.ShowSas]\n) => {\n  useEffect(() => {\n    verifier.on(VerifierEvent.ShowSas, onCallback);\n    return () => {\n      verifier.removeListener(VerifierEvent.ShowSas, onCallback);\n    };\n  }, [verifier, onCallback]);\n};\n","import type { ShowSasCallbacks, VerificationRequest, Verifier } from '$types/matrix-sdk';\nimport { VerificationPhase, VerificationMethod } from '$types/matrix-sdk';\nimport type { CSSProperties } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Box, config, Dialog, Header, IconButton, Spinner, Text } from 'folds';\nimport { composerIcon, X } from '$components/icons/phosphor';\nimport * as Sentry from '@sentry/react';\nimport {\n  useVerificationRequestPhase,\n  useVerificationRequestReceived,\n  useVerifierCancel,\n  useVerifierShowSas,\n} from '$hooks/useVerificationRequest';\nimport { useRefreshDeviceVerificationStatus } from '$hooks/useDeviceVerificationStatus';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { Button } from '$components/button';\n\nconst DialogHeaderStyles: CSSProperties = {\n  padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n  borderBottomWidth: config.borderWidth.B300,\n};\n\ntype WaitingMessageProps = {\n  message: string;\n};\nfunction WaitingMessage({ message }: WaitingMessageProps) {\n  return (\n    <Box alignItems=\"Center\" gap=\"200\">\n      <Spinner variant=\"Secondary\" size=\"200\" style={{ backgroundColor: 'transparent' }} />\n      <Text size=\"T300\">{message}</Text>\n    </Box>\n  );\n}\n\ntype VerificationUnexpectedProps = { message: string; onClose: () => void };\nfunction VerificationUnexpected({ message, onClose }: VerificationUnexpectedProps) {\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Text>{message}</Text>\n      <Button variant=\"Secondary\" fill=\"Soft\" onClick={onClose}>\n        <Text size=\"B400\">Close</Text>\n      </Button>\n    </Box>\n  );\n}\n\nfunction VerificationWaitAccept() {\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Text>Please accept the request from other device.</Text>\n      <WaitingMessage message=\"Waiting for request to be accepted...\" />\n    </Box>\n  );\n}\n\ntype VerificationAcceptProps = {\n  onAccept: () => Promise<void>;\n};\nfunction VerificationAccept({ onAccept }: VerificationAcceptProps) {\n  const [acceptState, accept] = useAsyncCallback(onAccept);\n\n  const accepting = acceptState.status === AsyncStatus.Loading;\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Text>Click accept to start the verification process.</Text>\n      <Button\n        variant=\"Primary\"\n        fill=\"Solid\"\n        onClick={accept}\n        loading={accepting}\n        spinnerSize=\"100\"\n        spinnerVariant=\"Primary\"\n      >\n        <Text size=\"B400\">Accept</Text>\n      </Button>\n    </Box>\n  );\n}\n\nfunction VerificationWaitStart() {\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Text>Verification request has been accepted.</Text>\n      <WaitingMessage message=\"Waiting for the response from other device...\" />\n    </Box>\n  );\n}\n\ntype VerificationStartProps = {\n  onStart: () => Promise<void>;\n};\nfunction AutoVerificationStart({ onStart }: VerificationStartProps) {\n  useEffect(() => {\n    onStart();\n  }, [onStart]);\n\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <WaitingMessage message=\"Starting verification using emoji comparison...\" />\n    </Box>\n  );\n}\n\nfunction CompareEmoji({ sasData }: { sasData: ShowSasCallbacks }) {\n  const [confirmState, confirm] = useAsyncCallback(useCallback(() => sasData.confirm(), [sasData]));\n  const emojiEntries = useMemo<{ id: string; emoji: string; name: string }[]>(\n    () =>\n      (sasData.sas.emoji ?? []).map(([emoji, name], index) => ({\n        id: `emoji-${index}`,\n        emoji,\n        name,\n      })),\n    [sasData]\n  );\n\n  const confirming =\n    confirmState.status === AsyncStatus.Loading || confirmState.status === AsyncStatus.Success;\n\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Text>Confirm the emoji below are displayed on both devices, in the same order:</Text>\n      <Box\n        className={ContainerColor({ variant: 'SurfaceVariant' })}\n        style={{\n          borderRadius: config.radii.R400,\n          padding: config.space.S500,\n        }}\n        gap=\"700\"\n        wrap=\"Wrap\"\n        justifyContent=\"Center\"\n      >\n        {emojiEntries.map(({ id, emoji, name }) => (\n          <Box key={id} direction=\"Column\" gap=\"100\" justifyContent=\"Center\" alignItems=\"Center\">\n            <Text size=\"H1\">{emoji}</Text>\n            <Text size=\"T200\">{name}</Text>\n          </Box>\n        ))}\n      </Box>\n      <Box direction=\"Column\" gap=\"200\">\n        <Button\n          variant=\"Primary\"\n          fill=\"Soft\"\n          onClick={confirm}\n          loading={confirming}\n          spinnerSize=\"100\"\n          spinnerVariant=\"Primary\"\n        >\n          <Text size=\"B400\">They Match</Text>\n        </Button>\n        <Button\n          variant=\"Primary\"\n          fill=\"Soft\"\n          onClick={() => sasData.mismatch()}\n          disabled={confirming}\n        >\n          <Text size=\"B400\">Do not Match</Text>\n        </Button>\n      </Box>\n    </Box>\n  );\n}\n\ntype SasVerificationProps = {\n  verifier: Verifier;\n  onCancel: () => void;\n};\nfunction SasVerification({ verifier, onCancel }: SasVerificationProps) {\n  const [sasData, setSasData] = useState<ShowSasCallbacks>();\n\n  useVerifierShowSas(verifier, setSasData);\n  useVerifierCancel(verifier, onCancel);\n\n  useEffect(() => {\n    verifier.verify();\n  }, [verifier]);\n\n  if (sasData) {\n    return <CompareEmoji sasData={sasData} />;\n  }\n\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <WaitingMessage message=\"Starting verification using emoji comparison...\" />\n    </Box>\n  );\n}\n\ntype VerificationDoneProps = {\n  onExit: () => void;\n};\nfunction VerificationDone({ onExit }: VerificationDoneProps) {\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <div>\n        <Text>Your device is verified.</Text>\n      </div>\n      <Button variant=\"Primary\" fill=\"Solid\" onClick={onExit}>\n        <Text size=\"B400\">Okay</Text>\n      </Button>\n    </Box>\n  );\n}\n\ntype VerificationCanceledProps = {\n  onClose: () => void;\n};\nfunction VerificationCanceled({ onClose }: VerificationCanceledProps) {\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Text>Verification has been canceled.</Text>\n      <Button variant=\"Secondary\" fill=\"Soft\" onClick={onClose}>\n        <Text size=\"B400\">Close</Text>\n      </Button>\n    </Box>\n  );\n}\n\ntype DeviceVerificationProps = {\n  request: VerificationRequest;\n  onExit: () => void;\n};\nexport function DeviceVerification({ request, onExit }: DeviceVerificationProps) {\n  const phase = useVerificationRequestPhase(request);\n\n  const handleCancel = useCallback(() => {\n    if (request.phase !== VerificationPhase.Done && request.phase !== VerificationPhase.Cancelled) {\n      request.cancel();\n    }\n    onExit();\n  }, [request, onExit]);\n\n  const handleAccept = useCallback(() => request.accept(), [request]);\n  const handleStart = useCallback(async () => {\n    await request.startVerification(VerificationMethod.Sas);\n  }, [request]);\n\n  const refreshVerificationStatus = useRefreshDeviceVerificationStatus();\n\n  useEffect(() => {\n    if (phase === VerificationPhase.Done) {\n      refreshVerificationStatus();\n      Sentry.metrics.count('sable.crypto.verification_outcome', 1, {\n        attributes: { outcome: 'completed' },\n      });\n    } else if (phase === VerificationPhase.Cancelled) {\n      Sentry.metrics.count('sable.crypto.verification_outcome', 1, {\n        attributes: { outcome: 'cancelled' },\n      });\n    }\n  }, [phase, refreshVerificationStatus]);\n\n  return (\n    <ModalOverlay\n      requestClose={handleCancel}\n      dismissOnClickOutside={false}\n      escapeDeactivates={false}\n    >\n      <Dialog variant=\"Surface\">\n        <Header style={DialogHeaderStyles} variant=\"Surface\" size=\"500\">\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">Device Verification</Text>\n          </Box>\n          <IconButton size=\"300\" radii=\"300\" onClick={handleCancel}>\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n          {phase === VerificationPhase.Requested &&\n            (request.initiatedByMe ? (\n              <VerificationWaitAccept />\n            ) : (\n              <VerificationAccept onAccept={handleAccept} />\n            ))}\n          {phase === VerificationPhase.Ready &&\n            (request.initiatedByMe ? (\n              <AutoVerificationStart onStart={handleStart} />\n            ) : (\n              <VerificationWaitStart />\n            ))}\n          {phase === VerificationPhase.Started &&\n            (request.verifier ? (\n              <SasVerification verifier={request.verifier} onCancel={handleCancel} />\n            ) : (\n              <VerificationUnexpected\n                message=\"Unexpected Error! Verification is started but verifier is missing.\"\n                onClose={handleCancel}\n              />\n            ))}\n          {phase === VerificationPhase.Done && <VerificationDone onExit={onExit} />}\n          {phase === VerificationPhase.Cancelled && <VerificationCanceled onClose={handleCancel} />}\n        </Box>\n      </Dialog>\n    </ModalOverlay>\n  );\n}\n\nexport function ReceiveSelfDeviceVerification() {\n  const [request, setRequest] = useState<VerificationRequest>();\n\n  useVerificationRequestReceived(setRequest);\n\n  const handleExit = useCallback(() => {\n    setRequest(undefined);\n  }, []);\n\n  if (!request) return null;\n\n  if (!request.isSelfVerification) {\n    return null;\n  }\n\n  return <DeviceVerification request={request} onExit={handleExit} />;\n}\n","import type { FormEventHandler } from 'react';\nimport { forwardRef, useCallback, useState } from 'react';\nimport { Dialog, Header, Box, Text, IconButton, config, Chip } from 'folds';\nimport { AsyncError } from '$components/AsyncError';\nimport { composerIcon, X } from '$components/icons/phosphor';\nimport { saveFileToDevice } from '$utils/download';\nimport to from 'await-to-js';\nimport type { AuthDict, IAuthData, UIAuthCallback, UIAFlow } from '$types/matrix-sdk';\nimport { MatrixError } from '$types/matrix-sdk';\nimport { clearSecretStorageKeys } from '$client/secretStorageKeys';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { copyToClipboard } from '$utils/dom';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useAlive } from '$hooks/useAlive';\nimport { PasswordInput } from './password-input';\nimport { ActionUIA, ActionUIAFlowsLoader } from './ActionUIA';\nimport { UseStateProvider } from './UseStateProvider';\nimport { Button } from '$components/button';\n\ntype UIACallback<T> = (\n  authDict: AuthDict | null\n) => Promise<[IAuthData, undefined] | [undefined, T]>;\n\ntype PerformAction<T> = (authDict: AuthDict | null) => Promise<T>;\n\ntype UIAAction<T> = {\n  authData: IAuthData;\n  callback: UIACallback<T>;\n  cancelCallback: () => void;\n};\n\nfunction makeUIAAction<T>(\n  authData: IAuthData,\n  performAction: PerformAction<T>,\n  resolve: (data: T) => void,\n  reject: (error?: unknown) => void\n): UIAAction<T> {\n  const action: UIAAction<T> = {\n    authData,\n    callback: async (authDict) => {\n      const [error, data] = await to<T, MatrixError | Error>(performAction(authDict));\n\n      if (error instanceof MatrixError && error.httpStatus === 401) {\n        return [error.data as IAuthData, undefined];\n      }\n\n      if (error) {\n        reject(error);\n        throw error;\n      }\n\n      resolve(data);\n      return [undefined, data];\n    },\n    cancelCallback: reject,\n  };\n\n  return action;\n}\n\nfunction renderUnsupportedUIAFlow() {\n  return (\n    <Text size=\"T200\">\n      Authentication steps to perform this action are not supported by client.\n    </Text>\n  );\n}\n\ntype SetupVerificationUIAProps = {\n  authData: IAuthData;\n  ongoingFlow: UIAFlow;\n  action: (authDict: AuthDict) => void;\n  onCancel: () => void;\n};\n\nfunction SetupVerificationUIA({\n  authData,\n  ongoingFlow,\n  action,\n  onCancel,\n}: SetupVerificationUIAProps) {\n  return (\n    <ActionUIA authData={authData} ongoingFlow={ongoingFlow} action={action} onCancel={onCancel} />\n  );\n}\n\ntype SetupVerificationProps = {\n  onComplete: (recoveryKey: string) => void;\n  reset?: boolean;\n};\nfunction SetupVerification({ onComplete, reset }: Readonly<SetupVerificationProps>) {\n  const mx = useMatrixClient();\n  const alive = useAlive();\n\n  const [uiaAction, setUIAAction] = useState<UIAAction<void>>();\n  const [nextAuthData, setNextAuthData] = useState<IAuthData | null>(); // null means no next action.\n\n  const handleAction = useCallback(\n    async (authDict: AuthDict) => {\n      if (!uiaAction) {\n        throw new Error('Unexpected Error! UIA action is perform without data.');\n      }\n      if (alive()) {\n        setNextAuthData(null);\n      }\n      const [authData] = await uiaAction.callback(authDict);\n\n      if (alive() && authData) {\n        setNextAuthData(authData);\n      }\n    },\n    [uiaAction, alive]\n  );\n\n  const resetUIA = useCallback(() => {\n    if (!alive()) return;\n    setUIAAction(undefined);\n    setNextAuthData(undefined);\n  }, [alive]);\n\n  const authUploadDeviceSigningKeys: UIAuthCallback<void> = useCallback(\n    (makeRequest) =>\n      new Promise<void>((resolve, reject) => {\n        makeRequest(null)\n          .then(() => {\n            resolve();\n            resetUIA();\n          })\n          .catch((error) => {\n            if (error instanceof MatrixError && error.httpStatus === 401) {\n              const authData = error.data as IAuthData;\n              const action = makeUIAAction(\n                authData,\n                makeRequest as PerformAction<void>,\n                resolve,\n                (err) => {\n                  resetUIA();\n                  reject(err);\n                }\n              );\n              if (alive()) {\n                setUIAAction(action);\n              } else {\n                reject(new Error('Authentication failed! Failed to setup device verification.'));\n              }\n              return;\n            }\n            reject(error);\n          });\n      }),\n    [alive, resetUIA]\n  );\n\n  const [setupState, setup] = useAsyncCallback<void, Error, [string | undefined]>(\n    useCallback(\n      async (passphrase) => {\n        const crypto = mx.getCrypto();\n        if (!crypto) throw new Error('Unexpected Error! Crypto module not found!');\n\n        const recoveryKeyData = await crypto.createRecoveryKeyFromPassphrase(passphrase);\n        if (!recoveryKeyData.encodedPrivateKey) {\n          throw new Error('Unexpected Error! Failed to create recovery key.');\n        }\n        clearSecretStorageKeys();\n\n        if (reset) {\n          await crypto.resetEncryption(authUploadDeviceSigningKeys);\n          await crypto.bootstrapSecretStorage({\n            createSecretStorageKey: async () => recoveryKeyData,\n            setupNewSecretStorage: true,\n          });\n        } else {\n          await crypto.bootstrapSecretStorage({\n            createSecretStorageKey: async () => recoveryKeyData,\n            setupNewSecretStorage: true,\n          });\n          await crypto.bootstrapCrossSigning({\n            authUploadDeviceSigningKeys,\n            setupNewCrossSigning: true,\n          });\n          await crypto.resetKeyBackup();\n        }\n\n        onComplete(recoveryKeyData.encodedPrivateKey);\n      },\n      [mx, onComplete, authUploadDeviceSigningKeys, reset]\n    )\n  );\n\n  const loading = setupState.status === AsyncStatus.Loading;\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (loading) return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const passphraseInput = target?.passphraseInput as HTMLInputElement | undefined;\n    let passphrase: string | undefined;\n    if (passphraseInput && passphraseInput.value.length > 0) {\n      passphrase = passphraseInput.value;\n    }\n\n    setup(passphrase);\n  };\n\n  const renderSetupVerificationUIA = useCallback(\n    (ongoingFlow: UIAFlow) => {\n      if (!uiaAction) return null;\n      return (\n        <SetupVerificationUIA\n          authData={nextAuthData ?? uiaAction.authData}\n          ongoingFlow={ongoingFlow}\n          action={handleAction}\n          onCancel={uiaAction.cancelCallback}\n        />\n      );\n    },\n    [uiaAction, nextAuthData, handleAction]\n  );\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} direction=\"Column\" gap=\"400\">\n      <Text size=\"T300\">\n        Generate a <b>Recovery Key</b> for verifying identity if you do not have access to other\n        devices. Additionally, setup a passphrase as a memorable alternative.\n      </Text>\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Passphrase (Optional)</Text>\n        <PasswordInput name=\"passphraseInput\" size=\"400\" readOnly={loading} />\n      </Box>\n      <Button type=\"submit\" loading={loading} spinnerSize=\"200\" spinnerVariant=\"Primary\">\n        <Text size=\"B400\">Continue</Text>\n      </Button>\n      <AsyncError state={setupState} bold />\n      {nextAuthData !== null && uiaAction && (\n        <ActionUIAFlowsLoader\n          authData={nextAuthData ?? uiaAction.authData}\n          unsupported={renderUnsupportedUIAFlow}\n        >\n          {renderSetupVerificationUIA}\n        </ActionUIAFlowsLoader>\n      )}\n    </Box>\n  );\n}\n\ntype RecoveryKeyDisplayProps = {\n  recoveryKey: string;\n};\nfunction RecoveryKeyDisplay({ recoveryKey }: Readonly<RecoveryKeyDisplayProps>) {\n  const [show, setShow] = useState(false);\n\n  const handleCopy = () => {\n    copyToClipboard(recoveryKey);\n  };\n\n  const handleDownload = () => {\n    const blob = new Blob([recoveryKey], {\n      type: 'text/plain;charset=us-ascii',\n    });\n    void saveFileToDevice(blob, 'recovery-key.txt');\n  };\n\n  const safeToDisplayKey = show ? recoveryKey : recoveryKey.replaceAll(/[^\\s]/g, '*');\n\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Text size=\"T300\">\n        Store the Recovery Key in a safe place for future use, as you will need it to verify your\n        identity if you do not have access to other devices.\n      </Text>\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Recovery Key</Text>\n        <Box\n          className={ContainerColor({ variant: 'SurfaceVariant' })}\n          style={{\n            padding: config.space.S300,\n            borderRadius: config.radii.R400,\n          }}\n          alignItems=\"Center\"\n          justifyContent=\"Center\"\n          gap=\"400\"\n        >\n          <Text style={{ fontFamily: 'var(--font-monospace)' }} size=\"T200\" priority=\"300\">\n            {safeToDisplayKey}\n          </Text>\n          <Chip onClick={() => setShow(!show)} variant=\"Secondary\" radii=\"Pill\">\n            <Text size=\"B300\">{show ? 'Hide' : 'Show'}</Text>\n          </Chip>\n        </Box>\n      </Box>\n      <Box direction=\"Column\" gap=\"200\">\n        <Button onClick={handleCopy}>\n          <Text size=\"B400\">Copy</Text>\n        </Button>\n        <Button onClick={handleDownload} fill=\"Soft\">\n          <Text size=\"B400\">Download</Text>\n        </Button>\n      </Box>\n    </Box>\n  );\n}\n\ntype DeviceVerificationSetupProps = {\n  onCancel: () => void;\n};\nexport const DeviceVerificationSetup = forwardRef<HTMLDivElement, DeviceVerificationSetupProps>(\n  ({ onCancel }, ref) => {\n    const [recoveryKey, setRecoveryKey] = useState<string>();\n\n    return (\n      <Dialog ref={ref}>\n        <Header\n          style={{\n            padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n            borderBottomWidth: config.borderWidth.B300,\n          }}\n          variant=\"Surface\"\n          size=\"500\"\n        >\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">Setup Device Verification</Text>\n          </Box>\n          <IconButton size=\"300\" radii=\"300\" onClick={onCancel}>\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n          {recoveryKey ? (\n            <RecoveryKeyDisplay recoveryKey={recoveryKey} />\n          ) : (\n            <SetupVerification onComplete={setRecoveryKey} />\n          )}\n        </Box>\n      </Dialog>\n    );\n  }\n);\ntype DeviceVerificationResetProps = {\n  onCancel: () => void;\n};\nexport const DeviceVerificationReset = forwardRef<HTMLDivElement, DeviceVerificationResetProps>(\n  ({ onCancel }, ref) => {\n    const [reset, setReset] = useState(false);\n\n    return (\n      <Dialog ref={ref}>\n        <Header\n          style={{\n            padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n            borderBottomWidth: config.borderWidth.B300,\n          }}\n          variant=\"Surface\"\n          size=\"500\"\n        >\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">Reset Device Verification</Text>\n          </Box>\n          <IconButton size=\"300\" radii=\"300\" onClick={onCancel}>\n            {composerIcon(X)}\n          </IconButton>\n        </Header>\n        {reset ? (\n          <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n            <UseStateProvider initial={undefined}>\n              {(recoveryKey: string | undefined, setRecoveryKey) =>\n                recoveryKey ? (\n                  <RecoveryKeyDisplay recoveryKey={recoveryKey} />\n                ) : (\n                  <SetupVerification onComplete={setRecoveryKey} reset />\n                )\n              }\n            </UseStateProvider>\n          </Box>\n        ) : (\n          <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n            <Box direction=\"Column\" gap=\"200\">\n              <Text size=\"H1\">✋🧑‍🚒🤚</Text>\n              <Text size=\"T300\">Resetting device verification is permanent.</Text>\n              <Text size=\"T300\">\n                Anyone you have verified with will see security alerts and your encryption backup\n                will be lost. You almost certainly do not want to do this, unless you have lost{' '}\n                <b>Recovery Key</b> or <b>Recovery Passphrase</b> and every device you can verify\n                from.\n              </Text>\n            </Box>\n            <Button variant=\"Critical\" onClick={() => setReset(true)}>\n              <Text size=\"B400\">Reset</Text>\n            </Button>\n          </Box>\n        )}\n      </Dialog>\n    );\n  }\n);\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useState } from 'react';\nimport { isTauri } from '@tauri-apps/api/core';\nimport type { RectCords } from 'folds';\nimport { Badge, Box, Button, Chip, config, Spinner, Text, IconButton, Menu, MenuItem } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { DotsThreeOutlineVerticalIcon, menuIcon, X } from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport type { CryptoApi, VerificationRequest } from '$types/matrix-sdk';\nimport { VerificationStatus } from '$hooks/useDeviceVerificationStatus';\nimport { InfoCard } from '$components/info-card';\nimport { ManualVerificationTile } from '$components/ManualVerification';\nimport type { SecretStorageKeyContent } from '$types/matrix/accountData';\nimport type { AsyncState } from '$hooks/useAsyncCallback';\nimport { AsyncStatus, useAsync } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { DeviceVerification } from '$components/DeviceVerification';\nimport {\n  DeviceVerificationReset,\n  DeviceVerificationSetup,\n} from '$components/DeviceVerificationSetup';\nimport { stopPropagation } from '$utils/keyboard';\nimport { useAuthMetadata } from '$hooks/useAuthMetadata';\nimport { getAccountManagementUrl, useAccountManagementActions } from '$hooks/useAccountManagement';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\n\ntype VerificationStatusBadgeProps = {\n  verificationStatus: VerificationStatus;\n  otherUnverifiedCount?: number;\n};\nexport function VerificationStatusBadge({\n  verificationStatus,\n  otherUnverifiedCount,\n}: VerificationStatusBadgeProps) {\n  if (\n    verificationStatus === VerificationStatus.Unknown ||\n    typeof otherUnverifiedCount !== 'number'\n  ) {\n    return <Spinner size=\"400\" variant=\"Secondary\" />;\n  }\n  if (verificationStatus === VerificationStatus.Unverified) {\n    return (\n      <Badge variant=\"Critical\" fill=\"Solid\" size=\"500\">\n        <Text size=\"L400\">Unverified</Text>\n      </Badge>\n    );\n  }\n\n  if (otherUnverifiedCount > 0) {\n    return (\n      <Badge variant=\"Warning\" fill=\"Solid\" size=\"500\">\n        <Text size=\"L400\">{otherUnverifiedCount} Unverified</Text>\n      </Badge>\n    );\n  }\n\n  return (\n    <Badge variant=\"Success\" fill=\"Solid\" size=\"500\">\n      <Text size=\"L400\">Verified</Text>\n    </Badge>\n  );\n}\n\nfunction LearnStartVerificationFromOtherDevice() {\n  return (\n    <Box direction=\"Column\">\n      <Text size=\"T200\">Steps to verify from other device.</Text>\n      <Text as=\"div\" size=\"T200\">\n        <ul style={{ margin: `${config.space.S100} 0` }}>\n          <li>Open your other verified device.</li>\n          <li>\n            Open <i>Settings</i>.\n          </li>\n          <li>\n            Find this device in <i>Devices/Sessions</i> section.\n          </li>\n          <li>Initiate verification.</li>\n        </ul>\n      </Text>\n      <Text size=\"T200\">\n        If you do not have any verified device press the <i>&quot;Verify Manually&quot;</i> button.\n      </Text>\n    </Box>\n  );\n}\n\ntype VerifyCurrentDeviceTileProps = {\n  secretStorageKeyId: string;\n  secretStorageKeyContent: SecretStorageKeyContent;\n};\nexport function VerifyCurrentDeviceTile({\n  secretStorageKeyId,\n  secretStorageKeyContent,\n}: VerifyCurrentDeviceTileProps) {\n  const [learnMore, setLearnMore] = useState(false);\n\n  const [manualVerification, setManualVerification] = useState(false);\n  const handleCancelVerification = () => setManualVerification(false);\n\n  return (\n    <>\n      <InfoCard\n        variant=\"Critical\"\n        title=\"Unverified\"\n        description={\n          <>\n            Start verification from other device or verify manually.{' '}\n            <Text as=\"a\" size=\"T200\" onClick={() => setLearnMore(!learnMore)}>\n              <b>{learnMore ? 'View Less' : 'Learn More'}</b>\n            </Text>\n          </>\n        }\n        after={\n          !manualVerification && (\n            <Button\n              size=\"300\"\n              variant=\"Critical\"\n              fill=\"Soft\"\n              radii=\"300\"\n              outlined\n              onClick={() => setManualVerification(true)}\n            >\n              <Text as=\"span\" size=\"B300\">\n                Verify Manually\n              </Text>\n            </Button>\n          )\n        }\n      >\n        {learnMore && <LearnStartVerificationFromOtherDevice />}\n      </InfoCard>\n      {manualVerification && (\n        <ManualVerificationTile\n          secretStorageKeyId={secretStorageKeyId}\n          secretStorageKeyContent={secretStorageKeyContent}\n          options={\n            <Chip\n              type=\"button\"\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              radii=\"Pill\"\n              onClick={handleCancelVerification}\n            >\n              {menuIcon(X)}\n            </Chip>\n          }\n        />\n      )}\n    </>\n  );\n}\n\ntype VerifyOtherDeviceTileProps = {\n  crypto: CryptoApi;\n  deviceId: string;\n};\nexport function VerifyOtherDeviceTile({ crypto, deviceId }: VerifyOtherDeviceTileProps) {\n  const mx = useMatrixClient();\n  const [requestState, setRequestState] = useState<AsyncState<VerificationRequest, Error>>({\n    status: AsyncStatus.Idle,\n  });\n\n  const requestVerification = useAsync<VerificationRequest, Error, []>(\n    useCallback(() => {\n      const requestPromise = crypto.requestDeviceVerification(mx.getSafeUserId(), deviceId);\n      return requestPromise;\n    }, [mx, crypto, deviceId]),\n    setRequestState\n  );\n\n  const handleExit = useCallback(() => {\n    setRequestState({\n      status: AsyncStatus.Idle,\n    });\n  }, []);\n\n  const requesting = requestState.status === AsyncStatus.Loading;\n  return (\n    <InfoCard\n      variant=\"Warning\"\n      title=\"Unverified\"\n      description=\"Verify device identity and grant access to encrypted messages.\"\n      after={\n        <Button\n          size=\"300\"\n          variant=\"Warning\"\n          radii=\"300\"\n          onClick={requestVerification}\n          before={requesting && <Spinner size=\"100\" variant=\"Warning\" fill=\"Solid\" />}\n          disabled={requesting}\n        >\n          <Text as=\"span\" size=\"B300\">\n            Verify\n          </Text>\n        </Button>\n      }\n    >\n      {requestState.status === AsyncStatus.Error && (\n        <Text size=\"T200\">{requestState.error.message}</Text>\n      )}\n      {requestState.status === AsyncStatus.Success && (\n        <DeviceVerification request={requestState.data} onExit={handleExit} />\n      )}\n    </InfoCard>\n  );\n}\n\ntype EnableVerificationProps = {\n  visible: boolean;\n};\nexport function EnableVerification({ visible }: EnableVerificationProps) {\n  const [open, setOpen] = useState(false);\n\n  const handleCancel = useCallback(() => setOpen(false), []);\n\n  return (\n    <>\n      {visible && (\n        <Button size=\"300\" radii=\"300\" onClick={() => setOpen(true)}>\n          <Text as=\"span\" size=\"B300\">\n            Enable\n          </Text>\n        </Button>\n      )}\n      {open && (\n        <ModalOverlay\n          requestClose={handleCancel}\n          dismissOnClickOutside={false}\n          escapeDeactivates={false}\n        >\n          <DeviceVerificationSetup onCancel={handleCancel} />\n        </ModalOverlay>\n      )}\n    </>\n  );\n}\n\nexport function DeviceVerificationOptions() {\n  const [menuCords, setMenuCords] = useState<RectCords>();\n  const authMetadata = useAuthMetadata();\n  const mx = useMatrixClient();\n  const accountManagementActions = useAccountManagementActions();\n\n  const [reset, setReset] = useState(false);\n\n  const handleCancelReset = useCallback(() => {\n    setReset(false);\n  }, []);\n\n  const handleMenu: MouseEventHandler<HTMLButtonElement> = (event) => {\n    setMenuCords(event.currentTarget.getBoundingClientRect());\n  };\n\n  const handleReset = () => {\n    setMenuCords(undefined);\n\n    const url = getAccountManagementUrl(\n      authMetadata,\n      accountManagementActions.crossSigningReset,\n      undefined,\n      mx.getHomeserverUrl()\n    );\n    if (url) {\n      if (isTauri()) {\n        import('@tauri-apps/plugin-opener')\n          .then(({ openUrl }) => openUrl(url))\n          .catch(() => window.open(url, '_blank'));\n      } else {\n        window.open(url, '_blank');\n      }\n    }\n\n    setReset(true);\n  };\n\n  return (\n    <>\n      <IconButton\n        aria-pressed={!!menuCords}\n        variant=\"SurfaceVariant\"\n        size=\"300\"\n        radii=\"300\"\n        onClick={handleMenu}\n      >\n        {menuIcon(DotsThreeOutlineVerticalIcon, { weight: menuCords ? 'fill' : 'regular' })}\n      </IconButton>\n      <PopOut\n        anchor={menuCords}\n        offset={5}\n        position=\"Bottom\"\n        align=\"Center\"\n        content={\n          <FocusTrap\n            focusTrapOptions={{\n              initialFocus: false,\n              onDeactivate: () => setMenuCords(undefined),\n              clickOutsideDeactivates: true,\n              isKeyForward: (evt: KeyboardEvent) =>\n                evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n              isKeyBackward: (evt: KeyboardEvent) =>\n                evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n              escapeDeactivates: stopPropagation,\n            }}\n          >\n            <Menu>\n              <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                <MenuItem\n                  variant=\"Critical\"\n                  onClick={handleReset}\n                  size=\"300\"\n                  radii=\"300\"\n                  fill=\"None\"\n                >\n                  <Text as=\"span\" size=\"T300\" truncate>\n                    Reset\n                  </Text>\n                </MenuItem>\n              </Box>\n            </Menu>\n          </FocusTrap>\n        }\n      />\n      {reset && (\n        <ModalOverlay\n          requestClose={handleCancelReset}\n          dismissOnClickOutside={false}\n          escapeDeactivates={false}\n        >\n          <DeviceVerificationReset onCancel={handleCancelReset} />\n        </ModalOverlay>\n      )}\n    </>\n  );\n}\n","import { useCallback, useState } from 'react';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { Box, Button, config, Menu, Spinner, Text } from 'folds';\nimport type { AuthDict, IAuthData, IMyDevice, MatrixError, UIAFlow } from '$types/matrix-sdk';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { ActionUIA, ActionUIAFlowsLoader } from '$components/ActionUIA';\nimport type { AsyncState } from '$hooks/useAsyncCallback';\nimport { AsyncStatus, useAsync } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useUIAMatrixError } from '$hooks/useUIAFlows';\nimport { DeviceVerificationStatus } from '$components/DeviceVerificationStatus';\nimport { VerificationStatus } from '$hooks/useDeviceVerificationStatus';\nimport { useAuthMetadata } from '$hooks/useAuthMetadata';\nimport { getAccountManagementUrl, useAccountManagementActions } from '$hooks/useAccountManagement';\nimport { SettingTile } from '$components/setting-tile';\nimport { VerifyOtherDeviceTile } from './Verification';\nimport { DeviceDeleteBtn, DeviceTile } from './DeviceTile';\n\nfunction renderUnsupportedUIAFlow() {\n  return (\n    <Text size=\"T200\">\n      Authentication steps to perform this action are not supported by client.\n    </Text>\n  );\n}\n\ntype DeleteDevicesUIAProps = {\n  authData: IAuthData;\n  ongoingFlow: UIAFlow;\n  deleteDevices: (authDict?: AuthDict) => void;\n  onCancel: () => void;\n};\n\nfunction DeleteDevicesUIA({\n  authData,\n  ongoingFlow,\n  deleteDevices,\n  onCancel,\n}: DeleteDevicesUIAProps) {\n  return (\n    <ActionUIA\n      authData={authData}\n      ongoingFlow={ongoingFlow}\n      action={deleteDevices}\n      onCancel={onCancel}\n    />\n  );\n}\n\ntype OtherDevicesProps = {\n  devices: IMyDevice[];\n  refreshDeviceList: () => Promise<void>;\n  showVerification?: boolean;\n};\nexport function OtherDevices({ devices, refreshDeviceList, showVerification }: OtherDevicesProps) {\n  const mx = useMatrixClient();\n  const crypto = mx.getCrypto();\n  const authMetadata = useAuthMetadata();\n  const accountManagementActions = useAccountManagementActions();\n\n  const [deleted, setDeleted] = useState(new Set());\n\n  const handleDashboardOIDC = useCallback(() => {\n    const url = getAccountManagementUrl(\n      authMetadata,\n      accountManagementActions.sessionsList,\n      undefined,\n      mx.getHomeserverUrl()\n    );\n    if (!url) return;\n    if (isTauri()) {\n      import('@tauri-apps/plugin-opener')\n        .then(({ openUrl }) => openUrl(url))\n        .catch(() => window.open(url, '_blank'));\n      return;\n    }\n    window.open(url, '_blank');\n  }, [authMetadata, accountManagementActions, mx]);\n\n  const handleDeleteOIDC = useCallback(\n    (deviceId: string) => {\n      const url = getAccountManagementUrl(\n        authMetadata,\n        accountManagementActions.sessionEnd,\n        deviceId,\n        mx.getHomeserverUrl()\n      );\n      if (!url) return;\n      if (isTauri()) {\n        import('@tauri-apps/plugin-opener')\n          .then(({ openUrl }) => openUrl(url))\n          .catch(() => window.open(url, '_blank'));\n        return;\n      }\n      window.open(url, '_blank');\n    },\n    [authMetadata, accountManagementActions, mx]\n  );\n\n  const handleToggleDelete = useCallback((deviceId: string) => {\n    setDeleted((deviceIds) => {\n      const newIds = new Set(deviceIds);\n      if (newIds.has(deviceId)) {\n        newIds.delete(deviceId);\n      } else {\n        newIds.add(deviceId);\n      }\n      return newIds;\n    });\n  }, []);\n\n  const [deleteState, setDeleteState] = useState<AsyncState<void, MatrixError>>({\n    status: AsyncStatus.Idle,\n  });\n\n  const deleteDevices = useAsync(\n    useCallback(\n      async (authDict?: AuthDict) => {\n        await mx.deleteMultipleDevices(Array.from(deleted) as string[], authDict);\n      },\n      [mx, deleted]\n    ),\n    useCallback(\n      (state: typeof deleteState) => {\n        if (state.status === AsyncStatus.Success) {\n          setDeleted(new Set());\n          refreshDeviceList();\n        }\n        setDeleteState(state);\n      },\n      [refreshDeviceList]\n    )\n  );\n  const [authData, deleteError] = useUIAMatrixError(\n    deleteState.status === AsyncStatus.Error ? deleteState.error : undefined\n  );\n  const deleting = deleteState.status === AsyncStatus.Loading || authData !== undefined;\n\n  const handleCancelDelete = () => setDeleted(new Set());\n  const handleCancelAuth = useCallback(() => {\n    setDeleteState({ status: AsyncStatus.Idle });\n  }, []);\n\n  const renderDeleteDevicesUIA = useCallback(\n    (ongoingFlow: UIAFlow) =>\n      authData ? (\n        <DeleteDevicesUIA\n          authData={authData}\n          ongoingFlow={ongoingFlow}\n          deleteDevices={deleteDevices}\n          onCancel={handleCancelAuth}\n        />\n      ) : null,\n    [authData, deleteDevices, handleCancelAuth]\n  );\n\n  return devices.length > 0 ? (\n    <>\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Others</Text>\n        {authMetadata?.account_management_uri && (\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"400\"\n          >\n            <SettingTile\n              title=\"Device Dashboard\"\n              focusId=\"device-dashboard\"\n              description=\"Manage your devices on OIDC dashboard.\"\n              after={\n                <Button\n                  size=\"300\"\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  radii=\"300\"\n                  outlined\n                  onClick={handleDashboardOIDC}\n                >\n                  <Text size=\"B300\">Open</Text>\n                </Button>\n              }\n            />\n          </SequenceCard>\n        )}\n        {devices\n          .toSorted((d1, d2) => {\n            return (d1.last_seen_ts ?? 0) < (d2.last_seen_ts ?? 0) ? 1 : -1;\n          })\n          .map((device) => (\n            <SequenceCard\n              key={device.device_id}\n              className={SequenceCardStyle}\n              variant={deleted.has(device.device_id) ? 'Critical' : 'SurfaceVariant'}\n              direction=\"Column\"\n              gap=\"400\"\n            >\n              <DeviceTile\n                device={device}\n                deleted={deleted.has(device.device_id)}\n                refreshDeviceList={refreshDeviceList}\n                disabled={deleting}\n                options={\n                  authMetadata?.account_management_uri ? (\n                    <DeviceDeleteBtn\n                      deviceId={device.device_id}\n                      deleted={false}\n                      onDeleteToggle={handleDeleteOIDC}\n                    />\n                  ) : authMetadata ? undefined : (\n                    <DeviceDeleteBtn\n                      deviceId={device.device_id}\n                      deleted={deleted.has(device.device_id)}\n                      onDeleteToggle={handleToggleDelete}\n                      disabled={deleting}\n                    />\n                  )\n                }\n              />\n              {showVerification && crypto && (\n                <DeviceVerificationStatus\n                  crypto={crypto}\n                  userId={mx.getSafeUserId()}\n                  deviceId={device.device_id}\n                >\n                  {(status) =>\n                    status === VerificationStatus.Unverified && (\n                      <VerifyOtherDeviceTile crypto={crypto} deviceId={device.device_id} />\n                    )\n                  }\n                </DeviceVerificationStatus>\n              )}\n            </SequenceCard>\n          ))}\n      </Box>\n      {deleted.size > 0 && (\n        <Menu\n          style={{\n            position: 'sticky',\n            padding: config.space.S200,\n            paddingLeft: config.space.S400,\n            bottom: config.space.S400,\n            left: config.space.S400,\n            right: 0,\n            zIndex: 1,\n          }}\n          variant=\"Critical\"\n        >\n          <Box alignItems=\"Center\" gap=\"400\">\n            <Box grow=\"Yes\" direction=\"Column\">\n              {deleteError ? (\n                <Text size=\"T200\">\n                  <b>Failed to logout devices! Please try again. {deleteError.message}</b>\n                </Text>\n              ) : (\n                <Text size=\"T200\">\n                  <b>Logout from selected devices. ({deleted.size} selected)</b>\n                </Text>\n              )}\n              {authData && (\n                <ActionUIAFlowsLoader authData={authData} unsupported={renderUnsupportedUIAFlow}>\n                  {renderDeleteDevicesUIA}\n                </ActionUIAFlowsLoader>\n              )}\n            </Box>\n            <Box shrink=\"No\" gap=\"200\">\n              <Button\n                size=\"300\"\n                variant=\"Critical\"\n                fill=\"None\"\n                radii=\"300\"\n                disabled={deleting}\n                onClick={handleCancelDelete}\n              >\n                <Text size=\"B300\">Cancel</Text>\n              </Button>\n              <Button\n                size=\"300\"\n                variant=\"Critical\"\n                radii=\"300\"\n                disabled={deleting}\n                before={deleting && <Spinner variant=\"Critical\" fill=\"Solid\" size=\"100\" />}\n                onClick={() => deleteDevices()}\n              >\n                <Text size=\"B300\">Logout</Text>\n              </Button>\n            </Box>\n          </Box>\n        </Menu>\n      )}\n    </>\n  ) : null;\n}\n","import { Box, Text, Scroll } from 'folds';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useDeviceIds, useDeviceList, useSplitCurrentDevice } from '$hooks/useDeviceList';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport {\n  useDeviceVerificationStatus,\n  useUnverifiedDeviceCount,\n  VerificationStatus,\n} from '$hooks/useDeviceVerificationStatus';\nimport { useSecretStorageDefaultKeyId, useSecretStorageKeyContent } from '$hooks/useSecretStorage';\nimport { useCrossSigningActive } from '$hooks/useCrossSigning';\nimport { BackupRestoreTile } from '$components/BackupRestore';\nimport { LocalBackup } from './LocalBackup';\nimport { DeviceLogoutBtn, DeviceKeyDetails, DeviceTile, DeviceTilePlaceholder } from './DeviceTile';\nimport { OtherDevices } from './OtherDevices';\nimport {\n  DeviceVerificationOptions,\n  EnableVerification,\n  VerificationStatusBadge,\n  VerifyCurrentDeviceTile,\n} from './Verification';\n\nfunction DevicesPlaceholder() {\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <DeviceTilePlaceholder />\n      <DeviceTilePlaceholder />\n    </Box>\n  );\n}\n\ntype DevicesProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\nexport function Devices({ requestBack, requestClose }: DevicesProps) {\n  const mx = useMatrixClient();\n  const crypto = mx.getCrypto();\n  const crossSigningActive = useCrossSigningActive();\n  const [devices, refreshDeviceList] = useDeviceList();\n\n  const [currentDevice, otherDevices] = useSplitCurrentDevice(devices);\n  const verificationStatus = useDeviceVerificationStatus(\n    crypto,\n    mx.getSafeUserId(),\n    currentDevice?.device_id\n  );\n\n  const otherDevicesId = useDeviceIds(otherDevices);\n  const unverifiedDeviceCount = useUnverifiedDeviceCount(\n    crypto,\n    mx.getSafeUserId(),\n    otherDevicesId\n  );\n\n  const defaultSecretStorageKeyId = useSecretStorageDefaultKeyId();\n  const defaultSecretStorageKeyContent = useSecretStorageKeyContent(\n    defaultSecretStorageKeyId ?? ''\n  );\n\n  return (\n    <SettingsSectionPage title=\"Devices\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Security</Text>\n                <SequenceCard\n                  className={SequenceCardStyle}\n                  variant=\"SurfaceVariant\"\n                  direction=\"Column\"\n                  gap=\"400\"\n                >\n                  <SettingTile\n                    title=\"Device Verification\"\n                    focusId=\"device-verification\"\n                    description=\"To verify device identity and grant access to encrypted messages.\"\n                    after={\n                      <>\n                        <EnableVerification visible={!crossSigningActive} />\n                        {crossSigningActive && (\n                          <Box gap=\"200\" alignItems=\"Center\">\n                            <VerificationStatusBadge\n                              verificationStatus={verificationStatus}\n                              otherUnverifiedCount={unverifiedDeviceCount}\n                            />\n                            <DeviceVerificationOptions />\n                          </Box>\n                        )}\n                      </>\n                    }\n                  />\n                </SequenceCard>\n              </Box>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Current</Text>\n                {currentDevice ? (\n                  <SequenceCard\n                    className={SequenceCardStyle}\n                    variant=\"SurfaceVariant\"\n                    direction=\"Column\"\n                    gap=\"400\"\n                  >\n                    <DeviceTile\n                      device={currentDevice}\n                      refreshDeviceList={refreshDeviceList}\n                      options={<DeviceLogoutBtn />}\n                    >\n                      {crypto && <DeviceKeyDetails crypto={crypto} />}\n                    </DeviceTile>\n                    {crossSigningActive &&\n                      verificationStatus === VerificationStatus.Unverified &&\n                      defaultSecretStorageKeyId &&\n                      defaultSecretStorageKeyContent && (\n                        <VerifyCurrentDeviceTile\n                          secretStorageKeyId={defaultSecretStorageKeyId}\n                          secretStorageKeyContent={defaultSecretStorageKeyContent}\n                        />\n                      )}\n                    {crypto && verificationStatus === VerificationStatus.Verified && (\n                      <BackupRestoreTile\n                        crypto={crypto}\n                        secretStorageKeyId={defaultSecretStorageKeyId}\n                        secretStorageKeyContent={defaultSecretStorageKeyContent}\n                      />\n                    )}\n                  </SequenceCard>\n                ) : (\n                  <DeviceTilePlaceholder />\n                )}\n              </Box>\n              {devices === undefined && <DevicesPlaceholder />}\n              {otherDevices && (\n                <OtherDevices\n                  devices={otherDevices}\n                  refreshDeviceList={refreshDeviceList}\n                  showVerification={\n                    crossSigningActive && verificationStatus === VerificationStatus.Verified\n                  }\n                />\n              )}\n              <LocalBackup />\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { useMemo } from 'react';\nimport { Button, Text } from 'folds';\nimport { CaretDown, sizedIcon } from '$components/icons/phosphor';\nimport { ImageUsage } from '$plugins/custom-emoji';\nimport {\n  SettingMenuSelector,\n  type SettingMenuOption,\n} from '$components/setting-menu-selector/SettingMenuSelector';\n\nconst getUsageStr = (usage: ImageUsage[]): string => {\n  const sticker = usage.includes(ImageUsage.Sticker);\n  const emoticon = usage.includes(ImageUsage.Emoticon);\n\n  if (sticker && emoticon) return 'Both';\n  if (sticker) return 'Sticker';\n  if (emoticon) return 'Emoji';\n  return 'Both';\n};\n\nexport const useUsageStr = (): ((usage: ImageUsage[]) => string) => getUsageStr;\n\nconst ALL_USAGES: ImageUsage[][] = [\n  [ImageUsage.Emoticon],\n  [ImageUsage.Sticker],\n  [ImageUsage.Sticker, ImageUsage.Emoticon],\n];\n\ntype UsageSwitcherProps = {\n  usage: ImageUsage[];\n  canEdit?: boolean;\n  onChange: (usage: ImageUsage[]) => void;\n};\nexport function UsageSwitcher({ usage, onChange, canEdit }: UsageSwitcherProps) {\n  const formatUsageStr = useUsageStr();\n\n  const options: SettingMenuOption<string>[] = useMemo(\n    () => ALL_USAGES.map((usg) => ({ value: formatUsageStr(usg), label: formatUsageStr(usg) })),\n    [formatUsageStr]\n  );\n\n  const handleSelect = (usageStr: string) => {\n    const selectedUsage = ALL_USAGES.find((usg) => formatUsageStr(usg) === usageStr);\n    if (selectedUsage) onChange(selectedUsage);\n  };\n\n  return (\n    <SettingMenuSelector\n      value={formatUsageStr(usage)}\n      options={options}\n      onSelect={handleSelect}\n      renderTrigger={({ openMenu }) => (\n        <Button\n          variant=\"Secondary\"\n          fill=\"Soft\"\n          size=\"300\"\n          radii=\"300\"\n          type=\"button\"\n          outlined\n          aria-disabled={!canEdit}\n          after={canEdit && sizedIcon(CaretDown, '100')}\n          onClick={canEdit ? openMenu : undefined}\n        >\n          <Text size=\"B300\">{formatUsageStr(usage)}</Text>\n        </Button>\n      )}\n      renderOption={({ option, selected }) => (\n        <Text size=\"T300\">{selected ? <b>{option.label}</b> : option.label}</Text>\n      )}\n    />\n  );\n}\n","import type { FormEventHandler, ReactNode } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Badge, Box, Button, Chip, Input, Text } from 'folds';\nimport { sizedIcon, Trash } from '$components/icons/phosphor';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport type { ImageUsage } from '$plugins/custom-emoji';\nimport { imageUsageEqual, PackImageReader } from '$plugins/custom-emoji';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useObjectURL } from '$hooks/useObjectURL';\nimport type { TUploadAtom } from '$state/upload';\nimport { createUploadAtom } from '$state/upload';\nimport { replaceSpaceWithDash } from '$utils/common';\nimport { SettingTile } from '$components/setting-tile';\nimport { Image as MediaImage } from '$components/media';\nimport * as css from './style.css';\nimport { UsageSwitcher, useUsageStr } from './UsageSwitcher';\n\ntype ImageTileProps = {\n  defaultShortcode: string;\n  useAuthentication: boolean;\n  packUsage: ImageUsage[];\n  image: PackImageReader;\n  canEdit?: boolean;\n  onEdit?: (defaultShortcode: string, image: PackImageReader) => void;\n  deleted?: boolean;\n  onDeleteToggle?: (defaultShortcode: string) => void;\n};\nexport function ImageTile({\n  defaultShortcode,\n  image,\n  packUsage,\n  useAuthentication,\n  canEdit,\n  onEdit,\n  onDeleteToggle,\n  deleted,\n}: ImageTileProps) {\n  const mx = useMatrixClient();\n  const getUsageStr = useUsageStr();\n\n  return (\n    <SettingTile\n      before={\n        <MediaImage\n          className={css.ImagePackImage}\n          src={mxcUrlToHttp(mx, image.url, useAuthentication) ?? undefined}\n          alt={image.shortcode}\n          loading=\"lazy\"\n        />\n      }\n      title={\n        deleted ? (\n          <span className={css.DeleteImageShortcode}>{image.shortcode}</span>\n        ) : (\n          image.shortcode\n        )\n      }\n      description={\n        <Box as=\"span\" gap=\"200\">\n          {image.usage && getUsageStr(image.usage) !== getUsageStr(packUsage) && (\n            <Badge as=\"span\" variant=\"Secondary\" size=\"400\" radii=\"300\" outlined>\n              <Text as=\"span\" size=\"L400\">\n                {getUsageStr(image.usage)}\n              </Text>\n            </Badge>\n          )}\n          {image.body}\n        </Box>\n      }\n      after={\n        canEdit ? (\n          <Box shrink=\"No\" alignItems=\"Center\" gap=\"200\">\n            <Chip\n              variant={deleted ? 'Critical' : 'Secondary'}\n              fill=\"None\"\n              radii=\"Pill\"\n              onClick={() => onDeleteToggle?.(defaultShortcode)}\n            >\n              {deleted ? <Text size=\"B300\">Undo</Text> : sizedIcon(Trash, '50')}\n            </Chip>\n            {!deleted && (\n              <Chip\n                variant=\"Secondary\"\n                radii=\"Pill\"\n                onClick={() => onEdit?.(defaultShortcode, image)}\n              >\n                <Text size=\"B300\">Edit</Text>\n              </Chip>\n            )}\n          </Box>\n        ) : undefined\n      }\n    />\n  );\n}\n\ntype ImageTileUploadProps = {\n  file: File;\n  children: (uploadAtom: TUploadAtom) => ReactNode;\n};\nexport function ImageTileUpload({ file, children }: ImageTileUploadProps) {\n  const url = useObjectURL(file);\n  const uploadAtom = useMemo(() => createUploadAtom(file), [file]);\n\n  return (\n    <SettingTile before={<MediaImage className={css.ImagePackImage} src={url} alt={file.name} />}>\n      {children(uploadAtom)}\n    </SettingTile>\n  );\n}\n\ntype ImageTileEditProps = {\n  defaultShortcode: string;\n  useAuthentication: boolean;\n  packUsage: ImageUsage[];\n  image: PackImageReader;\n  onCancel: (shortcode: string) => void;\n  onSave: (shortcode: string, image: PackImageReader) => void;\n};\nexport function ImageTileEdit({\n  defaultShortcode,\n  useAuthentication,\n  packUsage,\n  image,\n  onCancel,\n  onSave,\n}: ImageTileEditProps) {\n  const mx = useMatrixClient();\n  const defaultUsage = image.usage ?? packUsage;\n\n  const [unsavedUsage, setUnsavedUsages] = useState(defaultUsage);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const shortcodeInput = target?.shortcodeInput as HTMLInputElement | undefined;\n    const bodyInput = target?.bodyInput as HTMLTextAreaElement | undefined;\n    if (!shortcodeInput || !bodyInput) return;\n\n    const shortcode = replaceSpaceWithDash(shortcodeInput.value.trim());\n    const body = bodyInput.value.trim() || undefined;\n    const usage = unsavedUsage;\n\n    if (!shortcode) return;\n\n    if (\n      shortcode === image.shortcode &&\n      body === image.body &&\n      imageUsageEqual(usage, defaultUsage)\n    ) {\n      onCancel(defaultShortcode);\n      return;\n    }\n\n    const imageReader = new PackImageReader(shortcode, image.url, {\n      info: image.info,\n      body,\n      usage: imageUsageEqual(usage, packUsage) ? undefined : usage,\n    });\n\n    onSave(defaultShortcode, imageReader);\n  };\n\n  return (\n    <SettingTile\n      before={\n        <MediaImage\n          className={css.ImagePackImage}\n          src={mxcUrlToHttp(mx, image.url, useAuthentication) ?? undefined}\n          alt={image.shortcode}\n          loading=\"lazy\"\n        />\n      }\n    >\n      <Box as=\"form\" onSubmit={handleSubmit} direction=\"Column\" gap=\"200\">\n        <Box direction=\"Column\" className={css.ImagePackImageInputs}>\n          <Input\n            before={<Text size=\"L400\">Shortcode:</Text>}\n            defaultValue={image.shortcode}\n            name=\"shortcodeInput\"\n            variant=\"Secondary\"\n            size=\"300\"\n            radii=\"0\"\n            required\n            autoFocus\n          />\n          <Input\n            before={<Text size=\"L400\">Body:</Text>}\n            defaultValue={image.body}\n            name=\"bodyInput\"\n            variant=\"Secondary\"\n            size=\"300\"\n            radii=\"0\"\n          />\n        </Box>\n        <Box gap=\"200\">\n          <Box shrink=\"No\" direction=\"Column\">\n            <UsageSwitcher usage={unsavedUsage} onChange={setUnsavedUsages} canEdit />\n          </Box>\n          <Box grow=\"Yes\" />\n          <Button type=\"submit\" variant=\"Success\" size=\"300\" radii=\"300\">\n            <Text size=\"B300\">Save</Text>\n          </Button>\n          <Button\n            type=\"reset\"\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            size=\"300\"\n            radii=\"300\"\n            onClick={() => onCancel(defaultShortcode)}\n          >\n            <Text size=\"B300\">Cancel</Text>\n          </Button>\n        </Box>\n      </Box>\n    </SettingTile>\n  );\n}\n","import type { FormEventHandler } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport {\n  Box,\n  Text,\n  Avatar,\n  AvatarImage,\n  AvatarFallback,\n  Button,\n  Input,\n  TextArea,\n  Chip,\n} from 'folds';\nimport { sizedIcon, PencilSimple } from '$components/icons/phosphor';\nimport Linkify from 'linkify-react';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { nameInitials } from '$utils/common';\nimport { BreakWord } from '$styles/Text.css';\nimport { LINKIFY_OPTS } from '$plugins/react-custom-html-parser';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { useFilePicker } from '$hooks/useFilePicker';\nimport { useObjectURL } from '$hooks/useObjectURL';\nimport type { UploadSuccess } from '$state/upload';\nimport { createUploadAtom } from '$state/upload';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport { PackMetaReader } from '$plugins/custom-emoji';\nimport { CompactUploadCardRenderer } from '$components/upload-card';\n\ntype ImagePackAvatarProps = {\n  url?: string;\n  name?: string;\n};\nfunction ImagePackAvatar({ url, name }: ImagePackAvatarProps) {\n  const resolvedUrl = useRenderableMediaUrl(url);\n  return (\n    <Avatar size=\"500\" className={ContainerColor({ variant: 'Secondary' })}>\n      {url ? (\n        <AvatarImage src={resolvedUrl ?? url} alt={name ?? 'Unknown'} />\n      ) : (\n        <AvatarFallback>\n          <Text size=\"H2\">{nameInitials(name ?? 'Unknown')}</Text>\n        </AvatarFallback>\n      )}\n    </Avatar>\n  );\n}\n\ntype ImagePackProfileProps = {\n  meta: PackMetaReader;\n  canEdit?: boolean;\n  onEdit?: () => void;\n};\nexport function ImagePackProfile({ meta, canEdit, onEdit }: ImagePackProfileProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const avatarUrl = meta.avatar\n    ? (mxcUrlToHttp(mx, meta.avatar, useAuthentication) ?? undefined)\n    : undefined;\n\n  return (\n    <Box gap=\"400\">\n      <Box grow=\"Yes\" direction=\"Column\" gap=\"300\">\n        <Box direction=\"Column\" gap=\"100\">\n          <Text className={BreakWord} size=\"H5\">\n            {meta.name ?? 'Unknown'}\n          </Text>\n          {meta.attribution && (\n            <Text className={BreakWord} size=\"T200\">\n              <Linkify options={LINKIFY_OPTS}>{meta.attribution}</Linkify>\n            </Text>\n          )}\n        </Box>\n        {canEdit && (\n          <Box gap=\"200\">\n            <Chip\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              radii=\"300\"\n              before={sizedIcon(PencilSimple, '50')}\n              onClick={onEdit}\n              outlined\n            >\n              <Text size=\"B300\">Edit</Text>\n            </Chip>\n          </Box>\n        )}\n      </Box>\n      <Box shrink=\"No\">\n        <ImagePackAvatar url={avatarUrl} name={meta.name} />\n      </Box>\n    </Box>\n  );\n}\n\ntype ImagePackProfileEditProps = {\n  meta: PackMetaReader;\n  onCancel: () => void;\n  onSave: (meta: PackMetaReader) => void;\n};\nexport function ImagePackProfileEdit({ meta, onCancel, onSave }: ImagePackProfileEditProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const [avatar, setAvatar] = useState(meta.avatar);\n\n  const avatarUrl = avatar ? (mxcUrlToHttp(mx, avatar, useAuthentication) ?? undefined) : undefined;\n\n  const [imageFile, setImageFile] = useState<File>();\n  const avatarFileUrl = useObjectURL(imageFile);\n  const uploadingAvatar = avatarFileUrl ? avatar === meta.avatar : false;\n  const uploadAtom = useMemo(() => {\n    if (imageFile) return createUploadAtom(imageFile);\n    return undefined;\n  }, [imageFile]);\n\n  const pickFile = useFilePicker(setImageFile, false);\n\n  const handleRemoveUpload = useCallback(() => {\n    setImageFile(undefined);\n    setAvatar(meta.avatar);\n  }, [meta.avatar]);\n\n  const handleUploaded = useCallback((upload: UploadSuccess) => {\n    setAvatar(upload.mxc);\n  }, []);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (uploadingAvatar) return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const nameInput = target?.nameInput as HTMLInputElement | undefined;\n    const attributionTextArea = target?.attributionTextArea as HTMLTextAreaElement | undefined;\n    if (!nameInput || !attributionTextArea) return;\n\n    const name = nameInput.value.trim();\n    const attribution = attributionTextArea.value.trim();\n    if (!name) return;\n\n    const metaReader = new PackMetaReader({\n      avatar_url: avatar,\n      display_name: name,\n      attribution,\n    });\n    onSave(metaReader);\n  };\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} direction=\"Column\" gap=\"400\">\n      <Box gap=\"400\">\n        <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n          <Text size=\"L400\">Pack Avatar</Text>\n          {uploadAtom ? (\n            <Box gap=\"200\" direction=\"Column\">\n              <CompactUploadCardRenderer\n                uploadAtom={uploadAtom}\n                onRemove={handleRemoveUpload}\n                onComplete={handleUploaded}\n              />\n            </Box>\n          ) : (\n            <Box gap=\"200\">\n              <Button\n                type=\"button\"\n                size=\"300\"\n                variant=\"Secondary\"\n                fill=\"Soft\"\n                radii=\"300\"\n                onClick={() => pickFile('image/*')}\n              >\n                <Text size=\"B300\">Upload</Text>\n              </Button>\n              {!avatar && meta.avatar && (\n                <Button\n                  type=\"button\"\n                  size=\"300\"\n                  variant=\"Success\"\n                  fill=\"None\"\n                  radii=\"300\"\n                  onClick={() => setAvatar(meta.avatar)}\n                >\n                  <Text size=\"B300\">Reset</Text>\n                </Button>\n              )}\n              {avatar && (\n                <Button\n                  type=\"button\"\n                  size=\"300\"\n                  variant=\"Critical\"\n                  fill=\"None\"\n                  radii=\"300\"\n                  onClick={() => setAvatar(undefined)}\n                >\n                  <Text size=\"B300\">Remove</Text>\n                </Button>\n              )}\n            </Box>\n          )}\n        </Box>\n        <Box shrink=\"No\">\n          <ImagePackAvatar url={avatarFileUrl ?? avatarUrl} name={meta.name} />\n        </Box>\n      </Box>\n      <Box direction=\"Inherit\" gap=\"100\">\n        <Text size=\"L400\">Name</Text>\n        <Input name=\"nameInput\" defaultValue={meta.name} variant=\"Secondary\" radii=\"300\" required />\n      </Box>\n      <Box direction=\"Inherit\" gap=\"100\">\n        <Text size=\"L400\">Attribution</Text>\n        <TextArea\n          name=\"attributionTextArea\"\n          defaultValue={meta.attribution}\n          variant=\"Secondary\"\n          radii=\"300\"\n        />\n      </Box>\n      <Box gap=\"300\">\n        <Button type=\"submit\" variant=\"Success\" size=\"300\" radii=\"300\" disabled={uploadingAvatar}>\n          <Text size=\"B300\">Save</Text>\n        </Button>\n        <Button\n          type=\"reset\"\n          onClick={onCancel}\n          variant=\"Secondary\"\n          fill=\"Soft\"\n          size=\"300\"\n          radii=\"300\"\n        >\n          <Text size=\"B300\">Cancel</Text>\n        </Button>\n      </Box>\n    </Box>\n  );\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { as, Box, Text, config, Button, Menu, Spinner } from 'folds';\nimport type { ImagePack, ImageUsage, PackContent, PackImage } from '$plugins/custom-emoji';\nimport { PackImageReader, packMetaEqual, PackMetaReader } from '$plugins/custom-emoji';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useFilePicker } from '$hooks/useFilePicker';\nimport type { UploadSuccess } from '$state/upload';\nimport type { TUploadContent } from '$utils/matrix';\nimport { getImageInfo } from '$utils/matrix';\nimport { getImageFileUrl, loadImageElement, renameFile } from '$utils/dom';\nimport { replaceSpaceWithDash, suffixRename } from '$utils/common';\nimport { getFileNameWithoutExt } from '$utils/mimeTypes';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { SequenceCard } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { CompactUploadCardRenderer } from '$components/upload-card';\nimport { ImageTile, ImageTileEdit, ImageTileUpload } from './ImageTile';\nimport { UsageSwitcher } from './UsageSwitcher';\nimport { ImagePackProfile, ImagePackProfileEdit } from './PackMeta';\nimport * as css from './style.css';\n\ntype ImagePackContentProps = {\n  imagePack: ImagePack;\n  canEdit?: boolean;\n  onUpdate?: (packContent: PackContent) => Promise<void>;\n};\n\nexport const ImagePackContent = as<'div', ImagePackContentProps>(\n  ({ imagePack, canEdit, onUpdate, ...props }, ref) => {\n    const useAuthentication = useMediaAuthentication();\n\n    const [metaEditing, setMetaEditing] = useState(false);\n    const [savedMeta, setSavedMeta] = useState<PackMetaReader>();\n    const currentMeta = savedMeta ?? imagePack.meta;\n\n    const images = useMemo(() => Array.from(imagePack.images.collection.values()), [imagePack]);\n    const [files, setFiles] = useState<File[]>([]);\n    const [uploadedImages, setUploadedImages] = useState<PackImageReader[]>([]);\n    const [imagesEditing, setImagesEditing] = useState<Set<string>>(new Set());\n    const [savedImages, setSavedImages] = useState<Map<string, PackImageReader>>(new Map());\n    const [deleteImages, setDeleteImages] = useState<Set<string>>(new Set());\n\n    const hasImageWithShortcode = useCallback(\n      (shortcode: string): boolean => {\n        const hasInPack = imagePack.images.collection.has(shortcode);\n        if (hasInPack) return true;\n        const hasInUploaded =\n          uploadedImages.find((img) => img.shortcode === shortcode) !== undefined;\n        if (hasInUploaded) return true;\n        const hasInSaved =\n          Array.from(savedImages).find(([, img]) => img.shortcode === shortcode) !== undefined;\n        return hasInSaved;\n      },\n      [imagePack, savedImages, uploadedImages]\n    );\n\n    const pickFiles = useFilePicker(\n      useCallback(\n        (pickedFiles: File[]) => {\n          const uniqueFiles = pickedFiles.map((file) => {\n            const fileName = replaceSpaceWithDash(file.name);\n            if (hasImageWithShortcode(fileName)) {\n              const uniqueName = suffixRename(fileName, hasImageWithShortcode);\n              return renameFile(file, uniqueName);\n            }\n            return fileName !== file.name ? renameFile(file, fileName) : file;\n          });\n\n          setFiles((f) => [...f, ...uniqueFiles]);\n        },\n        [hasImageWithShortcode]\n      ),\n      true\n    );\n\n    const handleMetaSave = useCallback(\n      (editedMeta: PackMetaReader) => {\n        setMetaEditing(false);\n        setSavedMeta(\n          (m) =>\n            new PackMetaReader({\n              ...imagePack.meta.content,\n              ...m?.content,\n              ...editedMeta.content,\n            })\n        );\n      },\n      [imagePack.meta]\n    );\n\n    const handleMetaCancel = () => setMetaEditing(false);\n\n    const handlePackUsageChange = useCallback(\n      (usg: ImageUsage[]) => {\n        setSavedMeta(\n          (m) =>\n            new PackMetaReader({\n              ...imagePack.meta.content,\n              ...m?.content,\n              usage: usg,\n            })\n        );\n      },\n      [imagePack.meta]\n    );\n\n    const handleUploadRemove = useCallback((file: TUploadContent) => {\n      setFiles((fs) => fs.filter((f) => f !== file));\n    }, []);\n\n    const handleUploadComplete = useCallback(\n      async (data: UploadSuccess) => {\n        const imgUrl = getImageFileUrl(data.file);\n        let imgEl: HTMLImageElement;\n        try {\n          imgEl = await loadImageElement(imgUrl);\n        } finally {\n          URL.revokeObjectURL(imgUrl);\n        }\n        const packImage: PackImage = {\n          url: data.mxc,\n          info: getImageInfo(imgEl, data.file),\n        };\n        const image = PackImageReader.fromPackImage(\n          getFileNameWithoutExt(data.file.name),\n          packImage\n        );\n        if (!image) return;\n        handleUploadRemove(data.file);\n        setUploadedImages((imgs) => [image, ...imgs]);\n      },\n      [handleUploadRemove]\n    );\n\n    const handleImageEdit = (shortcode: string) => {\n      setImagesEditing((shortcodes) => {\n        const shortcodeSet = new Set(shortcodes);\n        shortcodeSet.add(shortcode);\n        return shortcodeSet;\n      });\n    };\n    const handleDeleteToggle = (shortcode: string) => {\n      setDeleteImages((shortcodes) => {\n        const shortcodeSet = new Set(shortcodes);\n        if (shortcodeSet.has(shortcode)) shortcodeSet.delete(shortcode);\n        else shortcodeSet.add(shortcode);\n        return shortcodeSet;\n      });\n    };\n\n    const handleImageEditCancel = (shortcode: string) => {\n      setImagesEditing((shortcodes) => {\n        const shortcodeSet = new Set(shortcodes);\n        shortcodeSet.delete(shortcode);\n        return shortcodeSet;\n      });\n    };\n\n    const handleImageEditSave = (shortcode: string, image: PackImageReader) => {\n      handleImageEditCancel(shortcode);\n\n      const saveImage =\n        shortcode !== image.shortcode && hasImageWithShortcode(image.shortcode)\n          ? new PackImageReader(\n              suffixRename(image.shortcode, hasImageWithShortcode),\n              image.url,\n              image.content\n            )\n          : image;\n\n      setSavedImages((sImgs) => {\n        const imgs = new Map(sImgs);\n        imgs.set(shortcode, saveImage);\n        return imgs;\n      });\n    };\n\n    const handleResetSavedChanges = () => {\n      setSavedMeta(undefined);\n      setFiles([]);\n      setUploadedImages([]);\n      setSavedImages(new Map());\n      setDeleteImages(new Set());\n    };\n\n    const [applyState, applyChanges] = useAsyncCallback(\n      useCallback(async () => {\n        const pack: PackContent = {\n          pack: savedMeta?.content ?? imagePack.meta.content,\n          images: {},\n        };\n        const pushImage = (img: PackImageReader) => {\n          if (deleteImages.has(img.shortcode)) return;\n          if (!pack.images) return;\n          const imgToPush = savedImages.get(img.shortcode) ?? img;\n          pack.images[imgToPush.shortcode] = imgToPush.content;\n        };\n        uploadedImages.forEach((img) => pushImage(img));\n        images.forEach((img) => pushImage(img));\n\n        return onUpdate?.(pack);\n      }, [imagePack, images, savedMeta, uploadedImages, savedImages, deleteImages, onUpdate])\n    );\n\n    useEffect(() => {\n      if (applyState.status === AsyncStatus.Success) {\n        handleResetSavedChanges();\n      }\n    }, [applyState]);\n\n    const savedChanges =\n      (savedMeta && !packMetaEqual(imagePack.meta, savedMeta)) ||\n      uploadedImages.length > 0 ||\n      savedImages.size > 0 ||\n      deleteImages.size > 0;\n    const canApplyChanges = !metaEditing && imagesEditing.size === 0 && files.length === 0;\n    const applying = applyState.status === AsyncStatus.Loading;\n\n    const renderImage = (image: PackImageReader) => (\n      <SequenceCard\n        key={image.shortcode}\n        style={{ padding: config.space.S300 }}\n        variant={deleteImages.has(image.shortcode) ? 'Critical' : 'SurfaceVariant'}\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        {imagesEditing.has(image.shortcode) ? (\n          <ImageTileEdit\n            defaultShortcode={image.shortcode}\n            image={savedImages.get(image.shortcode) ?? image}\n            packUsage={currentMeta.usage}\n            useAuthentication={useAuthentication}\n            onCancel={handleImageEditCancel}\n            onSave={handleImageEditSave}\n          />\n        ) : (\n          <ImageTile\n            defaultShortcode={image.shortcode}\n            image={savedImages.get(image.shortcode) ?? image}\n            packUsage={currentMeta.usage}\n            useAuthentication={useAuthentication}\n            canEdit={canEdit}\n            onEdit={handleImageEdit}\n            deleted={deleteImages.has(image.shortcode)}\n            onDeleteToggle={handleDeleteToggle}\n          />\n        )}\n      </SequenceCard>\n    );\n\n    return (\n      <Box grow=\"Yes\" direction=\"Column\" gap=\"700\" {...props} ref={ref}>\n        {savedChanges && (\n          <Menu className={css.UnsavedMenu} variant=\"Success\">\n            <Box alignItems=\"Center\" gap=\"400\">\n              <Box grow=\"Yes\" direction=\"Column\">\n                {applyState.status === AsyncStatus.Error ? (\n                  <Text size=\"T200\">\n                    <b>Failed to apply changes! Please try again.</b>\n                  </Text>\n                ) : (\n                  <Text size=\"T200\">\n                    <b>Changes saved! Apply when ready.</b>\n                  </Text>\n                )}\n              </Box>\n              <Box shrink=\"No\" gap=\"200\">\n                <Button\n                  size=\"300\"\n                  variant=\"Success\"\n                  fill=\"None\"\n                  radii=\"300\"\n                  disabled={!canApplyChanges || applying}\n                  onClick={handleResetSavedChanges}\n                >\n                  <Text size=\"B300\">Reset</Text>\n                </Button>\n                <Button\n                  size=\"300\"\n                  variant=\"Success\"\n                  radii=\"300\"\n                  disabled={!canApplyChanges || applying}\n                  before={applying && <Spinner variant=\"Success\" fill=\"Solid\" size=\"100\" />}\n                  onClick={applyChanges}\n                >\n                  <Text size=\"B300\">Apply Changes</Text>\n                </Button>\n              </Box>\n            </Box>\n          </Menu>\n        )}\n        <Box direction=\"Column\" gap=\"100\">\n          <Text size=\"L400\">Pack</Text>\n          <SequenceCard\n            style={{ padding: config.space.S300 }}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"400\"\n          >\n            {metaEditing ? (\n              <ImagePackProfileEdit\n                meta={currentMeta}\n                onCancel={handleMetaCancel}\n                onSave={handleMetaSave}\n              />\n            ) : (\n              <ImagePackProfile\n                meta={currentMeta}\n                canEdit={canEdit}\n                onEdit={() => setMetaEditing(true)}\n              />\n            )}\n          </SequenceCard>\n          <SequenceCard\n            style={{ padding: config.space.S300 }}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            gap=\"400\"\n          >\n            <SettingTile\n              title=\"Images Usage\"\n              description=\"Select how the images are being used: as emojis, as stickers, or as both.\"\n              after={\n                <UsageSwitcher\n                  usage={currentMeta.usage}\n                  canEdit={canEdit}\n                  onChange={handlePackUsageChange}\n                />\n              }\n            />\n          </SequenceCard>\n        </Box>\n        {images.length === 0 && !canEdit ? null : (\n          <Box direction=\"Column\" gap=\"100\">\n            <Text size=\"L400\">Images</Text>\n            {canEdit && (\n              <SequenceCard\n                style={{ padding: config.space.S300 }}\n                variant=\"SurfaceVariant\"\n                direction=\"Column\"\n                gap=\"400\"\n              >\n                <SettingTile\n                  title=\"Upload Images\"\n                  description=\"Select images from your storage to upload them in pack.\"\n                  after={\n                    <Button\n                      variant=\"Secondary\"\n                      fill=\"Soft\"\n                      size=\"300\"\n                      radii=\"300\"\n                      type=\"button\"\n                      outlined\n                      onClick={() => pickFiles('image/*')}\n                    >\n                      <Text size=\"B300\">Select</Text>\n                    </Button>\n                  }\n                />\n              </SequenceCard>\n            )}\n            {files.map((file) => (\n              <SequenceCard\n                key={file.name}\n                style={{ padding: config.space.S300 }}\n                variant=\"SurfaceVariant\"\n                direction=\"Column\"\n                gap=\"400\"\n              >\n                <ImageTileUpload file={file}>\n                  {(uploadAtom) => (\n                    <CompactUploadCardRenderer\n                      uploadAtom={uploadAtom}\n                      onRemove={handleUploadRemove}\n                      onComplete={handleUploadComplete}\n                    />\n                  )}\n                </ImageTileUpload>\n              </SequenceCard>\n            ))}\n            {uploadedImages.map(renderImage)}\n            {images.map(renderImage)}\n          </Box>\n        )}\n      </Box>\n    );\n  }\n);\n","import { useCallback, useMemo } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport { usePowerLevels } from '$hooks/usePowerLevels';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { PackContent } from '$plugins/custom-emoji';\nimport { ImagePack } from '$plugins/custom-emoji';\n\nimport { useRoomImagePack } from '$hooks/useImagePacks';\nimport { randomStr } from '$utils/common';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { ImagePackContent } from './ImagePackContent';\nimport { CustomStateEvent } from '$types/matrix/room';\n\ntype RoomImagePackProps = {\n  room: Room;\n  stateKey: string;\n};\n\nexport function RoomImagePack({ room, stateKey }: RoomImagePackProps) {\n  const mx = useMatrixClient();\n  const userId = mx.getUserId()!;\n  const powerLevels = usePowerLevels(room);\n  const creators = useRoomCreators(room);\n\n  const permissions = useRoomPermissions(creators, powerLevels);\n  const canEditImagePack = permissions.stateEvent(CustomStateEvent.ImagePack, userId);\n\n  const fallbackPack = useMemo(() => {\n    const fakePackId = randomStr(4);\n    return new ImagePack(\n      fakePackId,\n      {},\n      {\n        roomId: room.roomId,\n        stateKey,\n      }\n    );\n  }, [room.roomId, stateKey]);\n  const imagePack = useRoomImagePack(room, stateKey) ?? fallbackPack;\n\n  const handleUpdate = useCallback(\n    async (packContent: PackContent) => {\n      const { address } = imagePack;\n      if (!address) return;\n\n      await mx.sendStateEvent(\n        address.roomId,\n        CustomStateEvent.ImagePack,\n        packContent,\n        address.stateKey\n      );\n    },\n    [mx, imagePack]\n  );\n\n  return (\n    <ImagePackContent imagePack={imagePack} canEdit={canEditImagePack} onUpdate={handleUpdate} />\n  );\n}\n","import { useCallback, useMemo } from 'react';\nimport type { PackContent } from '$plugins/custom-emoji';\nimport { ImagePack } from '$plugins/custom-emoji';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\n\nimport { useUserImagePack } from '$hooks/useImagePacks';\nimport { ImagePackContent } from './ImagePackContent';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\n\nexport function UserImagePack() {\n  const mx = useMatrixClient();\n\n  const defaultPack = useMemo(() => new ImagePack(mx.getUserId() ?? '', {}, undefined), [mx]);\n  const imagePack = useUserImagePack();\n\n  const handleUpdate = useCallback(\n    async (packContent: PackContent) => {\n      await mx.setAccountData(CustomAccountDataEvent.PoniesUserEmotes, packContent);\n    },\n    [mx]\n  );\n\n  return <ImagePackContent imagePack={imagePack ?? defaultPack} canEdit onUpdate={handleUpdate} />;\n}\n","import { Box, IconButton, Text, Scroll, Chip } from 'folds';\nimport { ArrowLeft, composerIcon, sizedIcon, X } from '$components/icons/phosphor';\nimport type { PackAddress } from '$plugins/custom-emoji';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { Page, PageHeader, PageContent } from '$components/page';\nimport { RoomImagePack } from './RoomImagePack';\nimport { UserImagePack } from './UserImagePack';\n\ntype ImagePackViewProps = {\n  address: PackAddress | undefined;\n  requestClose: () => void;\n};\nexport function ImagePackView({ address, requestClose }: ImagePackViewProps) {\n  const mx = useMatrixClient();\n  const room = address && mx.getRoom(address.roomId);\n\n  return (\n    <Page>\n      <PageHeader outlined={false} balance>\n        <Box alignItems=\"Center\" grow=\"Yes\" gap=\"200\">\n          <Box alignItems=\"Inherit\" grow=\"Yes\" gap=\"200\">\n            <Chip\n              size=\"500\"\n              radii=\"Pill\"\n              onClick={requestClose}\n              before={sizedIcon(ArrowLeft, '100')}\n            >\n              <Text size=\"T300\">Emojis & Stickers</Text>\n            </Chip>\n          </Box>\n          <Box shrink=\"No\">\n            <IconButton onClick={requestClose} variant=\"Surface\">\n              {composerIcon(X)}\n            </IconButton>\n          </Box>\n        </Box>\n      </PageHeader>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            {room && address ? (\n              <RoomImagePack room={room} stateKey={address.stateKey} />\n            ) : (\n              <UserImagePack />\n            )}\n          </PageContent>\n        </Scroll>\n      </Box>\n    </Page>\n  );\n}\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport {\n  Box,\n  Text,\n  Button,\n  IconButton,\n  Avatar,\n  AvatarImage,\n  AvatarFallback,\n  config,\n  Spinner,\n  Menu,\n  Checkbox,\n  toRem,\n  Scroll,\n  Header,\n  Line,\n  Chip,\n} from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { composerIcon, menuIcon, Plus, Sticker, X } from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport { useAtomValue } from 'jotai';\nimport type { Room } from '$types/matrix-sdk';\nimport { useGlobalImagePacks, useRoomsImagePacks } from '$hooks/useImagePacks';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { toSettingsFocusIdPart } from '$features/settings/settingsLink';\nimport type { EmoteRoomsContent, ImagePack, PackAddress } from '$plugins/custom-emoji';\nimport { ImageUsage, packAddressEqual } from '$plugins/custom-emoji';\nimport { LineClamp2 } from '$styles/Text.css';\nimport { allRoomsAtom } from '$state/room-list/roomList';\n\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { stopPropagation } from '$utils/keyboard';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\n\nfunction GlobalPackSelector({\n  packs,\n  useAuthentication,\n  onSelect,\n}: {\n  packs: ImagePack[];\n  useAuthentication: boolean;\n  onSelect: (addresses: PackAddress[]) => void;\n}) {\n  const mx = useMatrixClient();\n  const roomToPacks = useMemo(() => {\n    const rToP = new Map<string, ImagePack[]>();\n    packs\n      .filter((pack) => !pack.deleted)\n      .forEach((pack) => {\n        if (!pack.address) return;\n        const pks = rToP.get(pack.address.roomId) ?? [];\n        pks.push(pack);\n        rToP.set(pack.address.roomId, pks);\n      });\n    return rToP;\n  }, [packs]);\n\n  const [selected, setSelected] = useState<PackAddress[]>([]);\n  const toggleSelect = (address: PackAddress) => {\n    setSelected((addresses) => {\n      const newAddresses = addresses.filter((addr) => !packAddressEqual(addr, address));\n      if (newAddresses.length !== addresses.length) {\n        return newAddresses;\n      }\n      newAddresses.push(address);\n      return newAddresses;\n    });\n  };\n\n  const addSelected = (adds: PackAddress[]) => {\n    setSelected((addresses) => {\n      const newAddresses = Array.from(addresses);\n      adds.forEach((address) => {\n        if (newAddresses.find((addr) => packAddressEqual(addr, address))) {\n          return;\n        }\n        newAddresses.push(address);\n      });\n      return newAddresses;\n    });\n  };\n\n  const removeSelected = (adds: PackAddress[]) => {\n    setSelected((addresses) => {\n      const newAddresses = addresses.filter(\n        (addr) => !adds.find((address) => packAddressEqual(addr, address))\n      );\n      return newAddresses;\n    });\n  };\n\n  const hasSelected = selected.length > 0;\n  return (\n    <Box grow=\"Yes\" direction=\"Column\">\n      <Header size=\"400\" variant=\"Surface\" style={{ padding: `0 ${config.space.S300}` }}>\n        <Box grow=\"Yes\">\n          <Text size=\"L400\" truncate>\n            Room Packs\n          </Text>\n        </Box>\n        <Box shrink=\"No\">\n          <Chip\n            radii=\"Pill\"\n            variant={hasSelected ? 'Success' : 'SurfaceVariant'}\n            outlined={hasSelected}\n            onClick={() => onSelect(selected)}\n          >\n            <Text size=\"B300\">{hasSelected ? 'Save' : 'Close'}</Text>\n          </Chip>\n        </Box>\n      </Header>\n      <Line variant=\"Surface\" size=\"300\" />\n      <Box grow=\"Yes\">\n        <Scroll size=\"300\" hideTrack visibility=\"Hover\">\n          <Box\n            direction=\"Column\"\n            gap=\"400\"\n            style={{\n              paddingLeft: config.space.S300,\n              paddingTop: config.space.S300,\n              paddingBottom: config.space.S300,\n              paddingRight: config.space.S100,\n            }}\n          >\n            {Array.from(roomToPacks.entries()).map(([roomId, roomPacks]) => {\n              const room = mx.getRoom(roomId);\n              if (!room) return null;\n              const roomPackAddresses = roomPacks\n                .map((pack) => pack.address)\n                .filter((addr) => addr !== undefined);\n              const allSelected = roomPackAddresses.every((addr) =>\n                selected.find((address) => packAddressEqual(addr, address))\n              );\n\n              return (\n                <Box key={roomId} direction=\"Column\" gap=\"100\">\n                  <Box alignItems=\"Center\">\n                    <Box grow=\"Yes\">\n                      <Text size=\"L400\">{room.name}</Text>\n                    </Box>\n                    <Box shrink=\"No\">\n                      <Chip\n                        variant={allSelected ? 'Critical' : 'Surface'}\n                        radii=\"Pill\"\n                        onClick={() => {\n                          if (allSelected) {\n                            removeSelected(roomPackAddresses);\n                            return;\n                          }\n                          addSelected(roomPackAddresses);\n                        }}\n                      >\n                        <Text size=\"B300\">{allSelected ? 'Unselect All' : 'Select All'}</Text>\n                      </Chip>\n                    </Box>\n                  </Box>\n                  {roomPacks.map((pack) => {\n                    const avatarMxc = pack.getAvatarUrl(ImageUsage.Emoticon);\n                    const avatarUrl = avatarMxc\n                      ? mxcUrlToHttp(mx, avatarMxc, useAuthentication)\n                      : undefined;\n                    const { address } = pack;\n                    if (!address) return null;\n\n                    const added = !!selected.find((addr) => packAddressEqual(addr, address));\n                    return (\n                      <SequenceCard\n                        key={pack.id}\n                        className={SequenceCardStyle}\n                        variant={added ? 'Success' : 'SurfaceVariant'}\n                        direction=\"Column\"\n                        gap=\"400\"\n                      >\n                        <SettingTile\n                          title={pack.meta.name ?? 'Unknown'}\n                          focusId={`room-pack-${toSettingsFocusIdPart(pack.id)}`}\n                          showSettingLinkAction={false}\n                          description={<span className={LineClamp2}>{pack.meta.attribution}</span>}\n                          before={\n                            <Box alignItems=\"Center\" gap=\"300\">\n                              <Avatar size=\"300\" radii=\"300\">\n                                {avatarUrl ? (\n                                  <AvatarImage\n                                    style={{\n                                      objectFit: 'contain',\n                                    }}\n                                    src={avatarUrl}\n                                  />\n                                ) : (\n                                  <AvatarFallback>\n                                    {composerIcon(Sticker, { weight: 'fill' })}\n                                  </AvatarFallback>\n                                )}\n                              </Avatar>\n                            </Box>\n                          }\n                          after={\n                            <Checkbox\n                              checked={added}\n                              variant=\"Success\"\n                              onClick={() => toggleSelect(address)}\n                            />\n                          }\n                        />\n                      </SequenceCard>\n                    );\n                  })}\n                </Box>\n              );\n            })}\n\n            {roomToPacks.size === 0 && (\n              <SequenceCard\n                className={SequenceCardStyle}\n                variant=\"SurfaceVariant\"\n                direction=\"Column\"\n                gap=\"400\"\n              >\n                <Box\n                  justifyContent=\"Center\"\n                  direction=\"Column\"\n                  gap=\"200\"\n                  style={{\n                    padding: `${config.space.S700} ${config.space.S400}`,\n                    maxWidth: toRem(300),\n                    margin: 'auto',\n                  }}\n                >\n                  <Text size=\"H5\" align=\"Center\">\n                    No Packs\n                  </Text>\n                  <Text size=\"T200\" align=\"Center\">\n                    Pack from rooms will appear here. You do not have any room with packs yet.\n                  </Text>\n                </Box>\n              </SequenceCard>\n            )}\n          </Box>\n        </Scroll>\n      </Box>\n    </Box>\n  );\n}\n\ntype GlobalPacksProps = {\n  onViewPack: (imagePack: ImagePack) => void;\n};\nexport function GlobalPacks({ onViewPack }: GlobalPacksProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const globalPacks = useGlobalImagePacks();\n  const [menuCords, setMenuCords] = useState<RectCords>();\n\n  const roomIds = useAtomValue(allRoomsAtom);\n  const rooms = useMemo(() => {\n    const rs: Room[] = [];\n    roomIds.forEach((rId) => {\n      const r = mx.getRoom(rId);\n      if (r) rs.push(r);\n    });\n    return rs;\n  }, [mx, roomIds]);\n  const roomsImagePack = useRoomsImagePacks(rooms);\n  const nonGlobalPacks = useMemo(\n    () =>\n      roomsImagePack.filter(\n        (pack) => !globalPacks.find((p) => packAddressEqual(pack.address, p.address))\n      ),\n    [roomsImagePack, globalPacks]\n  );\n\n  const [selectedPacks, setSelectedPacks] = useState<PackAddress[]>([]);\n  const [removedPacks, setRemovedPacks] = useState<PackAddress[]>([]);\n\n  const unselectedGlobalPacks = useMemo(\n    () =>\n      nonGlobalPacks.filter(\n        (pack) => !selectedPacks.find((addr) => packAddressEqual(pack.address, addr))\n      ),\n    [selectedPacks, nonGlobalPacks]\n  );\n\n  const handleRemove = (address: PackAddress) => {\n    setRemovedPacks((addresses) => [...addresses, address]);\n  };\n\n  const handleUndoRemove = (address: PackAddress) => {\n    setRemovedPacks((addresses) => addresses.filter((addr) => !packAddressEqual(addr, address)));\n  };\n\n  const handleSelected = (addresses: PackAddress[]) => {\n    setMenuCords(undefined);\n    if (addresses.length > 0) {\n      setSelectedPacks((a) => [...addresses, ...a]);\n    }\n  };\n\n  const [applyState, applyChanges] = useAsyncCallback(\n    useCallback(async () => {\n      const content =\n        (mx\n          .getAccountData(CustomAccountDataEvent.ImagePackRooms)\n          ?.getContent<EmoteRoomsContent>() ||\n          mx\n            .getAccountData(CustomAccountDataEvent.PoniesEmoteRooms)\n            ?.getContent<EmoteRoomsContent>()) ??\n        {};\n      const updatedContent: EmoteRoomsContent = JSON.parse(JSON.stringify(content));\n\n      selectedPacks.forEach((addr) => {\n        const roomsToState = updatedContent.rooms ?? {};\n        const stateKeyToObj = roomsToState[addr.roomId] ?? {};\n        stateKeyToObj[addr.stateKey] = {};\n        roomsToState[addr.roomId] = stateKeyToObj;\n        updatedContent.rooms = roomsToState;\n      });\n\n      removedPacks.forEach((addr) => {\n        if (updatedContent.rooms?.[addr.roomId]?.[addr.stateKey]) {\n          delete updatedContent.rooms[addr.roomId]![addr.stateKey];\n        }\n      });\n\n      await mx.setAccountData(CustomAccountDataEvent.ImagePackRooms, updatedContent);\n    }, [mx, selectedPacks, removedPacks])\n  );\n\n  const resetChanges = useCallback(() => {\n    setSelectedPacks([]);\n    setRemovedPacks([]);\n  }, []);\n\n  useEffect(() => {\n    if (applyState.status === AsyncStatus.Success) {\n      resetChanges();\n    }\n  }, [applyState, resetChanges]);\n\n  const handleSelectMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setMenuCords(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const applyingChanges = applyState.status === AsyncStatus.Loading;\n  const hasChanges = removedPacks.length > 0 || selectedPacks.length > 0;\n\n  const renderPack = (pack: ImagePack) => {\n    const avatarMxc = pack.getAvatarUrl(ImageUsage.Emoticon);\n    const avatarUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication) : undefined;\n    const { address } = pack;\n    if (!address) return null;\n    const removed = !!removedPacks.find((addr) => packAddressEqual(addr, address));\n\n    return (\n      <SequenceCard\n        key={pack.id}\n        className={SequenceCardStyle}\n        variant={removed ? 'Critical' : 'SurfaceVariant'}\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          focusId={`selected-pack-${toSettingsFocusIdPart(pack.id)}`}\n          showSettingLinkAction={false}\n          title={\n            <span style={{ textDecoration: removed ? 'line-through' : undefined }}>\n              {pack.meta.name ?? 'Unknown'}\n            </span>\n          }\n          description={<span className={LineClamp2}>{pack.meta.attribution}</span>}\n          before={\n            <Box alignItems=\"Center\" gap=\"300\">\n              {removed ? (\n                <IconButton\n                  size=\"300\"\n                  radii=\"Pill\"\n                  variant=\"Critical\"\n                  onClick={() => handleUndoRemove(address)}\n                  disabled={applyingChanges}\n                >\n                  {menuIcon(Plus)}\n                </IconButton>\n              ) : (\n                <IconButton\n                  size=\"300\"\n                  radii=\"Pill\"\n                  variant=\"Secondary\"\n                  onClick={() => handleRemove(address)}\n                  disabled={applyingChanges}\n                >\n                  {menuIcon(X)}\n                </IconButton>\n              )}\n              <Avatar size=\"300\" radii=\"300\">\n                {avatarUrl ? (\n                  <AvatarImage style={{ objectFit: 'contain' }} src={avatarUrl} />\n                ) : (\n                  <AvatarFallback>{composerIcon(Sticker, { weight: 'fill' })}</AvatarFallback>\n                )}\n              </Avatar>\n            </Box>\n          }\n          after={\n            !removed && (\n              <Button\n                variant=\"Secondary\"\n                fill=\"Soft\"\n                size=\"300\"\n                radii=\"300\"\n                outlined\n                onClick={() => onViewPack(pack)}\n              >\n                <Text size=\"B300\">View</Text>\n              </Button>\n            )\n          }\n        />\n      </SequenceCard>\n    );\n  };\n\n  return (\n    <>\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Favorite Packs</Text>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"400\"\n        >\n          <SettingTile\n            title=\"Select Pack\"\n            focusId=\"select-pack\"\n            description=\"Pick emojis and stickers pack from rooms to use in all rooms.\"\n            after={\n              <>\n                <Button\n                  onClick={handleSelectMenu}\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  size=\"300\"\n                  radii=\"300\"\n                  outlined\n                >\n                  <Text size=\"B300\">Select</Text>\n                </Button>\n                <PopOut\n                  anchor={menuCords}\n                  position=\"Bottom\"\n                  align=\"End\"\n                  content={\n                    <FocusTrap\n                      focusTrapOptions={{\n                        initialFocus: false,\n                        onDeactivate: () => setMenuCords(undefined),\n                        clickOutsideDeactivates: true,\n                        isKeyForward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowDown' || evt.key === 'ArrowRight',\n                        isKeyBackward: (evt: KeyboardEvent) =>\n                          evt.key === 'ArrowUp' || evt.key === 'ArrowLeft',\n                        escapeDeactivates: stopPropagation,\n                      }}\n                    >\n                      <Menu\n                        style={{\n                          display: 'flex',\n                          maxWidth: toRem(400),\n                          width: '100vw',\n                          maxHeight: toRem(500),\n                        }}\n                      >\n                        <GlobalPackSelector\n                          packs={unselectedGlobalPacks}\n                          useAuthentication={useAuthentication}\n                          onSelect={handleSelected}\n                        />\n                      </Menu>\n                    </FocusTrap>\n                  }\n                />\n              </>\n            }\n          />\n        </SequenceCard>\n        {globalPacks.map(renderPack)}\n        {nonGlobalPacks\n          .filter((pack) => !!selectedPacks.find((addr) => packAddressEqual(pack.address, addr)))\n          .map(renderPack)}\n      </Box>\n      {hasChanges && (\n        <Menu\n          style={{\n            position: 'sticky',\n            padding: config.space.S200,\n            paddingLeft: config.space.S400,\n            bottom: config.space.S400,\n            left: config.space.S400,\n            right: 0,\n            zIndex: 1,\n          }}\n          variant=\"Success\"\n        >\n          <Box alignItems=\"Center\" gap=\"400\">\n            <Box grow=\"Yes\" direction=\"Column\">\n              {applyState.status === AsyncStatus.Error ? (\n                <Text size=\"T200\">\n                  <b>Failed to apply changes! Please try again.</b>\n                </Text>\n              ) : (\n                <Text size=\"T200\">\n                  <b>Changes saved! Apply when ready.</b>\n                </Text>\n              )}\n            </Box>\n            <Box shrink=\"No\" gap=\"200\">\n              <Button\n                size=\"300\"\n                variant=\"Success\"\n                fill=\"None\"\n                radii=\"300\"\n                disabled={applyingChanges}\n                onClick={resetChanges}\n              >\n                <Text size=\"B300\">Reset</Text>\n              </Button>\n              <Button\n                size=\"300\"\n                variant=\"Success\"\n                radii=\"300\"\n                disabled={applyingChanges}\n                before={applyingChanges && <Spinner variant=\"Success\" fill=\"Solid\" size=\"100\" />}\n                onClick={applyChanges}\n              >\n                <Text size=\"B300\">Apply Changes</Text>\n              </Button>\n            </Box>\n          </Box>\n        </Menu>\n      )}\n    </>\n  );\n}\n","import { Avatar, AvatarFallback, AvatarImage, Box, Button, Text } from 'folds';\nimport { composerIcon, Sticker } from '$components/icons/phosphor';\nimport { useUserImagePack } from '$hooks/useImagePacks';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { ImagePack, ImageUsage } from '$plugins/custom-emoji';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\n\ntype UserPackProps = {\n  onViewPack: (imagePack: ImagePack) => void;\n};\nexport function UserPack({ onViewPack }: UserPackProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const userPack = useUserImagePack();\n  const avatarMxc = userPack?.getAvatarUrl(ImageUsage.Emoticon);\n  const avatarUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication) : undefined;\n  const resolvedAvatarUrl = useRenderableMediaUrl(avatarUrl ?? undefined);\n\n  const handleView = () => {\n    if (userPack) {\n      onViewPack(userPack);\n    } else {\n      const defaultPack = new ImagePack(mx.getUserId() ?? '', {}, undefined);\n      onViewPack(defaultPack);\n    }\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Default Pack</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title={userPack?.meta.name ?? 'Unknown'}\n          focusId=\"default-pack\"\n          description={userPack?.meta.attribution}\n          before={\n            <Avatar size=\"300\" radii=\"300\">\n              {avatarUrl ? (\n                <AvatarImage\n                  style={{ objectFit: 'contain' }}\n                  src={resolvedAvatarUrl ?? avatarUrl}\n                />\n              ) : (\n                <AvatarFallback>{composerIcon(Sticker, { weight: 'fill' })}</AvatarFallback>\n              )}\n            </Avatar>\n          }\n          after={\n            <Button\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              size=\"300\"\n              radii=\"300\"\n              outlined\n              onClick={handleView}\n            >\n              <Text size=\"B300\">View</Text>\n            </Button>\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import { useState } from 'react';\nimport { Box, Scroll } from 'folds';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport type { ImagePack } from '$plugins/custom-emoji';\nimport { ImagePackView } from '$components/image-pack-view';\nimport { GlobalPacks } from './GlobalPacks';\nimport { UserPack } from './UserPack';\n\ntype EmojisStickersProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\nexport function EmojisStickers({ requestBack, requestClose }: EmojisStickersProps) {\n  const [imagePack, setImagePack] = useState<ImagePack>();\n\n  const handleImagePackViewClose = () => {\n    setImagePack(undefined);\n  };\n\n  if (imagePack) {\n    return <ImagePackView address={imagePack.address} requestClose={handleImagePackViewClose} />;\n  }\n\n  return (\n    <SettingsSectionPage\n      title=\"Emojis & Stickers\"\n      requestBack={requestBack}\n      requestClose={requestClose}\n    >\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <UserPack onViewPack={setImagePack} />\n              <GlobalPacks onViewPack={setImagePack} />\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { Box, Switch, Text } from 'folds';\n\nexport function BandwidthSavingEmojis() {\n  const [useBandwidthSaving, setUseBandwidthSaving] = useSetting(\n    settingsAtom,\n    'saveStickerEmojiBandwidth'\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Save Bandwidth for Sticker and Emoji Images</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"100\"\n      >\n        <SettingTile\n          title=\"Enable bandwidth saving for stickers and emojis\"\n          focusId=\"bandwidth-saving-emojis\"\n          description=\"If enabled, sticker and emoji images will be optimized to save bandwidth. This helps reduce data usage when viewing these images. But will increase server computation load.\"\n          after={\n            <Switch variant=\"Primary\" value={useBandwidthSaving} onChange={setUseBandwidthSaving} />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { Box, Switch, Text } from 'folds';\n\nexport function MSC4268HistoryShare() {\n  const [enabledMSC4268Command, setEnabledMSC4268Command] = useSetting(\n    settingsAtom,\n    'enableMSC4268CMD'\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Enable Sharing of Encrypted History</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"100\"\n      >\n        <SettingTile\n          title=\"Enable the /sharehistory command\"\n          focusId=\"sharehistory-command\"\n          description=\"If enabled, this command will allow users to share encrypted history with other newly joined users, as per MSC4268.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={enabledMSC4268Command}\n              onChange={setEnabledMSC4268Command}\n              title={\n                enabledMSC4268Command\n                  ? 'Disable /sharehistory command'\n                  : 'Enable /sharehistory command'\n              }\n            />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { Box, Switch, Text } from 'folds';\n\nexport function MSC4274MediaGalleries() {\n  const [enabledMediaGalleries, setEnabledMediaGalleries] = useSetting(\n    settingsAtom,\n    'enableMediaGalleries'\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Enable Media Galleries Support</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"100\"\n      >\n        <SettingTile\n          title=\"Enable Media Galleries\"\n          focusId=\"media-galleries\"\n          description=\"If enabled, multiple attachments will be sent in one message, as per MSC4274. Incompatible with clients that don't implement it.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={enabledMediaGalleries}\n              onChange={setEnabledMediaGalleries}\n              title={enabledMediaGalleries ? 'Disable Media Galleries' : 'Enable Media Galleries'}\n            />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import { Box, Text, Scroll } from 'folds';\nimport { menuIcon, Warning } from '$components/icons/phosphor';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { InfoCard } from '$components/info-card';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport { SettingToggle } from '$components/setting-tile';\nimport { BandwidthSavingEmojis } from './BandwithSavingEmojis';\nimport { MSC4268HistoryShare } from './MSC4268HistoryShare';\nimport { MSC4274MediaGalleries } from './MSC4274MediaGalleries';\n\nfunction PersonaToggle() {\n  const [showPersonaSetting, setShowPersonaSetting] = useSetting(\n    settingsAtom,\n    'showPersonaSetting'\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Personas (Per-Message Profiles)</Text>\n      <SettingToggle\n        title=\"Show Personas Tab\"\n        focusId=\"show-personas-tab\"\n        description=\"Enables the personas tab in the settings menu for per-message profiles\"\n        value={showPersonaSetting}\n        onChange={setShowPersonaSetting}\n      />\n    </Box>\n  );\n}\n\nfunction NewCallsToggle() {\n  const [newCallsEnabled, setNewCallsEnabled] = useSetting(settingsAtom, 'newCallsEnabled');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">New calls</Text>\n      <SettingToggle\n        title=\"Enable new calls\"\n        focusId=\"new-calls\"\n        description=\"Uses LiveKit JS on web and desktop, and native LiveKit on supported mobile devices. Element Call remains the fallback.\"\n        value={newCallsEnabled}\n        onChange={setNewCallsEnabled}\n      />\n    </Box>\n  );\n}\n\ntype ExperimentalProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\nexport function Experimental({ requestBack, requestClose }: Readonly<ExperimentalProps>) {\n  return (\n    <SettingsSectionPage title=\"Experimental\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <InfoCard\n              before={menuIcon(Warning, { weight: 'fill' })}\n              variant=\"Warning\"\n              description={\n                <>\n                  The features listed below may be unstable or incomplete,{' '}\n                  <strong>use at your own risk</strong>.\n                  <br />\n                  Please report any new issues potentially caused by these features!\n                </>\n              }\n            />\n            <br />\n            <Box direction=\"Column\" gap=\"700\">\n              <MSC4268HistoryShare />\n              <BandwidthSavingEmojis />\n              <PersonaToggle />\n              <NewCallsToggle />\n              <MSC4274MediaGalleries />\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","function _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = !0,\n      o = !1;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) {\n        if (Object(t) !== t) return;\n        f = !1;\n      } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = !0, n = r;\n    } finally {\n      try {\n        if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nexport { _iterableToArrayLimit as default };","function _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nexport { _arrayLikeToArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n  }\n}\nexport { _unsupportedIterableToArray as default };","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n  return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bind = void 0;\nfunction bind(target, _a) {\n    var type = _a.type, listener = _a.listener, options = _a.options;\n    target.addEventListener(type, listener, options);\n    return function unbind() {\n        target.removeEventListener(type, listener, options);\n    };\n}\nexports.bind = bind;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(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))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bindAll = void 0;\nvar bind_1 = require(\"./bind\");\nfunction toOptions(value) {\n    if (typeof value === 'undefined') {\n        return undefined;\n    }\n    if (typeof value === 'boolean') {\n        return {\n            capture: value,\n        };\n    }\n    return value;\n}\nfunction getBinding(original, sharedOptions) {\n    if (sharedOptions == null) {\n        return original;\n    }\n    var binding = __assign(__assign({}, original), { options: __assign(__assign({}, toOptions(sharedOptions)), toOptions(original.options)) });\n    return binding;\n}\nfunction bindAll(target, bindings, sharedOptions) {\n    var unbinds = bindings.map(function (original) {\n        var binding = getBinding(original, sharedOptions);\n        return (0, bind_1.bind)(target, binding);\n    });\n    return function unbindAll() {\n        unbinds.forEach(function (unbind) { return unbind(); });\n    };\n}\nexports.bindAll = bindAll;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bindAll = exports.bind = void 0;\nvar bind_1 = require(\"./bind\");\nObject.defineProperty(exports, \"bind\", { enumerable: true, get: function () { return bind_1.bind; } });\nvar bind_all_1 = require(\"./bind-all\");\nObject.defineProperty(exports, \"bindAll\", { enumerable: true, get: function () { return bind_all_1.bindAll; } });\n","// pulling this into a separate file so adapter(s) that don't\n// need the honey pot can pay as little as possible for it.\nexport var honeyPotDataAttribute = 'data-pdnd-honey-pot';","import { honeyPotDataAttribute } from './honey-pot-data-attribute';\nexport function isHoneyPotElement(target) {\n  return target instanceof Element && target.hasAttribute(honeyPotDataAttribute);\n}","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { isHoneyPotElement } from './is-honey-pot-element';\nexport function getElementFromPointWithoutHoneypot(client) {\n  // eslint-disable-next-line no-restricted-syntax\n  var _document$elementsFro = document.elementsFromPoint(client.x, client.y),\n    _document$elementsFro2 = _slicedToArray(_document$elementsFro, 2),\n    top = _document$elementsFro2[0],\n    second = _document$elementsFro2[1];\n  if (!top) {\n    return null;\n  }\n  if (isHoneyPotElement(top)) {\n    return second !== null && second !== void 0 ? second : null;\n  }\n  return top;\n}","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","// Maximum possible z-index\n// https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index\nexport var maxZIndex = 2147483647;","/**\n * Resets user agent styles for `[popover]` elements.\n *\n * Browsers apply these defaults to popovers (per the WHATWG HTML spec rendering section):\n * - `inset: 0` + `margin: auto` → centers the popover in the viewport\n * - `border: solid` → visible border\n * - `padding: 0.25em` → internal spacing\n * - `overflow: auto` → scrollbars when content overflows\n * - `color: CanvasText` + `background-color: Canvas` → system theme colors\n *\n * This object neutralizes those defaults so the popover behaves like a plain\n * positioned `<div>`, matching the sizing of the legacy (non-popover)\n * fallback container exactly.\n *\n * **Width and height (`auto`)**\n *\n * `width` and `height` override the spec user agent value of `fit-content`\n * with `auto`.\n *\n * _Why?_\n *\n * - When a `[popover]` is sized with `fit-content` and contains a flex\n *   container, Safari collapses any flex item that uses `overflow: auto`\n *   to `0px`.\n * - Setting the popover's `width` and `height` to `auto` skips the `fit-content`\n *   pass and avoids the bug in Safari\n * - Chromium and Firefox tolerate `fit-content` here, but `auto` is safe\n *   everywhere and matches our non-popover path\n */\nexport var popoverResetUserAgentStyles = {\n  inset: 'unset',\n  border: 'none',\n  padding: 0,\n  margin: 0,\n  overflow: 'visible',\n  color: 'inherit',\n  background: 'transparent',\n  width: 'auto',\n  height: 'auto'\n};","/** Provide a function that you only ever want to be called a single time */\nexport function once(fn) {\n  var cache = null;\n  return function wrapped() {\n    if (!cache) {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      var result = fn.apply(this, args);\n      cache = {\n        result: result\n      };\n    }\n    return cache.result;\n  };\n}","import { once } from '../public-utils/once';\n\n// Using `once` as the value won't change in a browser\n\n/**\n * Returns `true` if the browser supports the Popover API (top-layer).\n *\n * When supported, elements with `popover=\"manual\"` can be promoted to the\n * browser's top layer via `element.showPopover()`, which is more reliable\n * than `z-index` for ensuring an element renders above everything else.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Popover_API\n */\nexport var supportsPopover = once(function supportsPopover() {\n  return typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.showPopover === 'function';\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { bind, bindAll } from 'bind-event-listener';\nimport { maxZIndex } from '../util/max-z-index';\nimport { popoverResetUserAgentStyles } from '../util/popover-reset-styles';\nimport { supportsPopover } from '../util/supports-popover';\nimport { honeyPotDataAttribute } from './honey-pot-data-attribute';\nvar honeyPotSize = 2;\nvar halfHoneyPotSize = honeyPotSize / 2;\n\n/**\n * `clientX` and `clientY` can be in sub pixels (eg `2.332`)\n * However, browser hitbox testing is commonly do to the closest pixel.\n *\n * → https://issues.chromium.org/issues/40940531\n *\n * To be sure that the honey pot will be over the `client` position,\n * we `.floor()` `clientX` and`clientY` and then make it `2px` in size.\n **/\nfunction floorToClosestPixel(point) {\n  return {\n    x: Math.floor(point.x),\n    y: Math.floor(point.y)\n  };\n}\n\n/**\n * We want to make sure the honey pot sits around the users position.\n * This seemed to be the most resilient while testing.\n */\nfunction pullBackByHalfHoneyPotSize(point) {\n  return {\n    x: point.x - halfHoneyPotSize,\n    y: point.y - halfHoneyPotSize\n  };\n}\n\n/**\n * Prevent the honey pot from changing the window size.\n * This is super unlikely to occur, but just being safe.\n */\nfunction preventGoingBackwardsOffScreen(point) {\n  return {\n    x: Math.max(point.x, 0),\n    y: Math.max(point.y, 0)\n  };\n}\n\n/**\n * Prevent the honey pot from changing the window size.\n * This is super unlikely to occur, but just being safe.\n */\nfunction preventGoingForwardsOffScreen(point) {\n  return {\n    x: Math.min(point.x, window.innerWidth - honeyPotSize),\n    y: Math.min(point.y, window.innerHeight - honeyPotSize)\n  };\n}\n\n/**\n * Create a `2x2` `DOMRect` around the `client` position\n */\nfunction getHoneyPotRectFor(_ref) {\n  var client = _ref.client;\n  var point = preventGoingForwardsOffScreen(preventGoingBackwardsOffScreen(pullBackByHalfHoneyPotSize(floorToClosestPixel(client))));\n\n  // When debugging, it is helpful to\n  // make this element a bit bigger\n  return DOMRect.fromRect({\n    x: point.x,\n    y: point.y,\n    width: honeyPotSize,\n    height: honeyPotSize\n  });\n}\nfunction getRectStyles(_ref2) {\n  var clientRect = _ref2.clientRect;\n  return {\n    left: \"\".concat(clientRect.left, \"px\"),\n    top: \"\".concat(clientRect.top, \"px\"),\n    width: \"\".concat(clientRect.width, \"px\"),\n    height: \"\".concat(clientRect.height, \"px\")\n  };\n}\nfunction isWithin(_ref3) {\n  var client = _ref3.client,\n    clientRect = _ref3.clientRect;\n  return (\n    // is within horizontal bounds\n    client.x >= clientRect.x && client.x <= clientRect.x + clientRect.width &&\n    // is within vertical bounds\n    client.y >= clientRect.y && client.y <= clientRect.y + clientRect.height\n  );\n}\n/**\n * The honey pot fix is designed to get around a painful bug in all browsers.\n *\n * [Overview](https://www.youtube.com/watch?v=udE9qbFTeQg)\n *\n * **Background**\n *\n * When a drag starts, browsers incorrectly think that the users pointer is\n * still depressed where the drag started. Any element that goes under this position\n * will be entered into, causing `\"mouseenter\"` events and `\":hover\"` styles to be applied.\n *\n * _This is a violation of the spec_\n *\n * > \"From the moment that the user agent is to initiate the drag-and-drop operation,\n * > until the end \tof the drag-and-drop operation, device input events\n * > (e.g. mouse and keyboard events) must be suppressed.\"\n * >\n * > - https://html.spec.whatwg.org/multipage/dnd.html#drag-and-drop-processing-model\n *\n * _Some impacts_\n *\n * - `\":hover\"` styles being applied where they shouldn't (looks messy)\n * - components such as tooltips responding to `\"mouseenter\"` can show during a drag,\n *   and on an element the user isn't even over\n *\n * Bug: https://issues.chromium.org/issues/41129937\n *\n * **Honey pot fix**\n *\n * 1. Create an element where the browser thinks the depressed pointer is\n *    to absorb the incorrect pointer events\n * 2. Remove that element when it is no longer needed\n */\nfunction mountHoneyPot(_ref4) {\n  var initial = _ref4.initial;\n  var element = document.createElement('div');\n  element.setAttribute(honeyPotDataAttribute, 'true');\n\n  // Using popover=\"manual\" to place the element in the browser's top layer.\n  // This ensures the honey pot is visually on top of everything else,\n  // including elements using z-index and other stacking contexts.\n  // \"manual\" means no light dismiss — we manage the lifecycle ourselves.\n  // Falls back to position:fixed + maxZIndex when the popover API is not available.\n  if (supportsPopover()) {\n    element.setAttribute('popover', 'manual');\n  }\n\n  // can shift during the drag thanks to Firefox\n  var clientRect = getHoneyPotRectFor({\n    client: initial\n  });\n  Object.assign(element.style, _objectSpread(_objectSpread({\n    position: 'fixed'\n  }, supportsPopover() ?\n  // needs to come first as it has 'inset: unset' which\n  // needs to be overridden by our top / left values\n  popoverResetUserAgentStyles : {\n    // Fallback: using maximum possible z-index so that this element\n    // will always be on top of other positioned content.\n    zIndex: maxZIndex\n  }), {}, {\n    // Setting a background color explicitly to avoid any inherited styles.\n    // Looks like this could be `opacity: 0`, but worried that _might_\n    // cause the element to be ignored on some platforms.\n    // When debugging, set backgroundColor to something like \"red\".\n    backgroundColor: 'transparent',\n    // Being explicit to avoid inheriting styles\n    padding: 0,\n    margin: 0,\n    boxSizing: 'border-box',\n    // We want this element to absorb pointer events,\n    // it's kind of the whole point 😉\n    pointerEvents: 'auto'\n  }, getRectStyles({\n    clientRect: clientRect\n  })));\n  document.body.appendChild(element);\n  if (supportsPopover()) {\n    element.showPopover();\n  }\n\n  /**\n   *  🦊 In firefox we can get `\"pointermove\"` events after the drag\n   * has started, which is a spec violation.\n   * The final `\"pointermove\"` will reveal where the \"depressed\" position\n   * is for our honey pot fix.\n   */\n  var unbindPointerMove = bind(window, {\n    type: 'pointermove',\n    listener: function listener(event) {\n      var client = {\n        x: event.clientX,\n        y: event.clientY\n      };\n      clientRect = getHoneyPotRectFor({\n        client: client\n      });\n      Object.assign(element.style, getRectStyles({\n        clientRect: clientRect\n      }));\n    },\n    // using capture so we are less likely to be impacted by event stopping\n    options: {\n      capture: true\n    }\n  });\n  return function finish(_ref5) {\n    var current = _ref5.current;\n    // Don't need this any more\n    unbindPointerMove();\n\n    // If the user is hover the honey pot, we remove it\n    // so that the user can continue to interact with the page normally.\n    if (isWithin({\n      client: current,\n      clientRect: clientRect\n    })) {\n      element.remove();\n      return;\n    }\n    function cleanup() {\n      unbindPostDragEvents();\n      element.remove();\n    }\n    var unbindPostDragEvents = bindAll(window, [{\n      type: 'pointerdown',\n      listener: cleanup\n    }, {\n      type: 'pointermove',\n      listener: cleanup\n    }, {\n      type: 'focusin',\n      listener: cleanup\n    }, {\n      type: 'focusout',\n      listener: cleanup\n    },\n    // a 'pointerdown' should happen before 'dragstart', but just being super safe\n    {\n      type: 'dragstart',\n      listener: cleanup\n    },\n    // if the user has dragged something out of the window\n    // and then is dragging something back into the window\n    // the first events we will see are \"dragenter\" (and then \"dragover\").\n    // So if we see any of these we need to clear the post drag fix.\n    {\n      type: 'dragenter',\n      listener: cleanup\n    }, {\n      type: 'dragover',\n      listener: cleanup\n    }\n\n    // Not adding a \"wheel\" event listener, as \"wheel\" by itself does not\n    // resolve the bug.\n    ], {\n      // Using `capture` so less likely to be impacted by other code stopping events\n      capture: true\n    });\n  };\n}\nexport function makeHoneyPotFix() {\n  var latestPointerMove = null;\n  function bindEvents() {\n    // For sanity, only collecting this value from when events are first bound.\n    // This prevents the case where a super old \"pointermove\" could be used\n    // from a prior interaction.\n    latestPointerMove = null;\n    return bind(window, {\n      type: 'pointermove',\n      listener: function listener(event) {\n        latestPointerMove = {\n          x: event.clientX,\n          y: event.clientY\n        };\n      },\n      // listening for pointer move in capture phase\n      // so we are less likely to be impacted by events being stopped.\n      options: {\n        capture: true\n      }\n    });\n  }\n  function getOnPostDispatch() {\n    var finish = null;\n    return function onPostEvent(_ref6) {\n      var eventName = _ref6.eventName,\n        payload = _ref6.payload;\n      // We are adding the honey pot `onDragStart` so we don't\n      // impact the creation of the native drag preview.\n      if (eventName === 'onDragStart') {\n        var input = payload.location.initial.input;\n\n        // Sometimes there will be no latest \"pointermove\" (eg iOS).\n        // In which case, we use the start position of the drag.\n        var initial = latestPointerMove !== null && latestPointerMove !== void 0 ? latestPointerMove : {\n          x: input.clientX,\n          y: input.clientY\n        };\n\n        // Don't need to defensively call `finish()` as `onDrop` from\n        // one interaction is guaranteed to be called before `onDragStart`\n        // of the next.\n        finish = mountHoneyPot({\n          initial: initial\n        });\n      }\n      if (eventName === 'onDrop') {\n        var _finish;\n        var _input = payload.location.current.input;\n        (_finish = finish) === null || _finish === void 0 || _finish({\n          current: {\n            x: _input.clientX,\n            y: _input.clientY\n          }\n        });\n        finish = null;\n        // this interaction is finished, we want to use\n        // the latest \"pointermove\" for each interaction\n        latestPointerMove = null;\n      }\n    };\n  }\n  return {\n    bindEvents: bindEvents,\n    getOnPostDispatch: getOnPostDispatch\n  };\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _arrayWithoutHoles(r) {\n  if (Array.isArray(r)) return arrayLikeToArray(r);\n}\nexport { _arrayWithoutHoles as default };","function _iterableToArray(r) {\n  if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nexport { _iterableToArray as default };","function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableSpread as default };","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nfunction _toConsumableArray(r) {\n  return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();\n}\nexport { _toConsumableArray as default };","import { once } from '../public-utils/once';\n\n// using `cache` as our `isFirefox()` result will not change in a browser\n\n/**\n * Returns `true` if a `Firefox` browser\n * */\nexport var isFirefox = once(function isFirefox() {\n  if (process.env.NODE_ENV === 'test') {\n    return false;\n  }\n  return navigator.userAgent.includes('Firefox');\n});","import { once } from '../public-utils/once';\n\n// using `cache` as our `isSafari()` result will not change in a browser\n\n/**\n * Returns `true` if a `Safari` browser.\n * Returns `true` if the browser is running on iOS (they are all Safari).\n *\n * Use `isSafariOnIOS` if you want to check if something is Safari + iOS\n * */\nexport var isSafari = once(function isSafari() {\n  if (process.env.NODE_ENV === 'test') {\n    return false;\n  }\n  var _navigator = navigator,\n    userAgent = _navigator.userAgent;\n  return userAgent.includes('AppleWebKit') && !userAgent.includes('Chrome');\n});","import { bindAll } from 'bind-event-listener';\nimport { isSafari } from '../is-safari';\n\n/* For \"dragenter\" events, the browser should set `relatedTarget` to the previous element.\n * For external drag operations, our first \"dragenter\" event should have a `event.relatedTarget` of `null`.\n *\n *  Unfortunately in Safari `event.relatedTarget` is *always* set to `null`\n *  Safari bug: https://bugs.webkit.org/show_bug.cgi?id=242627\n *  To work around this we count \"dragenter\" and \"dragleave\" events */\n\n// Using symbols for event properties so we don't clash with\n// anything on the `event` object\nvar symbols = {\n  isLeavingWindow: Symbol('leaving'),\n  isEnteringWindow: Symbol('entering')\n};\nexport function isEnteringWindowInSafari(_ref) {\n  var dragEnter = _ref.dragEnter;\n  if (!isSafari()) {\n    return false;\n  }\n  return dragEnter.hasOwnProperty(symbols.isEnteringWindow);\n}\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport function isLeavingWindowInSafari(_ref2) {\n  var dragLeave = _ref2.dragLeave;\n  if (!isSafari()) {\n    return false;\n  }\n  return dragLeave.hasOwnProperty(symbols.isLeavingWindow);\n}\n(function fixSafari() {\n  // Don't do anything when server side rendering\n  if (typeof window === 'undefined') {\n    return;\n  }\n\n  // rather than checking the userAgent for \"jsdom\" we can do this check\n  // so that the check will be removed completely in production code\n  if (process.env.NODE_ENV === 'test') {\n    return;\n  }\n  if (!isSafari()) {\n    return;\n  }\n  function getInitialState() {\n    return {\n      enterCount: 0,\n      isOverWindow: false\n    };\n  }\n  var state = getInitialState();\n  function resetState() {\n    state = getInitialState();\n  }\n\n  // These event listeners are bound _forever_ and _never_ removed\n  // We don't bother cleaning up these event listeners (for now)\n  // as this workaround is only for Safari\n\n  // This is how the event count works:\n  //\n  // lift (+1 enterCount)\n  // - dragstart(draggable) [enterCount: 0]\n  // - dragenter(draggable) [enterCount: 1]\n  // leaving draggable (+0 enterCount)\n  // - dragenter(document.body) [enterCount: 2]\n  // - dragleave(draggable) [enterCount: 1]\n  // leaving window (-1 enterCount)\n  // - dragleave(document.body) [enterCount: 0] {leaving the window}\n\n  // Things to note:\n  // - dragenter and dragleave bubble\n  // - the first dragenter when entering a window might not be on `window`\n  //   - it could be on an element that is pressed up against the window\n  //   - (so we cannot rely on `event.target` values)\n\n  bindAll(window, [{\n    type: 'dragstart',\n    listener: function listener() {\n      state.enterCount = 0;\n      // drag start occurs in the source window\n      state.isOverWindow = true;\n      // When a drag first starts it will also trigger a \"dragenter\" on the draggable element\n    }\n  }, {\n    type: 'drop',\n    listener: resetState\n  }, {\n    type: 'dragend',\n    listener: resetState\n  }, {\n    type: 'dragenter',\n    listener: function listener(event) {\n      if (!state.isOverWindow && state.enterCount === 0) {\n        // Patching the `event` object\n        // The `event` object is shared with all event listeners for the event\n        event[symbols.isEnteringWindow] = true;\n      }\n      state.isOverWindow = true;\n      state.enterCount++;\n    }\n  }, {\n    type: 'dragleave',\n    listener: function listener(event) {\n      state.enterCount--;\n      if (state.isOverWindow && state.enterCount === 0) {\n        // Patching the `event` object as it is shared with all event listeners\n        // The `event` object is shared with all event listeners for the event\n        event[symbols.isLeavingWindow] = true;\n        state.isOverWindow = false;\n      }\n    }\n  }],\n  // using `capture: true` so that adding event listeners\n  // in bubble phase will have the correct symbols\n  {\n    capture: true\n  });\n})();","/**\n * Does the `EventTarget` look like a `Node` based on \"duck typing\".\n *\n * Helpful when the `Node` might be outside of the current document\n * so we cannot to an `target instanceof Node` check.\n */\nfunction isNodeLike(target) {\n  return 'nodeName' in target;\n}\n\n/**\n * Is an `EventTarget` a `Node` from another `window`?\n */\nexport function isFromAnotherWindow(eventTarget) {\n  return isNodeLike(eventTarget) && eventTarget.ownerDocument !== document;\n}","import { isFirefox } from '../is-firefox';\nimport { isSafari } from '../is-safari';\nimport { isLeavingWindowInSafari } from './count-events-for-safari';\nimport { isFromAnotherWindow } from './is-from-another-window';\nexport function isLeavingWindow(_ref) {\n  var dragLeave = _ref.dragLeave;\n  var type = dragLeave.type,\n    relatedTarget = dragLeave.relatedTarget;\n  if (type !== 'dragleave') {\n    return false;\n  }\n  if (isSafari()) {\n    return isLeavingWindowInSafari({\n      dragLeave: dragLeave\n    });\n  }\n\n  // Standard check: if going to `null` we are leaving the `window`\n  if (relatedTarget == null) {\n    return true;\n  }\n\n  /**\n   * 🦊 Exception: `iframe` in Firefox (`125.0`)\n   *\n   * Case 1: parent `window` → child `iframe`\n   * `dragLeave.relatedTarget` is element _inside_ the child `iframe`\n   * (foreign element)\n   *\n   * Case 2: child `iframe` → parent `window`\n   * `dragLeave.relatedTarget` is the `iframe` in the parent `window`\n   * (foreign element)\n   */\n\n  if (isFirefox()) {\n    return isFromAnotherWindow(relatedTarget);\n  }\n\n  /**\n   * 🌏 Exception: `iframe` in Chrome (`124.0`)\n   *\n   * Case 1: parent `window` → child `iframe`\n   * `dragLeave.relatedTarget` is the `iframe` in the parent `window`\n   *\n   * Case 2: child `iframe` → parent `window`\n   * `dragLeave.relatedTarget` is `null` *(standard check)*\n   */\n\n  // Case 2\n  // Using `instanceof` check as the element will be in the same `window`\n  return relatedTarget instanceof HTMLIFrameElement;\n}","export function getBindingsForBrokenDrags(_ref) {\n  var onDragEnd = _ref.onDragEnd;\n  return [\n  // ## Detecting drag ending for removed draggables\n  //\n  // If a draggable element is removed during a drag and the user drops:\n  // 1. if over a valid drop target: we get a \"drop\" event to know the drag is finished\n  // 2. if not over a valid drop target (or cancelled): we get nothing\n  // The \"dragend\" event will not fire on the source draggable if it has been\n  // removed from the DOM.\n  // So we need to figure out if a drag operation has finished by looking at other events\n  // We can do this by looking at other events\n\n  // ### First detection: \"pointermove\" events\n\n  // 1. \"pointermove\" events cannot fire during a drag and drop operation\n  // according to the spec. So if we get a \"pointermove\" it means that\n  // the drag and drop operations has finished. So if we get a \"pointermove\"\n  // we know that the drag is over\n  // 2. 🦊😤 Drag and drop operations are _supposed_ to suppress\n  // other pointer events. However, firefox will allow a few\n  // pointer event to get through after a drag starts.\n  // The most I've seen is 3\n  {\n    type: 'pointermove',\n    listener: function () {\n      var callCount = 0;\n      return function listener() {\n        // Using 20 as it is far bigger than the most observed (3)\n        if (callCount < 20) {\n          callCount++;\n          return;\n        }\n        onDragEnd();\n      };\n    }()\n  },\n  // ### Second detection: \"pointerdown\" events\n\n  // If we receive this event then we know that a drag operation has finished\n  // and potentially another one is about to start.\n  // Note: `pointerdown` fires on all browsers / platforms before \"dragstart\"\n  {\n    type: 'pointerdown',\n    listener: onDragEnd\n  }];\n}","export function getInput(event) {\n  return {\n    altKey: event.altKey,\n    button: event.button,\n    buttons: event.buttons,\n    ctrlKey: event.ctrlKey,\n    metaKey: event.metaKey,\n    shiftKey: event.shiftKey,\n    clientX: event.clientX,\n    clientY: event.clientY,\n    pageX: event.pageX,\n    pageY: event.pageY\n  };\n}","import rafSchd from 'raf-schd';\nvar scheduleOnDrag = rafSchd(function (fn) {\n  return fn();\n});\nvar dragStart = function () {\n  var scheduled = null;\n  function schedule(fn) {\n    var frameId = requestAnimationFrame(function () {\n      scheduled = null;\n      fn();\n    });\n    scheduled = {\n      frameId: frameId,\n      fn: fn\n    };\n  }\n  function flush() {\n    if (scheduled) {\n      cancelAnimationFrame(scheduled.frameId);\n      scheduled.fn();\n      scheduled = null;\n    }\n  }\n  return {\n    schedule: schedule,\n    flush: flush\n  };\n}();\nexport function makeDispatch(_ref) {\n  var source = _ref.source,\n    initial = _ref.initial,\n    dispatchEvent = _ref.dispatchEvent;\n  var previous = {\n    dropTargets: []\n  };\n  function safeDispatch(args) {\n    dispatchEvent(args);\n    previous = {\n      dropTargets: args.payload.location.current.dropTargets\n    };\n  }\n  var dispatch = {\n    start: function start(_ref2) {\n      var nativeSetDragImage = _ref2.nativeSetDragImage;\n      // Ensuring that both `onGenerateDragPreview` and `onDragStart` get the same location.\n      // We do this so that `previous` is`[]` in `onDragStart` (which is logical)\n      var location = {\n        current: initial,\n        previous: previous,\n        initial: initial\n      };\n      // a `onGenerateDragPreview` does _not_ add another entry for `previous`\n      // onDragPreview\n      safeDispatch({\n        eventName: 'onGenerateDragPreview',\n        payload: {\n          source: source,\n          location: location,\n          nativeSetDragImage: nativeSetDragImage\n        }\n      });\n      dragStart.schedule(function () {\n        safeDispatch({\n          eventName: 'onDragStart',\n          payload: {\n            source: source,\n            location: location\n          }\n        });\n      });\n    },\n    dragUpdate: function dragUpdate(_ref3) {\n      var current = _ref3.current;\n      dragStart.flush();\n      scheduleOnDrag.cancel();\n      safeDispatch({\n        eventName: 'onDropTargetChange',\n        payload: {\n          source: source,\n          location: {\n            initial: initial,\n            previous: previous,\n            current: current\n          }\n        }\n      });\n    },\n    drag: function drag(_ref4) {\n      var current = _ref4.current;\n      scheduleOnDrag(function () {\n        dragStart.flush();\n        var location = {\n          initial: initial,\n          previous: previous,\n          current: current\n        };\n        safeDispatch({\n          eventName: 'onDrag',\n          payload: {\n            source: source,\n            location: location\n          }\n        });\n      });\n    },\n    drop: function drop(_ref5) {\n      var current = _ref5.current,\n        updatedSourcePayload = _ref5.updatedSourcePayload;\n      dragStart.flush();\n      scheduleOnDrag.cancel();\n      safeDispatch({\n        eventName: 'onDrop',\n        payload: {\n          source: updatedSourcePayload !== null && updatedSourcePayload !== void 0 ? updatedSourcePayload : source,\n          location: {\n            current: current,\n            previous: previous,\n            initial: initial\n          }\n        }\n      });\n    }\n  };\n  return dispatch;\n}","var rafSchd = function rafSchd(fn) {\n  var lastArgs = [];\n  var frameId = null;\n\n  var wrapperFn = function wrapperFn() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    lastArgs = args;\n\n    if (frameId) {\n      return;\n    }\n\n    frameId = requestAnimationFrame(function () {\n      frameId = null;\n      fn.apply(void 0, lastArgs);\n    });\n  };\n\n  wrapperFn.cancel = function () {\n    if (!frameId) {\n      return;\n    }\n\n    cancelAnimationFrame(frameId);\n    frameId = null;\n  };\n\n  return wrapperFn;\n};\n\nexport default rafSchd;\n","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport { bindAll } from 'bind-event-listener';\nimport { getElementFromPointWithoutHoneypot } from '../honey-pot-fix/get-element-from-point-without-honey-pot';\nimport { isHoneyPotElement } from '../honey-pot-fix/is-honey-pot-element';\nimport { isLeavingWindow } from '../util/changing-window/is-leaving-window';\nimport { getBindingsForBrokenDrags } from '../util/detect-broken-drag';\nimport { getInput } from '../util/get-input';\nimport { makeDispatch } from './dispatch-consumer-event';\nvar globalState = {\n  isActive: false\n};\nfunction canStart() {\n  return !globalState.isActive;\n}\nfunction getNativeSetDragImage(event) {\n  if (event.dataTransfer) {\n    // need to use `.bind` as `setDragImage` is required\n    // to be run with `event.dataTransfer` as the \"this\" context\n    return event.dataTransfer.setDragImage.bind(event.dataTransfer);\n  }\n  return null;\n}\nfunction hasHierarchyChanged(_ref) {\n  var current = _ref.current,\n    next = _ref.next;\n  if (current.length !== next.length) {\n    return true;\n  }\n  // not checking stickiness, data or dropEffect,\n  // just whether the hierarchy has changed\n  for (var i = 0; i < current.length; i++) {\n    if (current[i].element !== next[i].element) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction start(_ref2) {\n  var event = _ref2.event,\n    dragType = _ref2.dragType,\n    getDropTargetsOver = _ref2.getDropTargetsOver,\n    dispatchEvent = _ref2.dispatchEvent;\n  if (!canStart()) {\n    return;\n  }\n  var initial = getStartLocation({\n    event: event,\n    dragType: dragType,\n    getDropTargetsOver: getDropTargetsOver\n  });\n  globalState.isActive = true;\n  var state = {\n    current: initial\n  };\n\n  // Setting initial drop effect for the drag\n  setDropEffectOnEvent({\n    event: event,\n    current: initial.dropTargets\n  });\n  var dispatch = makeDispatch({\n    source: dragType.payload,\n    dispatchEvent: dispatchEvent,\n    initial: initial\n  });\n  function updateState(next) {\n    // only looking at whether hierarchy has changed to determine whether something as 'changed'\n    var hasChanged = hasHierarchyChanged({\n      current: state.current.dropTargets,\n      next: next.dropTargets\n    });\n\n    // Always updating the state to include latest data, dropEffect and stickiness\n    // Only updating consumers if the hierarchy has changed in some way\n    // Consumers can get the latest data by using `onDrag`\n    state.current = next;\n    if (hasChanged) {\n      dispatch.dragUpdate({\n        current: state.current\n      });\n    }\n  }\n  function onUpdateEvent(event) {\n    var input = getInput(event);\n\n    // If we are over the honey pot, we need to get the element\n    // that the user would have been over if not for the honey pot\n    var target = isHoneyPotElement(event.target) ? getElementFromPointWithoutHoneypot({\n      x: input.clientX,\n      y: input.clientY\n    }) : event.target;\n    var nextDropTargets = getDropTargetsOver({\n      target: target,\n      input: input,\n      source: dragType.payload,\n      current: state.current.dropTargets\n    });\n    if (nextDropTargets.length) {\n      // 🩸 must call `event.preventDefault()` to allow a browser drop to occur\n      event.preventDefault();\n      setDropEffectOnEvent({\n        event: event,\n        current: nextDropTargets\n      });\n    }\n    updateState({\n      dropTargets: nextDropTargets,\n      input: input\n    });\n  }\n  function cancel() {\n    // The spec behaviour is that when a drag is cancelled, or when dropping on no drop targets,\n    // a \"dragleave\" event is fired on the active drop target before a \"dragend\" event.\n    // We are replicating that behaviour in `cancel` if there are any active drop targets to\n    // ensure consistent behaviour.\n    //\n    // Note: When cancelling, or dropping on no drop targets, a \"dragleave\" event\n    // will have already cleared the dropTargets to `[]` (as that particular \"dragleave\" has a `relatedTarget` of `null`)\n\n    if (state.current.dropTargets.length) {\n      updateState({\n        dropTargets: [],\n        input: state.current.input\n      });\n    }\n    dispatch.drop({\n      current: state.current,\n      updatedSourcePayload: null\n    });\n    finish();\n  }\n  function finish() {\n    globalState.isActive = false;\n    unbindEvents();\n  }\n  var unbindEvents = bindAll(window, [{\n    // 👋 Note: we are repurposing the `dragover` event as our `drag` event\n    // this is because firefox does not publish pointer coordinates during\n    // a `drag` event, but does for every other type of drag event\n    // `dragover` fires on all elements that are being dragged over\n    // Because we are binding to `window` - our `dragover` is effectively the same as a `drag`\n    // 🦊😤\n    type: 'dragover',\n    listener: function listener(event) {\n      // We need to regularly calculate the drop targets in order to allow:\n      //  - dynamic `canDrop()` checks\n      //  - rapid updating `getData()` calls to attach data in response to user input (eg for edge detection)\n      // Sadly we cannot schedule inspecting changes resulting from this event\n      // we need to be able to conditionally cancel the event with `event.preventDefault()`\n      // to enable the correct native drop experience.\n\n      // 1. check to see if anything has changed\n      onUpdateEvent(event);\n\n      // 2. let consumers know a move has occurred\n      // This will include the latest 'input' values\n      dispatch.drag({\n        current: state.current\n      });\n    }\n  }, {\n    type: 'dragenter',\n    listener: onUpdateEvent\n  }, {\n    type: 'dragleave',\n    listener: function listener(event) {\n      if (!isLeavingWindow({\n        dragLeave: event\n      })) {\n        return;\n      }\n\n      /**\n       * At this point we don't know if a drag is being cancelled,\n       * or if a drag is leaving the `window`.\n       *\n       * Both have:\n       *   1. \"dragleave\" (with `relatedTarget: null`)\n       *   2. \"dragend\" (a \"dragend\" can occur when outside the `window`)\n       *\n       * **Clearing drop targets**\n       *\n       * For either case we are clearing the the drop targets\n       *\n       * - cancelling: we clear drop targets in `\"dragend\"` anyway\n       * - leaving the `window`: we clear the drop targets (to clear stickiness)\n       *\n       * **Leaving the window and finishing the drag**\n       *\n       * _internal drags_\n       *\n       * - The drag continues when the user is outside the `window`\n       *   and can resume if the user drags back over the `window`,\n       *   or end when the user drops in an external `window`.\n       * - We will get a `\"dragend\"`, or we can listen for other\n       *   events to determine the drag is finished when the user re-enters the `window`).\n       *\n       * _external drags_\n       *\n       * - We conclude the drag operation.\n       * - We have no idea if the user will drag back over the `window`,\n       *   or if the drag ends elsewhere.\n       * - We will create a new drag if the user re-enters the `window`.\n       *\n       * **Not updating `input`**\n       *\n       * 🐛 Bug[Chrome] the final `\"dragleave\"` has default input values (eg `clientX == 0`)\n       * Workaround: intentionally not updating `input` in \"dragleave\"\n       * rather than the users current input values\n       * - [Conversation](https://twitter.com/alexandereardon/status/1642697633864241152)\n       * - [Bug](https://bugs.chromium.org/p/chromium/issues/detail?id=1429937)\n       **/\n\n      updateState({\n        input: state.current.input,\n        dropTargets: []\n      });\n      if (dragType.startedFrom === 'external') {\n        cancel();\n      }\n    }\n  }, {\n    // A \"drop\" can only happen if the browser allowed the drop\n    type: 'drop',\n    listener: function listener(event) {\n      // Capture the final input.\n      // We are capturing the final `input` for the\n      // most accurate honey pot experience\n      state.current = {\n        dropTargets: state.current.dropTargets,\n        input: getInput(event)\n      };\n\n      /** If there are no drop targets, then we will get\n       * a \"drop\" event if:\n       * - `preventUnhandled()` is being used\n       * - there is an unmanaged drop target (eg another library)\n       * In these cases, it's up to the consumer\n       * to handle the drop if it's not over one of our drop targets\n       * - `preventUnhandled()` will cancel the \"drop\"\n       * - unmanaged drop targets can handle the \"drop\" how they want to\n       * We won't call `event.preventDefault()` in this call path */\n\n      if (!state.current.dropTargets.length) {\n        cancel();\n        return;\n      }\n      event.preventDefault();\n\n      // applying the latest drop effect to the event\n      setDropEffectOnEvent({\n        event: event,\n        current: state.current.dropTargets\n      });\n      dispatch.drop({\n        current: state.current,\n        // When dropping something native, we need to extract the latest\n        // `.items` from the \"drop\" event as it is now accessible\n        updatedSourcePayload: dragType.type === 'external' ? dragType.getDropPayload(event) : null\n      });\n      finish();\n    }\n  }, {\n    // \"dragend\" fires when on the drag source (eg a draggable element)\n    // when the drag is finished.\n    // \"dragend\" will fire after \"drop\" (if there was a successful drop)\n    // \"dragend\" does not fire if the draggable source has been removed during the drag\n    // or for external drag sources (eg files)\n\n    // This \"dragend\" listener will not fire if there was a successful drop\n    // as we will have already removed the event listener\n\n    type: 'dragend',\n    listener: function listener(event) {\n      // In firefox, the position of the \"dragend\" event can\n      // be a bit different to the last \"dragover\" event.\n      // Updating the input so we can get the best possible\n      // information for the honey pot.\n      state.current = {\n        dropTargets: state.current.dropTargets,\n        input: getInput(event)\n      };\n      cancel();\n    }\n  }].concat(_toConsumableArray(getBindingsForBrokenDrags({\n    onDragEnd: cancel\n  }))),\n  // Once we have started a managed drag operation it is important that we see / own all drag events\n  // We got one adoption bug pop up where some code was stopping (`event.stopPropagation()`)\n  // all \"drop\" events in the bubble phase on the `document.body`.\n  // This meant that we never saw the \"drop\" event.\n  {\n    capture: true\n  });\n  dispatch.start({\n    nativeSetDragImage: getNativeSetDragImage(event)\n  });\n}\nfunction setDropEffectOnEvent(_ref3) {\n  var _current$;\n  var event = _ref3.event,\n    current = _ref3.current;\n  // setting the `dropEffect` to be the innerMost drop targets dropEffect\n  var innerMost = (_current$ = current[0]) === null || _current$ === void 0 ? void 0 : _current$.dropEffect;\n  if (innerMost != null && event.dataTransfer) {\n    event.dataTransfer.dropEffect = innerMost;\n  }\n}\nfunction getStartLocation(_ref4) {\n  var event = _ref4.event,\n    dragType = _ref4.dragType,\n    getDropTargetsOver = _ref4.getDropTargetsOver;\n  var input = getInput(event);\n\n  // When dragging from outside of the browser,\n  // the drag is not being sourced from any local drop targets\n  if (dragType.startedFrom === 'external') {\n    return {\n      input: input,\n      dropTargets: []\n    };\n  }\n  var dropTargets = getDropTargetsOver({\n    input: input,\n    source: dragType.payload,\n    target: event.target,\n    current: []\n  });\n  return {\n    input: input,\n    dropTargets: dropTargets\n  };\n}\nexport var lifecycle = {\n  canStart: canStart,\n  start: start\n};","// Extending `Map` to allow us to link Key and Values together\n\nvar ledger = new Map();\nfunction registerUsage(_ref) {\n  var typeKey = _ref.typeKey,\n    mount = _ref.mount;\n  var entry = ledger.get(typeKey);\n  if (entry) {\n    entry.usageCount++;\n    return entry;\n  }\n  var initial = {\n    typeKey: typeKey,\n    unmount: mount(),\n    usageCount: 1\n  };\n  ledger.set(typeKey, initial);\n  return initial;\n}\nexport function register(args) {\n  var entry = registerUsage(args);\n  return function unregister() {\n    entry.usageCount--;\n    if (entry.usageCount > 0) {\n      return;\n    }\n    // Only a single usage left, remove it\n    entry.unmount();\n    ledger.delete(args.typeKey);\n  };\n}","/** Create a new combined function that will call all the provided functions */\nexport function combine() {\n  for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {\n    fns[_key] = arguments[_key];\n  }\n  return function cleanup() {\n    fns.forEach(function (fn) {\n      return fn();\n    });\n  };\n}","export function addAttribute(element, _ref) {\n  var attribute = _ref.attribute,\n    value = _ref.value;\n  element.setAttribute(attribute, value);\n  return function () {\n    return element.removeAttribute(attribute);\n  };\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nimport { combine } from '../public-utils/combine';\nimport { once } from '../public-utils/once';\nimport { addAttribute } from '../util/add-attribute';\nfunction copyReverse(array) {\n  return array.slice(0).reverse();\n}\nexport function makeDropTarget(_ref) {\n  var typeKey = _ref.typeKey,\n    defaultDropEffect = _ref.defaultDropEffect;\n  var registry = new WeakMap();\n  var dropTargetDataAtt = \"data-drop-target-for-\".concat(typeKey);\n  var dropTargetSelector = \"[\".concat(dropTargetDataAtt, \"]\");\n  function addToRegistry(args) {\n    registry.set(args.element, args);\n    return function () {\n      return registry.delete(args.element);\n    };\n  }\n  function dropTargetForConsumers(args) {\n    // Guardrail: warn if the draggable element is already registered\n    if (process.env.NODE_ENV !== 'production') {\n      var existing = registry.get(args.element);\n      if (existing) {\n        // eslint-disable-next-line no-console\n        console.warn(\"You have already registered a [\".concat(typeKey, \"] dropTarget on the same element\"), {\n          existing: existing,\n          proposed: args\n        });\n      }\n      if (args.element instanceof HTMLIFrameElement) {\n        // eslint-disable-next-line no-console\n        console.warn(\"\\n            We recommend not registering <iframe> elements as drop targets\\n            as it can result in some strange browser event ordering.\\n          \" // Removing newlines and excessive whitespace\n        .replace(/\\s{2,}/g, ' ').trim());\n      }\n    }\n    var cleanup = combine(addAttribute(args.element, {\n      attribute: dropTargetDataAtt,\n      value: 'true'\n    }), addToRegistry(args));\n\n    // Wrapping in `once` to prevent unexpected side effects if consumers call\n    // the clean up function multiple times.\n    return once(cleanup);\n  }\n  function getActualDropTargets(_ref2) {\n    var _args$getData, _args$getData2, _args$getDropEffect, _args$getDropEffect2;\n    var source = _ref2.source,\n      target = _ref2.target,\n      input = _ref2.input,\n      _ref2$result = _ref2.result,\n      result = _ref2$result === void 0 ? [] : _ref2$result;\n    if (target == null) {\n      return result;\n    }\n    if (!(target instanceof Element)) {\n      // For \"text-selection\" drags, the original `target`\n      // is not an `Element`, so we need to start looking from\n      // the parent element\n      if (target instanceof Node) {\n        return getActualDropTargets({\n          source: source,\n          target: target.parentElement,\n          input: input,\n          result: result\n        });\n      }\n\n      // not sure what we are working with,\n      // so we can exit.\n      return result;\n    }\n    var closest = target.closest(dropTargetSelector);\n\n    // Cannot find anything else\n    if (closest == null) {\n      return result;\n    }\n    var args = registry.get(closest);\n\n    // error: something had a dropTargetSelector but we could not\n    // find a match. For now, failing silently\n    if (args == null) {\n      return result;\n    }\n    var feedback = {\n      input: input,\n      source: source,\n      element: args.element\n    };\n\n    // if dropping is not allowed, skip this drop target\n    // and continue looking up the DOM tree\n    if (args.canDrop && !args.canDrop(feedback)) {\n      return getActualDropTargets({\n        source: source,\n        target: args.element.parentElement,\n        input: input,\n        result: result\n      });\n    }\n\n    // calculate our new record\n    var data = (_args$getData = (_args$getData2 = args.getData) === null || _args$getData2 === void 0 ? void 0 : _args$getData2.call(args, feedback)) !== null && _args$getData !== void 0 ? _args$getData : {};\n    var dropEffect = (_args$getDropEffect = (_args$getDropEffect2 = args.getDropEffect) === null || _args$getDropEffect2 === void 0 ? void 0 : _args$getDropEffect2.call(args, feedback)) !== null && _args$getDropEffect !== void 0 ? _args$getDropEffect : defaultDropEffect;\n    var record = {\n      data: data,\n      element: args.element,\n      dropEffect: dropEffect,\n      // we are collecting _actual_ drop targets, so these are\n      // being applied _not_ due to stickiness\n      isActiveDueToStickiness: false\n    };\n    return getActualDropTargets({\n      source: source,\n      target: args.element.parentElement,\n      input: input,\n      // Using bubble ordering. Same ordering as `event.getPath()`\n      result: [].concat(_toConsumableArray(result), [record])\n    });\n  }\n  function notifyCurrent(_ref3) {\n    var eventName = _ref3.eventName,\n      payload = _ref3.payload;\n    var _iterator = _createForOfIteratorHelper(payload.location.current.dropTargets),\n      _step;\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var _entry$eventName;\n        var record = _step.value;\n        var entry = registry.get(record.element);\n        var args = _objectSpread(_objectSpread({}, payload), {}, {\n          self: record\n        });\n        entry === null || entry === void 0 || (_entry$eventName = entry[eventName]) === null || _entry$eventName === void 0 || _entry$eventName.call(entry,\n        // I cannot seem to get the types right here.\n        // TS doesn't seem to like that one event can need `nativeSetDragImage`\n        // @ts-expect-error\n        args);\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n  }\n  var actions = {\n    onGenerateDragPreview: notifyCurrent,\n    onDrag: notifyCurrent,\n    onDragStart: notifyCurrent,\n    onDrop: notifyCurrent,\n    onDropTargetChange: function onDropTargetChange(_ref4) {\n      var payload = _ref4.payload;\n      var isCurrent = new Set(payload.location.current.dropTargets.map(function (record) {\n        return record.element;\n      }));\n      var visited = new Set();\n      var _iterator2 = _createForOfIteratorHelper(payload.location.previous.dropTargets),\n        _step2;\n      try {\n        for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n          var _entry$onDropTargetCh;\n          var record = _step2.value;\n          visited.add(record.element);\n          var entry = registry.get(record.element);\n          var isOver = isCurrent.has(record.element);\n          var args = _objectSpread(_objectSpread({}, payload), {}, {\n            self: record\n          });\n          entry === null || entry === void 0 || (_entry$onDropTargetCh = entry.onDropTargetChange) === null || _entry$onDropTargetCh === void 0 || _entry$onDropTargetCh.call(entry, args);\n\n          // if we cannot find the drop target in the current array, then it has been left\n          if (!isOver) {\n            var _entry$onDragLeave;\n            entry === null || entry === void 0 || (_entry$onDragLeave = entry.onDragLeave) === null || _entry$onDragLeave === void 0 || _entry$onDragLeave.call(entry, args);\n          }\n        }\n      } catch (err) {\n        _iterator2.e(err);\n      } finally {\n        _iterator2.f();\n      }\n      var _iterator3 = _createForOfIteratorHelper(payload.location.current.dropTargets),\n        _step3;\n      try {\n        for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n          var _entry$onDropTargetCh2, _entry$onDragEnter;\n          var _record = _step3.value;\n          // already published an update to this drop target\n          if (visited.has(_record.element)) {\n            continue;\n          }\n          // at this point we have a new drop target that is being entered into\n          var _args = _objectSpread(_objectSpread({}, payload), {}, {\n            self: _record\n          });\n          var _entry = registry.get(_record.element);\n          _entry === null || _entry === void 0 || (_entry$onDropTargetCh2 = _entry.onDropTargetChange) === null || _entry$onDropTargetCh2 === void 0 || _entry$onDropTargetCh2.call(_entry, _args);\n          _entry === null || _entry === void 0 || (_entry$onDragEnter = _entry.onDragEnter) === null || _entry$onDragEnter === void 0 || _entry$onDragEnter.call(_entry, _args);\n        }\n      } catch (err) {\n        _iterator3.e(err);\n      } finally {\n        _iterator3.f();\n      }\n    }\n  };\n  function dispatchEvent(args) {\n    actions[args.eventName](args);\n  }\n  function getIsOver(_ref5) {\n    var source = _ref5.source,\n      target = _ref5.target,\n      input = _ref5.input,\n      current = _ref5.current;\n    var actual = getActualDropTargets({\n      source: source,\n      target: target,\n      input: input\n    });\n\n    // stickiness is only relevant when we have less\n    // drop targets than we did before\n    if (actual.length >= current.length) {\n      return actual;\n    }\n\n    // less 'actual' drop targets than before,\n    // we need to see if 'stickiness' applies\n\n    // An old drop target will continue to be dropped on if:\n    // 1. it has the same parent\n    // 2. nothing exists in it's previous index\n\n    var lastCaptureOrdered = copyReverse(current);\n    var actualCaptureOrdered = copyReverse(actual);\n    var resultCaptureOrdered = [];\n    for (var index = 0; index < lastCaptureOrdered.length; index++) {\n      var _argsForLast$getIsSti;\n      var last = lastCaptureOrdered[index];\n      var fresh = actualCaptureOrdered[index];\n\n      // if a record is in the new index -> use that\n      // it will have the latest data + dropEffect\n      if (fresh != null) {\n        resultCaptureOrdered.push(fresh);\n        continue;\n      }\n\n      // At this point we have no drop target in the old spot\n      // Check to see if we can use a previous sticky drop target\n\n      // The \"parent\" is the one inside of `resultCaptureOrdered`\n      // (the parent might be a drop target that was sticky)\n      var parent = resultCaptureOrdered[index - 1];\n      var lastParent = lastCaptureOrdered[index - 1];\n\n      // Stickiness is based on parent relationships, so if the parent relationship has change\n      // then we can stop our search\n      if ((parent === null || parent === void 0 ? void 0 : parent.element) !== (lastParent === null || lastParent === void 0 ? void 0 : lastParent.element)) {\n        break;\n      }\n\n      // We need to check whether the old drop target can still be dropped on\n\n      var argsForLast = registry.get(last.element);\n\n      // We cannot drop on a drop target that is no longer mounted\n      if (!argsForLast) {\n        break;\n      }\n      var feedback = {\n        input: input,\n        source: source,\n        element: argsForLast.element\n      };\n\n      // We cannot drop on a drop target that no longer allows being dropped on\n      if (argsForLast.canDrop && !argsForLast.canDrop(feedback)) {\n        break;\n      }\n\n      // We cannot drop on a drop target that is no longer sticky\n      if (!((_argsForLast$getIsSti = argsForLast.getIsSticky) !== null && _argsForLast$getIsSti !== void 0 && _argsForLast$getIsSti.call(argsForLast, feedback))) {\n        break;\n      }\n\n      // Note: intentionally not recollecting `getData()` or `getDropEffect()`\n      // Previous values for `data` and `dropEffect` will be borrowed\n      // This is to prevent things like the 'closest edge' changing when\n      // no longer over a drop target.\n      // We could change our mind on this behaviour in the future\n\n      resultCaptureOrdered.push(_objectSpread(_objectSpread({}, last), {}, {\n        // making it clear to consumers this drop target is active due to stickiness\n        isActiveDueToStickiness: true\n      }));\n    }\n\n    // return bubble ordered result\n    return copyReverse(resultCaptureOrdered);\n  }\n  return {\n    dropTargetForConsumers: dropTargetForConsumers,\n    getIsOver: getIsOver,\n    dispatchEvent: dispatchEvent\n  };\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { once } from '../public-utils/once';\nexport function makeMonitor() {\n  var registry = new Set();\n  var dragging = null;\n  function tryAddToActive(monitor) {\n    if (!dragging) {\n      return;\n    }\n    // Monitor is allowed to monitor events if:\n    // 1. It has no `canMonitor` function (default is that a monitor can listen to everything)\n    // 2. `canMonitor` returns true\n    if (!monitor.canMonitor || monitor.canMonitor(dragging.canMonitorArgs)) {\n      dragging.active.add(monitor);\n    }\n  }\n  function monitorForConsumers(args) {\n    // We are giving each `args` a new reference so that you\n    // can create multiple monitors with the same `args`.\n    var entry = _objectSpread({}, args);\n    registry.add(entry);\n\n    // if there is an active drag we need to see if this new monitor is relevant\n    tryAddToActive(entry);\n    function cleanup() {\n      registry.delete(entry);\n\n      // We need to stop publishing events during a drag to this monitor!\n      if (dragging) {\n        dragging.active.delete(entry);\n      }\n    }\n\n    // Wrapping in `once` to prevent unexpected side effects if consumers call\n    // the clean up function multiple times.\n    return once(cleanup);\n  }\n  function dispatchEvent(_ref) {\n    var eventName = _ref.eventName,\n      payload = _ref.payload;\n    if (eventName === 'onGenerateDragPreview') {\n      dragging = {\n        canMonitorArgs: {\n          initial: payload.location.initial,\n          source: payload.source\n        },\n        active: new Set()\n      };\n      var _iterator = _createForOfIteratorHelper(registry),\n        _step;\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var monitor = _step.value;\n          tryAddToActive(monitor);\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n    }\n\n    // This should never happen.\n    if (!dragging) {\n      return;\n    }\n\n    // Creating an array from the set _before_ iterating\n    // This is so that monitors added during the current event will not be called.\n    // This behaviour matches native EventTargets where an event listener\n    // cannot add another event listener during an active event to the same\n    // event target in the same event (for us we have a single global event target)\n    var active = Array.from(dragging.active);\n    for (var _i = 0, _active = active; _i < _active.length; _i++) {\n      var _monitor = _active[_i];\n      // A monitor can be removed by another monitor during an event.\n      // We need to check that the monitor is still registered before calling it\n      if (dragging.active.has(_monitor)) {\n        var _monitor$eventName;\n        // @ts-expect-error: I cannot get this type working!\n        (_monitor$eventName = _monitor[eventName]) === null || _monitor$eventName === void 0 || _monitor$eventName.call(_monitor, payload);\n      }\n    }\n    if (eventName === 'onDrop') {\n      dragging.active.clear();\n      dragging = null;\n    }\n  }\n  return {\n    dispatchEvent: dispatchEvent,\n    monitorForConsumers: monitorForConsumers\n  };\n}","import { lifecycle } from '../ledger/lifecycle-manager';\nimport { register } from '../ledger/usage-ledger';\nimport { makeDropTarget } from './make-drop-target';\nimport { makeMonitor } from './make-monitor';\nexport function makeAdapter(_ref) {\n  var typeKey = _ref.typeKey,\n    mount = _ref.mount,\n    dispatchEventToSource = _ref.dispatchEventToSource,\n    onPostDispatch = _ref.onPostDispatch,\n    defaultDropEffect = _ref.defaultDropEffect;\n  var monitorAPI = makeMonitor();\n  var dropTargetAPI = makeDropTarget({\n    typeKey: typeKey,\n    defaultDropEffect: defaultDropEffect\n  });\n  function dispatchEvent(args) {\n    // 1. forward the event to source\n    dispatchEventToSource === null || dispatchEventToSource === void 0 || dispatchEventToSource(args);\n\n    // 2. forward the event to relevant dropTargets\n    dropTargetAPI.dispatchEvent(args);\n\n    // 3. forward event to monitors\n    monitorAPI.dispatchEvent(args);\n\n    // 4. post consumer dispatch (used for honey pot fix)\n    onPostDispatch === null || onPostDispatch === void 0 || onPostDispatch(args);\n  }\n  function start(_ref2) {\n    var event = _ref2.event,\n      dragType = _ref2.dragType;\n    lifecycle.start({\n      event: event,\n      dragType: dragType,\n      getDropTargetsOver: dropTargetAPI.getIsOver,\n      dispatchEvent: dispatchEvent\n    });\n  }\n  function registerUsage() {\n    function mountAdapter() {\n      var api = {\n        canStart: lifecycle.canStart,\n        start: start\n      };\n      return mount(api);\n    }\n    return register({\n      typeKey: typeKey,\n      mount: mountAdapter\n    });\n  }\n  return {\n    registerUsage: registerUsage,\n    dropTarget: dropTargetAPI.dropTargetForConsumers,\n    monitor: monitorAPI.monitorForConsumers\n  };\n}","import { once } from '../public-utils/once';\n\n// Using `once` as the value won't change in a browser\n\nexport var isAndroid = once(function isAndroid() {\n  return navigator.userAgent.toLocaleLowerCase().includes('android');\n});\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport var androidFallbackText = 'pdnd:android-fallback';","// Why we put the media types in their own files:\n//\n// - we are not putting them all in one file as not all adapters need all types\n// - we are not putting them in the external helpers as some things just need the\n//   types and not the external functions code\nexport var textMediaType = 'text/plain';","/**\n * This key has been pulled into a separate module\n * so that the external adapter does not need to import\n * the element adapter\n */\nexport var elementAdapterNativeDataKey = 'application/vnd.pdnd';","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { bind } from 'bind-event-listener';\nimport { getElementFromPointWithoutHoneypot } from '../honey-pot-fix/get-element-from-point-without-honey-pot';\nimport { makeHoneyPotFix } from '../honey-pot-fix/make-honey-pot-fix';\nimport { makeAdapter } from '../make-adapter/make-adapter';\nimport { combine } from '../public-utils/combine';\nimport { once } from '../public-utils/once';\nimport { addAttribute } from '../util/add-attribute';\nimport { androidFallbackText, isAndroid } from '../util/android';\nimport { getInput } from '../util/get-input';\nimport { textMediaType } from '../util/media-types/text-media-type';\nimport { URLMediaType } from '../util/media-types/url-media-type';\nimport { elementAdapterNativeDataKey } from './element-adapter-native-data-key';\nvar draggableRegistry = new WeakMap();\nfunction addToRegistry(args) {\n  draggableRegistry.set(args.element, args);\n  return function cleanup() {\n    draggableRegistry.delete(args.element);\n  };\n}\nvar honeyPotFix = makeHoneyPotFix();\nvar adapter = makeAdapter({\n  typeKey: 'element',\n  defaultDropEffect: 'move',\n  mount: function mount(api) {\n    /**  Binding event listeners the `document` rather than `window` so that\n     * this adapter always gets preference over the text adapter.\n     * `document` is the first `EventTarget` under `window`\n     * https://twitter.com/alexandereardon/status/1604658588311465985\n     */\n    return combine(honeyPotFix.bindEvents(), bind(document, {\n      type: 'dragstart',\n      listener: function listener(event) {\n        var _entry$dragHandle, _entry$getInitialData, _entry$getInitialData2, _entry$dragHandle2, _entry$getInitialData3, _entry$getInitialData4;\n        if (!api.canStart(event)) {\n          return;\n        }\n\n        // If the \"dragstart\" event is cancelled, then a drag won't start\n        // There will be no further drag operation events (eg no \"dragend\" event)\n        if (event.defaultPrevented) {\n          return;\n        }\n\n        // Technically `dataTransfer` can be `null` according to the types\n        // But that behaviour does not seem to appear in the spec.\n        // If there is not `dataTransfer`, we can assume something is wrong and not\n        // start a drag\n        if (!event.dataTransfer) {\n          // Including this code on \"test\" and \"development\" environments:\n          // - Browser tests commonly run against \"development\" builds\n          // - Unit tests commonly run in \"test\"\n          if (process.env.NODE_ENV !== 'production') {\n            // eslint-disable-next-line no-console\n            console.warn(\"\\n              It appears as though you have are not testing DragEvents correctly.\\n\\n              - If you are unit testing, ensure you have polyfilled DragEvent.\\n              - If you are browser testing, ensure you are dispatching drag events correctly.\\n\\n              Please see our testing guides for more information:\\n              https://atlassian.design/components/pragmatic-drag-and-drop/core-package/testing\\n            \".replace(/ {2}/g, ''));\n          }\n          return;\n        }\n\n        // the closest parent that is a draggable element will be marked as\n        // the `event.target` for the event\n        var target = event.target;\n\n        // this source is only for elements\n        // Note: only HTMLElements can have the \"draggable\" attribute\n        if (!(target instanceof HTMLElement)) {\n          return;\n        }\n\n        // see if the thing being dragged is owned by us\n        var entry = draggableRegistry.get(target);\n\n        // no matching element found\n        // → dragging an element with `draggable=\"true\"` that is not controlled by us\n        if (!entry) {\n          return;\n        }\n\n        /**\n         * A text selection drag _can_ have the `draggable` element be\n         * the `event.target` if the user is dragging the text selection\n         * from the `draggable`.\n         *\n         * To know if the `draggable` is being dragged, we look at whether any\n         * `\"text/plain\"` data is being dragged. If it is, then a text selection\n         * drag is occurring.\n         *\n         * This behaviour has been validated on:\n         *\n         * - Chrome@128 on Android@14\n         * - Chrome@128 on iOS@17.6.1\n         * - Chrome@128 on Windows@11\n         * - Chrome@128 on MacOS@14.6.1\n         * - Firefox@129 on Windows@11 (not possible for user to select text in a draggable)\n         * - Firefox@129 on MacOS@14.6.1 (not possible for user to select text in a draggable)\n         *\n         * Note: Could usually just use: `event.dataTransfer.types.includes(textMediaType)`\n         * but unfortunately ProseMirror is always setting `\"\"` as the dragged text\n         *\n         * Note: Unfortunately editor is (heavily) leaning on the current functionality today\n         * and unwinding it will be a decent amount of effort. So for now, a text selection\n         * where the `event.target` is a `draggable` element will still trigger the\n         * element adapter.\n         *\n         * // Future state:\n         * if(event.dataTransfer.getData(textMediaType)) {\n         * \treturn;\n         * }\n         *\n         */\n\n        var input = getInput(event);\n        var feedback = {\n          element: entry.element,\n          dragHandle: (_entry$dragHandle = entry.dragHandle) !== null && _entry$dragHandle !== void 0 ? _entry$dragHandle : null,\n          input: input\n        };\n\n        // Check: does the draggable want to allow dragging?\n        if (entry.canDrag && !entry.canDrag(feedback)) {\n          // cancel drag operation if we cannot drag\n          event.preventDefault();\n          return;\n        }\n\n        // Check: is there a drag handle and is the user using it?\n        if (entry.dragHandle) {\n          // technically don't need this util, but just being\n          // consistent with how we look up what is under the users\n          // cursor.\n          var over = getElementFromPointWithoutHoneypot({\n            x: input.clientX,\n            y: input.clientY\n          });\n\n          // if we are not dragging from the drag handle (or something inside the drag handle)\n          // then we will cancel the active drag\n          if (!entry.dragHandle.contains(over)) {\n            event.preventDefault();\n            return;\n          }\n        }\n\n        /**\n         *  **Goal**\n         *  Pass information to other applications\n         *\n         * **Approach**\n         *  Put data into the native data store\n         *\n         *  **What about the native adapter?**\n         *  When the element adapter puts native data into the native data store\n         *  the native adapter is not triggered in the current window,\n         *  but a native adapter in an external window _can_ be triggered\n         *\n         *  **Why bake this into core?**\n         *  This functionality could be pulled out and exposed inside of\n         *  `onGenerateDragPreview`. But decided to make it a part of the\n         *  base API as it felt like a common enough use case and ended\n         *  up being a similar amount of code to include this function as\n         *  it was to expose the hook for it\n         */\n        var nativeData = (_entry$getInitialData = (_entry$getInitialData2 = entry.getInitialDataForExternal) === null || _entry$getInitialData2 === void 0 ? void 0 : _entry$getInitialData2.call(entry, feedback)) !== null && _entry$getInitialData !== void 0 ? _entry$getInitialData : null;\n        if (nativeData) {\n          for (var _i = 0, _Object$entries = Object.entries(nativeData); _i < _Object$entries.length; _i++) {\n            var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),\n              key = _Object$entries$_i[0],\n              data = _Object$entries$_i[1];\n            event.dataTransfer.setData(key, data !== null && data !== void 0 ? data : '');\n          }\n        }\n\n        /**\n         *  📱 For Android devices, a drag operation will not start unless\n         * \"text/plain\" or \"text/uri-list\" data exists in the native data store\n         * https://twitter.com/alexandereardon/status/1732189803754713424\n         *\n         * Tested on:\n         * Device: Google Pixel 5\n         * Android version: 14 (November 5, 2023)\n         * Chrome version: 120.0\n         */\n        if (isAndroid() && !event.dataTransfer.types.includes(textMediaType) && !event.dataTransfer.types.includes(URLMediaType)) {\n          event.dataTransfer.setData(textMediaType, androidFallbackText);\n        }\n\n        /**\n         * 1. Must set any media type for `iOS15` to work\n         * 2. We are also doing adding data so that the native adapter\n         * can know that the element adapter has handled this drag\n         *\n         * We used to wrap this `setData()` in a `try/catch` for Firefox,\n         * but it looks like that was not needed.\n         *\n         * Tested using: https://codesandbox.io/s/checking-firefox-throw-behaviour-on-dragstart-qt8h4f\n         *\n         * - ✅ Firefox@70.0 (Oct 2019) on macOS Sonoma\n         * - ✅ Firefox@70.0 (Oct 2019) on macOS Big Sur\n         * - ✅ Firefox@70.0 (Oct 2019) on Windows 10\n         *\n         * // just checking a few more combinations to be super safe\n         *\n         * - ✅ Chrome@78 (Oct 2019) on macOS Big Sur\n         * - ✅ Chrome@78 (Oct 2019) on Windows 10\n         * - ✅ Safari@14.1 on macOS Big Sur\n         */\n        event.dataTransfer.setData(elementAdapterNativeDataKey, '');\n        var payload = {\n          element: entry.element,\n          dragHandle: (_entry$dragHandle2 = entry.dragHandle) !== null && _entry$dragHandle2 !== void 0 ? _entry$dragHandle2 : null,\n          data: (_entry$getInitialData3 = (_entry$getInitialData4 = entry.getInitialData) === null || _entry$getInitialData4 === void 0 ? void 0 : _entry$getInitialData4.call(entry, feedback)) !== null && _entry$getInitialData3 !== void 0 ? _entry$getInitialData3 : {}\n        };\n        var dragType = {\n          type: 'element',\n          payload: payload,\n          startedFrom: 'internal'\n        };\n        api.start({\n          event: event,\n          dragType: dragType\n        });\n      }\n    }));\n  },\n  dispatchEventToSource: function dispatchEventToSource(_ref) {\n    var _draggableRegistry$ge, _draggableRegistry$ge2;\n    var eventName = _ref.eventName,\n      payload = _ref.payload;\n    // During a drag operation, a draggable can be:\n    // - remounted with different functions\n    // - removed completely\n    // So we need to get the latest entry from the registry in order\n    // to call the latest event functions\n\n    (_draggableRegistry$ge = draggableRegistry.get(payload.source.element)) === null || _draggableRegistry$ge === void 0 || (_draggableRegistry$ge2 = _draggableRegistry$ge[eventName]) === null || _draggableRegistry$ge2 === void 0 || _draggableRegistry$ge2.call(_draggableRegistry$ge,\n    // I cannot seem to get the types right here.\n    // TS doesn't seem to like that one event can need `nativeSetDragImage`\n    // @ts-expect-error\n    payload);\n  },\n  onPostDispatch: honeyPotFix.getOnPostDispatch()\n});\nexport var dropTargetForElements = adapter.dropTarget;\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport var monitorForElements = adapter.monitor;\n\n// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports\nexport function draggable(args) {\n  // Guardrail: warn if the drag handle is not contained in draggable element\n  if (process.env.NODE_ENV !== 'production') {\n    if (args.dragHandle && !args.element.contains(args.dragHandle)) {\n      // eslint-disable-next-line no-console\n      console.warn('Drag handle element must be contained in draggable element', {\n        element: args.element,\n        dragHandle: args.dragHandle\n      });\n    }\n  }\n  // Guardrail: warn if the draggable element is already registered\n  if (process.env.NODE_ENV !== 'production') {\n    var existing = draggableRegistry.get(args.element);\n    if (existing) {\n      // eslint-disable-next-line no-console\n      console.warn('You have already registered a `draggable` on the same element', {\n        existing: existing,\n        proposed: args\n      });\n    }\n  }\n  var cleanup = combine(\n  // making the draggable register the adapter rather than drop targets\n  // this is because you *must* have a draggable element to start a drag\n  // but you _might_ not have any drop targets immediately\n  // (You might create drop targets async)\n  adapter.registerUsage(), addToRegistry(args), addAttribute(args.element, {\n    attribute: 'draggable',\n    value: 'true'\n  }));\n\n  // Wrapping in `once` to prevent unexpected side effects if consumers call\n  // the clean up function multiple times.\n  return once(cleanup);\n}\n\n/** Common event payload for all events */\n\n/** A map containing payloads for all events */\n\n/** Common event payload for all drop target events */\n\n/** A map containing payloads for all events on drop targets */\n\n/** Arguments given to all feedback functions (eg `canDrag()`) on for a `draggable()` */\n\n/** Arguments given to all feedback functions (eg `canDrop()`) on a `dropTargetForElements()` */\n\n/** Arguments given to all monitor feedback functions (eg `canMonitor()`) for a `monitorForElements` */","export enum KeySymbol {\n  Command = '⌘',\n}\n","import { sanitizeThemeRemoteTweakFavorites, type Settings } from '$state/settings';\nimport { isLocalImportTweakUrl } from '../theme/localImportUrls';\nimport { sanitizeShortcutOverrides } from '../keyboard/shortcuts';\nimport { saveFileToDevice } from './download';\nimport { readFileToString } from './file';\n\n/**\n * Keys excluded from cross-device sync.\n * These are platform-specific, security-sensitive, or purely local UI state.\n */\nexport const NON_SYNCABLE_KEYS = new Set<keyof Settings>([\n  // Platform / permission-level — differ per device/browser\n  'usePushNotifications',\n  'backgroundPushEnabled',\n  'backgroundPushProvider',\n  'useInAppNotifications',\n  'useSystemNotifications',\n  // Personal device-level preferences\n  'pageZoom',\n  'enterForNewline',\n  'isPeopleDrawer',\n  'isWidgetDrawer',\n  'memberSortFilterIndex',\n  // Call audio is device-local (speaker setup + custom files in IndexedDB)\n  'incomingCallSoundEnabled',\n  'outgoingRingbackEnabled',\n  'callRingtoneVolume',\n  'callRingtoneId',\n  'callRingbackTone',\n  'callSoundOverrideGlobalNotifications',\n  // Developer / diagnostic\n  'developerTools',\n  // Sync toggle itself must never be uploaded (it's device-local)\n  'settingsSyncEnabled',\n]);\n\nexport const SETTINGS_SYNC_VERSION = 1;\nconst MAX_SYNCED_LOCAL_TWEAK_CSS_BYTES = 256 * 1024;\nconst MAX_SYNCED_TWEAK_URL_LENGTH = 8192;\n\nexport type SettingsSyncContent = {\n  v: number;\n  settings: Partial<Settings>;\n};\n\nexport type PreparedSettingsSync = {\n  content: SettingsSyncContent;\n  excludedLocalTweakUrls: string[];\n};\n\nfunction sanitizeThemeRemoteEnabledTweakFullUrls(val: unknown): string[] | undefined {\n  if (!Array.isArray(val)) return undefined;\n  return val.flatMap((url) => {\n    if (typeof url !== 'string') return [];\n    const trimmed = url.trim();\n    return trimmed.length > 0 && trimmed.length <= MAX_SYNCED_TWEAK_URL_LENGTH ? [trimmed] : [];\n  });\n}\n\n/** Prepare a bounded, atomic local-tweak payload and report any excluded URLs. */\nexport const prepareSettingsForSync = (settings: Settings): PreparedSettingsSync => {\n  const syncable = { ...settings } as Partial<Settings>;\n  const favorites = sanitizeThemeRemoteTweakFavorites(settings.themeRemoteTweakFavorites) ?? [];\n  let usedCssBytes = 0;\n  const excludedLocalTweakUrls: string[] = [];\n  syncable.themeRemoteTweakFavorites = favorites.filter((favorite) => {\n    if (!isLocalImportTweakUrl(favorite.fullUrl) || typeof favorite.cssText !== 'string')\n      return true;\n    const bytes = new TextEncoder().encode(favorite.cssText).byteLength;\n    if (usedCssBytes + bytes > MAX_SYNCED_LOCAL_TWEAK_CSS_BYTES) {\n      excludedLocalTweakUrls.push(favorite.fullUrl);\n      return false;\n    }\n    usedCssBytes += bytes;\n    return true;\n  });\n  const excluded = new Set(excludedLocalTweakUrls);\n  syncable.themeRemoteEnabledTweakFullUrls = (\n    sanitizeThemeRemoteEnabledTweakFullUrls(settings.themeRemoteEnabledTweakFullUrls) ?? []\n  ).filter((url) => !excluded.has(url));\n  NON_SYNCABLE_KEYS.forEach((key) => delete syncable[key]);\n  return { content: { v: SETTINGS_SYNC_VERSION, settings: syncable }, excludedLocalTweakUrls };\n};\n\n/** Strip non-syncable keys and wrap in a versioned envelope. */\nexport const serializeForSync = (settings: Settings): SettingsSyncContent =>\n  prepareSettingsForSync(settings).content;\n\n/**\n * Validate incoming account data and merge it into current settings.\n * Returns null when the data is invalid or from an incompatible schema version.\n * Non-syncable keys are always taken from `currentSettings`, never from remote.\n */\nexport const deserializeFromSync = (data: unknown, currentSettings: Settings): Settings | null => {\n  if (!data || typeof data !== 'object') return null;\n  const content = data as Record<string, unknown>;\n  if (content.v !== SETTINGS_SYNC_VERSION) return null;\n  const remote = content.settings;\n  if (!remote || typeof remote !== 'object' || Array.isArray(remote)) return null;\n\n  const remoteSettings = remote as Partial<Settings>;\n  const merged = { ...currentSettings, ...remoteSettings };\n  const remoteTweakFavorites = sanitizeThemeRemoteTweakFavorites(\n    remoteSettings.themeRemoteTweakFavorites\n  );\n  if ('themeRemoteTweakFavorites' in remoteSettings) {\n    const excluded = new Set(prepareSettingsForSync(currentSettings).excludedLocalTweakUrls);\n    const remoteFavorites = remoteTweakFavorites ?? currentSettings.themeRemoteTweakFavorites;\n    const remoteUrls = new Set(remoteFavorites.map((favorite) => favorite.fullUrl));\n    const preservedExcluded = currentSettings.themeRemoteTweakFavorites.filter(\n      (favorite) => excluded.has(favorite.fullUrl) && !remoteUrls.has(favorite.fullUrl)\n    );\n    merged.themeRemoteTweakFavorites = [...remoteFavorites, ...preservedExcluded];\n    if ('themeRemoteEnabledTweakFullUrls' in remoteSettings) {\n      const remoteEnabled =\n        sanitizeThemeRemoteEnabledTweakFullUrls(remoteSettings.themeRemoteEnabledTweakFullUrls) ??\n        currentSettings.themeRemoteEnabledTweakFullUrls;\n      const remoteEnabledSet = new Set(remoteEnabled);\n      merged.themeRemoteEnabledTweakFullUrls = [\n        ...remoteEnabled,\n        ...currentSettings.themeRemoteEnabledTweakFullUrls.filter(\n          (url) => excluded.has(url) && !remoteEnabledSet.has(url)\n        ),\n      ];\n    }\n  }\n  if (\n    'themeRemoteEnabledTweakFullUrls' in remoteSettings &&\n    !('themeRemoteTweakFavorites' in remoteSettings)\n  ) {\n    const remoteEnabled =\n      sanitizeThemeRemoteEnabledTweakFullUrls(remoteSettings.themeRemoteEnabledTweakFullUrls) ??\n      currentSettings.themeRemoteEnabledTweakFullUrls;\n    const remoteEnabledSet = new Set(remoteEnabled);\n    const excluded = new Set(prepareSettingsForSync(currentSettings).excludedLocalTweakUrls);\n    merged.themeRemoteEnabledTweakFullUrls = [\n      ...remoteEnabled,\n      ...currentSettings.themeRemoteEnabledTweakFullUrls.filter(\n        (url) => excluded.has(url) && !remoteEnabledSet.has(url)\n      ),\n    ];\n  }\n  merged.shortcutOverrides =\n    sanitizeShortcutOverrides(remoteSettings.shortcutOverrides) ??\n    currentSettings.shortcutOverrides;\n  // Always restore non-syncable keys from local state.\n  NON_SYNCABLE_KEYS.forEach((key) => {\n    (merged as unknown as Record<string, unknown>)[key] = (\n      currentSettings as unknown as Record<string, unknown>\n    )[key];\n  });\n\n  return merged;\n};\n\n/** Save the current settings as a JSON file. */\nexport const exportSettingsAsJson = (settings: Settings): void => {\n  void saveFileToDevice(\n    new Blob([JSON.stringify({ v: SETTINGS_SYNC_VERSION, settings }, null, 2)], {\n      type: 'application/json',\n    }),\n    `sable-settings-${Date.now()}.json`,\n    'application/json'\n  );\n};\n\n/**\n * Open a file picker, parse the selected JSON, and return the merged settings.\n * Resolves to null if the user cancels or the file is invalid.\n */\nexport const importSettingsFromJson = (currentSettings: Settings): Promise<Settings | null> =>\n  new Promise((resolve) => {\n    const input = document.createElement('input');\n    input.type = 'file';\n    input.accept = 'application/json,.json';\n    input.addEventListener('change', () => {\n      const file = input.files?.[0];\n      if (!file) {\n        resolve(null);\n        return;\n      }\n\n      readFileToString(file)\n        .then((result) => {\n          resolve(deserializeFromSync(JSON.parse(result), currentSettings));\n        })\n        .catch(() => resolve(null));\n    });\n    // oncancel is not widely supported; clicking away without selecting resolves naturally via onchange with empty files\n    input.click();\n  });\n","import { useCallback, useEffect, useRef } from 'react';\nimport { atom, useAtom, useSetAtom } from 'jotai';\nimport type { MatrixEvent } from '$types/matrix-sdk';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useAccountDataCallback } from '$hooks/useAccountDataCallback';\nimport { settingsAtom } from '$state/settings';\nimport { deserializeFromSync, prepareSettingsForSync } from '$utils/settingsSync';\nimport { CustomAccountDataEvent } from '$types/matrix/accountData';\nimport { backfillLocalTweakCss, hydrateSyncedLocalTweakCss } from '../theme/syncedTweakCss';\n\nexport type SyncStatus = 'idle' | 'syncing' | 'partial' | 'error';\n\n/** Milliseconds to wait after a local settings change before uploading. */\nconst DEBOUNCE_MS = 2000;\n\n/** Unix timestamp (ms) of the last confirmed sync, or null if never synced this session. */\nexport const settingsSyncLastSyncedAtom = atom<number | null>(null);\n\n/** Current upload state for UI feedback. */\nexport const settingsSyncStatusAtom = atom<SyncStatus>('idle');\n\n/**\n * Side-effect hook that:\n *  - loads settings from account data when sync is first enabled\n *  - listens for live updates arriving from other devices\n *  - debounce-uploads local changes back to account data\n *\n * Only active when `settings.settingsSyncEnabled === true`.\n * Call this once from a component that stays mounted for the session lifetime.\n */\nexport function useSettingsSyncEffect(): void {\n  const mx = useMatrixClient();\n  const [settings, setSettings] = useAtom(settingsAtom);\n  const setLastSynced = useSetAtom(settingsSyncLastSyncedAtom);\n  const setSyncStatus = useSetAtom(settingsSyncStatusAtom);\n\n  // Keep a ref so callbacks can always read the latest value without stale closures.\n  const settingsRef = useRef(settings);\n  settingsRef.current = settings;\n\n  const syncEnabled = settings.settingsSyncEnabled;\n\n  // On mount / when sync is first enabled: load from account data\n  useEffect(() => {\n    if (!syncEnabled) return;\n    const event = mx.getAccountData(CustomAccountDataEvent.SableSettings);\n    if (!event) return;\n    // Strip synctoken so a stored sync token from a previous session doesn't get treated\n    // as an incoming change from another device.\n    const { synctoken: echoField, ...content } = event.getContent();\n    const merged = deserializeFromSync(content, settingsRef.current);\n    if (merged) {\n      void hydrateSyncedLocalTweakCss(merged.themeRemoteTweakFavorites);\n      if (JSON.stringify(merged) !== JSON.stringify(settingsRef.current)) {\n        setSettings(merged);\n      }\n      setLastSynced(Date.now());\n    }\n  }, [mx, syncEnabled, setSettings, setLastSynced]);\n\n  const uploadGenerationRef = useRef(0);\n  const ownEchoesRef = useRef(new Map<string, { generation: number; status: SyncStatus }>());\n\n  // Live updates from other devices\n  const onAccountData = useCallback(\n    (event: MatrixEvent) => {\n      if (event.getType() !== (CustomAccountDataEvent.SableSettings as string)) return;\n      const rawContent = event.getContent();\n      const ownEcho =\n        typeof rawContent.synctoken === 'string'\n          ? ownEchoesRef.current.get(rawContent.synctoken)\n          : undefined;\n      if (ownEcho) {\n        ownEchoesRef.current.delete(rawContent.synctoken as string);\n        if (ownEcho.generation === uploadGenerationRef.current) {\n          setLastSynced(Date.now());\n          setSyncStatus(ownEcho.status);\n        }\n        return;\n      }\n      if (!settingsRef.current.settingsSyncEnabled) return;\n\n      // Strip internal synctoken field before deserializing so stale tokens from\n      // previous sessions (stored on the homeserver) don't bypass the check above\n      // and don't leak into the settings object.\n      const { synctoken: echoField, ...content } = rawContent;\n\n      // Otherwise it came from another device — apply it.\n      const merged = deserializeFromSync(content, settingsRef.current);\n      if (merged) void hydrateSyncedLocalTweakCss(merged.themeRemoteTweakFavorites);\n      // Skip if nothing actually changed (deserializeFromSync always returns a\n      // new object, so compare values to avoid a spurious settings → upload loop).\n      if (merged && JSON.stringify(merged) !== JSON.stringify(settingsRef.current)) {\n        setSettings(merged);\n        setLastSynced(Date.now());\n      } else if (merged) {\n        // Same values — just update the last-synced timestamp without re-uploading.\n        setLastSynced(Date.now());\n      }\n    },\n    [setSettings, setLastSynced, setSyncStatus]\n  );\n  useAccountDataCallback(mx, onAccountData);\n\n  // Debounced upload whenever settings change\n  const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  useEffect(() => {\n    clearTimeout(timerRef.current);\n    const generation = ++uploadGenerationRef.current;\n    if (!syncEnabled) {\n      setSyncStatus('idle');\n      return undefined;\n    }\n    let cancelled = false;\n    timerRef.current = setTimeout(() => {\n      void (async () => {\n        const current = settingsRef.current;\n        const themeRemoteTweakFavorites = await backfillLocalTweakCss(\n          current.themeRemoteTweakFavorites\n        );\n        if (\n          cancelled ||\n          generation !== uploadGenerationRef.current ||\n          !settingsRef.current.settingsSyncEnabled\n        )\n          return;\n        const prepared = prepareSettingsForSync({ ...current, themeRemoteTweakFavorites });\n        const token = Math.random().toString(36).slice(2, 10);\n        const completionStatus: SyncStatus =\n          prepared.excludedLocalTweakUrls.length > 0 ? 'partial' : 'idle';\n        ownEchoesRef.current.set(token, { generation, status: completionStatus });\n        setSyncStatus('syncing');\n        const content = {\n          ...prepared.content,\n          synctoken: token,\n        };\n        mx.setAccountData(\n          CustomAccountDataEvent.SableSettings,\n          content as Record<string, unknown>\n        ).catch(() => {\n          ownEchoesRef.current.delete(token);\n          if (generation === uploadGenerationRef.current) setSyncStatus('error');\n        });\n      })();\n    }, DEBOUNCE_MS);\n\n    return () => {\n      cancelled = true;\n      if (generation === uploadGenerationRef.current) uploadGenerationRef.current += 1;\n      clearTimeout(timerRef.current);\n    };\n  }, [mx, settings, syncEnabled, setSyncStatus]);\n}\n","export default \"__VITE_ASSET__3AbdWWgtbrvJIojXBl8n$Q__\"","export default \"__VITE_ASSET__sgevQHA$9rrkn3nu49HsPg__\"","export default \"__VITE_ASSET__Tk3cKcIR8tYJqQz5l73v2A__\"","import InviteSound from '$public/sound/invite.ogg';\nimport NotificationSound from '$public/sound/notification.ogg';\nimport RingtoneSound from '$public/sound/ringtone.webm';\nimport { CALL_TONE_IDS, type CallRingtoneId, type Settings } from '$state/settings';\n\nexport type CallToneOption<T extends string> = {\n  value: T;\n  label: string;\n  description?: string;\n  disabled?: boolean;\n};\n\nexport const CUSTOM_CALL_RINGTONE_MAX_BYTES = 3_000_000;\nexport const CUSTOM_CALL_RINGTONE_MAX_DURATION_MS = 45_000;\n\nconst CALL_TONE_LABELS: Record<CallRingtoneId, string> = {\n  'sable-default': 'Sable Default',\n  'classic-soft': 'Classic Soft Ring',\n  'minimal-ping': 'Minimal Ping Loop',\n  silent: 'Silent (Visual Only)',\n  custom: 'Custom File',\n};\n\nexport const CALL_RINGTONE_OPTIONS: CallToneOption<CallRingtoneId>[] = CALL_TONE_IDS.map(\n  (value) => ({\n    value,\n    label: CALL_TONE_LABELS[value],\n  })\n);\n\nexport const CALL_RINGBACK_OPTIONS: CallToneOption<CallRingtoneId>[] = CALL_RINGTONE_OPTIONS.filter(\n  (option) => option.value !== 'silent'\n);\n\ntype ToneSettings = Pick<Settings, 'isNotificationSounds' | 'callSoundOverrideGlobalNotifications'>;\n\nexport const clampCallRingtoneVolume = (volume: number): number =>\n  Math.max(0, Math.min(100, Math.round(volume)));\n\nexport const callRingtoneVolumeToGain = (volume: number): number =>\n  clampCallRingtoneVolume(volume) / 100;\n\nexport const canPlayCallAudio = (settings: ToneSettings): boolean =>\n  settings.callSoundOverrideGlobalNotifications || settings.isNotificationSounds;\n\nconst resolveBuiltInTone = (id: Exclude<CallRingtoneId, 'custom'>): string | null => {\n  switch (id) {\n    case 'sable-default':\n      return RingtoneSound;\n    case 'classic-soft':\n      return InviteSound;\n    case 'minimal-ping':\n      return NotificationSound;\n    case 'silent':\n      return null;\n    default:\n      return RingtoneSound;\n  }\n};\n\nexport const resolveIncomingCallToneUrl = (\n  settings: Pick<Settings, 'callRingtoneId'>,\n  customRingtoneUrl?: string\n): string | null => {\n  if (settings.callRingtoneId === 'custom') {\n    return customRingtoneUrl ?? RingtoneSound;\n  }\n\n  return resolveBuiltInTone(settings.callRingtoneId);\n};\n\nexport const resolveOutgoingRingbackToneUrl = (\n  settings: Pick<Settings, 'callRingbackTone' | 'callRingtoneId'>,\n  customRingtoneUrl?: string,\n  customRingbackUrl?: string\n): string | null => {\n  if (settings.callRingbackTone === 'custom') {\n    return customRingbackUrl ?? resolveIncomingCallToneUrl(settings, customRingtoneUrl);\n  }\n  if (settings.callRingbackTone === 'silent') return null;\n  if (settings.callRingbackTone === settings.callRingtoneId) {\n    return resolveIncomingCallToneUrl(settings, customRingtoneUrl);\n  }\n  return resolveBuiltInTone(settings.callRingbackTone);\n};\n\nexport const readAudioDurationMs = async (file: Blob): Promise<number> =>\n  new Promise<number>((resolve, reject) => {\n    const objectUrl = URL.createObjectURL(file);\n    const audio = document.createElement('audio');\n    audio.preload = 'metadata';\n\n    const cleanup = () => {\n      audio.removeAttribute('src');\n      audio.load();\n      URL.revokeObjectURL(objectUrl);\n    };\n\n    audio.addEventListener(\n      'loadedmetadata',\n      () => {\n        const duration = Number.isFinite(audio.duration) ? Math.round(audio.duration * 1000) : 0;\n        cleanup();\n        resolve(duration);\n      },\n      { once: true }\n    );\n    audio.addEventListener(\n      'error',\n      () => {\n        cleanup();\n        reject(new Error('Unable to read audio duration.'));\n      },\n      { once: true }\n    );\n\n    audio.setAttribute('src', objectUrl);\n    audio.load();\n  });\n\ntype CustomRingtoneValidationInput = {\n  fileName: string;\n  mimeType: string;\n  sizeBytes: number;\n  durationMs: number;\n};\n\nexport const validateCustomCallRingtone = (\n  input: CustomRingtoneValidationInput\n): { valid: true } | { valid: false; reason: 'type' | 'size' | 'duration' } => {\n  if (!input.mimeType.startsWith('audio/')) {\n    return { valid: false, reason: 'type' };\n  }\n  if (input.sizeBytes > CUSTOM_CALL_RINGTONE_MAX_BYTES) {\n    return { valid: false, reason: 'size' };\n  }\n  if (input.durationMs <= 0 || input.durationMs > CUSTOM_CALL_RINGTONE_MAX_DURATION_MS) {\n    return { valid: false, reason: 'duration' };\n  }\n\n  return { valid: true };\n};\n","const DB_NAME = 'sable-call-audio';\nconst DB_VERSION = 1;\nconst STORE = 'ringtones';\nconst CUSTOM_RINGTONE_KEY = 'custom-ringtone';\nconst CUSTOM_RINGBACK_KEY = 'custom-ringback';\n\nexport type StoredCallRingtone = {\n  id: string;\n  fileName: string;\n  mimeType: string;\n  sizeBytes: number;\n  durationMs: number;\n  savedAt: number;\n  blob: Blob;\n};\n\nfunction openDb(): Promise<IDBDatabase> {\n  return new Promise((resolve, reject) => {\n    const req = indexedDB.open(DB_NAME, DB_VERSION);\n    req.addEventListener('error', () => reject(req.error));\n    req.addEventListener('success', () => resolve(req.result));\n    req.addEventListener('upgradeneeded', () => {\n      req.result.createObjectStore(STORE, { keyPath: 'id' });\n    });\n  });\n}\n\nasync function putCustomCallAudio(\n  key: string,\n  file: File,\n  durationMs: number\n): Promise<StoredCallRingtone> {\n  const db = await openDb();\n  const entry: StoredCallRingtone = {\n    id: key,\n    fileName: file.name,\n    mimeType: file.type,\n    sizeBytes: file.size,\n    durationMs,\n    savedAt: Date.now(),\n    blob: file,\n  };\n\n  try {\n    await new Promise<void>((resolve, reject) => {\n      const tx = db.transaction(STORE, 'readwrite');\n      tx.objectStore(STORE).put(entry);\n      tx.addEventListener('complete', () => resolve());\n      tx.addEventListener('error', () => reject(tx.error));\n    });\n  } finally {\n    db.close();\n  }\n\n  return entry;\n}\n\nasync function getCustomCallAudio(key: string): Promise<StoredCallRingtone | undefined> {\n  const db = await openDb();\n  try {\n    return await new Promise<StoredCallRingtone | undefined>((resolve, reject) => {\n      const tx = db.transaction(STORE, 'readonly');\n      const req = tx.objectStore(STORE).get(key);\n      req.addEventListener('error', () => reject(req.error));\n      req.addEventListener('success', () => {\n        resolve(req.result as StoredCallRingtone | undefined);\n      });\n    });\n  } finally {\n    db.close();\n  }\n}\n\nasync function clearCustomCallAudio(key: string): Promise<void> {\n  const db = await openDb();\n  try {\n    await new Promise<void>((resolve, reject) => {\n      const tx = db.transaction(STORE, 'readwrite');\n      tx.objectStore(STORE).delete(key);\n      tx.addEventListener('complete', () => resolve());\n      tx.addEventListener('error', () => reject(tx.error));\n    });\n  } finally {\n    db.close();\n  }\n}\n\nexport const putCustomCallRingtone = (\n  file: File,\n  durationMs: number\n): Promise<StoredCallRingtone> => putCustomCallAudio(CUSTOM_RINGTONE_KEY, file, durationMs);\n\nexport const getCustomCallRingtone = (): Promise<StoredCallRingtone | undefined> =>\n  getCustomCallAudio(CUSTOM_RINGTONE_KEY);\n\nexport const clearCustomCallRingtone = (): Promise<void> =>\n  clearCustomCallAudio(CUSTOM_RINGTONE_KEY);\n\nexport const putCustomCallRingback = (\n  file: File,\n  durationMs: number\n): Promise<StoredCallRingtone> => putCustomCallAudio(CUSTOM_RINGBACK_KEY, file, durationMs);\n\nexport const getCustomCallRingback = (): Promise<StoredCallRingtone | undefined> =>\n  getCustomCallAudio(CUSTOM_RINGBACK_KEY);\n\nexport const clearCustomCallRingback = (): Promise<void> =>\n  clearCustomCallAudio(CUSTOM_RINGBACK_KEY);\n","import type { Settings } from '$state/settings';\nimport { getCustomCallRingback, getCustomCallRingtone } from './callRingtoneStorage';\nimport { resolveIncomingCallToneUrl, resolveOutgoingRingbackToneUrl } from './callRingtone';\n\nexport type CallToneSourceSettings = Pick<Settings, 'callRingtoneId' | 'callRingbackTone'>;\n\nexport type ResolvedCallToneSources = {\n  incomingUrl: string | null;\n  outgoingUrl: string | null;\n  customRingtoneObjectUrl?: string;\n  customRingbackObjectUrl?: string;\n  revoke: () => void;\n};\n\nexport const resolveCallToneSources = async (\n  settings: CallToneSourceSettings\n): Promise<ResolvedCallToneSources> => {\n  let customRingtoneUrl: string | undefined;\n  let customRingbackUrl: string | undefined;\n\n  if (settings.callRingtoneId === 'custom') {\n    const customRingtone = await getCustomCallRingtone().catch(() => undefined);\n    if (customRingtone?.blob) {\n      customRingtoneUrl = URL.createObjectURL(customRingtone.blob);\n    }\n  }\n\n  if (settings.callRingbackTone === 'custom') {\n    const customRingback = await getCustomCallRingback().catch(() => undefined);\n    if (customRingback?.blob) {\n      customRingbackUrl = URL.createObjectURL(customRingback.blob);\n    }\n  }\n\n  const incomingUrl = resolveIncomingCallToneUrl(\n    { callRingtoneId: settings.callRingtoneId },\n    customRingtoneUrl\n  );\n  const outgoingUrl = resolveOutgoingRingbackToneUrl(\n    {\n      callRingtoneId: settings.callRingtoneId,\n      callRingbackTone: settings.callRingbackTone,\n    },\n    customRingtoneUrl,\n    customRingbackUrl\n  );\n\n  return {\n    incomingUrl,\n    outgoingUrl,\n    customRingtoneObjectUrl: customRingtoneUrl,\n    customRingbackObjectUrl: customRingbackUrl,\n    revoke: () => {\n      if (customRingtoneUrl) URL.revokeObjectURL(customRingtoneUrl);\n      if (customRingbackUrl) URL.revokeObjectURL(customRingbackUrl);\n    },\n  };\n};\n","import * as Sentry from '@sentry/react';\nimport { callRingtoneVolumeToGain } from './callRingtone';\nimport { resolveCallToneSources } from './callToneSources';\nimport type { Settings, CallRingtoneId } from '$state/settings';\n\nexport type PreviewTone = 'incoming' | 'outgoing';\n\nclass CallRingtoneManager {\n  private incomingAudio: HTMLAudioElement;\n  private outgoingAudio: HTMLAudioElement;\n  private previewAudio: HTMLAudioElement;\n  private revokeToneUrls: (() => void) | undefined;\n  private currentPreviewUrl: string | null = null;\n\n  constructor() {\n    this.incomingAudio = new Audio();\n    this.incomingAudio.loop = true;\n\n    this.outgoingAudio = new Audio();\n    this.outgoingAudio.loop = true;\n\n    this.previewAudio = new Audio();\n    this.previewAudio.loop = true;\n  }\n\n  public async syncSources(\n    callRingtoneId: CallRingtoneId,\n    callRingbackTone: CallRingtoneId,\n    callRingtoneVolume: number\n  ) {\n    const resolved = await resolveCallToneSources({ callRingtoneId, callRingbackTone });\n\n    this.revokeToneUrls?.();\n    this.revokeToneUrls = resolved.revoke;\n\n    const gain = callRingtoneVolumeToGain(callRingtoneVolume);\n\n    if (resolved.incomingUrl) {\n      this.incomingAudio.src = resolved.incomingUrl;\n    } else {\n      this.incomingAudio.removeAttribute('src');\n    }\n\n    if (resolved.outgoingUrl) {\n      this.outgoingAudio.src = resolved.outgoingUrl;\n    } else {\n      this.outgoingAudio.removeAttribute('src');\n    }\n\n    this.incomingAudio.volume = gain;\n    this.outgoingAudio.volume = gain;\n  }\n\n  public playIncoming(): Promise<void> {\n    if (!this.incomingAudio.src) return Promise.resolve();\n    return this.incomingAudio.play().catch((err) => {\n      if (err.name === 'AbortError') return;\n      Sentry.metrics.count('sable.call.ringtone.blocked', 1);\n      throw err;\n    });\n  }\n\n  public stopIncoming() {\n    this.incomingAudio.pause();\n    this.incomingAudio.currentTime = 0;\n  }\n\n  public playOutgoing() {\n    if (!this.outgoingAudio.src) return;\n    this.outgoingAudio.play().catch((err) => {\n      if (err.name === 'AbortError') return;\n      Sentry.metrics.count('sable.call.ringback.blocked', 1);\n    });\n  }\n\n  public stopOutgoing() {\n    this.outgoingAudio.pause();\n    this.outgoingAudio.currentTime = 0;\n  }\n\n  public async playPreview(\n    tone: PreviewTone,\n    settings: Pick<Settings, 'callRingtoneId' | 'callRingbackTone' | 'callRingtoneVolume'>\n  ) {\n    this.stopPreview();\n\n    const resolved = await resolveCallToneSources({\n      callRingtoneId: settings.callRingtoneId,\n      callRingbackTone: settings.callRingbackTone,\n    });\n    const source = tone === 'incoming' ? resolved.incomingUrl : resolved.outgoingUrl;\n\n    if (tone === 'incoming' && resolved.outgoingUrl?.startsWith('blob:')) {\n      URL.revokeObjectURL(resolved.outgoingUrl);\n    } else if (tone === 'outgoing' && resolved.incomingUrl?.startsWith('blob:')) {\n      URL.revokeObjectURL(resolved.incomingUrl);\n    }\n\n    if (!source) return;\n\n    this.currentPreviewUrl = source;\n    this.previewAudio.src = source;\n    this.previewAudio.volume = callRingtoneVolumeToGain(settings.callRingtoneVolume);\n\n    await this.previewAudio.play();\n  }\n\n  public stopPreview() {\n    this.previewAudio.pause();\n    this.previewAudio.currentTime = 0;\n    this.previewAudio.removeAttribute('src');\n\n    if (this.currentPreviewUrl?.startsWith('blob:')) {\n      URL.revokeObjectURL(this.currentPreviewUrl);\n    }\n    this.currentPreviewUrl = null;\n  }\n}\n\nexport const ringtoneManager = new CallRingtoneManager();\n","import { Box, Button, Icon, Icons, Spinner, Text } from 'folds';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport {\n  CUSTOM_CALL_RINGTONE_MAX_BYTES,\n  CUSTOM_CALL_RINGTONE_MAX_DURATION_MS,\n} from '$features/call/callRingtone';\nimport { bytesToSize, millisecondsToMinutesAndSeconds } from '$utils/common';\n\nexport type PreviewTone = 'incoming' | 'outgoing';\n\nexport type CustomToneMetadata = {\n  fileName: string;\n  sizeBytes: number;\n  durationMs: number;\n};\n\nfunction CustomToneMeta({\n  metadata,\n  emptyLabel,\n}: {\n  metadata: CustomToneMetadata | null;\n  emptyLabel: string;\n}) {\n  if (!metadata) {\n    return (\n      <Text size=\"T200\" priority=\"300\">\n        {emptyLabel}\n      </Text>\n    );\n  }\n\n  return (\n    <Text size=\"T200\" priority=\"300\">\n      {[\n        metadata.fileName,\n        bytesToSize(metadata.sizeBytes),\n        millisecondsToMinutesAndSeconds(metadata.durationMs),\n      ].join(' - ')}\n    </Text>\n  );\n}\n\nexport function CustomToneSettingsCard({\n  title,\n  focusId,\n  description,\n  metadata,\n  emptyLabel,\n  hasCustomTone,\n  previewing,\n  previewActions,\n  onImport,\n  onPreview,\n  onReset,\n}: {\n  title: string;\n  focusId: string;\n  description: string;\n  metadata: CustomToneMetadata | null;\n  emptyLabel: string;\n  hasCustomTone: boolean;\n  previewing: boolean;\n  previewActions: {\n    label: string;\n    tone: PreviewTone;\n    icon: (typeof Icons)[keyof typeof Icons];\n  }[];\n  onImport: () => void;\n  onPreview: (tone: PreviewTone) => void;\n  onReset: () => void;\n}) {\n  return (\n    <SequenceCard\n      className={SequenceCardStyle}\n      variant=\"SurfaceVariant\"\n      direction=\"Column\"\n      gap=\"400\"\n    >\n      <SettingTile title={title} focusId={focusId} description={description}>\n        <Box direction=\"Column\" gap=\"200\">\n          <CustomToneMeta metadata={metadata} emptyLabel={emptyLabel} />\n          <Box gap=\"200\" wrap=\"Wrap\">\n            <Button\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              size=\"300\"\n              radii=\"300\"\n              before={<Icon src={Icons.ArrowTop} size=\"100\" />}\n              onClick={onImport}\n            >\n              <Text size=\"B300\">Import</Text>\n            </Button>\n            {previewActions.map(({ label, tone, icon }) => (\n              <Button\n                key={label}\n                variant=\"Secondary\"\n                fill=\"Soft\"\n                size=\"300\"\n                radii=\"300\"\n                before={\n                  previewing ? (\n                    <Spinner variant=\"Secondary\" size=\"100\" />\n                  ) : (\n                    <Icon src={icon} size=\"100\" />\n                  )\n                }\n                onClick={() => onPreview(tone)}\n                disabled={previewing}\n              >\n                <Text size=\"B300\">{label}</Text>\n              </Button>\n            ))}\n            <Button\n              variant=\"Critical\"\n              fill=\"Soft\"\n              size=\"300\"\n              radii=\"300\"\n              before={<Icon src={Icons.Cross} size=\"100\" />}\n              onClick={onReset}\n              disabled={!hasCustomTone}\n            >\n              <Text size=\"B300\">Reset</Text>\n            </Button>\n          </Box>\n          <Text size=\"T200\" priority=\"300\">\n            Max file size: {bytesToSize(CUSTOM_CALL_RINGTONE_MAX_BYTES)}. Max duration:{' '}\n            {millisecondsToMinutesAndSeconds(CUSTOM_CALL_RINGTONE_MAX_DURATION_MS)}.\n          </Text>\n        </Box>\n      </SettingTile>\n    </SequenceCard>\n  );\n}\n\nexport const customToneValidationError = (\n  reason: 'type' | 'size' | 'duration',\n  label: 'Ringtone' | 'Ringback'\n): string => {\n  if (reason === 'type') return 'Only audio files are supported.';\n  if (reason === 'size') {\n    return `File is too large. Max ${bytesToSize(CUSTOM_CALL_RINGTONE_MAX_BYTES)} allowed.`;\n  }\n\n  return `${label} must be between 1s and ${millisecondsToMinutesAndSeconds(\n    CUSTOM_CALL_RINGTONE_MAX_DURATION_MS\n  )}.`;\n};\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Box, Icons, Input, Text, toRem } from 'folds';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile, SettingToggle } from '$components/setting-tile';\nimport { SettingMenuSelector } from '$components/setting-menu-selector';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom, type CallRingtoneId } from '$state/settings';\nimport {\n  CALL_RINGBACK_OPTIONS,\n  CALL_RINGTONE_OPTIONS,\n  clampCallRingtoneVolume,\n  readAudioDurationMs,\n  validateCustomCallRingtone,\n} from '$features/call/callRingtone';\nimport { ringtoneManager } from '$features/call/CallRingtoneManager';\nimport {\n  clearCustomCallRingback,\n  clearCustomCallRingtone,\n  getCustomCallRingback,\n  getCustomCallRingtone,\n  putCustomCallRingback,\n  putCustomCallRingtone,\n  type StoredCallRingtone,\n} from '$features/call/callRingtoneStorage';\nimport {\n  CustomToneSettingsCard,\n  customToneValidationError,\n  type CustomToneMetadata,\n  type PreviewTone,\n} from './CallSoundSettingsCards';\n\nconst toCustomToneMetadata = (stored: StoredCallRingtone): CustomToneMetadata => ({\n  fileName: stored.fileName,\n  sizeBytes: stored.sizeBytes,\n  durationMs: stored.durationMs,\n});\n\nexport function CallSoundSettings() {\n  const [incomingCallSoundEnabled, setIncomingCallSoundEnabled] = useSetting(\n    settingsAtom,\n    'incomingCallSoundEnabled'\n  );\n  const [incomingVoiceRoomCallSoundEnabled, setIncomingVoiceRoomCallSoundEnabled] = useSetting(\n    settingsAtom,\n    'incomingVoiceRoomCallSoundEnabled'\n  );\n  const [outgoingRingbackEnabled, setOutgoingRingbackEnabled] = useSetting(\n    settingsAtom,\n    'outgoingRingbackEnabled'\n  );\n  const [callRingtoneId, setCallRingtoneId] = useSetting(settingsAtom, 'callRingtoneId');\n  const [callRingbackTone, setCallRingbackTone] = useSetting(settingsAtom, 'callRingbackTone');\n  const [callRingtoneVolume, setCallRingtoneVolume] = useSetting(\n    settingsAtom,\n    'callRingtoneVolume'\n  );\n  const [callSoundOverrideGlobalNotifications, setCallSoundOverrideGlobalNotifications] =\n    useSetting(settingsAtom, 'callSoundOverrideGlobalNotifications');\n\n  const [previewing, setPreviewing] = useState(false);\n  const [loadingCustomState, setLoadingCustomState] = useState(true);\n  const [hasCustomRingtone, setHasCustomRingtone] = useState(false);\n  const [hasCustomRingback, setHasCustomRingback] = useState(false);\n  const [customRingtoneMeta, setCustomRingtoneMeta] = useState<CustomToneMetadata | null>(null);\n  const [customRingbackMeta, setCustomRingbackMeta] = useState<CustomToneMetadata | null>(null);\n  const [customError, setCustomError] = useState<string | null>(null);\n  useEffect(() => {\n    let mounted = true;\n    Promise.all([getCustomCallRingtone(), getCustomCallRingback()])\n      .then(([ringtone, ringback]) => {\n        if (!mounted) return;\n        setHasCustomRingtone(Boolean(ringtone));\n        setHasCustomRingback(Boolean(ringback));\n        setCustomRingtoneMeta(ringtone ? toCustomToneMetadata(ringtone) : null);\n        setCustomRingbackMeta(ringback ? toCustomToneMetadata(ringback) : null);\n      })\n      .finally(() => {\n        if (!mounted) return;\n        setLoadingCustomState(false);\n      });\n\n    return () => {\n      mounted = false;\n      ringtoneManager.stopPreview();\n    };\n  }, []);\n\n  useEffect(() => {\n    if (!loadingCustomState && !hasCustomRingtone && callRingtoneId === 'custom') {\n      setCallRingtoneId('sable-default');\n      setCustomError('Custom ringtone is not available on this device. Falling back to default.');\n    }\n    if (!loadingCustomState && !hasCustomRingback && callRingbackTone === 'custom') {\n      setCallRingbackTone('sable-default');\n      setCustomError('Custom ringback is not available on this device. Falling back to default.');\n    }\n  }, [\n    callRingtoneId,\n    callRingbackTone,\n    hasCustomRingtone,\n    hasCustomRingback,\n    loadingCustomState,\n    setCallRingtoneId,\n    setCallRingbackTone,\n  ]);\n\n  const ringtoneOptions = useMemo(\n    () =>\n      CALL_RINGTONE_OPTIONS.map((option) =>\n        option.value === 'custom'\n          ? {\n              ...option,\n              label: customRingtoneMeta ? 'Custom File (Imported)' : 'Custom File',\n              disabled: loadingCustomState,\n            }\n          : option\n      ),\n    [customRingtoneMeta, loadingCustomState]\n  );\n  const ringbackOptions = useMemo(\n    () =>\n      CALL_RINGBACK_OPTIONS.map((option) =>\n        option.value === 'custom'\n          ? {\n              ...option,\n              label: customRingbackMeta ? 'Custom File (Imported)' : 'Custom File',\n              disabled: loadingCustomState,\n            }\n          : option\n      ),\n    [customRingbackMeta, loadingCustomState]\n  );\n\n  const playPreviewTone = useCallback(\n    async (tone: PreviewTone) => {\n      setCustomError(null);\n      setPreviewing(true);\n      try {\n        await ringtoneManager.playPreview(tone, {\n          callRingtoneId,\n          callRingbackTone,\n          callRingtoneVolume,\n        });\n\n        window.setTimeout(() => {\n          ringtoneManager.stopPreview();\n        }, 2500);\n      } catch (err) {\n        if (err instanceof Error && err.name === 'AbortError') return;\n        setCustomError('Unable to preview this ringtone in your browser.');\n      } finally {\n        setPreviewing(false);\n      }\n    },\n    [callRingtoneId, callRingbackTone, callRingtoneVolume]\n  );\n\n  const importCustomTone = useCallback(\n    (\n      label: 'Ringtone' | 'Ringback',\n      putTone: (file: File, durationMs: number) => Promise<StoredCallRingtone>,\n      onImported: (stored: StoredCallRingtone) => void\n    ) => {\n      setCustomError(null);\n      const input = document.createElement('input');\n      input.type = 'file';\n      input.accept = 'audio/*';\n      input.addEventListener('change', async () => {\n        const file = input.files?.[0];\n        if (!file) return;\n\n        try {\n          const durationMs = await readAudioDurationMs(file);\n          const validation = validateCustomCallRingtone({\n            fileName: file.name,\n            mimeType: file.type,\n            sizeBytes: file.size,\n            durationMs,\n          });\n          if (!validation.valid) {\n            setCustomError(customToneValidationError(validation.reason, label));\n            return;\n          }\n\n          const stored = await putTone(file, durationMs);\n          onImported(stored);\n        } catch {\n          setCustomError('Could not import this file. Try a different audio format.');\n        }\n      });\n\n      input.click();\n    },\n    []\n  );\n\n  const handleImportCustomRingtone = useCallback(() => {\n    importCustomTone('Ringtone', putCustomCallRingtone, (stored) => {\n      setHasCustomRingtone(true);\n      setCallRingtoneId('custom');\n      setCustomRingtoneMeta(toCustomToneMetadata(stored));\n    });\n  }, [importCustomTone, setCallRingtoneId]);\n\n  const handleResetCustomRingtone = useCallback(async () => {\n    setCustomError(null);\n    await clearCustomCallRingtone();\n    setHasCustomRingtone(false);\n    setCustomRingtoneMeta(null);\n    if (callRingtoneId === 'custom') {\n      setCallRingtoneId('sable-default');\n    }\n  }, [callRingtoneId, setCallRingtoneId]);\n\n  const handleImportCustomRingback = useCallback(() => {\n    importCustomTone('Ringback', putCustomCallRingback, (stored) => {\n      setHasCustomRingback(true);\n      setCallRingbackTone('custom');\n      setCustomRingbackMeta(toCustomToneMetadata(stored));\n    });\n  }, [importCustomTone, setCallRingbackTone]);\n\n  const handleResetCustomRingback = useCallback(async () => {\n    setCustomError(null);\n    await clearCustomCallRingback();\n    setHasCustomRingback(false);\n    setCustomRingbackMeta(null);\n    if (callRingbackTone === 'custom') {\n      setCallRingbackTone('sable-default');\n    }\n  }, [callRingbackTone, setCallRingbackTone]);\n\n  const handleRingtoneSelection = (next: CallRingtoneId) => {\n    if (next === 'custom' && !hasCustomRingtone) {\n      setCustomError('Import a custom ringtone file first.');\n      return;\n    }\n    setCustomError(null);\n    setCallRingtoneId(next);\n  };\n\n  const handleRingbackSelection = (next: CallRingtoneId) => {\n    if (next === 'custom' && !hasCustomRingback) {\n      setCustomError('Import a custom ringback file first.');\n      return;\n    }\n    setCustomError(null);\n    setCallRingbackTone(next);\n  };\n\n  const handleVolumeChange = (value: string) => {\n    const parsed = Number.parseInt(value, 10);\n    if (Number.isNaN(parsed)) return;\n    setCallRingtoneVolume(clampCallRingtoneVolume(parsed));\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <SettingToggle\n        title=\"Incoming Call Sound\"\n        focusId=\"incoming-call-sound\"\n        description=\"Play ringtone audio for incoming calls.\"\n        value={incomingCallSoundEnabled}\n        onChange={setIncomingCallSoundEnabled}\n      />\n      <SettingToggle\n        title=\"Notify For Voice Rooms\"\n        focusId=\"notify-voice-rooms\"\n        description=\"Play ringtone audio when someone starts or joins a voice room.\"\n        value={incomingVoiceRoomCallSoundEnabled}\n        onChange={setIncomingVoiceRoomCallSoundEnabled}\n      />\n      <SettingToggle\n        title=\"Outgoing Ringback Sound\"\n        focusId=\"outgoing-ringback-sound\"\n        description=\"Play ringback while waiting for someone to join.\"\n        value={outgoingRingbackEnabled}\n        onChange={setOutgoingRingbackEnabled}\n      />\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Ringtone\"\n          focusId=\"call-ringtone\"\n          description=\"Choose the incoming call ringtone.\"\n          after={\n            <SettingMenuSelector\n              value={callRingtoneId}\n              options={ringtoneOptions}\n              onSelect={handleRingtoneSelection}\n              disabled={loadingCustomState}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Ringback Tone\"\n          focusId=\"call-ringback-tone\"\n          description=\"Choose what plays while your outgoing call is waiting.\"\n          after={\n            <SettingMenuSelector\n              value={callRingbackTone}\n              options={ringbackOptions}\n              onSelect={handleRingbackSelection}\n              disabled={loadingCustomState}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Ringtone Volume\"\n          focusId=\"call-ringtone-volume\"\n          after={\n            <Input\n              style={{ width: toRem(76) }}\n              variant=\"Secondary\"\n              size=\"300\"\n              radii=\"300\"\n              type=\"number\"\n              min=\"0\"\n              max=\"100\"\n              value={String(clampCallRingtoneVolume(callRingtoneVolume))}\n              onChange={(evt) => handleVolumeChange(evt.currentTarget.value)}\n              outlined\n            />\n          }\n        />\n      </SequenceCard>\n      <SettingToggle\n        title=\"Always Play Call Sound\"\n        focusId=\"always-play-call-sound\"\n        description=\"Play call sounds even when message notification sounds are turned off.\"\n        value={callSoundOverrideGlobalNotifications}\n        onChange={setCallSoundOverrideGlobalNotifications}\n      />\n      <CustomToneSettingsCard\n        title=\"Custom Ringtone\"\n        focusId=\"custom-call-ringtone\"\n        description=\"Import an audio file for your ringtone.\"\n        metadata={customRingtoneMeta}\n        emptyLabel=\"No custom ringtone imported.\"\n        hasCustomTone={hasCustomRingtone}\n        previewing={previewing}\n        previewActions={[{ label: 'Preview Ringtone', tone: 'incoming', icon: Icons.Play }]}\n        onImport={handleImportCustomRingtone}\n        onPreview={playPreviewTone}\n        onReset={handleResetCustomRingtone}\n      />\n      <CustomToneSettingsCard\n        title=\"Custom Ringback\"\n        focusId=\"custom-call-ringback\"\n        description=\"Import an audio file for outgoing ringback.\"\n        metadata={customRingbackMeta}\n        emptyLabel=\"No custom ringback imported.\"\n        hasCustomTone={hasCustomRingback}\n        previewing={previewing}\n        previewActions={[{ label: 'Preview Ringback', tone: 'outgoing', icon: Icons.Phone }]}\n        onImport={handleImportCustomRingback}\n        onPreview={playPreviewTone}\n        onReset={handleResetCustomRingback}\n      />\n      {customError && (\n        <Text size=\"T200\" style={{ color: 'var(--mx-color-critical-container-on)' }}>\n          {customError}\n        </Text>\n      )}\n    </Box>\n  );\n}\n","import type {\n  ChangeEventHandler,\n  FormEventHandler,\n  KeyboardEventHandler,\n  MouseEventHandler,\n} from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isTauri, invoke } from '@tauri-apps/api/core';\nimport dayjs from 'dayjs';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport type { RectCords } from 'folds';\nimport {\n  Box,\n  Button,\n  color,\n  config,\n  Header,\n  IconButton,\n  Input,\n  Menu,\n  Scroll,\n  Switch,\n  Text,\n  toRem,\n} from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport {\n  ArrowUp,\n  composerIcon,\n  DotsSixVerticalIcon,\n  Download,\n  Gif,\n  Info,\n  menuIcon,\n  Shield,\n  Smiley,\n  Sticker,\n  X,\n} from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport {\n  draggable,\n  dropTargetForElements,\n} from '@atlaskit/pragmatic-drag-and-drop/element/adapter';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport {\n  CAPTION_POSITION_OPTIONS,\n  MESSAGE_LAYOUT_OPTIONS,\n  DATE_FORMATS,\n  MESSAGE_SPACING_OPTIONS,\n  SettingMenuSelector,\n} from '$components/setting-menu-selector';\nimport { useSetting } from '$state/hooks/settings';\nimport type { EditorButtonId } from '$state/settings';\nimport { MessageLayout, RightSwipeAction, settingsAtom } from '$state/settings';\nimport { SettingTile, SettingToggle } from '$components/setting-tile';\nimport { getDebugLogger } from '$utils/debugLogger';\nimport { KeySymbol } from '$utils/key-symbol';\nimport { isDesktopTauri, isMacOS, isMobileOrTablet, isMobileTauri } from '$utils/platform';\nimport { stopPropagation } from '$utils/keyboard';\nimport { sessionsAtom, activeSessionIdAtom } from '$state/sessions';\nimport { isKeyHotkey } from 'is-hotkey';\nimport { settingsSyncLastSyncedAtom, settingsSyncStatusAtom } from '$hooks/useSettingsSync';\nimport { sanitizeDiagnosticsLogs } from '$utils/sentryScrubbers';\nimport { diagnosticCaptureActiveAtom } from '$state/debugLogger';\nimport { exportSettingsAsJson, importSettingsFromJson } from '$utils/settingsSync';\nimport { downloadJsonFile, saveFileToDevice } from '$utils/download';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { getGifProvider, getGifProviderOptions } from '$utils/gifProviders';\nimport { CallSoundSettings } from './CallSoundSettings';\n\ntype DateHintProps = {\n  hasChanges: boolean;\n  handleReset: () => void;\n};\nfunction DateHint({ hasChanges, handleReset }: Readonly<DateHintProps>) {\n  const [anchor, setAnchor] = useState<RectCords>();\n  const categoryPadding = { padding: config.space.S200, paddingTop: 0 };\n\n  const handleOpenMenu: MouseEventHandler<HTMLElement> = (evt) => {\n    setAnchor(evt.currentTarget.getBoundingClientRect());\n  };\n  return (\n    <PopOut\n      anchor={anchor}\n      position=\"Top\"\n      align=\"End\"\n      content={\n        <FocusTrap\n          focusTrapOptions={{\n            initialFocus: false,\n            onDeactivate: () => setAnchor(undefined),\n            clickOutsideDeactivates: true,\n            escapeDeactivates: stopPropagation,\n          }}\n        >\n          <Menu style={{ maxHeight: '85dvh', overflowY: 'auto' }}>\n            <Header size=\"300\" style={{ padding: `0 ${config.space.S200}` }}>\n              <Text size=\"L400\">Formatting</Text>\n            </Header>\n\n            <Box direction=\"Column\">\n              <Box style={categoryPadding} direction=\"Column\">\n                <Header size=\"300\">\n                  <Text size=\"L400\">Year</Text>\n                </Header>\n                <Box direction=\"Column\" tabIndex={0} gap=\"100\">\n                  <Text size=\"T300\">\n                    YY\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}\n                      Two-digit year\n                    </Text>{' '}\n                  </Text>\n                  <Text size=\"T300\">\n                    YYYY\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Four-digit year\n                    </Text>\n                  </Text>\n                </Box>\n              </Box>\n\n              <Box style={categoryPadding} direction=\"Column\">\n                <Header size=\"300\">\n                  <Text size=\"L400\">Month</Text>\n                </Header>\n                <Box direction=\"Column\" tabIndex={0} gap=\"100\">\n                  <Text size=\"T300\">\n                    M\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}The month\n                    </Text>\n                  </Text>\n                  <Text size=\"T300\">\n                    MM\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Two-digit month\n                    </Text>{' '}\n                  </Text>\n                  <Text size=\"T300\">\n                    MMM\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Short month name\n                    </Text>\n                  </Text>\n                  <Text size=\"T300\">\n                    MMMM\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Full month name\n                    </Text>\n                  </Text>\n                </Box>\n              </Box>\n\n              <Box style={categoryPadding} direction=\"Column\">\n                <Header size=\"300\">\n                  <Text size=\"L400\">Day of the Month</Text>\n                </Header>\n                <Box direction=\"Column\" tabIndex={0} gap=\"100\">\n                  <Text size=\"T300\">\n                    D\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Day of the month\n                    </Text>\n                  </Text>\n                  <Text size=\"T300\">\n                    DD\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Two-digit day of the month\n                    </Text>\n                  </Text>\n                </Box>\n              </Box>\n              <Box style={categoryPadding} direction=\"Column\">\n                <Header size=\"300\">\n                  <Text size=\"L400\">Day of the Week</Text>\n                </Header>\n                <Box direction=\"Column\" tabIndex={0} gap=\"100\">\n                  <Text size=\"T300\">\n                    d\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Day of the week (Sunday = 0)\n                    </Text>\n                  </Text>\n                  <Text size=\"T300\">\n                    dd\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Two-letter day name\n                    </Text>\n                  </Text>\n                  <Text size=\"T300\">\n                    ddd\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Short day name\n                    </Text>\n                  </Text>\n                  <Text size=\"T300\">\n                    dddd\n                    <Text as=\"span\" size=\"Inherit\" priority=\"300\">\n                      {': '}Full day name\n                    </Text>\n                  </Text>\n                </Box>\n              </Box>\n            </Box>\n          </Menu>\n        </FocusTrap>\n      }\n    >\n      {hasChanges ? (\n        <IconButton\n          tabIndex={-1}\n          onClick={handleReset}\n          type=\"reset\"\n          variant=\"Secondary\"\n          size=\"300\"\n          radii=\"300\"\n        >\n          {menuIcon(X)}\n        </IconButton>\n      ) : (\n        <IconButton\n          tabIndex={-1}\n          onClick={handleOpenMenu}\n          type=\"button\"\n          variant=\"Secondary\"\n          size=\"300\"\n          radii=\"300\"\n          aria-pressed={!!anchor}\n        >\n          {menuIcon(Info, { style: { opacity: config.opacity.P300 } })}\n        </IconButton>\n      )}\n    </PopOut>\n  );\n}\n\ntype CustomDateFormatProps = {\n  value: string;\n  onChange: (format: string) => void;\n};\nfunction CustomDateFormat({ value, onChange }: Readonly<CustomDateFormatProps>) {\n  const [dateFormatCustom, setDateFormatCustom] = useState(value);\n\n  useEffect(() => {\n    setDateFormatCustom(value);\n  }, [value]);\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const format = evt.currentTarget.value;\n    setDateFormatCustom(format);\n  };\n\n  const handleReset = () => {\n    setDateFormatCustom(value);\n  };\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const customDateFormatInput = target?.customDateFormatInput as HTMLInputElement | undefined;\n    const format = customDateFormatInput?.value;\n    if (!format) return;\n\n    onChange(format);\n  };\n\n  const hasChanges = dateFormatCustom !== value;\n  return (\n    <SettingTile focusId=\"custom-date-format\">\n      <Box as=\"form\" onSubmit={handleSubmit} gap=\"200\">\n        <Box grow=\"Yes\" direction=\"Column\">\n          <Input\n            required\n            name=\"customDateFormatInput\"\n            value={dateFormatCustom}\n            onChange={handleChange}\n            maxLength={16}\n            autoComplete=\"off\"\n            variant=\"Secondary\"\n            radii=\"300\"\n            style={{ paddingRight: config.space.S200 }}\n            after={<DateHint hasChanges={hasChanges} handleReset={handleReset} />}\n          />\n        </Box>\n        <Button\n          size=\"400\"\n          variant={hasChanges ? 'Success' : 'Secondary'}\n          fill={hasChanges ? 'Solid' : 'Soft'}\n          outlined\n          radii=\"300\"\n          disabled={!hasChanges}\n          type=\"submit\"\n        >\n          <Text size=\"B400\">Save</Text>\n        </Button>\n      </Box>\n    </SettingTile>\n  );\n}\n\ntype PresetDateFormatProps = {\n  value: string;\n  onChange: (format: string) => void;\n};\n\nconst getDisplayDate = (format: string): string =>\n  format === '' ? 'Custom' : dayjs().format(format);\n\nfunction PresetDateFormat({ value, onChange }: Readonly<PresetDateFormatProps>) {\n  // A format typed into the custom field is not a preset, but it still has to\n  // label the trigger rather than fall back to the first preset.\n  const options = useMemo(() => {\n    const formats: string[] = DATE_FORMATS.some((preset) => preset === value)\n      ? DATE_FORMATS\n      : [value, ...DATE_FORMATS];\n    return formats.map((format) => ({ value: format, label: getDisplayDate(format) }));\n  }, [value]);\n\n  return <SettingMenuSelector value={value} options={options} onSelect={onChange} />;\n}\n\nfunction SelectDateFormat() {\n  const [dateFormatString, setDateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n  const [selectedDateFormat, setSelectedDateFormat] = useState(dateFormatString);\n  const customDateFormat = selectedDateFormat === '';\n\n  const handlePresetChange = (format: string) => {\n    setSelectedDateFormat(format);\n    if (format !== '') {\n      setDateFormatString(format);\n    }\n  };\n\n  return (\n    <>\n      <SettingTile\n        title=\"Date Format\"\n        focusId=\"date-format\"\n        description={customDateFormat ? dayjs().format(dateFormatString) : ''}\n        after={<PresetDateFormat value={selectedDateFormat} onChange={handlePresetChange} />}\n      />\n      {customDateFormat && (\n        <CustomDateFormat value={dateFormatString} onChange={setDateFormatString} />\n      )}\n    </>\n  );\n}\n\nfunction getTombstoneSettingToggleTitle(showTombstone: boolean): string {\n  if (showTombstone) {\n    return 'Disable to hide redacted messages entirely instead of showing a tombstone.';\n  }\n  return 'Enable to show tombstone events for redacted messages instead of hiding them entirely.';\n}\n\nfunction DateAndTime() {\n  const [hour24Clock, setHour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Date & Time</Text>\n      <SettingToggle\n        title=\"24-Hour Time Format\"\n        focusId=\"twenty-four-hour-time-format\"\n        value={hour24Clock}\n        onChange={setHour24Clock}\n      />\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SelectDateFormat />\n      </SequenceCard>\n    </Box>\n  );\n}\n\nconst EDITOR_BUTTON_META = {\n  gif: { name: 'Gif', Icon: Gif },\n  sticker: { name: 'Sticker', Icon: Sticker },\n  emoji: { name: 'Emoji', Icon: Smiley },\n};\n\ntype EditorButtonOrderRowProps = {\n  id: EditorButtonId;\n  index: number;\n  isDragging: boolean;\n  onDraggingIndexChange: (index: number | null) => void;\n  onReorder: (from: number, to: number) => void;\n};\n\nfunction EditorButtonOrderRow({\n  id,\n  index,\n  isDragging,\n  onDraggingIndexChange,\n  onReorder,\n}: Readonly<EditorButtonOrderRowProps>) {\n  const rowRef = useRef<HTMLDivElement>(null);\n  const { name, Icon } = EDITOR_BUTTON_META[id];\n\n  useEffect(() => {\n    const element = rowRef.current;\n    if (!element) return undefined;\n    return draggable({\n      element,\n      getInitialData: () => ({ index }),\n      onDragStart: () => onDraggingIndexChange(index),\n      onDrop: () => onDraggingIndexChange(null),\n    });\n  }, [index, onDraggingIndexChange]);\n\n  useEffect(() => {\n    const element = rowRef.current;\n    if (!element) return undefined;\n    return dropTargetForElements({\n      element,\n      getData: () => ({ index }),\n      onDrop: ({ source }) => {\n        const from = source.data.index;\n        if (typeof from !== 'number' || from === index) return;\n        onReorder(from, index);\n      },\n    });\n  }, [index, onReorder]);\n\n  return (\n    <SequenceCard\n      ref={rowRef}\n      className={SequenceCardStyle}\n      variant=\"Surface\"\n      direction=\"Column\"\n      style={{ opacity: isDragging ? 0.4 : 1, cursor: 'grab' }}\n    >\n      <SettingTile\n        focusId={`editor-button-order-${id}`}\n        title={name}\n        before={composerIcon(Icon, { weight: 'regular' })}\n        after={composerIcon(DotsSixVerticalIcon)}\n      />\n    </SequenceCard>\n  );\n}\n\nfunction Editor() {\n  const [enterForNewline, setEnterForNewline] = useSetting(settingsAtom, 'enterForNewline');\n  const [editorToolbar, setEditorToolbar] = useSetting(settingsAtom, 'editorToolbar');\n  const [alwaysInlineEditor, setAlwaysInlineEditor] = useSetting(\n    settingsAtom,\n    'alwaysInlineEditor'\n  );\n  const [editorOldAddFile, setEditorOldAddFile] = useSetting(settingsAtom, 'editorOldAddFile');\n  const [editorMicButton, setEditorMicButton] = useSetting(settingsAtom, 'editorMicButton');\n  const [editorEmojiButton, setEditorEmojiButton] = useSetting(settingsAtom, 'editorEmojiButton');\n  const [editorGifButton, setEditorGifButton] = useSetting(settingsAtom, 'editorGifButton');\n  const gifs = useClientConfig().gifs;\n  const [gifProviderSetting] = useSetting(settingsAtom, 'gifProvider');\n  const gifProvider = getGifProvider(gifs, gifProviderSetting);\n  const [editorStickerButton, setEditorStickerButton] = useSetting(\n    settingsAtom,\n    'editorStickerButton'\n  );\n  const [editorButtonOrder, setEditorButtonOrder] = useSetting(settingsAtom, 'editorButtonOrder');\n  const [draggingIndex, setDraggingIndex] = useState<number | null>(null);\n\n  const handleReorder = useCallback(\n    (from: number, to: number) => {\n      if (from === to) return;\n      setEditorButtonOrder((prev) => {\n        const next = [...prev];\n        const removed = next.splice(from, 1);\n        next.splice(to, 0, ...removed);\n        return next;\n      });\n    },\n    [setEditorButtonOrder]\n  );\n  const enabledButtons: Record<EditorButtonId, boolean> = {\n    gif: editorGifButton,\n    sticker: editorStickerButton,\n    emoji: editorEmojiButton,\n  };\n  const hasEnabledOrder = editorButtonOrder.some((id) => enabledButtons[id]);\n  const [hideActivity, setHideActivity] = useSetting(settingsAtom, 'hideActivity');\n  const [hideReads, setHideReads] = useSetting(settingsAtom, 'hideReads');\n  const [sendPresence, setSendPresence] = useSetting(settingsAtom, 'sendPresence');\n  const [mentionInReplies, setMentionInReplies] = useSetting(settingsAtom, 'mentionInReplies');\n  const [sendIndividualAttachmentAsCaption, setSendIndividualAttachmentAsCaption] = useSetting(\n    settingsAtom,\n    'sendIndividualAttachmentAsCaption'\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Editor</Text>\n      <SettingToggle\n        title=\"ENTER for Newline\"\n        focusId=\"enter-for-newline\"\n        description={`Use ${isMacOS() ? KeySymbol.Command : 'Ctrl'} + ENTER to send message.`}\n        value={enterForNewline}\n        onChange={setEnterForNewline}\n      />\n      <SettingToggle\n        title=\"Message Formatting Toolbar\"\n        focusId=\"composer-formatting-toolbar\"\n        description=\"Enable the formatting toolbar in the message composer.\"\n        value={editorToolbar}\n        onChange={setEditorToolbar}\n      />\n      <SettingToggle\n        title=\"Hide Add Menu in the Editor\"\n        focusId=\"hide-add-menu\"\n        description=\"Make the Plus button in the editor only add files. You may still send the special items using commands such as /poll and /location\"\n        value={editorOldAddFile}\n        onChange={setEditorOldAddFile}\n      />\n      <SettingToggle\n        title=\"Show Voice Recording Button\"\n        focusId=\"show-voice-recording-button\"\n        description=\"Show the microphone button in the message composer. When off, the send button shows even when the editor is empty.\"\n        value={editorMicButton}\n        onChange={setEditorMicButton}\n      />\n      <SettingToggle\n        title=\"Show Emoji Button\"\n        focusId=\"show-emoji-button\"\n        description=\"Show the emoji button inline with the message composer.\"\n        value={editorEmojiButton}\n        onChange={setEditorEmojiButton}\n      />\n      <SettingToggle\n        title=\"Show Gif Button\"\n        focusId=\"show-gif-button\"\n        description={`Show the gif button inline with the message composer. This makes requests to ${gifProvider.searchHost} whenever you search for a gif.`}\n        value={editorGifButton}\n        onChange={setEditorGifButton}\n      />\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Gif Provider\"\n          focusId=\"gif-provider\"\n          description=\"Which service the gif picker searches.\"\n          after={<SelectGifProvider />}\n        />\n      </SequenceCard>\n      <SettingToggle\n        title=\"Show Sticker Button\"\n        focusId=\"show-sticker-button\"\n        description=\"Show the sticker button inline with the message composer.\"\n        value={editorStickerButton}\n        onChange={setEditorStickerButton}\n      />\n      <SettingToggle\n        title=\"Always Inline Editor\"\n        focusId=\"always-inline-editor\"\n        description=\"Always keep the last line of the text editor inline with UI buttons.\"\n        value={alwaysInlineEditor}\n        onChange={setAlwaysInlineEditor}\n      />\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Composer Button Order\"\n          focusId=\"composer-button-order\"\n          description=\"Drag to reorder the buttons shown in the message composer. Use the show/hide toggles above to control which buttons appear.\"\n        />\n        {hasEnabledOrder && (\n          <Box\n            direction=\"Column\"\n            gap=\"200\"\n            style={{\n              backgroundColor: color.Background.Container,\n              borderRadius: config.radii.R400,\n              marginInline: config.space.S300,\n              marginTop: config.space.S300,\n            }}\n          >\n            {editorButtonOrder.map((id, index) =>\n              enabledButtons[id] ? (\n                <EditorButtonOrderRow\n                  key={id}\n                  id={id}\n                  index={index}\n                  isDragging={draggingIndex === index}\n                  onDraggingIndexChange={setDraggingIndex}\n                  onReorder={handleReorder}\n                />\n              ) : null\n            )}\n          </Box>\n        )}\n      </SequenceCard>\n      <SettingToggle\n        title=\"Hide Typing Indicators\"\n        focusId=\"hide-typing-indicators\"\n        description=\"Turn off typing status.\"\n        value={hideActivity}\n        onChange={setHideActivity}\n      />\n      <SettingToggle\n        title=\"Hide Read Receipts\"\n        focusId=\"hide-read-receipts\"\n        description=\"Turn off read receipts.\"\n        value={hideReads}\n        onChange={setHideReads}\n      />\n      <SettingToggle\n        title=\"Presence Status\"\n        focusId=\"presence-status\"\n        description=\"Show and receive online status from other users.\"\n        value={sendPresence}\n        onChange={setSendPresence}\n      />\n      <SettingToggle\n        title=\"Send notifications for replies\"\n        focusId=\"reply-notifications\"\n        description=\"Disable to use silent replies by default. You can still toggle reply notifications for each reply.\"\n        value={mentionInReplies}\n        onChange={setMentionInReplies}\n      />\n      <SettingToggle\n        title=\"Send text with individual attachment as caption\"\n        focusId=\"reply-notifications\"\n        description=\"Send the contents of the message field as the attachment caption if present.\"\n        value={sendIndividualAttachmentAsCaption}\n        onChange={setSendIndividualAttachmentAsCaption}\n      />\n    </Box>\n  );\n}\n\nfunction SelectGifProvider() {\n  const gifs = useClientConfig().gifs;\n  const [gifProvider, setGifProvider] = useSetting(settingsAtom, 'gifProvider');\n\n  return (\n    <SettingMenuSelector\n      value={gifProvider}\n      options={getGifProviderOptions(gifs)}\n      onSelect={setGifProvider}\n    />\n  );\n}\n\nfunction SelectMessageLayout() {\n  const [messageLayout, setMessageLayout] = useSetting(settingsAtom, 'messageLayout');\n\n  return (\n    <SettingMenuSelector\n      value={messageLayout}\n      options={MESSAGE_LAYOUT_OPTIONS}\n      onSelect={setMessageLayout}\n    />\n  );\n}\nfunction SelectCaptionPosition() {\n  const [captionPosition, setCaptionPosition] = useSetting(settingsAtom, 'captionPosition');\n\n  return (\n    <SettingMenuSelector\n      value={captionPosition}\n      options={CAPTION_POSITION_OPTIONS}\n      onSelect={setCaptionPosition}\n    />\n  );\n}\n\nfunction SelectMessageSpacing() {\n  const [messageSpacing, setMessageSpacing] = useSetting(settingsAtom, 'messageSpacing');\n\n  return (\n    <SettingMenuSelector\n      value={messageSpacing}\n      options={MESSAGE_SPACING_OPTIONS}\n      onSelect={setMessageSpacing}\n    />\n  );\n}\n\nfunction SelectRightSwipeAction({ disabled }: Readonly<{ disabled?: boolean }>) {\n  const [action, setAction] = useSetting(settingsAtom, 'rightSwipeAction');\n\n  return (\n    <SettingMenuSelector\n      value={action}\n      options={[\n        { value: RightSwipeAction.Reply, label: 'Reply to Message' },\n        { value: RightSwipeAction.Members, label: 'Open Member List' },\n      ]}\n      onSelect={setAction}\n      disabled={disabled}\n      offset={5}\n    />\n  );\n}\n\nfunction Gestures({ isMobile }: Readonly<{ isMobile: boolean }>) {\n  return (\n    <Box direction=\"Column\" gap=\"100\" style={{ opacity: isMobile ? 1 : 0.5 }}>\n      <Text size=\"L400\">Gestures {!isMobile && '(Mobile Only)'}</Text>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Right Swipe Action\"\n          focusId=\"right-swipe-action\"\n          description=\"What happens when you swipe right on a message.\"\n          after={<SelectRightSwipeAction disabled={!isMobile} />}\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n\nfunction EmojiSelectorThresholdInput() {\n  const [emojiThreshold, setEmojiThreshold] = useSetting(settingsAtom, 'emojiSuggestThreshold');\n  const [inputValue, setInputValue] = useState(emojiThreshold.toString());\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const val = evt.target.value;\n    setInputValue(val);\n\n    const parsed = Number.parseInt(val, 10);\n    if (!Number.isNaN(parsed) && parsed >= 1 && parsed <= 10) {\n      setEmojiThreshold(parsed);\n    }\n  };\n\n  const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (evt) => {\n    if (isKeyHotkey('escape', evt)) {\n      evt.stopPropagation();\n      setInputValue(emojiThreshold.toString());\n      (evt.target as HTMLInputElement).blur();\n    }\n\n    if (isKeyHotkey('enter', evt)) {\n      (evt.target as HTMLInputElement).blur();\n    }\n  };\n\n  return (\n    <Input\n      style={{ width: toRem(80) }}\n      variant={Number.parseInt(inputValue, 10) === emojiThreshold ? 'Secondary' : 'Success'}\n      size=\"300\"\n      radii=\"300\"\n      type=\"number\"\n      min=\"1\"\n      max=\"10\"\n      value={inputValue}\n      onChange={handleChange}\n      onKeyDown={handleKeyDown}\n      outlined\n    />\n  );\n}\n\nfunction Calls() {\n  const [alwaysShowCallButton, setAlwaysShowCallButton] = useSetting(\n    settingsAtom,\n    'alwaysShowCallButton'\n  );\n  const [joinCallOnSingleClick, setjoinCallOnSingleClick] = useSetting(\n    settingsAtom,\n    'joinCallOnSingleClick'\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Calls</Text>\n      <SettingToggle\n        title=\"Show Call Button for Large Rooms\"\n        focusId=\"large-room-call-button\"\n        value={alwaysShowCallButton}\n        onChange={setAlwaysShowCallButton}\n      />\n      <SettingToggle\n        title=\"Join voice calls by just clicking the room's icon\"\n        focusId=\"join-on-click-voicecalls\"\n        value={joinCallOnSingleClick}\n        onChange={setjoinCallOnSingleClick}\n      />\n      <CallSoundSettings />\n    </Box>\n  );\n}\n\nfunction Messages() {\n  const [hideMembershipEvents, setHideMembershipEvents] = useSetting(\n    settingsAtom,\n    'hideMembershipEvents'\n  );\n  const [hideNickAvatarEvents, setHideNickAvatarEvents] = useSetting(\n    settingsAtom,\n    'hideNickAvatarEvents'\n  );\n  const [mediaAutoLoad, setMediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad');\n  const [showHiddenEvents, setShowHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents');\n  const [showTombstoneEvents, setShowTombstoneEvents] = useSetting(\n    settingsAtom,\n    'showTombstoneEvents'\n  );\n  const [hiddenEventEdits, setHiddenEventEdits] = useSetting(settingsAtom, 'hiddenEventEdits');\n  const [hiddenEventRedactionTimeline, setHiddenEventRedactionTimeline] = useSetting(\n    settingsAtom,\n    'hiddenEventRedactionTimeline'\n  );\n  const [hiddenEventReactions, setHiddenEventReactions] = useSetting(\n    settingsAtom,\n    'hiddenEventReactions'\n  );\n  const [hiddenEventReactionTombstone, setHiddenEventReactionTombstone] = useSetting(\n    settingsAtom,\n    'hiddenEventReactionTombstone'\n  );\n  const [hiddenEventReactionRedactionTimeline, setHiddenEventReactionRedactionTimeline] =\n    useSetting(settingsAtom, 'hiddenEventReactionRedactionTimeline');\n  const [hiddenEventOther, setHiddenEventOther] = useSetting(settingsAtom, 'hiddenEventOther');\n  const [hideMembershipInReadOnly, setHideMembershipInReadOnly] = useSetting(\n    settingsAtom,\n    'hideMembershipInReadOnly'\n  );\n\n  const [messageLayout] = useSetting(settingsAtom, 'messageLayout');\n  const [rightBubbles, setRightBubbles] = useSetting(settingsAtom, 'useRightBubbles');\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Messages</Text>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Message Layout\"\n          focusId=\"message-layout\"\n          after={<SelectMessageLayout />}\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Message Spacing\"\n          focusId=\"message-spacing\"\n          after={<SelectMessageSpacing />}\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"File description placement\"\n          focusId=\"file-description-placement\"\n          after={<SelectCaptionPosition />}\n        />\n      </SequenceCard>\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Emoji Selector Character Threshold\"\n          focusId=\"emoji-selector-threshold\"\n          after={<EmojiSelectorThresholdInput />}\n        />\n      </SequenceCard>\n      {messageLayout === MessageLayout.Bubble && (\n        <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n          <SettingTile\n            title=\"Right Aligned Bubbles\"\n            focusId=\"right-aligned-bubbles\"\n            description=\"While using bubble layout, have your bubbles right aligned.\"\n            after={<Switch variant=\"Primary\" value={rightBubbles} onChange={setRightBubbles} />}\n          />\n        </SequenceCard>\n      )}\n      <SettingToggle\n        title=\"Disable Media Auto Load\"\n        focusId=\"disable-media-auto-load\"\n        value={!mediaAutoLoad}\n        onChange={(v) => setMediaAutoLoad(!v)}\n      />\n      <SettingToggle\n        title=\"Hide Membership Change\"\n        focusId=\"hide-membership-change\"\n        value={hideMembershipEvents}\n        onChange={setHideMembershipEvents}\n      />\n      <SettingToggle\n        title=\"Hide Profile Change\"\n        focusId=\"hide-profile-change\"\n        value={hideNickAvatarEvents}\n        onChange={setHideNickAvatarEvents}\n      />\n      <SettingToggle\n        title=\"Hide Member Events in Read-Only Rooms\"\n        focusId=\"hide-member-events-read-only-rooms\"\n        description=\"Hide membership changes, reactions, and reaction redactions in read-only rooms such as announcement channels.\"\n        value={hideMembershipInReadOnly}\n        onChange={setHideMembershipInReadOnly}\n      />\n      <SettingToggle\n        title=\"Show Hidden Events\"\n        focusId=\"show-hidden-events\"\n        description=\"Reveal additional timeline events that are normally filtered out.\"\n        value={showHiddenEvents}\n        onChange={setShowHiddenEvents}\n        switchTitle={\n          showHiddenEvents\n            ? 'Disable to hide hidden events'\n            : 'Enable to show hidden events, this will cause visual clutter in busy rooms.'\n        }\n      />\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showHiddenEvents ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Show Edit Events\"\n          focusId=\"hidden-event-edits\"\n          description=\"Show message edits as separate timeline events with a link to the previous version.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={hiddenEventEdits}\n              onChange={setHiddenEventEdits}\n              disabled={!showHiddenEvents}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showHiddenEvents ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Show Tombstones for Redacted Messages\"\n          focusId=\"show-redacted-message-tombstones\"\n          description=\"Show a tombstone in place of redacted messages instead of hiding them entirely.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={showTombstoneEvents}\n              onChange={setShowTombstoneEvents}\n              title={getTombstoneSettingToggleTitle(showTombstoneEvents)}\n              disabled={!showHiddenEvents}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showHiddenEvents ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Show Redaction Events\"\n          focusId=\"hidden-event-redaction-timeline\"\n          description=\"Show when a message was redacted as a timeline event with a link to the original message.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={hiddenEventRedactionTimeline}\n              onChange={setHiddenEventRedactionTimeline}\n              disabled={!showHiddenEvents}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showHiddenEvents ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Show Reaction Events\"\n          focusId=\"hidden-event-reactions\"\n          description=\"Show reactions as separate timeline events with a link to the target message.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={hiddenEventReactions}\n              onChange={setHiddenEventReactions}\n              disabled={!showHiddenEvents}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showHiddenEvents ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Show Tombstones for Redacted Reactions\"\n          focusId=\"hidden-event-reaction-tombstones\"\n          description=\"Show a tombstone in place of redacted reactions instead of hiding them entirely.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={hiddenEventReactionTombstone}\n              onChange={setHiddenEventReactionTombstone}\n              disabled={!showHiddenEvents}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showHiddenEvents ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Show Reaction Redaction Events\"\n          focusId=\"hidden-event-reaction-redaction-timeline\"\n          description=\"Show when a reaction was removed as a timeline event with a link to the target message.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={hiddenEventReactionRedactionTimeline}\n              onChange={setHiddenEventReactionRedactionTimeline}\n              disabled={!showHiddenEvents}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        style={{ opacity: showHiddenEvents ? 1 : 0.5 }}\n      >\n        <SettingTile\n          title=\"Show Other Hidden Events\"\n          focusId=\"hidden-event-other\"\n          description=\"Show generic state events and other unrecognized timeline events.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={hiddenEventOther}\n              onChange={setHiddenEventOther}\n              disabled={!showHiddenEvents}\n            />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n\nfunction Embeds() {\n  const [multiplePreviews, setMultiplePreviews] = useSetting(settingsAtom, 'multiplePreviews');\n  const [bundledPreview, setBundledPreview] = useSetting(settingsAtom, 'bundledPreview');\n  const [urlPreview, setUrlPreview] = useSetting(settingsAtom, 'urlPreview');\n  const [encUrlPreview, setEncUrlPreview] = useSetting(settingsAtom, 'encUrlPreview');\n  const [clientUrlPreview, setClientUrlPreview] = useSetting(settingsAtom, 'clientUrlPreview');\n  const [showInteractiveMap, setShowInteractiveMap] = useSetting(\n    settingsAtom,\n    'showInteractiveMap'\n  );\n  const [showEncInteractiveMap, setEncShowInteractiveMap] = useSetting(\n    settingsAtom,\n    'showEncInteractiveMap'\n  );\n  const [encClientUrlPreview, setEncClientUrlPreview] = useSetting(\n    settingsAtom,\n    'encClientUrlPreview'\n  );\n  const [clientPreviewYoutube, setClientPreviewYoutube] = useSetting(\n    settingsAtom,\n    'clientPreviewYoutube'\n  );\n  const [externalGifAutoLoadEncrypted, setExternalGifAutoLoadEncrypted] = useSetting(\n    settingsAtom,\n    'externalGifAutoLoadEncrypted'\n  );\n  const [enableGifPicker, setEnableGifPicker] = useSetting(settingsAtom, 'enableGifPicker');\n  const [gifPickerProvider] = useSetting(settingsAtom, 'gifProvider');\n  const gifPickerHost = getGifProvider(useClientConfig().gifs, gifPickerProvider).searchHost;\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Embeds</Text>\n      <SettingToggle\n        title=\"Display Multiple Embeds\"\n        focusId=\"display-multiple-embeds\"\n        description=\"Display the embeds of all the links. Turning it off makes it only show the embed of the 1st item\"\n        value={multiplePreviews}\n        onChange={setMultiplePreviews}\n      />\n      <SettingToggle\n        title=\"Display Bundled Embeds\"\n        focusId=\"display-bundled-embeds\"\n        description=\"Show embeds when provided by the message itself. The embeds may be fabricated or incorrect.\"\n        value={bundledPreview}\n        onChange={setBundledPreview}\n      />\n      <SettingToggle\n        title=\"Server-side Embeds\"\n        focusId=\"url-preview\"\n        description=\"Send the links from inside the messages to your homeserver to generate previews of the linked pages.\"\n        value={urlPreview}\n        onChange={setUrlPreview}\n      />\n      <SettingToggle\n        title=\"Server-side Embeds in Encrypted Room\"\n        focusId=\"encrypted-room-url-preview\"\n        description=\"Request server-side embeds in E2EE chats. This partially decreases secrecy by revealing sent links to your homeserver\"\n        value={encUrlPreview}\n        onChange={setEncUrlPreview}\n      />\n      <SettingToggle\n        title=\"Client-side Embeds\"\n        focusId=\"client-side-embeds\"\n        description=\"Attempt to preview supported urls (e.g. YouTube) on the client, without involving the homeserver. This will expose your IP Address to third party services.\"\n        value={clientUrlPreview}\n        onChange={setClientUrlPreview}\n        switchTitle={clientUrlPreview ? 'Disable client-side embeds' : 'Enable client-side embeds'}\n      />\n      {clientUrlPreview && (\n        <>\n          <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n            <SettingTile\n              title=\"Client-side Embeds in Encrypted Rooms\"\n              focusId=\"encrypted-room-embeds\"\n              after={\n                <Switch\n                  variant=\"Primary\"\n                  value={encClientUrlPreview}\n                  onChange={setEncClientUrlPreview}\n                  title={\n                    encClientUrlPreview\n                      ? 'Disable client-side embeds in encrypted rooms'\n                      : 'Enable client-side embeds in encrypted rooms'\n                  }\n                />\n              }\n            />\n          </SequenceCard>\n          <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n            <SettingTile\n              title=\"Embed YouTube Links\"\n              focusId=\"embed-youtube-links\"\n              after={\n                <Switch\n                  variant=\"Primary\"\n                  value={clientPreviewYoutube}\n                  onChange={setClientPreviewYoutube}\n                  title={\n                    clientPreviewYoutube\n                      ? 'Disable client-side Youtube video embeds'\n                      : 'Enable client-side Youtube video embeds'\n                  }\n                />\n              }\n            />\n          </SequenceCard>\n        </>\n      )}\n      <SettingToggle\n        title=\"Enable Gif Picker\"\n        focusId=\"enable-gif-picker\"\n        description={`Enables the gif picker in the emoji board. This reduces Privacy because it makes requests to ${gifPickerHost} whenever you search for a gif.`}\n        value={enableGifPicker}\n        onChange={setEnableGifPicker}\n        switchTitle={enableGifPicker ? 'Disable Gif Picker' : 'Enable Gif Picker'}\n      />\n      <SettingToggle\n        title=\"Automatically Load External GIFs in Encrypted Rooms\"\n        focusId=\"external-gif-auto-load-encrypted\"\n        description=\"Loading contacts the GIF provider directly and may reveal when you viewed a GIF.\"\n        value={externalGifAutoLoadEncrypted}\n        onChange={setExternalGifAutoLoadEncrypted}\n      />\n      <SettingToggle\n        title=\"Show Interactive maps\"\n        focusId=\"show-interactive-map\"\n        description=\"Show an interactive map in messages. This reduces Privacy because it requests map data from OpenStreetMap.org whenever you need to load a uncached part of the maps.\"\n        value={showInteractiveMap}\n        onChange={setShowInteractiveMap}\n        switchTitle={showInteractiveMap ? 'Disable Interactive Map' : 'Enable Interactive Map'}\n      />\n      <SettingToggle\n        title=\"Show Interactive maps in Encrypted Rooms\"\n        focusId=\"show-interactive-map-enc\"\n        description=\"Show an interactive map in Encrypted rooms. This reduces Privacy because it requests map data from OpenStreetMap.org whenever you need to load a uncached part of the maps.\"\n        value={showEncInteractiveMap}\n        onChange={setEncShowInteractiveMap}\n        switchTitle={showEncInteractiveMap ? 'Disable Interactive Map' : 'Enable Interactive Map'}\n      />\n    </Box>\n  );\n}\n\ntype GeneralProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\n\nfunction Sync() {\n  const sessions = useAtomValue(sessionsAtom);\n  const activeSessionId = useAtomValue(activeSessionIdAtom);\n  const setSessions = useSetAtom(sessionsAtom);\n  const activeSession = sessions.find((s) => s.userId === activeSessionId) ?? sessions[0];\n\n  const useSlidingSync = activeSession?.slidingSyncOptIn === true;\n\n  const handleSetSlidingSync = (value: boolean) => {\n    if (!activeSession) return;\n    setSessions({\n      type: 'UPDATE',\n      userId: activeSession.userId,\n      patch: { slidingSyncOptIn: value },\n    });\n    window.location.reload();\n  };\n\n  const [syncEnabled, setSyncEnabled] = useSetting(settingsAtom, 'settingsSyncEnabled');\n  const lastSynced = useAtomValue(settingsSyncLastSyncedAtom);\n  const syncStatus = useAtomValue(settingsSyncStatusAtom);\n  const fullSettings = useAtomValue(settingsAtom);\n  const setSettings = useSetAtom(settingsAtom);\n\n  const [importError, setImportError] = useState<string | null>(null);\n\n  const handleImport = async () => {\n    setImportError(null);\n    const merged = await importSettingsFromJson(fullSettings);\n    if (merged === null) {\n      setImportError('Could not import — file was invalid or you cancelled.');\n      return;\n    }\n    setSettings(merged);\n  };\n\n  const syncStatusLabel: Record<typeof syncStatus, string> = {\n    idle: lastSynced\n      ? `Last synced at ${dayjs(lastSynced).format('HH:mm:ss')}`\n      : 'Not yet synced this session',\n    syncing: 'Syncing…',\n    partial: 'Settings synced, but some local tweaks were too large to sync.',\n    error: 'Sync failed — will retry on next change',\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Data Syncing</Text>\n      <SettingToggle\n        title=\"Use Sliding Sync\"\n        focusId=\"use-sliding-sync\"\n        description={\n          <>Enable Sliding Sync for this current login/session. Requires server support.</>\n        }\n        value={useSlidingSync}\n        onChange={handleSetSlidingSync}\n      />\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Sync settings across devices\"\n          focusId=\"sync-across-devices\"\n          description=\"Store your settings in your Matrix account so they follow you to any Sable instance. Locally imported tweak CSS is uploaded as unencrypted account data readable by your homeserver. Notification and zoom preferences are kept per-device.\"\n          after={<Switch variant=\"Primary\" value={syncEnabled} onChange={setSyncEnabled} />}\n        />\n        {syncEnabled && (\n          <SettingTile\n            focusId=\"sync-status\"\n            title=\"Sync status\"\n            description={syncStatusLabel[syncStatus]}\n          />\n        )}\n      </SequenceCard>\n      <Box gap=\"200\" wrap=\"Wrap\" style={{ paddingTop: '4px' }}>\n        <Button\n          variant=\"Secondary\"\n          fill=\"Soft\"\n          size=\"300\"\n          radii=\"300\"\n          before={menuIcon(Download)}\n          onClick={() => exportSettingsAsJson(fullSettings)}\n        >\n          <Text size=\"B300\">Export Settings</Text>\n        </Button>\n        <Button\n          variant=\"Secondary\"\n          fill=\"Soft\"\n          size=\"300\"\n          radii=\"300\"\n          before={menuIcon(ArrowUp)}\n          onClick={handleImport}\n        >\n          <Text size=\"B300\">Import Settings</Text>\n        </Button>\n      </Box>\n      {importError && (\n        <Text size=\"T200\" style={{ color: 'var(--mx-color-critical-container-on)' }}>\n          {importError}\n        </Text>\n      )}\n    </Box>\n  );\n}\n\nfunction DiagnosticsAndPrivacy() {\n  const [sentryEnabled, setSentryEnabled] = useState(\n    localStorage.getItem('sable_sentry_enabled') === 'true'\n  );\n  const [sessionReplayEnabled, setSessionReplayEnabled] = useState(\n    localStorage.getItem('sable_sentry_replay_enabled') === 'true'\n  );\n  const [needsRefresh, setNeedsRefresh] = useState(false);\n  const [diagnosticsState, setDiagnosticsState] = useState<\n    'idle' | 'exporting' | 'success' | 'error'\n  >('idle');\n  const [captureActive, setCaptureActive] = useAtom(diagnosticCaptureActiveAtom);\n  const [captureSince, setCaptureSince] = useState<number>();\n  const [captureCompleted, setCaptureCompleted] = useState(false);\n  const [exportDestination, setExportDestination] = useState<string>();\n\n  const isSentryConfigured = Boolean(import.meta.env.VITE_SENTRY_DSN);\n\n  const handleSentryToggle = (enabled: boolean) => {\n    setSentryEnabled(enabled);\n    if (enabled) {\n      localStorage.setItem('sable_sentry_enabled', 'true');\n    } else {\n      localStorage.setItem('sable_sentry_enabled', 'false');\n    }\n    setNeedsRefresh(true);\n  };\n\n  const handleReplayToggle = (enabled: boolean) => {\n    setSessionReplayEnabled(enabled);\n    if (enabled) {\n      localStorage.setItem('sable_sentry_replay_enabled', 'true');\n    } else {\n      localStorage.removeItem('sable_sentry_replay_enabled');\n    }\n    setNeedsRefresh(true);\n  };\n\n  const handleDiagnosticsCapture = async () => {\n    if (!captureActive && !captureCompleted) {\n      const since = getDebugLogger().startCapture();\n      setCaptureSince(since);\n      setCaptureActive(true);\n      setDiagnosticsState('idle');\n      setExportDestination(undefined);\n      return;\n    }\n\n    setDiagnosticsState('exporting');\n    try {\n      const since = captureSince ?? getDebugLogger().getCaptureSince();\n      if (captureActive) {\n        getDebugLogger().stopCapture();\n        setCaptureActive(false);\n        setCaptureCompleted(true);\n      }\n      const frontendLogs = getDebugLogger().exportLogs({ since });\n      if (isDesktopTauri()) {\n        const outputPath = await invoke<string | null | undefined>('export_diagnostics', {\n          frontendLogs,\n        });\n        if (outputPath == null) {\n          setDiagnosticsState('idle');\n          return;\n        }\n        setExportDestination(outputPath);\n      } else if (isMobileTauri()) {\n        const zipBytes = await invoke<number[] | Uint8Array>('export_diagnostics', {\n          frontendLogs,\n        });\n        const filename = `sable-diagnostics-${dayjs().format('YYYY-MM-DD-HHmmss')}.zip`;\n        const saveResult = await saveFileToDevice(\n          new Blob([new Uint8Array(zipBytes)], { type: 'application/zip' }),\n          filename,\n          'application/zip'\n        );\n        if (saveResult === 'cancelled') {\n          setDiagnosticsState('idle');\n          return;\n        }\n        if (saveResult === 'failed') {\n          setDiagnosticsState('error');\n          return;\n        }\n      } else {\n        const sanitizedLogs = sanitizeDiagnosticsLogs(frontendLogs);\n        if (sanitizedLogs === null) {\n          setDiagnosticsState('error');\n          return;\n        }\n        await downloadJsonFile(sanitizedLogs, 'sable-web-diagnostics');\n      }\n      setDiagnosticsState('success');\n      setCaptureCompleted(false);\n      setCaptureSince(undefined);\n    } catch {\n      setDiagnosticsState('error');\n    }\n  };\n\n  const handleDiscardCapture = () => {\n    getDebugLogger().clear();\n    setCaptureCompleted(false);\n    setCaptureSince(undefined);\n    setExportDestination(undefined);\n    setDiagnosticsState('idle');\n  };\n\n  const handleStartNewCapture = () => {\n    const since = getDebugLogger().startCapture();\n    setCaptureSince(since);\n    setCaptureActive(true);\n    setCaptureCompleted(false);\n    setDiagnosticsState('idle');\n    setExportDestination(undefined);\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Diagnostics & Privacy</Text>\n      {needsRefresh && (\n        <Box\n          style={{\n            padding: '12px',\n            backgroundColor: 'rgba(33, 150, 243, 0.1)',\n            borderRadius: '8px',\n          }}\n        >\n          <Text size=\"T300\" style={{ color: 'rgb(33, 150, 243)' }}>\n            Please refresh the page for these settings to take effect.\n          </Text>\n        </Box>\n      )}\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Error Reporting\"\n          focusId=\"error-reporting\"\n          description={\n            isSentryConfigured\n              ? 'Send anonymous crash reports to help improve Sable. No messages, room names, or personal data are included.'\n              : 'Error reporting is not configured for this build.'\n          }\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={sentryEnabled}\n              onChange={handleSentryToggle}\n              disabled={!isSentryConfigured}\n            />\n          }\n        />\n        {sentryEnabled && isSentryConfigured && (\n          <SettingTile\n            title=\"Session Replay\"\n            focusId=\"session-replay\"\n            description=\"Allow recording of UI interactions to help debug errors. All text, media, and inputs are fully masked before sending.\"\n            after={\n              <Switch\n                variant=\"Primary\"\n                value={sessionReplayEnabled}\n                onChange={handleReplayToggle}\n              />\n            }\n          />\n        )}\n      </SequenceCard>\n      {(!isTauri() || isDesktopTauri() || isMobileTauri()) && (\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"300\"\n        >\n          <SettingTile\n            title=\"Capture Diagnostics\"\n            focusId=\"capture-diagnostics\"\n            description={\n              captureActive\n                ? 'Capture is active. Reproduce the problem, then stop and export the report.'\n                : captureCompleted\n                  ? 'Your completed capture is ready to export. You can retry the export or discard it.'\n                  : 'Start a short, privacy-reviewed capture of errors and useful app activity. Nothing is uploaded automatically.'\n            }\n            after={\n              <Button\n                variant={captureActive ? 'Critical' : 'Secondary'}\n                fill=\"Soft\"\n                size=\"300\"\n                radii=\"300\"\n                before={captureActive ? undefined : menuIcon(Download)}\n                onClick={handleDiagnosticsCapture}\n                disabled={diagnosticsState === 'exporting'}\n              >\n                <Text size=\"B300\">\n                  {diagnosticsState === 'exporting'\n                    ? 'Exporting…'\n                    : captureActive\n                      ? 'Stop & Export'\n                      : captureCompleted\n                        ? 'Export Capture'\n                        : 'Start Capture'}\n                </Text>\n              </Button>\n            }\n          />\n          {diagnosticsState === 'success' && (\n            <Text size=\"T200\" style={{ color: 'var(--mx-color-positive-container-on)' }}>\n              {isDesktopTauri()\n                ? `Diagnostics ZIP saved to ${exportDestination ?? 'the selected destination'}. It includes frontend and native logs. Review it before sharing.`\n                : isMobileTauri()\n                  ? 'Diagnostics ZIP saved with content redacted where possible. Review it before sharing.'\n                  : 'Frontend diagnostics downloaded with content redacted where possible. Review it before sharing.'}\n            </Text>\n          )}\n          {diagnosticsState === 'error' && (\n            <Text size=\"T200\" style={{ color: 'var(--mx-color-critical-container-on)' }}>\n              Could not export diagnostics. Please try again.\n            </Text>\n          )}\n          {captureCompleted && diagnosticsState !== 'exporting' && (\n            <Box gap=\"200\" wrap=\"Wrap\">\n              <Button\n                variant=\"Secondary\"\n                fill=\"Soft\"\n                size=\"300\"\n                radii=\"300\"\n                onClick={handleStartNewCapture}\n              >\n                <Text size=\"B300\">Start New Capture</Text>\n              </Button>\n              <Button\n                variant=\"Secondary\"\n                fill=\"Soft\"\n                size=\"300\"\n                radii=\"300\"\n                onClick={handleDiscardCapture}\n              >\n                <Text size=\"B300\">Discard Capture</Text>\n              </Button>\n            </Box>\n          )}\n        </SequenceCard>\n      )}\n      <Box gap=\"200\" wrap=\"Wrap\" style={{ paddingTop: '4px' }}>\n        <Button\n          as=\"a\"\n          href=\"https://github.com/SableClient/Sable/blob/dev/docs/PRIVACY.md\"\n          rel=\"noreferrer noopener\"\n          target=\"_blank\"\n          variant=\"Secondary\"\n          fill=\"Soft\"\n          size=\"300\"\n          radii=\"300\"\n          before={menuIcon(Shield, { weight: 'fill' })}\n        >\n          <Text size=\"B300\">Privacy Policy</Text>\n        </Button>\n      </Box>\n    </Box>\n  );\n}\n\nexport function General({ requestBack, requestClose }: Readonly<GeneralProps>) {\n  return (\n    <SettingsSectionPage title=\"General\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <DateAndTime />\n              <Gestures isMobile={isMobileOrTablet()} />\n              <Editor />\n              <Messages />\n              <Embeds />\n              <Calls />\n              <Sync />\n              <DiagnosticsAndPrivacy />\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { Box, Button, Scroll, Text, config } from 'folds';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport {\n  SHORTCUTS,\n  captureShortcut,\n  findShortcutConflict,\n  formatShortcut,\n  getShortcutBinding,\n} from '../../../keyboard/shortcuts';\nimport type { ShortcutDefinition, ShortcutId } from '../../../keyboard/shortcuts';\n\nconst CATEGORIES = ['General', 'Navigation', 'Messages'] as const;\n\nfunction ShortcutKeys({ binding }: { binding: string | null }) {\n  const label = formatShortcut(binding);\n  return (\n    <kbd\n      style={{\n        fontFamily: 'monospace',\n        fontWeight: 'bold',\n        padding: `0 ${config.space.S100}`,\n        borderRadius: '3px',\n        border: '1px solid currentColor',\n        opacity: binding === null ? 0.6 : 0.8,\n        fontSize: '0.85em',\n      }}\n    >\n      {label}\n    </kbd>\n  );\n}\n\ntype ShortcutRowProps = {\n  shortcut: ShortcutDefinition;\n  binding: string | null;\n  customized: boolean;\n  editing: boolean;\n  error?: string;\n  onEdit: () => void;\n  onReset: () => void;\n};\n\nfunction ShortcutRow({\n  shortcut,\n  binding,\n  customized,\n  editing,\n  error,\n  onEdit,\n  onReset,\n}: ShortcutRowProps) {\n  return (\n    <SettingTile\n      title={shortcut.label}\n      focusId={`shortcut-${shortcut.id}`}\n      showSettingLinkAction={false}\n      description={\n        editing && !error ? 'Press a shortcut. Backspace removes it; Escape cancels.' : undefined\n      }\n      after={\n        <Box alignItems=\"Center\" gap=\"200\" wrap=\"Wrap\">\n          <ShortcutKeys binding={binding} />\n          <Button\n            variant=\"Secondary\"\n            fill=\"Soft\"\n            outlined\n            size=\"300\"\n            radii=\"300\"\n            onClick={onEdit}\n            aria-label={\n              editing ? `Press a new shortcut for ${shortcut.label}` : `Change ${shortcut.label}`\n            }\n          >\n            <Text size=\"B300\">{editing ? 'Press keys…' : 'Change'}</Text>\n          </Button>\n          {customized && (\n            <Button\n              variant=\"Critical\"\n              fill=\"Soft\"\n              outlined\n              size=\"300\"\n              radii=\"300\"\n              onClick={onReset}\n            >\n              <Text size=\"B300\">Reset</Text>\n            </Button>\n          )}\n        </Box>\n      }\n    >\n      {editing && error && (\n        <Text size=\"T200\" priority=\"500\" aria-live=\"polite\">\n          {error}\n        </Text>\n      )}\n    </SettingTile>\n  );\n}\n\ntype KeyboardShortcutsProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\n\nexport function KeyboardShortcuts({ requestBack, requestClose }: KeyboardShortcutsProps) {\n  const [overrides, setOverrides] = useSetting(settingsAtom, 'shortcutOverrides');\n  const [editingId, setEditingId] = useState<ShortcutId>();\n  const [error, setError] = useState<string>();\n\n  const updateOverride = useCallback(\n    (id: ShortcutId, binding: string | null | undefined) => {\n      setOverrides((current) => {\n        const next = { ...current };\n        if (binding === undefined) delete next[id];\n        else next[id] = binding;\n        return next;\n      });\n      setEditingId(undefined);\n      setError(undefined);\n    },\n    [setOverrides]\n  );\n\n  useEffect(() => {\n    const id = editingId;\n    if (!id) return undefined;\n\n    const handleCapture = (event: KeyboardEvent) => {\n      event.preventDefault();\n      event.stopPropagation();\n      if (event.key === 'Escape') {\n        setEditingId(undefined);\n        setError(undefined);\n        return;\n      }\n      if (event.key === 'Backspace' || event.key === 'Delete') {\n        updateOverride(id, null);\n        return;\n      }\n      const binding = captureShortcut(event);\n      if (!binding) return;\n      const conflict = findShortcutConflict(id, binding, overrides);\n      if (conflict) {\n        setError(`Already used by “${conflict.label}” in this context.`);\n        return;\n      }\n      updateOverride(id, binding);\n    };\n\n    window.addEventListener('keydown', handleCapture, true);\n    return () => window.removeEventListener('keydown', handleCapture, true);\n  }, [editingId, overrides, updateOverride]);\n\n  return (\n    <SettingsSectionPage\n      title=\"Keyboard Shortcuts\"\n      titleAs=\"h1\"\n      actionLabel=\"Close keyboard shortcuts\"\n      requestBack={requestBack}\n      requestClose={requestClose}\n    >\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"600\">\n              <Text size=\"T300\" priority=\"300\">\n                Choose Change, then press a new key combination. Global shortcuts do not run while\n                typing unless the action specifically supports it.\n              </Text>\n              {CATEGORIES.map((category) => (\n                <Box key={category} direction=\"Column\" gap=\"100\">\n                  <Text size=\"L400\" as=\"h2\">\n                    {category}\n                  </Text>\n                  <Box direction=\"Column\" gap=\"100\">\n                    {SHORTCUTS.filter((shortcut) => shortcut.category === category).map(\n                      (shortcut) => (\n                        <SequenceCard\n                          key={shortcut.id}\n                          className={SequenceCardStyle}\n                          variant=\"SurfaceVariant\"\n                          direction=\"Column\"\n                        >\n                          <ShortcutRow\n                            shortcut={shortcut}\n                            binding={getShortcutBinding(shortcut.id, overrides)}\n                            customized={shortcut.id in overrides}\n                            editing={editingId === shortcut.id}\n                            error={editingId === shortcut.id ? error : undefined}\n                            onEdit={() => {\n                              setEditingId(shortcut.id);\n                              setError(undefined);\n                            }}\n                            onReset={() => updateOverride(shortcut.id, undefined)}\n                          />\n                        </SequenceCard>\n                      )\n                    )}\n                  </Box>\n                </Box>\n              ))}\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { useEffect, useState } from 'react';\n\nexport const getNotificationState = (): PermissionState => {\n  if ('Notification' in window) {\n    if (window.Notification.permission === 'default') {\n      return 'prompt';\n    }\n\n    return window.Notification.permission;\n  }\n\n  return 'denied';\n};\n\nexport function usePermissionState(name: PermissionName, initialValue: PermissionState = 'prompt') {\n  const [permissionState, setPermissionState] = useState<PermissionState>(initialValue);\n\n  useEffect(() => {\n    let permissionStatus: PermissionStatus;\n\n    function handlePermissionChange(this: PermissionStatus) {\n      setPermissionState(this.state);\n    }\n\n    if (!navigator.permissions?.query) {\n      return undefined;\n    }\n\n    navigator.permissions\n      .query({ name })\n      .then((permStatus: PermissionStatus) => {\n        permissionStatus = permStatus;\n        handlePermissionChange.apply(permStatus);\n        permStatus.addEventListener('change', handlePermissionChange);\n      })\n      .catch(() => {\n        // Silence error since FF doesn't support microphone permission\n      });\n\n    return () => {\n      permissionStatus?.removeEventListener('change', handlePermissionChange);\n    };\n  }, [name]);\n\n  return permissionState;\n}\n","import { useCallback } from 'react';\nimport { AsyncStatus, useAsyncCallbackValue } from './useAsyncCallback';\nimport { useMatrixClient } from './useMatrixClient';\n\ntype RefreshHandler = () => void;\n\ntype EmailNotificationResult = {\n  enabled: boolean;\n  email?: string;\n};\n\nexport const useEmailNotifications = (): [\n  EmailNotificationResult | undefined | null,\n  RefreshHandler,\n] => {\n  const mx = useMatrixClient();\n\n  const [emailState, refresh] = useAsyncCallbackValue<EmailNotificationResult, Error>(\n    useCallback(async () => {\n      const tpIDs = (await mx.getThreePids())?.threepids;\n      const emailAddresses = tpIDs\n        .filter((id) => (id.medium as string) === 'email')\n        .map((id) => id.address);\n      if (emailAddresses.length === 0)\n        return {\n          enabled: false,\n        };\n\n      const pushers = (await mx.getPushers())?.pushers;\n      const emailPusher = pushers.find(\n        (pusher) => pusher.app_id === 'm.email' && emailAddresses.includes(pusher.pushkey)\n      );\n\n      if (emailPusher?.pushkey) {\n        return {\n          enabled: true,\n          email: emailPusher.pushkey,\n        };\n      }\n\n      return {\n        enabled: false,\n        email: emailAddresses[0],\n      };\n    }, [mx])\n  );\n\n  if (emailState.status === AsyncStatus.Success) {\n    return [emailState.data, refresh];\n  }\n\n  if (emailState.status === AsyncStatus.Error) {\n    return [null, refresh];\n  }\n\n  return [undefined, refresh];\n};\n","import { atom } from 'jotai';\nimport {\n  atomWithLocalStorage,\n  getLocalStorageItem,\n  setLocalStorageItem,\n} from './utils/atomWithLocalStorage';\n\nconst PUSH_SUBSCRIPTION_KEY = 'webPushSubscription';\n\nconst basePushSubscriptionAtom = atomWithLocalStorage<PushSubscriptionJSON | null>(\n  PUSH_SUBSCRIPTION_KEY,\n  (key) => getLocalStorageItem<PushSubscriptionJSON | null>(key, null),\n  (key, value) => {\n    setLocalStorageItem(key, value);\n  }\n);\n\nexport const pushSubscriptionAtom = atom<\n  PushSubscriptionJSON | null,\n  [PushSubscription | null],\n  void\n>(\n  (get) => get(basePushSubscriptionAtom),\n  (get, set, subscription: PushSubscription | null) => {\n    if (subscription) {\n      const subscriptionJSON = subscription.toJSON();\n      set(basePushSubscriptionAtom, subscriptionJSON);\n    } else {\n      set(basePushSubscriptionAtom, null);\n    }\n  }\n);\n","import { atom } from 'jotai';\nimport type { UnifiedPushRegistrationStatus } from '$features/settings/notifications/UnifiedPushTransport';\nimport {\n  atomWithLocalStorage,\n  getLocalStorageItem,\n  setLocalStorageItem,\n} from './utils/atomWithLocalStorage';\n\nconst UP_ENDPOINT_KEY = 'unifiedPushEndpoint';\n\nexport type UnifiedPushState = {\n  endpoint?: string;\n  instance?: string;\n  appId?: string;\n  gatewayUrl?: string;\n  status?: UnifiedPushRegistrationStatus;\n  distributor?: string;\n  error?: string;\n  permissionState?: 'granted' | 'denied' | 'default';\n  distributors?: string[];\n  pubKeySet?: {\n    pubKey: string;\n    auth: string;\n  };\n} | null;\n\nconst baseAtom = atomWithLocalStorage<UnifiedPushState>(\n  UP_ENDPOINT_KEY,\n  (key) => getLocalStorageItem<UnifiedPushState>(key, null),\n  (key, value) => {\n    setLocalStorageItem(key, value);\n  }\n);\n\nexport const unifiedPushEndpointAtom = atom(\n  (get) => get(baseAtom),\n  (_get, set, value: UnifiedPushState) => {\n    set(baseAtom, value);\n  }\n);\n","import type { MatrixClient } from '$types/matrix-sdk';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport { isTauri } from '@tauri-apps/api/core';\nimport type { ClientConfig } from '../../../hooks/useClientConfig';\n\nconst debugLog = createDebugLogger('PushNotifications');\n\ntype PushSubscriptionState = [\n  PushSubscriptionJSON | null,\n  (subscription: PushSubscription | null) => void,\n];\n\nexport async function requestBrowserNotificationPermission(): Promise<NotificationPermission> {\n  if (!('Notification' in window)) {\n    debugLog.warn('notification', 'Notification API not available in this browser');\n    return 'denied';\n  }\n  try {\n    debugLog.info('notification', 'Requesting browser notification permission');\n    const permission: NotificationPermission = await Notification.requestPermission();\n    debugLog.info('notification', 'Notification permission result', { permission });\n    return permission;\n  } catch (error) {\n    debugLog.error('notification', 'Failed to request notification permission', {\n      error: error instanceof Error ? error.message : String(error),\n    });\n    return 'denied';\n  }\n}\n\nexport async function enablePushNotifications(\n  mx: MatrixClient,\n  clientConfig: ClientConfig,\n  pushSubscriptionAtom: PushSubscriptionState\n): Promise<void> {\n  if (isTauri()) return;\n  if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\n    debugLog.error(\n      'notification',\n      'Push messaging not supported - missing serviceWorker or PushManager'\n    );\n    throw new Error('Push messaging is not supported in this browser.');\n  }\n  debugLog.info('notification', 'Enabling push notifications');\n  const [pushSubAtom, setPushSubscription] = pushSubscriptionAtom;\n  const registration = await navigator.serviceWorker.ready;\n  const currentBrowserSub = await registration.pushManager.getSubscription();\n\n  /* Self-Healing Check. Effectively checks if the browser has invalidated our subscription and recreates it\n     only when necessary. This prevents us from needing an external call to get back the web push info.\n  */\n  if (currentBrowserSub && pushSubAtom && currentBrowserSub.endpoint === pushSubAtom.endpoint) {\n    debugLog.info('notification', 'Push subscription already exists and is valid - reusing', {\n      endpoint: pushSubAtom.endpoint,\n    });\n    const { keys } = pushSubAtom;\n    if (!keys?.p256dh || !keys.auth) return;\n    const pusherData = {\n      kind: 'http' as const,\n      app_id: clientConfig.pushNotificationDetails?.webPushAppID,\n      pushkey: keys.p256dh,\n      app_display_name: 'Cinny',\n      device_display_name: 'This Browser',\n      lang: navigator.language || 'en',\n      data: {\n        url: clientConfig.pushNotificationDetails?.pushNotifyUrl,\n        format: 'event_id_only' as const,\n        endpoint: pushSubAtom.endpoint,\n        p256dh: keys.p256dh,\n        auth: keys.auth,\n      },\n      append: false,\n    };\n    navigator.serviceWorker.controller?.postMessage({\n      url: mx.baseUrl,\n      type: 'togglePush',\n      pusherData,\n      token: mx.getAccessToken(),\n    });\n    return;\n  }\n\n  if (currentBrowserSub) {\n    debugLog.info('notification', 'Unsubscribing old push subscription');\n    await currentBrowserSub.unsubscribe();\n  }\n\n  debugLog.info('notification', 'Creating new push subscription');\n  const newSubscription = await registration.pushManager.subscribe({\n    userVisibleOnly: true,\n    applicationServerKey: clientConfig.pushNotificationDetails?.vapidPublicKey,\n  });\n\n  debugLog.info('notification', 'Push subscription created successfully', {\n    endpoint: newSubscription.endpoint,\n  });\n  setPushSubscription(newSubscription);\n\n  const subJson = newSubscription.toJSON();\n  const { keys } = subJson;\n  if (!keys?.p256dh || !keys.auth) {\n    debugLog.error('notification', 'Push subscription missing required keys');\n    throw new Error('Push subscription keys missing.');\n  }\n  const pusherData = {\n    kind: 'http' as const,\n    app_id: clientConfig.pushNotificationDetails?.webPushAppID,\n    pushkey: keys.p256dh,\n    app_display_name: 'Cinny',\n    device_display_name:\n      (await mx.getDevice(mx.getDeviceId() ?? '')).display_name ?? 'Unknown Device',\n    lang: navigator.language || 'en',\n    data: {\n      url: clientConfig.pushNotificationDetails?.pushNotifyUrl,\n      format: 'event_id_only' as const,\n      endpoint: newSubscription.endpoint,\n      p256dh: keys.p256dh,\n      auth: keys.auth,\n    },\n    append: false,\n  };\n\n  navigator.serviceWorker.controller?.postMessage({\n    url: mx.baseUrl,\n    type: 'togglePush',\n    pusherData,\n    token: mx.getAccessToken(),\n  });\n}\n\n/**\n * Disables push notifications by telling the homeserver to delete the pusher,\n * but keeps the browser subscription locally for a fast re-enable.\n */\nexport async function disablePushNotifications(\n  mx: MatrixClient,\n  clientConfig: ClientConfig,\n  pushSubscriptionAtom: PushSubscriptionState\n): Promise<void> {\n  if (isTauri()) return;\n\n  debugLog.info('notification', 'Disabling push notifications');\n  const [pushSubAtom] = pushSubscriptionAtom;\n\n  const pusherData = {\n    kind: null,\n    app_id: clientConfig.pushNotificationDetails?.webPushAppID,\n    pushkey: pushSubAtom?.keys?.p256dh,\n  };\n\n  navigator.serviceWorker.controller?.postMessage({\n    url: mx.baseUrl,\n    type: 'togglePush',\n    pusherData,\n    token: mx.getAccessToken(),\n  });\n}\n\nexport async function deRegisterAllPushers(mx: MatrixClient): Promise<void> {\n  const response = await mx.getPushers();\n  const pushers = response.pushers || [];\n  if (pushers.length === 0) return;\n\n  const deletionPromises = pushers.map((pusher) => {\n    const pusherToDelete: { kind: null; app_id: string; pushkey: string } = {\n      kind: null,\n      app_id: pusher.app_id,\n      pushkey: pusher.pushkey,\n    };\n    return mx.setPusher(pusherToDelete as unknown as Parameters<typeof mx.setPusher>[0]);\n  });\n\n  await Promise.allSettled(deletionPromises);\n}\n\nexport async function togglePusher(\n  mx: MatrixClient,\n  clientConfig: ClientConfig,\n  visible: boolean,\n  usePushNotifications: boolean,\n  pushSubscriptionAtom: PushSubscriptionState,\n  keepEnabledWhenVisible = false\n): Promise<void> {\n  if (usePushNotifications) {\n    if (visible && !keepEnabledWhenVisible) {\n      await disablePushNotifications(mx, clientConfig, pushSubscriptionAtom);\n    } else {\n      await enablePushNotifications(mx, clientConfig, pushSubscriptionAtom);\n    }\n  }\n}\n","import { invoke } from '@tauri-apps/api/core';\nimport { isAndroidTauri } from './TauriNotificationsApiClient';\n\nexport type NativePushRegistration = {\n  deviceToken: string;\n  p256dh?: string;\n  auth?: string;\n};\n\nexport type NativePushNotificationsApi = {\n  isPermissionGranted: () => Promise<boolean | null>;\n  requestPermission: () => Promise<NotificationPermission>;\n  registerForPushNotifications: (vapid?: string) => Promise<NativePushRegistration>;\n  unregisterForPushNotifications: () => Promise<void>;\n};\n\nlet nativePushNotificationsApiPromise: Promise<NativePushNotificationsApi> | null = null;\n\nexport async function getNativePushNotificationsApi(): Promise<NativePushNotificationsApi> {\n  if (!nativePushNotificationsApiPromise) {\n    nativePushNotificationsApiPromise = import('@sableclient/tauri-plugin-notifications-api').then(\n      (notificationsApi) => ({\n        isPermissionGranted: notificationsApi.isPermissionGranted,\n        requestPermission: notificationsApi.requestPermission,\n        registerForPushNotifications: (vapid?: string) =>\n          invoke<NativePushRegistration>('plugin:notifications|register_for_push_notifications', {\n            vapid,\n            ...(isAndroidTauri() ? { provider: 'fcm' } : {}),\n          }),\n        unregisterForPushNotifications: notificationsApi.unregisterForPushNotifications,\n      })\n    );\n  }\n\n  return nativePushNotificationsApiPromise;\n}\n","import type { IPusherRequest, MatrixClient } from '$types/matrix-sdk';\nimport type { ClientConfig } from '$hooks/useClientConfig';\nimport { getNativePushNotificationsApi } from './NativePushNotificationsApiClient';\n\nconst NATIVE_PUSH_PUSHKEY_STORAGE_KEY = 'nativePushToken';\nconst NATIVE_PUSH_APP_ID_STORAGE_KEY = 'nativePushAppId';\n\nexport type NativePushRegistrationResult =\n  | {\n      permission: 'granted';\n      token: string;\n      p256dh?: string;\n      auth?: string;\n    }\n  | {\n      permission: 'default' | 'denied';\n      token: null;\n    };\n\nexport type { NativePushNotificationsApi } from './NativePushNotificationsApiClient';\n\nconst FIREBASE_UNCONFIGURED_PATTERN = /firebaseapp is not initialized|default firebaseapp/i;\n\nfunction describeNativePushRegistrationError(error: unknown): string {\n  const detail = error instanceof Error ? error.message : String(error);\n  if (FIREBASE_UNCONFIGURED_PATTERN.test(detail)) {\n    return 'Native push (FCM) is unavailable: this build has no Firebase configuration (google-services.json).';\n  }\n  return `Native push registration failed: ${detail}`;\n}\n\nfunction storeNativePushRegistration(appId: string, pushkey: string): void {\n  localStorage.setItem(NATIVE_PUSH_APP_ID_STORAGE_KEY, appId);\n  localStorage.setItem(NATIVE_PUSH_PUSHKEY_STORAGE_KEY, pushkey);\n}\n\nfunction getStoredNativePushRegistration(): { appId: string; pushkey: string } | null {\n  const appId = localStorage.getItem(NATIVE_PUSH_APP_ID_STORAGE_KEY);\n  const pushkey = localStorage.getItem(NATIVE_PUSH_PUSHKEY_STORAGE_KEY);\n  return appId && pushkey ? { appId, pushkey } : null;\n}\n\nfunction clearStoredNativePushRegistration(): void {\n  localStorage.removeItem(NATIVE_PUSH_APP_ID_STORAGE_KEY);\n  localStorage.removeItem(NATIVE_PUSH_PUSHKEY_STORAGE_KEY);\n}\n\nfunction getNativePushAppId(clientConfig: ClientConfig): string {\n  const appId = clientConfig.pushNotificationDetails?.nativePushAppID;\n  if (!appId) {\n    throw new Error('Native push requires pushNotificationDetails.nativePushAppID in config.json.');\n  }\n  return appId;\n}\n\nfunction getWebPushAppId(clientConfig: ClientConfig): string {\n  const appId = clientConfig.pushNotificationDetails?.webPushAppID;\n  if (!appId) {\n    throw new Error('WebPush push requires pushNotificationDetails.webPushAppID in config.json.');\n  }\n  return appId;\n}\n\nfunction getPushGatewayUrl(clientConfig: ClientConfig): string {\n  const pushGatewayUrl = clientConfig.pushNotificationDetails?.pushNotifyUrl;\n  if (!pushGatewayUrl) {\n    throw new Error('Native push requires pushNotificationDetails.pushNotifyUrl in config.json.');\n  }\n  return pushGatewayUrl;\n}\n\nexport async function isNativePushPermissionGranted(): Promise<boolean | null> {\n  const api = await getNativePushNotificationsApi();\n  return api.isPermissionGranted();\n}\n\nexport async function requestNativePushPermission(): Promise<NotificationPermission> {\n  const api = await getNativePushNotificationsApi();\n  return api.requestPermission();\n}\n\nexport async function ensureNativePushRegistered(\n  vapid?: string\n): Promise<NativePushRegistrationResult> {\n  const permission = (await isNativePushPermissionGranted())\n    ? 'granted'\n    : await requestNativePushPermission();\n\n  if (permission !== 'granted') {\n    return {\n      permission,\n      token: null,\n    };\n  }\n\n  const api = await getNativePushNotificationsApi();\n  let registration;\n  try {\n    registration = await api.registerForPushNotifications(vapid);\n  } catch (error) {\n    throw new Error(describeNativePushRegistrationError(error), { cause: error });\n  }\n\n  if (!registration?.deviceToken) {\n    throw new Error('Native push registration returned no device token.');\n  }\n\n  return {\n    permission: 'granted',\n    token: registration.deviceToken,\n    p256dh: registration.p256dh,\n    auth: registration.auth,\n  };\n}\n\nasync function ensureNativePushUnregistered(): Promise<void> {\n  const api = await getNativePushNotificationsApi();\n  await api.unregisterForPushNotifications();\n}\n\nasync function removeNativePushersForCurrentDevice(mx: MatrixClient, appId: string): Promise<void> {\n  const deviceId = mx.getDeviceId() ?? '';\n  if (!deviceId) {\n    return;\n  }\n\n  const currentDevice = await mx.getDevice(deviceId);\n  const deviceDisplayName = currentDevice?.display_name;\n  if (!deviceDisplayName) {\n    return;\n  }\n\n  const response = await mx.getPushers();\n  const pushers = response.pushers ?? [];\n  const currentDevicePushers = pushers.filter(\n    (pusher) =>\n      pusher.app_id === appId &&\n      pusher.device_display_name === deviceDisplayName &&\n      pusher.kind === 'http'\n  );\n\n  if (currentDevicePushers.length === 0) {\n    return;\n  }\n\n  await Promise.allSettled(\n    currentDevicePushers.map((pusher) =>\n      mx.setPusher({\n        kind: null,\n        app_id: pusher.app_id,\n        pushkey: pusher.pushkey,\n      } as unknown as IPusherRequest)\n    )\n  );\n}\n\nexport async function enableNativePush(\n  mx: MatrixClient,\n  clientConfig: ClientConfig\n): Promise<string> {\n  const vapid = clientConfig.pushNotificationDetails?.vapidPublicKey;\n  const registration = await ensureNativePushRegistered(vapid);\n\n  if (registration.permission !== 'granted' || !registration.token) {\n    throw new Error(\n      registration.permission === 'denied'\n        ? 'Native push permission denied'\n        : 'Native push permission dismissed'\n    );\n  }\n\n  const pushGatewayUrl = getPushGatewayUrl(clientConfig);\n  const deviceDisplayName =\n    (await mx.getDevice(mx.getDeviceId() ?? ''))?.display_name ?? 'Mobile Device';\n\n  if (registration.p256dh && registration.auth) {\n    const appId = getWebPushAppId(clientConfig);\n    await mx.setPusher({\n      kind: 'http',\n      app_id: appId,\n      pushkey: registration.p256dh,\n      app_display_name: 'Sable (Native Push)',\n      device_display_name: deviceDisplayName,\n      lang: navigator.language || 'en',\n      data: {\n        url: pushGatewayUrl,\n        format: 'event_id_only',\n        endpoint: registration.token,\n        p256dh: registration.p256dh,\n        auth: registration.auth,\n      },\n      append: false,\n    } as unknown as IPusherRequest);\n\n    storeNativePushRegistration(appId, registration.p256dh);\n    return registration.p256dh;\n  }\n\n  const appId = getNativePushAppId(clientConfig);\n  await mx.setPusher({\n    kind: 'http',\n    app_id: appId,\n    pushkey: registration.token,\n    app_display_name: 'Sable (Native Push)',\n    device_display_name: deviceDisplayName,\n    lang: navigator.language || 'en',\n    data: {\n      url: pushGatewayUrl,\n      format: 'event_id_only',\n    },\n    append: false,\n  } as unknown as IPusherRequest);\n\n  storeNativePushRegistration(appId, registration.token);\n  return registration.token;\n}\n\nexport async function disableNativePush(\n  mx: MatrixClient,\n  clientConfig: ClientConfig\n): Promise<void> {\n  const stored = getStoredNativePushRegistration();\n  if (stored) {\n    await mx.setPusher({\n      kind: null,\n      app_id: stored.appId,\n      pushkey: stored.pushkey,\n    } as unknown as IPusherRequest);\n  } else {\n    const appIds = [\n      clientConfig.pushNotificationDetails?.webPushAppID,\n      clientConfig.pushNotificationDetails?.nativePushAppID,\n    ].filter((appId): appId is string => Boolean(appId));\n    await Promise.all(appIds.map((appId) => removeNativePushersForCurrentDevice(mx, appId)));\n  }\n\n  await ensureNativePushUnregistered();\n  clearStoredNativePushRegistration();\n}\n","export type NotificationTransportMode = 'auto' | 'unifiedpush' | 'native' | 'web';\n\nexport type NotificationTransportProvider = 'unifiedpush' | 'native' | 'web';\n\nexport type NotificationTransportPlatform = 'android' | 'ios' | 'desktop' | 'web';\n\nexport type NotificationTransportStatus =\n  | 'ready'\n  | 'temp-unavailable'\n  | 'hard-failed'\n  | 'unavailable';\n\nexport type PushTransportConfig = {\n  mode?: NotificationTransportMode;\n  unifiedPushGatewayUrl?: string;\n  unifiedPushAppID?: string;\n  unifiedPushDistributor?: string;\n};\n\nexport type PushTransportOverrides = Omit<PushTransportConfig, 'mode'>;\n\nexport type PushTransportAvailability = {\n  available: boolean;\n  status: NotificationTransportStatus;\n};\n\nexport type ResolveNotificationTransportInput = {\n  platform: NotificationTransportPlatform;\n  enabled: boolean;\n  mode: NotificationTransportMode;\n  unifiedPush: PushTransportAvailability;\n  nativePush: PushTransportAvailability;\n  webPush: PushTransportAvailability;\n};\n\nexport type ResolvedNotificationTransport = {\n  provider: NotificationTransportProvider | null;\n  status: NotificationTransportStatus;\n  degraded: boolean;\n};\n\nexport type {\n  NativePushNotificationsApi,\n  NativePushRegistrationResult,\n} from './NativePushNotifications';\n\nexport { disableNativePush, enableNativePush } from './NativePushNotifications';\n\nexport function getSupportedNotificationTransportModes(\n  platform: NotificationTransportPlatform\n): NotificationTransportMode[] {\n  if (platform === 'android') {\n    return ['auto', 'unifiedpush', 'native'];\n  }\n\n  if (platform === 'ios') {\n    return ['auto', 'native'];\n  }\n\n  if (platform === 'web') {\n    return ['auto', 'web'];\n  }\n\n  return [];\n}\n\nexport function normalizeNotificationTransportMode(\n  mode: NotificationTransportMode,\n  platform: NotificationTransportPlatform\n): NotificationTransportMode {\n  const supportedModes = getSupportedNotificationTransportModes(platform);\n  if (supportedModes.includes(mode)) return mode;\n  return supportedModes[0] ?? 'auto';\n}\n\nexport function resolvePreferredNotificationTransportProvider(\n  mode: NotificationTransportMode,\n  platform: NotificationTransportPlatform\n): NotificationTransportProvider | null {\n  const normalizedMode = normalizeNotificationTransportMode(mode, platform);\n\n  if (platform === 'desktop') return null;\n\n  if (normalizedMode === 'web') return 'web';\n  if (normalizedMode === 'native') return 'native';\n  if (normalizedMode === 'unifiedpush') return 'unifiedpush';\n  if (platform === 'web') return 'web';\n  if (platform === 'android') return 'unifiedpush';\n  if (platform === 'ios') return 'native';\n  return null;\n}\n\nexport function deriveLegacyPushFlags(\n  enabled: boolean,\n  provider: NotificationTransportProvider | null\n): {\n  usePushNotifications: boolean;\n  useUnifiedPush: boolean;\n} {\n  return {\n    usePushNotifications: enabled && provider === 'web',\n    useUnifiedPush: enabled && provider === 'unifiedpush',\n  };\n}\n\nexport function mergePushConfig(\n  defaults: PushTransportConfig,\n  overrides: Partial<PushTransportConfig>\n): PushTransportConfig {\n  return {\n    mode: overrides.mode ?? defaults.mode,\n    unifiedPushGatewayUrl: overrides.unifiedPushGatewayUrl ?? defaults.unifiedPushGatewayUrl,\n    unifiedPushAppID: overrides.unifiedPushAppID ?? defaults.unifiedPushAppID,\n    unifiedPushDistributor: overrides.unifiedPushDistributor ?? defaults.unifiedPushDistributor,\n  };\n}\n\nfunction resolveProvider(\n  availability: PushTransportAvailability,\n  provider: ResolvedNotificationTransport['provider']\n): ResolvedNotificationTransport {\n  if (!availability.available) {\n    return {\n      provider: null,\n      status: 'unavailable',\n      degraded: false,\n    };\n  }\n\n  return {\n    provider,\n    status: availability.status,\n    degraded: availability.status === 'temp-unavailable',\n  };\n}\n\nexport function resolveNotificationTransport(\n  input: ResolveNotificationTransportInput\n): ResolvedNotificationTransport {\n  if (!input.enabled) {\n    return { provider: null, status: 'unavailable', degraded: false };\n  }\n\n  if (input.mode === 'web') {\n    return resolveProvider(input.webPush, 'web');\n  }\n\n  if (input.mode === 'native') {\n    return resolveProvider(input.nativePush, 'native');\n  }\n\n  if (input.mode === 'unifiedpush') {\n    return resolveProvider(input.unifiedPush, 'unifiedpush');\n  }\n\n  if (input.platform === 'android') {\n    if (\n      input.unifiedPush.available &&\n      (input.unifiedPush.status === 'ready' || input.unifiedPush.status === 'temp-unavailable')\n    ) {\n      return resolveProvider(input.unifiedPush, 'unifiedpush');\n    }\n\n    if (input.unifiedPush.status === 'hard-failed' && input.nativePush.available) {\n      return resolveProvider(input.nativePush, 'native');\n    }\n\n    return resolveProvider(input.nativePush, 'native');\n  }\n\n  if (input.platform === 'ios') {\n    return resolveProvider(input.nativePush, 'native');\n  }\n\n  if (input.platform === 'web') {\n    return resolveProvider(input.webPush, 'web');\n  }\n\n  return { provider: null, status: 'unavailable', degraded: false };\n}\n","import { useCallback, useState } from 'react';\nimport { Box, color, config, Dialog, Header, IconButton, Text } from 'folds';\nimport { menuIcon, X } from '$components/icons/phosphor';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { useAtom } from 'jotai';\nimport { useMatrixClient } from '../../../hooks/useMatrixClient';\nimport { useClientConfig } from '../../../hooks/useClientConfig';\nimport { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback';\nimport { useSetting } from '../../../state/hooks/settings';\nimport { settingsAtom } from '../../../state/settings';\nimport { pushSubscriptionAtom } from '../../../state/pushSubscription';\nimport { deRegisterAllPushers } from './PushNotifications';\nimport { disableNativePush } from './NotificationTransport';\nimport { disableUnifiedPush } from './UnifiedPushNotifications';\nimport { SettingTile } from '../../../components/setting-tile';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { Button } from '$components/button';\n\ntype ConfirmDeregisterDialogProps = {\n  onClose: () => void;\n  onConfirm: () => void;\n  isLoading: boolean;\n};\n\nfunction ConfirmDeregisterDialog({ onClose, onConfirm, isLoading }: ConfirmDeregisterDialogProps) {\n  return (\n    <ModalOverlay requestClose={onClose}>\n      <Dialog variant=\"Surface\">\n        <Header style={{ padding: `0 ${config.space.S400}` }} variant=\"Surface\" size=\"500\">\n          <Box grow=\"Yes\">\n            <Text size=\"H4\">Reset All Push Notifications</Text>\n          </Box>\n          <IconButton size=\"300\" radii=\"300\" onClick={onClose} disabled={isLoading}>\n            {menuIcon(X)}\n          </IconButton>\n        </Header>\n        <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n          <Text>\n            This will remove push notifications from all your sessions and devices. This action\n            cannot be undone. Are you sure you want to continue?\n          </Text>\n          <Box direction=\"Column\" gap=\"200\" style={{ paddingTop: config.space.S200 }}>\n            <Button\n              variant=\"Critical\"\n              fill=\"Solid\"\n              onClick={onConfirm}\n              loading={isLoading}\n              spinnerVariant=\"Critical\"\n              spinnerSize=\"100\"\n            >\n              <Text size=\"B400\">Reset All</Text>\n            </Button>\n            <Button variant=\"Secondary\" fill=\"Soft\" onClick={onClose} disabled={isLoading}>\n              <Text size=\"B400\">Cancel</Text>\n            </Button>\n          </Box>\n        </Box>\n      </Dialog>\n    </ModalOverlay>\n  );\n}\n\nexport function DeregisterAllPushersSetting() {\n  const mx = useMatrixClient();\n  const clientConfig = useClientConfig();\n  const deregisterAll = useCallback(async () => {\n    await deRegisterAllPushers(mx);\n    if (isTauri()) {\n      await Promise.allSettled([disableNativePush(mx, clientConfig), disableUnifiedPush(mx)]);\n    }\n  }, [mx, clientConfig]);\n  const [deregisterState, runDeregisterAll] = useAsyncCallback(deregisterAll);\n  const [isConfirming, setIsConfirming] = useState(false);\n  const [, setPushNotifications] = useSetting(settingsAtom, 'usePushNotifications');\n  const [backgroundPushEnabled, setBackgroundPushEnabled] = useSetting(\n    settingsAtom,\n    'backgroundPushEnabled'\n  );\n  const [, setBackgroundPushProvider] = useSetting(settingsAtom, 'backgroundPushProvider');\n\n  const [, setPushSubscription] = useAtom(pushSubscriptionAtom);\n\n  const handleOpenConfirmDialog = () => {\n    setIsConfirming(true);\n  };\n\n  const handleCloseConfirmDialog = () => {\n    if (deregisterState.status === AsyncStatus.Loading) return;\n    setIsConfirming(false);\n  };\n\n  const handleConfirmDeregister = async () => {\n    try {\n      await runDeregisterAll();\n    } catch {\n      return;\n    }\n    setPushNotifications(false);\n    setPushSubscription(null);\n\n    if (backgroundPushEnabled) {\n      setBackgroundPushEnabled(false);\n    }\n    setBackgroundPushProvider(null);\n    setIsConfirming(false);\n  };\n\n  return (\n    <>\n      {isConfirming && (\n        <ConfirmDeregisterDialog\n          onClose={handleCloseConfirmDialog}\n          onConfirm={handleConfirmDeregister}\n          isLoading={deregisterState.status === AsyncStatus.Loading}\n        />\n      )}\n\n      <SettingTile\n        title=\"Reset All Push Notifications\"\n        focusId=\"reset-all-push-notifications\"\n        description={\n          <>\n            This will remove push notifications from all your sessions/devices.\n            <br />\n            You will need to re-enable them on each device individually.\n          </>\n        }\n        after={\n          <Button\n            size=\"300\"\n            radii=\"300\"\n            variant=\"Critical\"\n            fill=\"Soft\"\n            onClick={handleOpenConfirmDialog}\n          >\n            <Text size=\"B300\">Reset All</Text>\n          </Button>\n        }\n      >\n        {deregisterState.status === AsyncStatus.Error && (\n          <Text as=\"span\" style={{ color: color.Critical.Main }} size=\"T200\">\n            <br />\n            Failed to deregister devices. Please try again.\n          </Text>\n        )}\n        {deregisterState.status === AsyncStatus.Success && (\n          <Text as=\"span\" style={{ color: color.Success.Main }} size=\"T200\">\n            <br />\n            Successfully deregistered all devices.\n          </Text>\n        )}\n      </SettingTile>\n    </>\n  );\n}\n","import { type FormEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport {\n  Box,\n  Button,\n  color,\n  config,\n  Icon,\n  IconButton,\n  Icons,\n  Input,\n  Spinner,\n  Switch,\n  Text,\n} from 'folds';\nimport type { IPusherRequest } from '$types/matrix-sdk';\nimport { useAtom } from 'jotai';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile, SettingToggle } from '$components/setting-tile';\nimport { SettingMenuSelector } from '$components/setting-menu-selector';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { getNotificationState, usePermissionState } from '$hooks/usePermission';\nimport { useEmailNotifications } from '$hooks/useEmailNotifications';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { pushSubscriptionAtom } from '$state/pushSubscription';\nimport { unifiedPushEndpointAtom, type UnifiedPushState } from '$state/unifiedPushEndpoint';\nimport { isMobileOrTablet } from '$utils/platform';\nimport { isIosTauri } from '$features/settings/notifications/TauriNotificationsApiClient';\nimport { isTauri } from '@tauri-apps/api/core';\nimport { type as osType } from '@tauri-apps/plugin-os';\nimport {\n  requestBrowserNotificationPermission,\n  enablePushNotifications,\n  disablePushNotifications,\n} from './PushNotifications';\nimport { DeregisterAllPushersSetting } from './DeregisterPushNotifications';\nimport {\n  disableNativePush,\n  enableNativePush,\n  getSupportedNotificationTransportModes,\n  mergePushConfig,\n  normalizeNotificationTransportMode,\n  type NotificationTransportMode,\n  type NotificationTransportPlatform,\n  type NotificationTransportProvider,\n  type PushTransportOverrides,\n  resolvePreferredNotificationTransportProvider,\n} from './NotificationTransport';\nimport {\n  DEFAULT_UNIFIED_PUSH_APP_ID,\n  disableUnifiedPush,\n  enableUnifiedPush,\n  tryEnableUnifiedPush,\n  type UnifiedPushTransportConfigInput,\n} from './UnifiedPushNotifications';\nimport { normalizeErrorMessage } from './UnifiedPushTransport';\nimport {\n  ensureUnifiedPushDistributorSelection,\n  loadUnifiedPushDistributorState,\n  setUnifiedPushDistributorSelection,\n  switchUnifiedPushDistributorSelection,\n} from './UnifiedPushTransport';\n\ntype BackgroundPushKind = NotificationTransportProvider;\ntype BackgroundPushPlatform = NotificationTransportPlatform;\n\nfunction getBackgroundPushPlatform(isTauriRuntime: boolean): BackgroundPushPlatform {\n  if (!isTauriRuntime) return 'web';\n\n  const platform = osType();\n  if (platform === 'android') return 'android';\n  if (platform === 'ios') return 'ios';\n  return 'desktop';\n}\n\nexport async function switchBackgroundPushTransport(params: {\n  previousKind: BackgroundPushKind | null;\n  activate: () => Promise<BackgroundPushKind | null>;\n  deactivate: (kind: BackgroundPushKind | null) => Promise<void>;\n  reactivate?: (kind: BackgroundPushKind) => Promise<void>;\n}): Promise<BackgroundPushKind | null> {\n  const { previousKind, activate, deactivate, reactivate } = params;\n\n  if (previousKind) {\n    await deactivate(previousKind);\n  }\n\n  try {\n    return await activate();\n  } catch (error) {\n    // The old transport is already torn down, so restore it rather than\n    // leaving the user with no push delivery.\n    if (previousKind && reactivate) {\n      await reactivate(previousKind);\n    }\n    throw error;\n  }\n}\n\nfunction getNativePushConfigError(clientConfig: ReturnType<typeof useClientConfig>): string | null {\n  if (!clientConfig.pushNotificationDetails?.nativePushAppID) {\n    return 'Native push requires pushNotificationDetails.nativePushAppID in config.json.';\n  }\n\n  if (!clientConfig.pushNotificationDetails?.pushNotifyUrl) {\n    return 'Native push requires pushNotificationDetails.pushNotifyUrl in config.json.';\n  }\n\n  return null;\n}\n\nfunction EmailNotification() {\n  const mx = useMatrixClient();\n  const [result, refreshResult] = useEmailNotifications();\n\n  const [setState, setEnable] = useAsyncCallback(\n    useCallback(\n      async (email: string, enable: boolean) => {\n        if (enable) {\n          await mx.setPusher({\n            kind: 'email',\n            app_id: 'm.email',\n            pushkey: email,\n            app_display_name: 'Email Notifications',\n            device_display_name: email,\n            lang: 'en',\n            data: {\n              brand: 'Sable',\n            },\n            append: true,\n          });\n          return;\n        }\n        await mx.setPusher({\n          pushkey: email,\n          app_id: 'm.email',\n          kind: null,\n        } as unknown as IPusherRequest);\n      },\n      [mx]\n    )\n  );\n\n  const handleChange = (value: boolean) => {\n    if (result && result.email) {\n      setEnable(result.email, value).then(() => {\n        refreshResult();\n      });\n    }\n  };\n\n  return (\n    <SettingTile\n      title=\"Email Notification\"\n      focusId=\"email-notification\"\n      description={\n        <>\n          {result && !result.email && (\n            <Text as=\"span\" style={{ color: color.Critical.Main }} size=\"T200\">\n              Your account does not have any email attached.\n            </Text>\n          )}\n          {result && result.email && <>Send notification to your email. {`(\"${result.email}\")`}</>}\n          {result === null && (\n            <Text as=\"span\" style={{ color: color.Critical.Main }} size=\"T200\">\n              Unexpected Error!\n            </Text>\n          )}\n          {result === undefined && 'Send notification to your email.'}\n        </>\n      }\n      after={\n        <>\n          {setState.status !== AsyncStatus.Loading &&\n            typeof result === 'object' &&\n            result?.email && <Switch value={result.enabled} onChange={handleChange} />}\n          {(setState.status === AsyncStatus.Loading || result === undefined) && (\n            <Spinner variant=\"Secondary\" />\n          )}\n        </>\n      }\n    />\n  );\n}\n\nfunction labelTransportMode(mode: NotificationTransportMode): string {\n  switch (mode) {\n    case 'auto':\n      return 'Auto';\n    case 'unifiedpush':\n      return 'UnifiedPush';\n    case 'native':\n      return 'Native';\n    case 'web':\n      return 'Web';\n    default:\n      return mode;\n  }\n}\n\nfunction labelTransportKind(kind: BackgroundPushKind): string {\n  switch (kind) {\n    case 'web':\n      return 'Web Push';\n    case 'native':\n      return 'Native Push';\n    case 'unifiedpush':\n      return 'UnifiedPush';\n    default:\n      return kind;\n  }\n}\n\nfunction cleanPushTransportOverrides(overrides: PushTransportOverrides): PushTransportOverrides {\n  const next: PushTransportOverrides = {};\n  if (overrides.unifiedPushGatewayUrl?.trim()) {\n    next.unifiedPushGatewayUrl = overrides.unifiedPushGatewayUrl.trim();\n  }\n  if (overrides.unifiedPushAppID?.trim()) {\n    next.unifiedPushAppID = overrides.unifiedPushAppID.trim();\n  }\n  if (overrides.unifiedPushDistributor?.trim()) {\n    next.unifiedPushDistributor = overrides.unifiedPushDistributor.trim();\n  }\n  return next;\n}\n\nfunction NotificationTransportOverrideInput({\n  focusId,\n  title,\n  description,\n  name,\n  value,\n  placeholder,\n  onSave,\n}: {\n  focusId: string;\n  title: string;\n  description: string;\n  name: string;\n  value: string;\n  placeholder: string;\n  onSave: (value: string) => void;\n}) {\n  const [draftValue, setDraftValue] = useState(value);\n\n  useEffect(() => {\n    setDraftValue(value);\n  }, [value]);\n\n  const hasChanges = draftValue !== value;\n\n  const handleReset = () => {\n    setDraftValue(value);\n  };\n\n  const handleSubmit = (evt: FormEvent<HTMLFormElement>) => {\n    evt.preventDefault();\n    onSave(draftValue);\n  };\n\n  return (\n    <SettingTile title={title} focusId={focusId} description={description}>\n      <Box direction=\"Column\" grow=\"Yes\" gap=\"100\">\n        <Box as=\"form\" gap=\"200\" onSubmit={handleSubmit}>\n          <Box grow=\"Yes\" direction=\"Column\">\n            <Input\n              aria-label={title}\n              name={name}\n              radii=\"300\"\n              variant=\"Secondary\"\n              value={draftValue}\n              placeholder={placeholder}\n              onChange={(evt) => setDraftValue(evt.currentTarget.value)}\n              style={{ paddingRight: config.space.S200 }}\n              after={\n                hasChanges && (\n                  <IconButton\n                    size=\"300\"\n                    radii=\"300\"\n                    variant=\"Secondary\"\n                    type=\"reset\"\n                    title={`Reset ${title}`}\n                    onClick={handleReset}\n                  >\n                    <Icon src={Icons.Cross} size=\"100\" />\n                  </IconButton>\n                )\n              }\n            />\n          </Box>\n          <Button\n            size=\"400\"\n            variant={hasChanges ? 'Success' : 'Secondary'}\n            fill={hasChanges ? 'Solid' : 'Soft'}\n            outlined\n            radii=\"300\"\n            disabled={!hasChanges}\n            type=\"submit\"\n          >\n            <Text size=\"B400\">Save</Text>\n          </Button>\n        </Box>\n      </Box>\n    </SettingTile>\n  );\n}\n\nfunction labelUnifiedPushDistributorOption(distributor: string): string {\n  const lastSegment = distributor\n    .split(/[./]/)\n    .map((segment) => segment.trim())\n    .findLast(Boolean);\n\n  return lastSegment ?? distributor;\n}\n\nfunction BackgroundPushNotificationSetting() {\n  const mx = useMatrixClient();\n  const clientConfig = useClientConfig();\n  const pushTransportDefaults = {\n    unifiedPushGatewayUrl:\n      clientConfig.pushTransport?.unifiedPushGatewayUrl ??\n      clientConfig.pushNotificationDetails?.unifiedPushGatewayUrl,\n    unifiedPushAppID:\n      clientConfig.pushTransport?.unifiedPushAppID ??\n      clientConfig.pushNotificationDetails?.unifiedPushAppID,\n    unifiedPushDistributor: clientConfig.pushTransport?.unifiedPushDistributor,\n  };\n  const [backgroundPushEnabled, setBackgroundPushEnabled] = useSetting(\n    settingsAtom,\n    'backgroundPushEnabled'\n  );\n  const [backgroundPushProvider, setBackgroundPushProvider] = useSetting(\n    settingsAtom,\n    'backgroundPushProvider'\n  );\n  const [pushTransportMode, setPushTransportMode] = useSetting(settingsAtom, 'pushTransportMode');\n  const [pushTransportOverride, setPushTransportOverride] = useSetting(\n    settingsAtom,\n    'pushTransportOverride'\n  );\n  const [useRichPushPayloads] = useSetting(settingsAtom, 'useRichPushPayloads');\n  const [pushNotifyUrlOverride] = useSetting(settingsAtom, 'pushNotifyUrlOverride');\n  const pushSubAtom = useAtom(pushSubscriptionAtom);\n  const [upEndpoint, setUpEndpoint] = useAtom(unifiedPushEndpointAtom);\n  const unifiedPushStateRef = useRef<UnifiedPushState>(upEndpoint);\n  const [isLoading, setIsLoading] = useState<boolean>(true);\n  const [error, setError] = useState<string | null>(null);\n  const [selectedDistributor, setSelectedDistributor] = useState<string>(\n    pushTransportOverride.unifiedPushDistributor ?? ''\n  );\n  const [availableDistributors, setAvailableDistributors] = useState<string[]>([]);\n  const browserPermission = usePermissionState('notifications', getNotificationState());\n  const isTauriRuntime = isTauri();\n  const runtimePlatform = getBackgroundPushPlatform(isTauriRuntime);\n  const supportedModes = getSupportedNotificationTransportModes(runtimePlatform);\n  const selectedTransportMode = normalizeNotificationTransportMode(\n    pushTransportMode,\n    runtimePlatform\n  );\n  const preferredKind = resolvePreferredNotificationTransportProvider(\n    selectedTransportMode,\n    runtimePlatform\n  );\n  const effectiveKind = backgroundPushEnabled\n    ? (backgroundPushProvider ?? preferredKind)\n    : preferredKind;\n  const effectivePushTransport = mergePushConfig(pushTransportDefaults, pushTransportOverride);\n  const backgroundPushSupported = supportedModes.length > 0;\n  const showUnifiedPushSettings =\n    runtimePlatform === 'android' &&\n    (selectedTransportMode === 'auto' || selectedTransportMode === 'unifiedpush');\n  const nativePushConfigError =\n    effectiveKind === 'native' ? getNativePushConfigError(clientConfig) : null;\n  const modeOptions = supportedModes.map((mode) => ({\n    value: mode,\n    label: labelTransportMode(mode),\n  }));\n  const distributorOptions = Array.from(\n    new Set(\n      [selectedDistributor, ...availableDistributors].filter(\n        (distributor): distributor is string => distributor.trim().length > 0\n      )\n    )\n  ).map((distributor) => ({\n    value: distributor,\n    label: labelUnifiedPushDistributorOption(distributor),\n  }));\n\n  useEffect(() => {\n    unifiedPushStateRef.current = upEndpoint;\n  }, [upEndpoint]);\n\n  useEffect(() => {\n    if (runtimePlatform !== 'android') {\n      setAvailableDistributors([]);\n      setIsLoading(false);\n      return undefined;\n    }\n\n    let active = true;\n    loadUnifiedPushDistributorState()\n      .then((state) => {\n        if (!active) return;\n        setAvailableDistributors(state.distributors);\n        const overrideDistributor = pushTransportOverride.unifiedPushDistributor;\n        const nextDistributor = overrideDistributor || state.selectedDistributor;\n        if (nextDistributor) {\n          setSelectedDistributor(nextDistributor);\n          if (!overrideDistributor) {\n            setPushTransportOverride((current) =>\n              current.unifiedPushDistributor === nextDistributor\n                ? current\n                : {\n                    ...current,\n                    unifiedPushDistributor: nextDistributor,\n                  }\n            );\n          }\n        }\n      })\n      .catch((caughtError) => {\n        if (!active) return;\n        setError(normalizeErrorMessage(caughtError));\n      })\n      .finally(() => {\n        if (active) setIsLoading(false);\n      });\n\n    return () => {\n      active = false;\n    };\n  }, [runtimePlatform, pushTransportOverride.unifiedPushDistributor, setPushTransportOverride]);\n\n  const updatePushTransportOverride = (patch: Partial<PushTransportOverrides>) => {\n    setPushTransportOverride((current) =>\n      cleanPushTransportOverrides({\n        ...current,\n        ...patch,\n      })\n    );\n  };\n\n  const buildUnifiedPushTransportConfig = (): UnifiedPushTransportConfigInput => ({\n    unifiedPushGatewayUrl: effectivePushTransport.unifiedPushGatewayUrl,\n    unifiedPushAppID: effectivePushTransport.unifiedPushAppID,\n    vapidPublicKey: clientConfig.pushNotificationDetails?.vapidPublicKey,\n    webPushAppID: clientConfig.pushNotificationDetails?.webPushAppID,\n    pushNotifyUrl: clientConfig.pushNotificationDetails?.pushNotifyUrl,\n    useRichPushPayloads,\n    pushNotifyUrlOverride,\n  });\n\n  const buildRegisteredUnifiedPushState = (\n    registration: {\n      endpoint: string;\n      gatewayUrl?: string;\n      distributor?: string;\n    },\n    distributorOverride?: string\n  ): UnifiedPushState => ({\n    endpoint: registration.endpoint,\n    appId: effectivePushTransport.unifiedPushAppID?.trim() ?? DEFAULT_UNIFIED_PUSH_APP_ID,\n    gatewayUrl:\n      registration.gatewayUrl ?? effectivePushTransport.unifiedPushGatewayUrl?.trim() ?? undefined,\n    status: 'registered',\n    distributor: distributorOverride ?? registration.distributor,\n    permissionState: 'granted',\n  });\n\n  const setUnifiedPushEndpointState = (endpoint: UnifiedPushState) => {\n    unifiedPushStateRef.current = endpoint;\n    setUpEndpoint(endpoint);\n  };\n\n  const ensureConfiguredUnifiedPushDistributor = async (): Promise<string> => {\n    const distributor = await ensureUnifiedPushDistributorSelection(\n      availableDistributors,\n      selectedDistributor || effectivePushTransport.unifiedPushDistributor || ''\n    );\n\n    if (!distributor) {\n      return '';\n    }\n\n    setSelectedDistributor(distributor);\n    updatePushTransportOverride({ unifiedPushDistributor: distributor });\n    return distributor;\n  };\n\n  const activateTransport = async (kind: BackgroundPushKind | null) => {\n    if (!kind) {\n      throw new Error('Background push is not available on this platform.');\n    }\n\n    if (kind === 'web') {\n      if (browserPermission === 'prompt') {\n        const permissionResult = await requestBrowserNotificationPermission();\n        if (permissionResult !== 'granted') {\n          throw new Error('Browser notification permission was not granted.');\n        }\n      }\n      await enablePushNotifications(mx, clientConfig, pushSubAtom);\n      return;\n    }\n\n    if (kind === 'unifiedpush') {\n      const distributor = await ensureConfiguredUnifiedPushDistributor();\n      if (!distributor) {\n        throw new Error('No UnifiedPush distributor selected.');\n      }\n      const result = await enableUnifiedPush(mx, buildUnifiedPushTransportConfig());\n      setUnifiedPushEndpointState(\n        buildRegisteredUnifiedPushState(\n          {\n            ...result,\n          },\n          distributor\n        )\n      );\n      return;\n    }\n\n    if (nativePushConfigError) {\n      throw new Error(nativePushConfigError);\n    }\n\n    await enableNativePush(mx, clientConfig);\n  };\n\n  const deactivateTransport = async (kind: BackgroundPushKind | null) => {\n    if (!kind) return;\n\n    if (kind === 'web') {\n      await disablePushNotifications(mx, clientConfig, pushSubAtom);\n      return;\n    }\n\n    if (kind === 'unifiedpush') {\n      const currentUnifiedPushState = unifiedPushStateRef.current;\n      await disableUnifiedPush(mx, {\n        pushkey: currentUnifiedPushState?.endpoint,\n        config: {\n          unifiedPushAppID:\n            currentUnifiedPushState?.appId ?? effectivePushTransport.unifiedPushAppID,\n          webPushAppID: clientConfig.pushNotificationDetails?.webPushAppID,\n        },\n      });\n      setUnifiedPushEndpointState(null);\n      return;\n    }\n\n    await disableNativePush(mx, clientConfig);\n  };\n\n  const activateAndroidAutoTransport = async (): Promise<BackgroundPushKind> => {\n    const nativeFallback = async (failureReason: string): Promise<BackgroundPushKind> => {\n      const configError = getNativePushConfigError(clientConfig);\n      if (configError) {\n        throw new Error(`${failureReason} Native push fallback is unavailable: ${configError}`);\n      }\n\n      await activateTransport('native');\n      return 'native';\n    };\n\n    const distributor = await ensureConfiguredUnifiedPushDistributor();\n    if (!distributor) {\n      return nativeFallback('UnifiedPush is not configured.');\n    }\n\n    const result = await tryEnableUnifiedPush(mx, buildUnifiedPushTransportConfig());\n    if (result.status === 'registered') {\n      setUnifiedPushEndpointState(buildRegisteredUnifiedPushState(result));\n      return 'unifiedpush';\n    }\n\n    if (result.status === 'temp-unavailable') {\n      throw new Error(result.error);\n    }\n\n    return nativeFallback(result.error);\n  };\n\n  const activateMode = async (\n    mode: NotificationTransportMode,\n    currentKind: BackgroundPushKind | null\n  ): Promise<BackgroundPushKind | null> => {\n    const normalizedMode = normalizeNotificationTransportMode(mode, runtimePlatform);\n    const nextPreferredKind = resolvePreferredNotificationTransportProvider(\n      normalizedMode,\n      runtimePlatform\n    );\n\n    if (!nextPreferredKind) {\n      throw new Error('Selected transport is not available on this platform.');\n    }\n\n    if (normalizedMode === 'auto' && runtimePlatform === 'android') {\n      if (currentKind === 'unifiedpush') {\n        return 'unifiedpush';\n      }\n      return activateAndroidAutoTransport();\n    }\n\n    if (currentKind === nextPreferredKind) {\n      return currentKind;\n    }\n\n    await activateTransport(nextPreferredKind);\n    return nextPreferredKind;\n  };\n\n  const handleToggleBackgroundPush = async (wantsPush: boolean) => {\n    setIsLoading(true);\n    setError(null);\n    try {\n      if (!backgroundPushSupported) {\n        throw new Error('Background push is not available in the desktop Tauri build yet.');\n      }\n      if (wantsPush) {\n        const nextKind = await activateMode(selectedTransportMode, null);\n        setBackgroundPushProvider(nextKind);\n      } else {\n        await deactivateTransport(backgroundPushProvider ?? preferredKind);\n        setBackgroundPushProvider(null);\n      }\n      setBackgroundPushEnabled(wantsPush);\n    } catch (caughtError) {\n      setError(normalizeErrorMessage(caughtError));\n    } finally {\n      setIsLoading(false);\n    }\n  };\n\n  const handleModeChange = async (nextMode: NotificationTransportMode) => {\n    if (nextMode === selectedTransportMode) return;\n    setIsLoading(true);\n    setError(null);\n    const previousKind = backgroundPushEnabled ? (backgroundPushProvider ?? preferredKind) : null;\n\n    try {\n      if (backgroundPushEnabled) {\n        const plannedKind = resolvePreferredNotificationTransportProvider(\n          normalizeNotificationTransportMode(nextMode, runtimePlatform),\n          runtimePlatform\n        );\n        if (plannedKind !== previousKind) {\n          const nextKind = await switchBackgroundPushTransport({\n            previousKind,\n            activate: () => activateMode(nextMode, previousKind),\n            deactivate: deactivateTransport,\n            reactivate: activateTransport,\n          });\n          setBackgroundPushProvider(nextKind);\n        }\n      } else {\n        setBackgroundPushProvider(null);\n      }\n      setPushTransportMode(nextMode);\n    } catch (caughtError) {\n      setError(normalizeErrorMessage(caughtError));\n    } finally {\n      setIsLoading(false);\n    }\n  };\n\n  const handleDistributorChange = async (distributor: string) => {\n    if (distributor === selectedDistributor) return;\n    setIsLoading(true);\n    setError(null);\n    try {\n      const activeKind = backgroundPushEnabled ? (backgroundPushProvider ?? preferredKind) : null;\n      if (backgroundPushEnabled && activeKind === 'unifiedpush') {\n        const result = await switchUnifiedPushDistributorSelection(\n          distributor,\n          selectedDistributor,\n          () => enableUnifiedPush(mx, buildUnifiedPushTransportConfig())\n        );\n        setUnifiedPushEndpointState(\n          buildRegisteredUnifiedPushState(\n            {\n              ...result,\n            },\n            distributor\n          )\n        );\n      } else {\n        await setUnifiedPushDistributorSelection(distributor);\n      }\n      setSelectedDistributor(distributor);\n      updatePushTransportOverride({ unifiedPushDistributor: distributor });\n    } catch (caughtError) {\n      setError(normalizeErrorMessage(caughtError));\n    } finally {\n      setIsLoading(false);\n    }\n  };\n\n  const transportDescription = (() => {\n    if (error) {\n      return (\n        <Text as=\"span\" style={{ color: color.Critical.Main }} size=\"T200\">\n          {error}\n        </Text>\n      );\n    }\n\n    if (!backgroundPushSupported) {\n      return (\n        <Text as=\"span\" style={{ color: color.Warning.Main }} size=\"T200\">\n          Background push is not available in the desktop Tauri build yet.\n        </Text>\n      );\n    }\n\n    if (!backgroundPushEnabled) {\n      return 'Receive notifications when the app is closed or in the background.';\n    }\n\n    if (nativePushConfigError) {\n      return (\n        <Text as=\"span\" style={{ color: color.Warning.Main }} size=\"T200\">\n          {nativePushConfigError}\n        </Text>\n      );\n    }\n\n    if (browserPermission === 'denied' && effectiveKind === 'web') {\n      return (\n        <Text as=\"span\" style={{ color: color.Critical.Main }} size=\"T200\">\n          Permission blocked. Please allow notifications in your browser settings.\n        </Text>\n      );\n    }\n\n    if (!effectiveKind) {\n      return 'Receive notifications when the app is closed or in the background.';\n    }\n\n    return `Background push is using ${labelTransportKind(effectiveKind)}.`;\n  })();\n\n  const renderTransportToggle = () => {\n    if (isLoading) {\n      return <Spinner variant=\"Secondary\" />;\n    }\n\n    if (!backgroundPushSupported) {\n      return <Switch value={false} disabled />;\n    }\n\n    if (!backgroundPushEnabled && nativePushConfigError) {\n      return <Switch value={false} disabled />;\n    }\n\n    if (!backgroundPushEnabled && effectiveKind === 'web' && browserPermission === 'prompt') {\n      return (\n        <Button size=\"300\" radii=\"300\" onClick={() => handleToggleBackgroundPush(true)}>\n          <Text size=\"B300\">Enable</Text>\n        </Button>\n      );\n    }\n\n    return <Switch value={backgroundPushEnabled} onChange={handleToggleBackgroundPush} />;\n  };\n\n  return (\n    <>\n      <SettingTile\n        title=\"Background Push Notifications\"\n        focusId=\"background-push-notifications\"\n        description={transportDescription}\n        after={renderTransportToggle()}\n      />\n      {supportedModes.length > 2 && (\n        <SettingTile\n          title=\"Transport Mode\"\n          focusId=\"background-push-transport-mode\"\n          description={`Current mode: ${labelTransportMode(\n            selectedTransportMode\n          )}${effectiveKind ? ` (${labelTransportKind(effectiveKind)})` : ''}`}\n          after={\n            <SettingMenuSelector\n              value={selectedTransportMode}\n              options={modeOptions}\n              onSelect={handleModeChange}\n              loading={isLoading}\n            />\n          }\n        />\n      )}\n      {showUnifiedPushSettings && (\n        <>\n          <SettingTile\n            title=\"UnifiedPush Distributor\"\n            focusId=\"unified-push-distributor\"\n            description={selectedDistributor || 'Not selected. Pick a distributor such as ntfy.'}\n            after={\n              distributorOptions.length > 0 ? (\n                <SettingMenuSelector\n                  value={selectedDistributor}\n                  options={distributorOptions}\n                  onSelect={handleDistributorChange}\n                  loading={isLoading}\n                />\n              ) : undefined\n            }\n          >\n            {distributorOptions.length === 0 && (\n              <Text size=\"T300\" priority=\"300\">\n                No UnifiedPush distributors were detected yet.\n              </Text>\n            )}\n          </SettingTile>\n          <NotificationTransportOverrideInput\n            focusId=\"unified-push-gateway-url\"\n            title=\"UnifiedPush Gateway URL\"\n            description={`Default: ${pushTransportDefaults.unifiedPushGatewayUrl ?? 'none'}`}\n            name=\"unifiedPushGatewayUrl\"\n            value={pushTransportOverride.unifiedPushGatewayUrl ?? ''}\n            placeholder={pushTransportDefaults.unifiedPushGatewayUrl ?? 'https://gateway.example'}\n            onSave={(nextValue) =>\n              updatePushTransportOverride({ unifiedPushGatewayUrl: nextValue })\n            }\n          />\n          <NotificationTransportOverrideInput\n            focusId=\"unified-push-app-id\"\n            title=\"UnifiedPush App ID\"\n            description={`Default: ${pushTransportDefaults.unifiedPushAppID ?? 'none'}`}\n            name=\"unifiedPushAppID\"\n            value={pushTransportOverride.unifiedPushAppID ?? ''}\n            placeholder={pushTransportDefaults.unifiedPushAppID ?? 'moe.sable.up'}\n            onSave={(nextValue) => updatePushTransportOverride({ unifiedPushAppID: nextValue })}\n          />\n        </>\n      )}\n    </>\n  );\n}\n\nexport function SystemNotification() {\n  const [showInAppNotifs, setShowInAppNotifs] = useSetting(settingsAtom, 'useInAppNotifications');\n  const [showSystemNotifs, setShowSystemNotifs] = useSetting(\n    settingsAtom,\n    'useSystemNotifications'\n  );\n  const [isNotificationSounds, setIsNotificationSounds] = useSetting(\n    settingsAtom,\n    'isNotificationSounds'\n  );\n  const [showMessageContent, setShowMessageContent] = useSetting(\n    settingsAtom,\n    'showMessageContentInNotifications'\n  );\n  const [showEncryptedMessageContent, setShowEncryptedMessageContent] = useSetting(\n    settingsAtom,\n    'showMessageContentInEncryptedNotifications'\n  );\n  const [clearNotificationsOnRead, setClearNotificationsOnRead] = useSetting(\n    settingsAtom,\n    'clearNotificationsOnRead'\n  );\n  const [useRichPushPayloads, setUseRichPushPayloads] = useSetting(\n    settingsAtom,\n    'useRichPushPayloads'\n  );\n  const [showUnreadCounts, setShowUnreadCounts] = useSetting(settingsAtom, 'showUnreadCounts');\n  const [badgeCountDMsOnly, setBadgeCountDMsOnly] = useSetting(settingsAtom, 'badgeCountDMsOnly');\n  const [showPingCounts, setShowPingCounts] = useSetting(settingsAtom, 'showPingCounts');\n  const [faviconForMentionsOnly, setFaviconForMentionsOnly] = useSetting(\n    settingsAtom,\n    'faviconForMentionsOnly'\n  );\n  const [highlightMentions, setHighlightMentions] = useSetting(settingsAtom, 'highlightMentions');\n\n  // Describe what the current badge combo actually does so users aren't left guessing.\n  const badgeBehaviourSummary = (): string => {\n    const showDMs = badgeCountDMsOnly;\n    const showRooms = showUnreadCounts;\n    const showPings = showPingCounts;\n\n    if (showDMs && showRooms && showPings) {\n      return 'All unread messages—DMs, Rooms, and mentions—show a number count.';\n    }\n    if (!showDMs && !showRooms && !showPings) {\n      return 'Badges show a plain dot for all unread activity—no numbers displayed.';\n    }\n\n    if (showDMs && !showRooms && !showPings)\n      return 'Only Direct Messages show a number count. Rooms and mentions show a plain dot.';\n    if (!showDMs && showRooms && !showPings)\n      return 'Only Rooms and spaces show a number count. DMs and mentions show a plain dot.';\n    if (!showDMs && !showRooms && showPings)\n      return 'Only mentions and keywords show a number count. All other activity shows a plain dot.';\n\n    // Case 4: Exactly two are ON\n    if (showDMs && showRooms && !showPings)\n      return 'DMs and Rooms show a number count. Mentions show a plain dot.';\n    if (showDMs && !showRooms && showPings)\n      return 'DMs and mentions show a number count. Rooms and spaces show a plain dot.';\n    if (!showDMs && showRooms && showPings)\n      return 'Rooms and mentions show a number count. Direct Messages show a plain dot.';\n\n    return ''; // Fallback\n  };\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">System & Notifications</Text>\n      <SettingToggle\n        title=\"In-App Notifications\"\n        focusId=\"in-app-notifications\"\n        description=\"Show a notification banner inside the app when a message arrives.\"\n        value={showInAppNotifs}\n        onChange={setShowInAppNotifs}\n      />\n      {(!isMobileOrTablet() || isIosTauri()) && (\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"400\"\n        >\n          <SettingTile\n            title=\"System Notifications\"\n            focusId=\"system-notifications\"\n            description=\"Show an OS-level notification banner when a message arrives while the app is open.\"\n            after={<Switch value={showSystemNotifs} onChange={setShowSystemNotifs} />}\n          />\n        </SequenceCard>\n      )}\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <BackgroundPushNotificationSetting />\n      </SequenceCard>\n      <SettingToggle\n        title=\"In-App Notification Sound\"\n        focusId=\"in-app-notification-sound\"\n        description=\"Play a sound inside the app when a new message arrives.\"\n        value={isNotificationSounds}\n        onChange={setIsNotificationSounds}\n      />\n      <SettingToggle\n        title=\"Show Message Content\"\n        focusId=\"show-message-content\"\n        description=\"Include message text in notification bodies.\"\n        value={showMessageContent}\n        onChange={setShowMessageContent}\n      />\n      <SettingToggle\n        title=\"Show Encrypted Message Content\"\n        focusId=\"show-encrypted-message-content\"\n        description=\"Allow message text from encrypted rooms in notification bodies. May not work on some platforms due to technical limitations.\"\n        value={showEncryptedMessageContent}\n        onChange={setShowEncryptedMessageContent}\n        disabled={!showMessageContent}\n      />\n      <SettingToggle\n        title=\"Rich Push Payloads\"\n        focusId=\"rich-push-payloads\"\n        description=\"Include message content in push payloads for faster notifications. Your push gateway can see unencrypted message text.\"\n        value={useRichPushPayloads}\n        onChange={setUseRichPushPayloads}\n      />\n      <SettingToggle\n        title=\"Clear Notifications When Read Elsewhere\"\n        focusId=\"clear-notifications-when-read-elsewhere\"\n        description=\"Automatically dismiss notifications on this device when you read messages on another device.\"\n        value={clearNotificationsOnRead}\n        onChange={setClearNotificationsOnRead}\n      />\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <EmailNotification />\n      </SequenceCard>\n\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <DeregisterAllPushersSetting />\n      </SequenceCard>\n\n      <Text size=\"L400\" style={{ paddingTop: config.space.S700 }}>\n        Badges\n      </Text>\n      <Text size=\"T300\" style={{ opacity: 0.7 }}>\n        {badgeBehaviourSummary()}\n      </Text>\n      <SettingToggle\n        title=\"Favicon Dot: Mentions Only\"\n        focusId=\"favicon-dot-mentions-only\"\n        description=\"Only change the browser tab favicon when you have mentions or keywords. Unreads without mentions won't affect the favicon.\"\n        value={faviconForMentionsOnly}\n        onChange={setFaviconForMentionsOnly}\n      />\n      <SettingToggle\n        title=\"Show Room Counts\"\n        focusId=\"show-room-counts\"\n        description=\"Displays a number for unread activity in Rooms and Spaces.\"\n        value={showUnreadCounts}\n        onChange={setShowUnreadCounts}\n      />\n      <SettingToggle\n        title=\"Show DM Counts\"\n        focusId=\"show-dm-counts\"\n        description=\"Displays a number for unread Direct Messages.\"\n        value={badgeCountDMsOnly}\n        onChange={setBadgeCountDMsOnly}\n      />\n      <SettingToggle\n        title=\"Show Mention Counts\"\n        focusId=\"show-mention-counts\"\n        description=\"Displays a number for mentions and keyword alerts.\"\n        value={showPingCounts}\n        onChange={setShowPingCounts}\n      />\n      <SettingToggle\n        title=\"Highlight Mentions\"\n        focusId=\"highlight-mentions\"\n        description=\"Highlight the full background message when it contains a mention/keyword.\"\n        value={highlightMentions}\n        onChange={setHighlightMentions}\n      />\n    </Box>\n  );\n}\n","import type { MouseEventHandler } from 'react';\nimport { useState } from 'react';\nimport type { RectCords } from 'folds';\nimport { Box, config, Header, IconButton, Menu, Text } from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { Info, menuIcon } from '$components/icons/phosphor';\nimport FocusTrap from 'focus-trap-react';\nimport { stopPropagation } from '$utils/keyboard';\n\nexport function NotificationLevelsHint() {\n  const [anchor, setAnchor] = useState<RectCords>();\n\n  const handleOpen: MouseEventHandler<HTMLElement> = (evt) => {\n    setAnchor(evt.currentTarget.getBoundingClientRect());\n  };\n\n  const itemPadding = { padding: config.space.S200, paddingTop: 0 };\n\n  return (\n    <PopOut\n      anchor={anchor}\n      position=\"Bottom\"\n      align=\"End\"\n      content={\n        <FocusTrap\n          focusTrapOptions={{\n            initialFocus: false,\n            onDeactivate: () => setAnchor(undefined),\n            clickOutsideDeactivates: true,\n            escapeDeactivates: stopPropagation,\n          }}\n        >\n          <Menu style={{ maxWidth: '280px' }}>\n            <Header size=\"300\" style={{ padding: `0 ${config.space.S200}` }}>\n              <Text size=\"L400\">Notification Levels</Text>\n            </Header>\n            <Box direction=\"Column\" style={itemPadding} gap=\"300\" tabIndex={0}>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Disable</Text>\n                <Text size=\"T300\" priority=\"300\">\n                  The rule is muted. No notifications of any kind.\n                </Text>\n              </Box>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Notify Silent</Text>\n                <Text size=\"T300\" priority=\"300\">\n                  Visual notification (badge and banner) when a relevant message arrives. No sound.\n                </Text>\n              </Box>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Notify Loud</Text>\n                <Text size=\"T300\" priority=\"300\">\n                  Visual highlight plus sound. Respects the Notification Sound setting above, and\n                  triggers sound and vibration on mobile push.\n                </Text>\n              </Box>\n            </Box>\n          </Menu>\n        </FocusTrap>\n      }\n    >\n      <IconButton\n        onClick={handleOpen}\n        type=\"button\"\n        variant=\"Secondary\"\n        size=\"300\"\n        radii=\"300\"\n        aria-pressed={!!anchor}\n      >\n        {menuIcon(Info, { style: { opacity: config.opacity.P300 } })}\n      </IconButton>\n    </PopOut>\n  );\n}\n","import type {\n  IPushRule,\n  IPushRules,\n  PushRuleAction,\n  PushRuleCondition,\n  RuleId,\n} from '$types/matrix-sdk';\nimport { PushRuleKind } from '$types/matrix-sdk';\nimport { useMemo } from 'react';\n\nexport type PushRuleData = {\n  kind: PushRuleKind;\n  pushRule: IPushRule;\n};\n\nexport const makePushRuleData = (\n  kind: PushRuleKind,\n  ruleId: RuleId,\n  actions: PushRuleAction[],\n  conditions?: PushRuleCondition[],\n  pattern?: string,\n  enabled?: boolean,\n  _default?: boolean\n): PushRuleData => ({\n  kind,\n  pushRule: {\n    rule_id: ruleId,\n    default: _default ?? true,\n    enabled: enabled ?? true,\n    pattern,\n    conditions,\n    actions,\n  },\n});\n\nconst orderedPushRuleKinds: PushRuleKind[] = [\n  PushRuleKind.Override,\n  PushRuleKind.ContentSpecific,\n  PushRuleKind.RoomSpecific,\n  PushRuleKind.SenderSpecific,\n  PushRuleKind.Underride,\n];\n\nconst getPushRule = (pushRules: IPushRules, ruleId: RuleId | string): PushRuleData | undefined => {\n  const { global } = pushRules;\n\n  let ruleData: PushRuleData | undefined;\n\n  orderedPushRuleKinds.some((kind) => {\n    const rules = global[kind];\n    const pushRule = rules?.find((r) => r.rule_id === ruleId);\n    if (pushRule) {\n      ruleData = {\n        kind,\n        pushRule,\n      };\n      return true;\n    }\n    return false;\n  });\n\n  return ruleData;\n};\n\nexport const usePushRule = (\n  pushRules: IPushRules,\n  ruleId: RuleId | string\n): PushRuleData | undefined => useMemo(() => getPushRule(pushRules, ruleId), [pushRules, ruleId]);\n","import { type SettingMenuOption } from '$components/setting-menu-selector';\nimport { NotificationMode } from '$hooks/useNotificationMode';\n\nexport const notificationModeSelectorOptions: SettingMenuOption<NotificationMode>[] = [\n  { value: NotificationMode.NotifyLoud, label: 'Notify Loud' },\n  { value: NotificationMode.Notify, label: 'Notify Silent' },\n  { value: NotificationMode.OFF, label: 'Disable' },\n];\n","import { useCallback } from 'react';\nimport type { IPushRules, RuleId } from '$types/matrix-sdk';\nimport { type PushRuleData, usePushRule } from '$hooks/usePushRule';\nimport {\n  type NotificationMode,\n  type NotificationModeOptions,\n  useNotificationActionsMode,\n  useNotificationModeActions,\n} from '$hooks/useNotificationMode';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { SettingMenuSelector } from '$components/setting-menu-selector';\nimport { notificationModeSelectorOptions } from './notificationModeOptions';\n\nexport type NotificationModeSwitcherProps = {\n  ruleId: RuleId;\n  pushRules: IPushRules;\n  defaultPushRuleData: PushRuleData;\n  modeOptions?: NotificationModeOptions;\n};\n\nexport function NotificationModeSwitcher({\n  ruleId,\n  pushRules,\n  defaultPushRuleData,\n  modeOptions,\n}: NotificationModeSwitcherProps) {\n  const mx = useMatrixClient();\n  const { kind, pushRule } = usePushRule(pushRules, ruleId) ?? defaultPushRuleData;\n  const getModeActions = useNotificationModeActions(modeOptions);\n  const selectedMode = useNotificationActionsMode(pushRule.actions);\n  const [changeState, change] = useAsyncCallback(\n    useCallback(\n      async (mode: NotificationMode) => {\n        const actions = getModeActions(mode);\n        await mx.setPushRuleActions('global', kind, ruleId, actions);\n      },\n      [mx, getModeActions, kind, ruleId]\n    )\n  );\n\n  return (\n    <SettingMenuSelector\n      value={selectedMode}\n      options={notificationModeSelectorOptions}\n      onSelect={change}\n      loading={changeState.status === AsyncStatus.Loading}\n    />\n  );\n}\n","import { useMemo } from 'react';\nimport { Badge, Box, Text } from 'folds';\nimport type { IPushRules, PushRuleCondition } from '$types/matrix-sdk';\nimport { ConditionKind, PushRuleKind, RuleId, EventType } from '$types/matrix-sdk';\nimport { useAccountData } from '$hooks/useAccountData';\n\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport type { PushRuleData } from '$hooks/usePushRule';\nimport { getNotificationModeActions, NotificationMode } from '$hooks/useNotificationMode';\nimport { NotificationLevelsHint } from './NotificationLevelsHint';\nimport { NotificationModeSwitcher } from './NotificationModeSwitcher';\n\nconst getAllMessageDefaultRule = (\n  ruleId: RuleId,\n  encrypted: boolean,\n  oneToOne: boolean\n): PushRuleData => {\n  const conditions: PushRuleCondition[] = [];\n  if (oneToOne)\n    conditions.push({\n      kind: ConditionKind.RoomMemberCount,\n      is: '2',\n    });\n  conditions.push({\n    kind: ConditionKind.EventMatch,\n    key: 'type',\n    pattern: encrypted ? EventType.RoomMessageEncrypted : EventType.RoomMessage,\n  });\n\n  return {\n    kind: PushRuleKind.Underride,\n    pushRule: {\n      rule_id: ruleId,\n      default: true,\n      enabled: true,\n      conditions,\n      actions: getNotificationModeActions(NotificationMode.NotifyLoud),\n    },\n  };\n};\n\ntype AllMessagesSwitcherProps = {\n  ruleId: RuleId.DM | RuleId.EncryptedDM | RuleId.Message | RuleId.EncryptedMessage;\n  pushRules: IPushRules;\n  encrypted?: boolean;\n  oneToOne?: boolean;\n};\nfunction AllMessagesModeSwitcher({\n  ruleId,\n  pushRules,\n  encrypted = false,\n  oneToOne = false,\n}: AllMessagesSwitcherProps) {\n  const defaultPushRuleData = getAllMessageDefaultRule(ruleId, encrypted, oneToOne);\n  return (\n    <NotificationModeSwitcher\n      ruleId={ruleId}\n      pushRules={pushRules}\n      defaultPushRuleData={defaultPushRuleData}\n    />\n  );\n}\n\nexport function AllMessagesNotifications() {\n  const pushRulesEvt = useAccountData(EventType.PushRules);\n  const pushRules = useMemo(\n    () => pushRulesEvt?.getContent<IPushRules>() ?? { global: {} },\n    [pushRulesEvt]\n  );\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\" gap=\"200\">\n        <Text size=\"L400\">All Messages</Text>\n        <Box gap=\"100\" alignItems=\"Center\">\n          <NotificationLevelsHint />\n          <Text size=\"T200\">Badge: </Text>\n          <Badge radii=\"300\" variant=\"Secondary\" fill=\"Solid\">\n            <Text size=\"L400\">1</Text>\n          </Badge>\n        </Box>\n      </Box>\n      <Text size=\"T300\" priority=\"300\">\n        Default notification level for all messages in rooms where no per-room override is set.\n      </Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Direct Messages\"\n          focusId=\"direct-messages\"\n          description=\"Includes 1-to-1, group DMs, and bridged conversations.\"\n          after={<AllMessagesModeSwitcher pushRules={pushRules} ruleId={RuleId.DM} oneToOne />}\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Direct Messages (Encrypted)\"\n          focusId=\"direct-messages-encrypted\"\n          description=\"Includes 1-to-1, group DMs, and bridged conversations.\"\n          after={\n            <AllMessagesModeSwitcher\n              pushRules={pushRules}\n              ruleId={RuleId.EncryptedDM}\n              encrypted\n              oneToOne\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Rooms\"\n          focusId=\"rooms\"\n          after={<AllMessagesModeSwitcher pushRules={pushRules} ruleId={RuleId.Message} />}\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Rooms (Encrypted)\"\n          focusId=\"rooms-encrypted\"\n          after={\n            <AllMessagesModeSwitcher\n              pushRules={pushRules}\n              ruleId={RuleId.EncryptedMessage}\n              encrypted\n            />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import { useMemo } from 'react';\nimport type { IPushRules } from '$types/matrix-sdk';\nimport { ConditionKind, PushRuleKind, RuleId, EventType } from '$types/matrix-sdk';\nimport { Box, Text, Badge } from 'folds';\nimport { useAccountData } from '$hooks/useAccountData';\n\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useUserProfile } from '$hooks/useUserProfile';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport type { PushRuleData } from '$hooks/usePushRule';\nimport { makePushRuleData } from '$hooks/usePushRule';\nimport { getNotificationModeActions, NotificationMode } from '$hooks/useNotificationMode';\nimport { NotificationLevelsHint } from './NotificationLevelsHint';\nimport { NotificationModeSwitcher } from './NotificationModeSwitcher';\n\nconst NOTIFY_MODE_OPS = {\n  highlight: true,\n};\nconst getDefaultIsUserMention = (userId: string): PushRuleData =>\n  makePushRuleData(\n    PushRuleKind.Override,\n    RuleId.IsUserMention,\n    getNotificationModeActions(NotificationMode.NotifyLoud, { highlight: true }),\n    [\n      {\n        kind: ConditionKind.EventPropertyContains,\n        key: 'content.m\\\\.mentions.user_ids',\n        value: userId,\n      },\n    ]\n  );\n\nconst DefaultContainsDisplayName = makePushRuleData(\n  PushRuleKind.Override,\n  RuleId.ContainsDisplayName,\n  getNotificationModeActions(NotificationMode.NotifyLoud, { highlight: true }),\n  [\n    {\n      kind: ConditionKind.ContainsDisplayName,\n    },\n  ]\n);\n\nconst getDefaultContainsUsername = (username: string) =>\n  makePushRuleData(\n    PushRuleKind.ContentSpecific,\n    RuleId.ContainsUserName,\n    getNotificationModeActions(NotificationMode.NotifyLoud, { highlight: true }),\n    undefined,\n    username\n  );\n\nconst DefaultIsRoomMention = makePushRuleData(\n  PushRuleKind.Override,\n  RuleId.IsRoomMention,\n  getNotificationModeActions(NotificationMode.Notify, { highlight: true }),\n  [\n    {\n      kind: ConditionKind.EventPropertyIs,\n      key: 'content.m\\\\.mentions.room',\n      value: true,\n    },\n    {\n      kind: ConditionKind.SenderNotificationPermission,\n      key: 'room',\n    },\n  ]\n);\n\nconst DefaultAtRoomNotification = makePushRuleData(\n  PushRuleKind.Override,\n  RuleId.AtRoomNotification,\n  getNotificationModeActions(NotificationMode.Notify, { highlight: true }),\n  [\n    {\n      kind: ConditionKind.EventMatch,\n      key: 'content.body',\n      pattern: '@room',\n    },\n    {\n      kind: ConditionKind.SenderNotificationPermission,\n      key: 'room',\n    },\n  ]\n);\n\ntype PushRulesProps = {\n  ruleId: RuleId;\n  pushRules: IPushRules;\n  defaultPushRuleData: PushRuleData;\n};\nfunction MentionModeSwitcher({ ruleId, pushRules, defaultPushRuleData }: PushRulesProps) {\n  return (\n    <NotificationModeSwitcher\n      ruleId={ruleId}\n      pushRules={pushRules}\n      defaultPushRuleData={defaultPushRuleData}\n      modeOptions={NOTIFY_MODE_OPS}\n    />\n  );\n}\n\nexport function SpecialMessagesNotifications() {\n  const mx = useMatrixClient();\n  const userId = mx.getUserId()!;\n  const { displayName } = useUserProfile(userId);\n  const pushRulesEvt = useAccountData(EventType.PushRules);\n  const pushRules = useMemo(\n    () => pushRulesEvt?.getContent<IPushRules>() ?? { global: {} },\n    [pushRulesEvt]\n  );\n  const intentionalMentions = mx.supportsIntentionalMentions();\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\" gap=\"200\">\n        <Text size=\"L400\">Special Messages</Text>\n        <Box gap=\"100\" alignItems=\"Center\">\n          <NotificationLevelsHint />\n          <Text size=\"T200\">Badge: </Text>\n          <Badge radii=\"300\" variant=\"Success\" fill=\"Solid\">\n            <Text size=\"L400\">1</Text>\n          </Badge>\n        </Box>\n      </Box>\n      <Text size=\"T300\" priority=\"300\">\n        Overrides the All Messages level for messages that mention you or match a keyword.\n      </Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title={`Mention User ID (\"${userId}\")`}\n          focusId=\"mention-user-id\"\n          after={\n            <MentionModeSwitcher\n              pushRules={pushRules}\n              ruleId={RuleId.IsUserMention}\n              defaultPushRuleData={getDefaultIsUserMention(userId)}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title={`Contains Displayname ${displayName ? `(\"${displayName}\")` : ''}`}\n          focusId=\"contains-display-name\"\n          after={\n            <MentionModeSwitcher\n              pushRules={pushRules}\n              ruleId={RuleId.ContainsDisplayName}\n              defaultPushRuleData={DefaultContainsDisplayName}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title={`Contains Username (\"${getMxIdLocalPart(userId)}\")`}\n          focusId=\"contains-username\"\n          after={\n            <MentionModeSwitcher\n              pushRules={pushRules}\n              ruleId={RuleId.ContainsUserName}\n              defaultPushRuleData={getDefaultContainsUsername(getMxIdLocalPart(userId) ?? userId)}\n            />\n          }\n        />\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Mention @room\"\n          focusId=\"mention-room\"\n          description=\"Only triggers if the sender has permission to notify the whole room.\"\n          after={\n            intentionalMentions ? (\n              <MentionModeSwitcher\n                pushRules={pushRules}\n                ruleId={RuleId.IsRoomMention}\n                defaultPushRuleData={DefaultIsRoomMention}\n              />\n            ) : (\n              <MentionModeSwitcher\n                pushRules={pushRules}\n                ruleId={RuleId.AtRoomNotification}\n                defaultPushRuleData={DefaultAtRoomNotification}\n              />\n            )\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","import type { ChangeEventHandler, FormEventHandler } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport type { IPushRule, IPushRules } from '$types/matrix-sdk';\nimport { PushRuleKind, EventType } from '$types/matrix-sdk';\nimport { Box, Text, Badge, Button, Input, config, IconButton, Spinner } from 'folds';\nimport { menuIcon, X } from '$components/icons/phosphor';\nimport { useAccountData } from '$hooks/useAccountData';\n\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { SettingMenuSelector } from '$components/setting-menu-selector';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { toSettingsFocusIdPart } from '$features/settings/settingsLink';\nimport type { NotificationModeOptions } from '$hooks/useNotificationMode';\nimport {\n  getNotificationModeActions,\n  NotificationMode,\n  useNotificationActionsMode,\n  useNotificationModeActions,\n} from '$hooks/useNotificationMode';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { NotificationLevelsHint } from './NotificationLevelsHint';\nimport { notificationModeSelectorOptions } from './notificationModeOptions';\n\nconst NOTIFY_MODE_OPS: NotificationModeOptions = {\n  highlight: true,\n};\n\nfunction KeywordInput() {\n  const mx = useMatrixClient();\n  const [keyword, setKeyword] = useState('');\n\n  const [keywordState, addKeyword] = useAsyncCallback(\n    useCallback(\n      async (k: string) => {\n        mx.addPushRule('global', PushRuleKind.ContentSpecific, k, {\n          actions: getNotificationModeActions(NotificationMode.Notify, NOTIFY_MODE_OPS),\n          pattern: k,\n        });\n        setKeyword('');\n      },\n      [mx]\n    )\n  );\n  const addingKeyword = keywordState.status === AsyncStatus.Loading;\n\n  const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const k = evt.currentTarget.value;\n    setKeyword(k);\n  };\n\n  const handleReset = () => {\n    setKeyword('');\n  };\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    if (addingKeyword) return;\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const keywordInput = target?.keywordInput as HTMLInputElement | undefined;\n    const k = keywordInput?.value.trim();\n    if (!k) return;\n\n    addKeyword(k);\n  };\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} gap=\"200\" aria-disabled={addingKeyword}>\n      <Box grow=\"Yes\" direction=\"Column\">\n        <Input\n          required\n          name=\"keywordInput\"\n          value={keyword}\n          onChange={handleChange}\n          variant=\"Secondary\"\n          radii=\"300\"\n          style={{ paddingRight: config.space.S200 }}\n          readOnly={addingKeyword}\n          after={\n            keyword &&\n            !addingKeyword && (\n              <IconButton\n                type=\"reset\"\n                onClick={handleReset}\n                size=\"300\"\n                radii=\"300\"\n                variant=\"Secondary\"\n              >\n                {menuIcon(X)}\n              </IconButton>\n            )\n          }\n        />\n      </Box>\n      <Button\n        size=\"400\"\n        variant=\"Secondary\"\n        fill=\"Soft\"\n        outlined\n        radii=\"300\"\n        type=\"submit\"\n        disabled={addingKeyword}\n      >\n        {addingKeyword && <Spinner variant=\"Secondary\" size=\"300\" />}\n        <Text size=\"B400\">Save</Text>\n      </Button>\n    </Box>\n  );\n}\n\ntype PushRulesProps = {\n  pushRule: IPushRule;\n};\n\nfunction KeywordCross({ pushRule }: PushRulesProps) {\n  const mx = useMatrixClient();\n  const [removeState, remove] = useAsyncCallback(\n    useCallback(\n      () => mx.deletePushRule('global', PushRuleKind.ContentSpecific, pushRule.rule_id),\n      [mx, pushRule]\n    )\n  );\n\n  const removing = removeState.status === AsyncStatus.Loading;\n  return (\n    <IconButton onClick={remove} size=\"300\" radii=\"Pill\" variant=\"Secondary\" disabled={removing}>\n      {removing ? <Spinner size=\"100\" /> : menuIcon(X)}\n    </IconButton>\n  );\n}\n\nfunction KeywordModeSwitcher({ pushRule }: PushRulesProps) {\n  const mx = useMatrixClient();\n\n  const getModeActions = useNotificationModeActions(NOTIFY_MODE_OPS);\n  const selectedMode = useNotificationActionsMode(pushRule.actions);\n  const [changeState, change] = useAsyncCallback(\n    useCallback(\n      async (mode: NotificationMode) => {\n        const actions = getModeActions(mode);\n        await mx.setPushRuleActions(\n          'global',\n          PushRuleKind.ContentSpecific,\n          pushRule.rule_id,\n          actions\n        );\n      },\n      [mx, getModeActions, pushRule]\n    )\n  );\n\n  return (\n    <SettingMenuSelector\n      value={selectedMode}\n      options={notificationModeSelectorOptions}\n      onSelect={change}\n      loading={changeState.status === AsyncStatus.Loading}\n    />\n  );\n}\n\nexport function KeywordMessagesNotifications() {\n  const pushRulesEvt = useAccountData(EventType.PushRules);\n  const pushRules = useMemo(\n    () => pushRulesEvt?.getContent<IPushRules>() ?? { global: {} },\n    [pushRulesEvt]\n  );\n\n  const keywordPushRules = useMemo(() => {\n    const content = pushRules.global.content ?? [];\n    return content.filter((pushRule) => !pushRule.default && typeof pushRule.pattern === 'string');\n  }, [pushRules]);\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Box alignItems=\"Center\" justifyContent=\"SpaceBetween\" gap=\"200\">\n        <Text size=\"L400\">Keyword Messages</Text>\n        <Box gap=\"100\" alignItems=\"Center\">\n          <NotificationLevelsHint />\n          <Text size=\"T200\">Badge: </Text>\n          <Badge radii=\"300\" variant=\"Success\" fill=\"Solid\">\n            <Text size=\"L400\">1</Text>\n          </Badge>\n        </Box>\n      </Box>\n      <Text size=\"T300\" priority=\"300\">\n        Custom keywords that trigger notifications when matched in a message body.\n      </Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Select Keyword\"\n          focusId=\"select-keyword\"\n          description=\"Set a notification preference for message containing given keyword.\"\n        >\n          <KeywordInput />\n        </SettingTile>\n      </SequenceCard>\n      {keywordPushRules.map((pushRule) => (\n        <SequenceCard\n          key={pushRule.rule_id}\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"400\"\n        >\n          <SettingTile\n            title={`\"${pushRule.pattern}\"`}\n            focusId={`keyword-${toSettingsFocusIdPart(\n              pushRule.pattern ?? pushRule.rule_id ?? 'custom-keyword'\n            )}`}\n            showSettingLinkAction={false}\n            before={<KeywordCross pushRule={pushRule} />}\n            after={<KeywordModeSwitcher pushRule={pushRule} />}\n          />\n        </SequenceCard>\n      ))}\n    </Box>\n  );\n}\n","import { Box, Scroll } from 'folds';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SystemNotification } from './SystemNotification';\nimport { AllMessagesNotifications } from './AllMessages';\nimport { SpecialMessagesNotifications } from './SpecialMessages';\nimport { KeywordMessagesNotifications } from './KeywordMessages';\n\ntype NotificationsProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\nexport function Notifications({ requestBack, requestClose }: NotificationsProps) {\n  return (\n    <SettingsSectionPage\n      title=\"Notifications\"\n      requestBack={requestBack}\n      requestClose={requestClose}\n    >\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <SystemNotification />\n              <AllMessagesNotifications />\n              <SpecialMessagesNotifications />\n              <KeywordMessagesNotifications />\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { color, Box, Text, Avatar, Chip } from 'folds';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { useCallback, useMemo } from 'react';\nimport { nameInitials } from '$utils/common';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { UserAvatar } from '$components/user-avatar';\nimport type { PronounSet } from '$utils/pronouns';\nimport { SettingTile } from '$components/setting-tile';\nimport { toSettingsFocusIdPart } from '../settingsLink';\nimport { Pronouns } from '$features/room/message';\nimport { ThemeKind, useActiveTheme } from '$hooks/useTheme';\n\n/**\n * the props we use for the per-message profile list item, which is used to display a per-message profile. This is used in the settings page when the user wants to view all of their profiles.\n */\ntype PerMessageProfileListItemProps = {\n  mx: MatrixClient;\n  profileId: string;\n  avatarMxcUrl?: string;\n  displayName?: string;\n  nameColorLight?: string;\n  nameColorDark?: string;\n  pronouns?: PronounSet[];\n  onOpenEditor: (profileId: string) => void;\n};\n\nexport function PerMessageProfileListItem({\n  mx,\n  profileId,\n  avatarMxcUrl,\n  displayName,\n  pronouns = Array<PronounSet>(),\n  nameColorLight,\n  nameColorDark,\n  onOpenEditor,\n}: Readonly<PerMessageProfileListItemProps>) {\n  const useAuthentication = useMediaAuthentication();\n  const activeTheme = useActiveTheme();\n  const nameColor = useMemo(\n    () => (activeTheme.kind === ThemeKind.Dark ? nameColorDark : nameColorLight),\n    [activeTheme, nameColorLight, nameColorDark]\n  );\n\n  const avatarUrl = useMemo(() => {\n    if (avatarMxcUrl) {\n      return mxcUrlToHttp(mx, avatarMxcUrl, useAuthentication, 96, 96, 'crop') ?? undefined;\n    }\n    return undefined;\n  }, [avatarMxcUrl, mx, useAuthentication]);\n\n  const handleOpenEditor = useCallback(() => onOpenEditor(profileId), [profileId, onOpenEditor]);\n\n  return (\n    <SettingTile\n      focusId={`persona-${toSettingsFocusIdPart(profileId)}`}\n      showSettingLinkAction={false}\n      title={\n        <Text style={{ color: nameColor ?? undefined }}>\n          {displayName ?? 'Unnamed Profile'}\n          <Pronouns pronouns={pronouns} tagColor={nameColor ?? color.Primary.Main} />\n        </Text>\n      }\n      description={profileId}\n      before={\n        <Avatar\n          size=\"300\"\n          radii=\"300\"\n          style={{\n            width: 'clamp(25px, 8vw, 50px)',\n            height: 'clamp(25px, 8vw, 50px)',\n            minWidth: 48,\n            minHeight: 48,\n            maxWidth: 72,\n            maxHeight: 72,\n          }}\n          aria-label=\"Profile avatar\"\n        >\n          <UserAvatar\n            userId={profileId}\n            src={avatarUrl}\n            fallbackColor={nameColorLight}\n            renderFallback={() => (\n              <Box>\n                <Text size=\"H4\" aria-label=\"Avatar fallback\">\n                  {nameInitials(displayName ?? '?')}\n                </Text>\n              </Box>\n            )}\n            alt={`Avatar for profile ${profileId}`}\n          />\n        </Avatar>\n      }\n      after={\n        <Chip variant=\"Secondary\" radii=\"Pill\" onClick={handleOpenEditor}>\n          <Text size=\"B300\">Edit</Text>\n        </Chip>\n      }\n    ></SettingTile>\n  );\n}\n","import { uploadContent } from '$app/utils/matrix';\nimport type { MatrixClient, MatrixError } from '$types/matrix-sdk';\nimport { getParsedPronouns } from '$utils/pronouns';\nimport type { ProfileCatalog } from './catalog';\nimport { convertPluralkitFormatToOurPerMessageProfile } from './projection';\n\n/** Used for PluralKit import */\nexport type PerMessageProfilePluralkitFormat = {\n  id: string;\n  uuid?: string;\n  name: string;\n  display_name?: string;\n  color?: string;\n  pronouns?: string;\n  avatar_url?: string;\n  description?: string;\n  proxy_tags?: { prefix: string | null; suffix: string | null }[];\n};\n\nexport async function fetchPkitAvatar(mx: MatrixClient, url: string): Promise<string> {\n  const req = await fetch(url);\n  if (!req.ok) throw new Error(`Fetch request to ${url} failed with code ${req.status}.`);\n\n  const content = await req.blob();\n  const uploadFile = new File([content], 'filename');\n\n  return new Promise((resolve, reject) => {\n    uploadContent(mx, uploadFile, {\n      onSuccess: resolve,\n      onError: function (error: MatrixError): void {\n        reject(error);\n      },\n    });\n  });\n}\n\nexport type PkImportOptions = {\n  extractPronouns?: boolean;\n};\n\nexport async function mergePluralkitProfile(\n  mx: MatrixClient,\n  catalog: ProfileCatalog,\n  pkPersona: PerMessageProfilePluralkitFormat,\n  options?: PkImportOptions\n): Promise<void> {\n  const personas = await catalog.list({ migrate: false });\n\n  // extract pronouns before converting to our Persona format\n  if (options?.extractPronouns && !!pkPersona.display_name) {\n    const { cleanedDisplayName, inlinePronoun } = getParsedPronouns(pkPersona.display_name, true);\n\n    if (inlinePronoun) {\n      pkPersona.display_name = cleanedDisplayName;\n      pkPersona.pronouns = inlinePronoun;\n    }\n  }\n  const newPersona = convertPluralkitFormatToOurPerMessageProfile(pkPersona);\n\n  // look for an old pluralkit profile\n  const matchingPersonaIndex = personas.findIndex(\n    ({ ['net.f0rest.pkimport']: record }) =>\n      (!!pkPersona.uuid && record?.uuid == pkPersona.uuid) || record?.id == pkPersona.id\n  );\n  const oldPersona = matchingPersonaIndex !== -1 ? personas[matchingPersonaIndex] : null;\n\n  if (pkPersona.avatar_url) {\n    // check if we can reuse the old avatar url (check pk avatar urls)\n    if (\n      oldPersona &&\n      oldPersona.avatar_url &&\n      oldPersona['net.f0rest.pkimport']?.avatar_url &&\n      oldPersona['net.f0rest.pkimport']?.avatar_url === pkPersona.avatar_url\n    ) {\n      newPersona.avatar_url = oldPersona.avatar_url;\n    } else {\n      newPersona.avatar_url = await fetchPkitAvatar(mx, pkPersona.avatar_url);\n    }\n  }\n\n  // if we find a pluralkit match but the id has changed, rename before merge\n  if (oldPersona && oldPersona.id !== newPersona.id)\n    await catalog.rename(oldPersona.id, newPersona.id);\n  await catalog.merge(newPersona);\n}\n\nexport async function importPluralkitMembers(\n  mx: MatrixClient,\n  catalog: ProfileCatalog,\n  pkitPersonas: PerMessageProfilePluralkitFormat[],\n  options?: PkImportOptions\n): Promise<void> {\n  for (const pkPersona of pkitPersonas) {\n    // i don't want to deal with the potential for race conditions,\n    // and i'm fine with an import being slow\n    //\n    // oxlint-disable-next-line no-await-in-loop\n    await mergePluralkitProfile(mx, catalog, pkPersona, options);\n  }\n}\n","import { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { PerMessageProfileMsc4461, Persona } from '$hooks/usePerMessageProfile';\nimport {\n  addOrUpdatePerMessageProfile,\n  getAllPerMessageProfiles,\n  getPerMessageProfileById,\n  ProfileCatalog,\n} from '$hooks/usePerMessageProfile';\nimport { isPersonaAccountDataEvent } from '$app/persona/catalog';\nimport { useAccountDataCallback } from '$hooks/useAccountDataCallback';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Box, Button, color, config, Dialog, Header, Spinner, Switch, Text } from 'folds';\nimport { generateShortId } from '$utils/shortIdGen';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { PerMessageProfileListItem } from './PerMessageProfileListItem';\nimport { SettingTile } from '$components/setting-tile';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport {\n  MATRIX_UNSTABLE_COLORS,\n  MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME,\n} from '$unstable/prefixes';\nimport { downloadJsonFile } from '$app/utils/download';\nimport { selectFile } from '$app/utils/dom';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { AsyncError } from '$components/AsyncError';\nimport {\n  importPluralkitMembers,\n  type PerMessageProfilePluralkitFormat,\n  type PkImportOptions,\n} from '$app/persona/pluralkit';\nimport { readFileToString } from '$app/utils/file';\n\ntype PerMessageProfileOverviewProps = {\n  onCreateProfile: (profile: PerMessageProfileMsc4461) => void;\n  onEditProfile: (profile: PerMessageProfileMsc4461) => void;\n};\n/**\n * Renders a list of per-message profiles along with an editor.\n * @returns rendering of per message profile list including editor\n */\nexport function PerMessageProfileOverview({\n  onCreateProfile,\n  onEditProfile,\n}: PerMessageProfileOverviewProps) {\n  const mx = useMatrixClient();\n  const [profiles, setProfiles] = useState<PerMessageProfileMsc4461[]>([]);\n\n  const [confirmWipeData, setConfirmWipeData] = useState(false);\n  const [confirmPkImport, setConfirmPkImport] = useState(false);\n  const [pkImportSettings, setPkImportSettings] = useState<PkImportOptions | null>(null);\n\n  useEffect(() => {\n    const fetchProfiles = async () => {\n      const fetchedProfiles = await getAllPerMessageProfiles(mx);\n      setProfiles(fetchedProfiles);\n    };\n    fetchProfiles();\n  }, [mx]);\n\n  useAccountDataCallback(\n    mx,\n    useCallback(\n      (event) => {\n        if (!isPersonaAccountDataEvent(event.getType())) return;\n        void getAllPerMessageProfiles(mx).then(setProfiles);\n      },\n      [mx]\n    )\n  );\n\n  const handleEdit = async (profileId: string) => {\n    const profile = await getPerMessageProfileById(mx, profileId);\n    if (profile) onEditProfile(profile);\n  };\n\n  const [addState, handleAdd] = useAsyncCallback(\n    useCallback(async () => {\n      const newProfile: PerMessageProfileMsc4461 = {\n        id: generateShortId(5),\n        displayname: 'New Profile',\n        triggers: [],\n      };\n      await addOrUpdatePerMessageProfile(mx, newProfile);\n      onCreateProfile(newProfile);\n    }, [mx, onCreateProfile])\n  );\n\n  const [handlePkitImportState, handlePkitImport] = useAsyncCallback<void, Error, []>(\n    useCallback(async () => {\n      const file = await selectFile('application/json', false);\n      if (!file) throw new Error('No file provided');\n\n      const text = await readFileToString(file);\n      const { members }: { members: PerMessageProfilePluralkitFormat[] } = JSON.parse(text);\n      if (!members) throw new Error('Personas not found in file');\n\n      const catalog = new ProfileCatalog(mx);\n      await importPluralkitMembers(mx, catalog, members, pkImportSettings ?? {});\n\n      // refetch\n      const fetchedProfiles = await catalog.list();\n      setProfiles(fetchedProfiles);\n      setConfirmPkImport(false);\n    }, [mx, pkImportSettings])\n  );\n\n  // import, export, etc\n  const [handlePersonaExportState, handlePersonaExport] = useAsyncCallback<void, Error, []>(\n    useCallback(async () => {\n      const personas = await new ProfileCatalog(mx).list();\n      const data = { personas };\n      await downloadJsonFile(JSON.stringify(data), 'persona');\n    }, [mx])\n  );\n\n  const [handlePersonaImportState, handlePersonaImport] = useAsyncCallback<void, Error, []>(\n    useCallback(async () => {\n      const file = await selectFile('application/json', false);\n      if (!file) throw new Error('No file provided');\n\n      const text = await readFileToString(file);\n      const json = JSON.parse(text);\n      if (!json.personas) throw new Error('Personas not found in file');\n\n      await new ProfileCatalog(mx).overwrite(json.personas as Persona[]);\n\n      // refetch\n      const fetchedProfiles = await getAllPerMessageProfiles(mx);\n      setProfiles(fetchedProfiles);\n    }, [mx])\n  );\n\n  const [handlePersonaWipeState, handlePersonaWipe] = useAsyncCallback<void, Error, []>(\n    useCallback(async () => {\n      await new ProfileCatalog(mx).overwrite([]);\n\n      // refetch\n      const fetchedProfiles = await getAllPerMessageProfiles(mx);\n      setProfiles(fetchedProfiles);\n      setConfirmWipeData(false);\n    }, [mx])\n  );\n\n  const manageError = useMemo(() => {\n    if (handlePersonaExportState.status == AsyncStatus.Error) return handlePersonaExportState.error;\n    if (handlePersonaImportState.status == AsyncStatus.Error) return handlePersonaImportState.error;\n    if (handlePersonaWipeState.status == AsyncStatus.Error) return handlePersonaWipeState.error;\n    return undefined;\n  }, [handlePersonaExportState, handlePersonaImportState, handlePersonaWipeState]);\n\n  return (\n    <>\n      <Box gap=\"100\" direction=\"Column\">\n        <Text size=\"L400\">Personas</Text>\n\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"100\"\n        >\n          <SettingTile\n            focusId=\"create-pmp\"\n            title=\"Create Persona\"\n            description=\"Create Personas to attach custom profiles to messages.\"\n            after={\n              <Button\n                size=\"300\"\n                radii=\"300\"\n                onClick={handleAdd}\n                disabled={addState.status === AsyncStatus.Loading}\n              >\n                {addState.status === AsyncStatus.Loading ? (\n                  <Spinner size=\"100\" variant=\"Primary\" fill=\"Solid\" />\n                ) : (\n                  <Text size=\"B300\">Add</Text>\n                )}\n              </Button>\n            }\n          />\n        </SequenceCard>\n\n        {profiles.map((profile) => (\n          <SequenceCard\n            className={SequenceCardStyle}\n            variant=\"SurfaceVariant\"\n            direction=\"Column\"\n            key={`profile-list-item-${profile.id}`}\n          >\n            <PerMessageProfileListItem\n              mx={mx}\n              avatarMxcUrl={profile.avatar_url}\n              displayName={profile.displayname}\n              pronouns={profile[MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME]}\n              profileId={profile.id}\n              nameColorLight={profile[MATRIX_UNSTABLE_COLORS]?.on_light}\n              nameColorDark={profile[MATRIX_UNSTABLE_COLORS]?.on_dark}\n              onOpenEditor={handleEdit}\n            />\n          </SequenceCard>\n        ))}\n      </Box>\n      <Box gap=\"100\" direction=\"Column\">\n        <Text size=\"L400\">Persona Management</Text>\n\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"100\"\n        >\n          <SettingTile\n            focusId=\"pmp-pk-import\"\n            title=\"PluralKit Import\"\n            description={\n              <>\n                Add or update PluralKit members from <code>system.json</code>. Consider backing up\n                Persona data before importing.\n              </>\n            }\n            after={\n              <Button\n                onClick={() => setConfirmPkImport(true)}\n                size=\"400\"\n                radii=\"300\"\n                variant=\"Primary\"\n                fill=\"Solid\"\n              >\n                {handlePkitImportState.status === AsyncStatus.Loading ? (\n                  <Spinner variant=\"Primary\" size=\"400\" />\n                ) : (\n                  <Text size=\"B300\">Import PK member data</Text>\n                )}\n              </Button>\n            }\n          ></SettingTile>\n        </SequenceCard>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"100\"\n        >\n          <SettingTile\n            focusId=\"pmp-list-export\"\n            title=\"Persona data management\"\n            description=\"Backup and restore your persona data.\"\n          >\n            {manageError && (\n              <Text style={{ color: color.Critical.Main }} size=\"T300\">\n                {manageError.message}\n              </Text>\n            )}\n            <Box\n              direction=\"Row\"\n              justifyContent=\"End\"\n              wrap=\"WrapReverse\"\n              gap=\"200\"\n              aria-label=\"PMP List edit buttons\"\n            >\n              <Button\n                onClick={handlePersonaExport}\n                size=\"400\"\n                radii=\"300\"\n                variant=\"Primary\"\n                fill=\"Solid\"\n              >\n                {handlePersonaExportState.status === AsyncStatus.Loading ? (\n                  <Spinner variant=\"Primary\" size=\"400\" />\n                ) : (\n                  <Text size=\"B300\">Export data</Text>\n                )}\n              </Button>\n              <Button\n                onClick={handlePersonaImport}\n                size=\"400\"\n                radii=\"300\"\n                variant=\"Primary\"\n                fill=\"Soft\"\n              >\n                {handlePersonaImportState.status === AsyncStatus.Loading ? (\n                  <Spinner variant=\"Primary\" size=\"300\" />\n                ) : (\n                  <Text size=\"B300\">Overwrite data from a backup</Text>\n                )}\n              </Button>\n              <Button\n                onClick={() => setConfirmWipeData(true)}\n                size=\"400\"\n                radii=\"300\"\n                variant=\"Critical\"\n                fill=\"Solid\"\n              >\n                <Text size=\"B300\">Wipe all Persona data</Text>\n              </Button>\n            </Box>\n            {confirmPkImport && (\n              <ModalOverlay requestClose={() => setConfirmPkImport(false)}>\n                <Dialog variant=\"Surface\">\n                  <Header\n                    style={{\n                      padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n                      borderBottomWidth: config.borderWidth.B300,\n                    }}\n                    variant=\"Surface\"\n                    size=\"500\"\n                  >\n                    <Box grow=\"Yes\">\n                      <Text size=\"H4\">Import PluralKit data</Text>\n                    </Box>\n                  </Header>\n                  <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n                    <Box direction=\"Column\" justifyContent=\"SpaceBetween\" gap=\"100\">\n                      <Text priority=\"400\" style={{ fontWeight: 'bold' }}>\n                        Configure import\n                      </Text>\n\n                      <SequenceCard\n                        className={SequenceCardStyle}\n                        variant=\"SurfaceVariant\"\n                        direction=\"Column\"\n                        gap=\"100\"\n                      >\n                        <Box direction=\"Row\" justifyContent=\"SpaceBetween\">\n                          <Text>Extract pronouns from display names</Text>\n                          <Switch\n                            variant=\"Primary\"\n                            value={!!pkImportSettings?.extractPronouns}\n                            onChange={(on) =>\n                              setPkImportSettings((opts) => {\n                                return { ...opts, extractPronouns: on };\n                              })\n                            }\n                          />\n                        </Box>\n                      </SequenceCard>\n                      <AsyncError state={handlePkitImportState} prefix=\"Failed to import\" />\n                    </Box>\n                    <Box direction=\"Row\" justifyContent=\"End\" gap=\"200\">\n                      <Button variant=\"Secondary\" onClick={() => setConfirmPkImport(false)}>\n                        <Text size=\"B400\">Cancel</Text>\n                      </Button>\n                      <Button variant=\"Primary\" onClick={handlePkitImport}>\n                        {handlePkitImportState.status === AsyncStatus.Loading ? (\n                          <Spinner variant=\"Primary\" size=\"300\" />\n                        ) : (\n                          <Text size=\"B400\">Import</Text>\n                        )}{' '}\n                      </Button>\n                    </Box>\n                  </Box>\n                </Dialog>\n              </ModalOverlay>\n            )}\n\n            {confirmWipeData && (\n              <ModalOverlay requestClose={() => setConfirmWipeData(false)}>\n                <Dialog variant=\"Surface\">\n                  <Header\n                    style={{\n                      padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n                      borderBottomWidth: config.borderWidth.B300,\n                    }}\n                    variant=\"Surface\"\n                    size=\"500\"\n                  >\n                    <Box grow=\"Yes\">\n                      <Text size=\"H4\">Wipe all Persona data</Text>\n                    </Box>\n                  </Header>\n                  <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n                    <Text priority=\"400\">Are you sure you want to wipe all Persona data?</Text>\n                    <Box direction=\"Column\" gap=\"200\">\n                      <Button variant=\"Critical\" onClick={handlePersonaWipe}>\n                        <Text size=\"B400\">Delete all data</Text>\n                      </Button>\n                      <Button variant=\"Secondary\" onClick={() => setConfirmWipeData(false)}>\n                        <Text size=\"B400\">Cancel</Text>\n                      </Button>\n                    </Box>\n                  </Box>\n                </Dialog>\n              </ModalOverlay>\n            )}\n          </SettingTile>\n        </SequenceCard>\n      </Box>\n    </>\n  );\n}\n","import { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { Box, Switch, Text } from 'folds';\n\nexport function PKCompatSettings() {\n  const [usePKCompat, setUsePKCompat] = useSetting(settingsAtom, 'pkCompat');\n  const [usePmpProxying, setUsePmpProxying] = useSetting(settingsAtom, 'pmpProxying');\n  const [usePmpLatching, setUsePmpLatching] = useSetting(settingsAtom, 'pmpLatching');\n  const [usePmpNoFallback, setUsePmpNoFallback] = useSetting(settingsAtom, 'pmpNoFallback');\n\n  return (\n    <>\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Limited Compatibility with PluralKit-like functions</Text>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"100\"\n        >\n          <SettingTile\n            focusId=\"enable-pk-commands\"\n            title=\"Enable PK commands\"\n            description=\"If enabled, it will enable a few pk style commands, currently verry limited\"\n            after={\n              <Switch\n                variant=\"Primary\"\n                value={usePKCompat}\n                onChange={setUsePKCompat}\n                title={usePKCompat ? 'disable pk; commands' : 'enable pk; commands'}\n              />\n            }\n          />\n        </SequenceCard>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"100\"\n        >\n          <SettingTile\n            focusId=\"enable-pk-shorthands\"\n            title=\"Enable Shorthands\"\n            description=\"If enabled, you can use shorthands to use a Persona for one message only (eg. '✨:test')\"\n            after={\n              <Switch\n                variant=\"Primary\"\n                value={usePmpProxying}\n                onChange={setUsePmpProxying}\n                title={\n                  usePmpProxying\n                    ? 'disable checking typed messages for shorthands'\n                    : 'enable checking typed messages for shorthands'\n                }\n              />\n            }\n          />\n        </SequenceCard>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"100\"\n        >\n          <SettingTile\n            focusId=\"enable-pk-latching\"\n            title=\"Enable Shorthand Latching\"\n            description=\"If enabled, you change a room's persona when you use a shorthand.\"\n            after={\n              <Switch\n                variant=\"Primary\"\n                value={usePmpLatching}\n                onChange={setUsePmpLatching}\n                title={\n                  usePmpLatching\n                    ? 'disable latching when using a shorthand'\n                    : 'enable latching when using a shorthand'\n                }\n              />\n            }\n          />\n        </SequenceCard>\n      </Box>\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">General Behavior</Text>\n        <SequenceCard\n          className={SequenceCardStyle}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"100\"\n        >\n          <SettingTile\n            focusId=\"prevent-sending-pmp-fallback\"\n            title=\"Prevent sending Persona fallback\"\n            description=\"If enabled, your messages will not include a prefix with your name to show clients that do not support Personas.\"\n            after={\n              <Switch\n                variant=\"Primary\"\n                value={usePmpNoFallback}\n                onChange={setUsePmpNoFallback}\n                title={\n                  usePmpNoFallback\n                    ? 'do not prevent fallbacks when sending a persona attached message'\n                    : 'prevent fallbacks when sending a persona attached message'\n                }\n              />\n            }\n          />\n        </SequenceCard>\n      </Box>\n    </>\n  );\n}\n","import { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { SettingTile } from '$components/setting-tile';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { Box, Switch, Text } from 'folds';\n\nexport function PickerPageSettings() {\n  const [usePmpPicker, setUsePmpPicker] = useSetting(settingsAtom, 'pmpPicker');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Persona Picker</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"100\"\n      >\n        <SettingTile\n          focusId=\"enable-pmp-picker\"\n          title=\"Enable Persona Picker\"\n          description=\"Enables a menu in the editor to pick an associated persona for that room.\"\n          after={\n            <Switch\n              variant=\"Primary\"\n              value={usePmpPicker}\n              onChange={setUsePmpPicker}\n              title={usePmpPicker ? 'disable persona picker' : 'enable persona picker'}\n            />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n","export let urlAlphabet =\n  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","\n\nimport { urlAlphabet } from './url-alphabet/index.js'\n\nexport { urlAlphabet }\n\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\n\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n  let safeByteCutoff = 256 - (256 % alphabet.length)\n\n  if (safeByteCutoff === 256) {\n    let mask = alphabet.length - 1\n\n    return (size = defaultSize) => {\n      if (!size) return ''\n      let id = ''\n      while (true) {\n        let bytes = getRandom(size)\n        let j = size\n        while (j--) {\n          id += alphabet[bytes[j] & mask]\n          if (id.length >= size) return id\n        }\n      }\n    }\n  }\n\n  let step = Math.ceil((1.6 * 256 * defaultSize) / safeByteCutoff)\n\n  return (size = defaultSize) => {\n    if (!size) return ''\n    let id = ''\n    while (true) {\n      let bytes = getRandom(step)\n      let j = step\n      while (j--) {\n        if (bytes[j] < safeByteCutoff) {\n          id += alphabet[bytes[j] % alphabet.length]\n          if (id.length >= size) return id\n        }\n      }\n    }\n  }\n}\n\nexport let customAlphabet = (alphabet, size = 21) =>\n  customRandom(alphabet, size | 0, random)\n\nexport let nanoid = (size = 21) => {\n  let id = ''\n  let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n  while (size--) {\n    id += urlAlphabet[bytes[size] & 63]\n  }\n  return id\n}\n","import { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { nanoid } from 'nanoid';\nimport { Box, Button, Text, Avatar, config, IconButton, Input, toRem, Spinner, color } from 'folds';\nimport { menuIcon, Trash, X } from '$components/icons/phosphor';\nimport type { MatrixClient } from '$types/matrix-sdk';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { nameInitials } from '$utils/common';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { useFilePicker } from '$hooks/useFilePicker';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useObjectURL } from '$hooks/useObjectURL';\nimport { createUploadAtom } from '$state/upload';\nimport { UserAvatar } from '$components/user-avatar';\nimport { CompactUploadCardRenderer } from '$components/upload-card';\nimport type { ProfileTrigger } from '$hooks/usePerMessageProfile';\nimport {\n  addOrUpdatePerMessageProfile,\n  deletePerMessageProfile,\n  renamePerMessageProfile,\n} from '$hooks/usePerMessageProfile';\nimport type { PronounSet } from '$utils/pronouns';\nimport { parsePronounsStringToPronounsSetArray } from '$utils/pronouns';\nimport { SettingTile } from '$components/setting-tile';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { NameColorEditor } from '../account/NameColorEditor';\nimport {\n  MATRIX_UNSTABLE_COLORS,\n  MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME,\n} from '$unstable/prefixes';\nimport { accessibleColor } from '$plugins/color';\nimport { ThemeKind } from '$hooks/useTheme';\n\ntype ShorthandRow = ProfileTrigger & { id: string };\n\ntype ShorthandListItemProps = ShorthandRow & {\n  onDelete: (shorthandId: string) => void;\n  onChange: (shorthandId: string, shorthand: ProfileTrigger) => void;\n};\nfunction ShorthandListItem({ id, prefix, suffix, onDelete, onChange }: ShorthandListItemProps) {\n  const [newPrefix, setNewPrefix] = useState(prefix);\n  const [newSuffix, setNewSuffix] = useState(suffix);\n\n  const [prefixWarn, setPrefixWarn] = useState(false);\n  const [suffixWarn, setSuffixWarn] = useState(false);\n\n  const handlePrefixChange = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      onChange(id, {\n        prefix: e.target.value.trimStart(),\n        suffix: newSuffix?.trimEnd(),\n      });\n      setNewPrefix(e.target.value);\n    },\n    [newSuffix, id, onChange]\n  );\n  const handleSuffixChange = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      // if you call setNewSuffix then use newSuffix you get race conditioned lol\n      onChange(id, {\n        prefix: newPrefix?.trimStart(),\n        suffix: e.target.value.trimEnd(),\n      });\n      setNewSuffix(e.target.value);\n    },\n    [newPrefix, id, onChange]\n  );\n\n  const isBlank = useMemo(() => !newPrefix && !newSuffix, [newPrefix, newSuffix]);\n\n  useEffect(() => {\n    setPrefixWarn((newPrefix ?? '').endsWith(' '));\n    setSuffixWarn((newSuffix ?? '').startsWith(' '));\n  }, [newPrefix, newSuffix]);\n\n  return (\n    <SequenceCard\n      className={SequenceCardStyle}\n      variant=\"Surface\"\n      style={{ padding: toRem(8) }}\n      gap=\"100\"\n    >\n      <Box\n        direction=\"Column\"\n        style={{ width: '100%' }} /* sorry, complex layout, idk what's happening */\n      >\n        {(prefixWarn || suffixWarn) && (\n          <Text size=\"T200\" style={{ color: color.Warning.Main }}>\n            Whitespace inside of a shorthand will require whitespace{' '}\n            {prefixWarn && suffixWarn\n              ? 'before/after'\n              : prefixWarn\n                ? 'before'\n                : suffixWarn\n                  ? 'after'\n                  : 'before/after'}{' '}\n            text to match.\n          </Text>\n        )}\n        <Box direction=\"Row\" gap=\"100\">\n          <Input\n            value={newPrefix}\n            style={{ flexGrow: 1, height: '2rem' }}\n            placeholder=\"Prefix...\"\n            variant={prefixWarn ? 'Warning' : 'Secondary'}\n            radii=\"300\"\n            onChange={handlePrefixChange}\n          />\n          <Input\n            value={newSuffix}\n            style={{ flexGrow: 1, height: '2rem' }}\n            placeholder=\"Suffix...\"\n            variant={suffixWarn ? 'Warning' : 'Secondary'}\n            radii=\"300\"\n            onChange={handleSuffixChange}\n          />\n          <Box gap=\"100\" style={{ marginLeft: toRem(6) }}>\n            <Button\n              onClick={() => onDelete(id)}\n              size=\"300\"\n              variant=\"Critical\"\n              disabled={isBlank}\n              fill=\"Soft\"\n              outlined\n              radii=\"300\"\n              aria-label=\"Delete shorthand\"\n            >\n              {menuIcon(Trash)}\n            </Button>\n          </Box>\n        </Box>\n      </Box>\n    </SequenceCard>\n  );\n}\n\nfunction triggersToShorthandRows(triggers: ProfileTrigger[]): ShorthandRow[] {\n  return triggers.map(({ prefix, suffix, keep_trigger }) => ({\n    prefix,\n    suffix,\n    keep_trigger,\n    id: nanoid(),\n  }));\n}\n\nfunction shorthandRowsToTriggers(rows: ShorthandRow[]): ProfileTrigger[] {\n  return rows.map(({ prefix, suffix, keep_trigger }) => ({ prefix, suffix, keep_trigger }));\n}\n/**\n * the props we use for the per-message profile editor, which is used to edit a per-message profile. This is used in the settings page when the user wants to edit a profile.\n */\nexport type PerMessageProfileEditorProps = {\n  mx: MatrixClient;\n  profileId: string;\n  avatarMxcUrl?: string;\n  displayName?: string;\n  pronouns?: PronounSet[];\n  nameColorLightTheme?: string;\n  nameColorDarkTheme?: string;\n  shorthands?: ProfileTrigger[];\n  onDelete?: (profileId: string) => void;\n};\n\nexport function PerMessageProfileEditor({\n  mx,\n  profileId,\n  avatarMxcUrl,\n  displayName,\n  pronouns = Array<PronounSet>(),\n  nameColorLightTheme,\n  nameColorDarkTheme,\n  shorthands,\n  onDelete,\n}: Readonly<PerMessageProfileEditorProps>) {\n  const useAuthentication = useMediaAuthentication();\n  const [currentDisplayName, setCurrentDisplayName] = useState(displayName ?? '');\n  const [currentId, setCurrentId] = useState(profileId);\n  const [newId, setNewId] = useState(profileId);\n\n  // Pronouns\n  const [currentPronouns, setCurrentPronouns] = useState(pronouns);\n  const [newPronouns, setNewPronouns] = useState(pronouns);\n  const currentPronounsString = useMemo(\n    () =>\n      Array.isArray(currentPronouns)\n        ? currentPronouns.map((p) => `${p.language ? `${p.language}:` : ''}${p.summary}`).join(', ')\n        : '',\n    [currentPronouns]\n  );\n  const [newPronounsString, setNewPronounsString] = useState(() => {\n    const pronounsString = Array.isArray(newPronouns)\n      ? newPronouns.map((p) => `${p.language ? `${p.language}:` : ''}${p.summary}`).join(', ')\n      : '';\n    return pronounsString;\n  });\n\n  // Name color\n  const [currentNameColorLight, setCurrentNameColorLight] = useState(nameColorLightTheme ?? null);\n  const [newNameColorLight, setNewNameColorLight] = useState(nameColorLightTheme ?? null);\n  const [currentNameColorDark, setCurrentNameColorDark] = useState(nameColorDarkTheme ?? null);\n  const [newNameColorDark, setNewNameColorDark] = useState(nameColorDarkTheme ?? null);\n\n  // shorthands\n  const shorthandProp = shorthands ? triggersToShorthandRows(shorthands) : undefined;\n  const [currentShorthands, setCurrentShorthands] = useState<ShorthandRow[] | undefined>(\n    shorthandProp\n  );\n  const [newShorthands, setNewShorthands] = useState<ShorthandRow[] | undefined>(shorthandProp);\n\n  const containsBlankShorthand = useMemo(\n    () =>\n      newShorthands && newShorthands.some((shorthand) => !shorthand.prefix && !shorthand.suffix),\n    [newShorthands]\n  );\n\n  const handleAddShorthand = () => {\n    if (newShorthands !== undefined) {\n      setNewShorthands([...newShorthands, { id: nanoid() }]);\n    }\n  };\n\n  const handleDeleteShorthand = (id: string) => {\n    if (newShorthands === undefined) return;\n    setNewShorthands((s) => s?.filter((shorthand) => shorthand.id !== id));\n  };\n\n  const handleSaveShorthand = (oldId: string, shorthand: ProfileTrigger) => {\n    setNewShorthands((rows = []) => {\n      const index = rows.findIndex((row) => row.id === oldId);\n      if (index === -1) return rows;\n      const oldShorthand = rows[index];\n      if (oldShorthand === undefined) return rows;\n\n      return rows.with(index, {\n        ...shorthand,\n        id: oldShorthand.id,\n      });\n    });\n  };\n\n  const [newDisplayName, setNewDisplayName] = useState(currentDisplayName);\n  const [imageFile, setImageFile] = useState<File | undefined>();\n  const [imageHasChanges, setImageHasChanges] = useState(false);\n  const [avatarMxc, setAvatarMxc] = useState(avatarMxcUrl);\n  const imageFileURL = useObjectURL(imageFile);\n  const avatarUrl = useMemo(() => {\n    if (imageFileURL) return imageFileURL;\n    if (avatarMxc) {\n      return mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96, 'crop') ?? undefined;\n    }\n    return undefined;\n  }, [imageFileURL, avatarMxc, mx, useAuthentication]);\n  const uploadAtom = useMemo(() => {\n    if (imageFile) return createUploadAtom(imageFile);\n    return undefined;\n  }, [imageFile]);\n  const pickFile = useFilePicker(setImageFile, false);\n  const handleRemoveUpload = useCallback(() => {\n    setImageFile(undefined);\n    setImageHasChanges(true);\n  }, []);\n  const handleUploaded = useCallback((upload: { status: string; mxc: string }) => {\n    if (upload?.status === 'success') {\n      setAvatarMxc(upload.mxc);\n      setImageHasChanges(true);\n    }\n    setImageFile(undefined);\n  }, []);\n  const handleNameChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n    setNewDisplayName(e.target.value);\n  }, []);\n\n  const [changingDisplayName, setChangingDisplayName] = useState(false);\n  // This state is used to disable the display name input while the user is changing it, to prevent them from making changes while the save operation is in progress.\n  // It is set to true when the user clicks the save button, and set back to false when the save operation is complete.\n  const [disableSetDisplayname, setDisableSetDisplayname] = useState(false);\n\n  const hasIdChange = useMemo(() => newId !== currentId, [newId, currentId]);\n\n  const hasChanges = useMemo(\n    () =>\n      newDisplayName !== (currentDisplayName ?? '') ||\n      newPronounsString !== currentPronounsString ||\n      newNameColorLight !== currentNameColorLight ||\n      newNameColorDark !== currentNameColorDark ||\n      newShorthands !== currentShorthands ||\n      hasIdChange ||\n      imageHasChanges,\n    [\n      newDisplayName,\n      currentDisplayName,\n      newPronounsString,\n      currentPronounsString,\n      newNameColorLight,\n      currentNameColorLight,\n      newNameColorDark,\n      currentNameColorDark,\n      newShorthands,\n      currentShorthands,\n      hasIdChange,\n      imageHasChanges,\n    ]\n  );\n\n  /**\n   * handler for resetting the display name\n   */\n  const handleDisplayNameReset = useCallback(() => {\n    setNewDisplayName(currentDisplayName ?? '');\n  }, [currentDisplayName]);\n\n  /**\n   * handler for resetting the pronouns\n   */\n  const handlePronounsReset = useCallback(() => {\n    setNewPronouns(currentPronouns);\n    setNewPronounsString(currentPronounsString);\n  }, [currentPronouns, currentPronounsString]);\n\n  /**\n   * persisting the data :3\n   */\n  const [saveState, handleSave] = useAsyncCallback(\n    useCallback(async () => {\n      await addOrUpdatePerMessageProfile(mx, {\n        id: currentId,\n        displayname: newDisplayName,\n        avatar_url: avatarMxc,\n        [MATRIX_UNSTABLE_PROFILE_PRONOUNS_PROPERTY_NAME]: newPronouns,\n        triggers: shorthandRowsToTriggers(newShorthands ?? []),\n        [MATRIX_UNSTABLE_COLORS]: {\n          on_light: newNameColorLight ?? undefined,\n          on_dark: newNameColorDark ?? undefined,\n        },\n      });\n\n      setCurrentDisplayName(newDisplayName);\n      setCurrentPronouns(newPronouns);\n      setCurrentNameColorLight(newNameColorLight);\n      setCurrentNameColorDark(newNameColorDark);\n      setCurrentShorthands(newShorthands);\n      setImageHasChanges(false);\n      setChangingDisplayName(false);\n      setDisableSetDisplayname(false);\n      if (hasIdChange) {\n        await renamePerMessageProfile(mx, currentId, newId);\n        setCurrentId(newId);\n      }\n    }, [\n      mx,\n      currentId,\n      newDisplayName,\n      avatarMxc,\n      newPronouns,\n      newNameColorLight,\n      newNameColorDark,\n      newShorthands,\n      hasIdChange,\n      newId,\n    ])\n  );\n\n  const [deleteState, handleDelete] = useAsyncCallback(\n    useCallback(async () => {\n      await deletePerMessageProfile(mx, currentId);\n      setCurrentDisplayName('');\n      setCurrentPronouns([]);\n      if (onDelete) onDelete(currentId);\n    }, [mx, currentId, onDelete])\n  );\n\n  const handleIdChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n    setNewId(e.target.value);\n  }, []);\n\n  const handlePronounsChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n    setNewPronounsString(e.target.value);\n    return setNewPronouns(parsePronounsStringToPronounsSetArray(e.target.value));\n  }, []);\n\n  return (\n    <Box\n      direction=\"Column\"\n      gap=\"100\"\n      role=\"form\"\n      aria-labelledby={`profile-editor-title-${profileId}`}\n    >\n      <Text size=\"L400\">Profile</Text>\n\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile title=\"Profile ID\" focusId={`idInput-${profileId}`}>\n          <Box grow=\"Yes\" direction=\"Column\">\n            <Input\n              required\n              name=\"idInput\"\n              id={`idInput-${profileId}`}\n              value={newId}\n              onChange={handleIdChange}\n              variant=\"Secondary\"\n              radii=\"300\"\n              placeholder=\"Profile ID\"\n              style={{ paddingRight: config.space.S200 }}\n              aria-label=\"profile id\"\n              title=\"profile id\"\n            />\n          </Box>\n        </SettingTile>\n      </SequenceCard>\n\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Avatar\"\n          focusId={`avatar-${profileId}`}\n          after={\n            <Avatar size=\"500\" radii=\"300\" aria-label=\"Profile avatar\">\n              <UserAvatar\n                userId={profileId}\n                src={avatarUrl}\n                renderFallback={() => (\n                  <Text size=\"H4\" aria-label=\"Avatar fallback\">\n                    {nameInitials(displayName)}\n                  </Text>\n                )}\n                alt={`Avatar for profile ${profileId}`}\n              />\n            </Avatar>\n          }\n        >\n          <Box>\n            <Button\n              onClick={() => pickFile('image/*')}\n              size=\"300\"\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              outlined\n              radii=\"300\"\n              aria-label=\"Upload avatar image\"\n            >\n              <Text size=\"T200\">Upload</Text>\n            </Button>\n          </Box>\n          {uploadAtom && (\n            <Box\n              gap=\"100\"\n              direction=\"Column\"\n              style={{\n                width: '100%',\n                maxWidth: 100,\n                maxHeight: 100,\n                overflow: 'visible',\n              }}\n              aria-label=\"Upload area\"\n            >\n              <CompactUploadCardRenderer\n                uploadAtom={uploadAtom}\n                onRemove={handleRemoveUpload}\n                onComplete={handleUploaded}\n              />\n            </Box>\n          )}\n        </SettingTile>\n      </SequenceCard>\n\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile title=\"Display Name\" focusId={`displayNameInput-${profileId}`}>\n          <Box grow=\"Yes\" direction=\"Column\">\n            <Input\n              required\n              name=\"displayNameInput\"\n              id={`displayNameInput-${profileId}`}\n              value={newDisplayName}\n              onChange={handleNameChange}\n              variant=\"Secondary\"\n              radii=\"300\"\n              style={{\n                paddingRight: config.space.S200,\n              }}\n              placeholder=\"Display name\"\n              readOnly={changingDisplayName || disableSetDisplayname}\n              aria-label={`Display name for ${profileId}`}\n              title={`Display name for ${profileId}`}\n              after={\n                newDisplayName !== (currentDisplayName ?? '') &&\n                !changingDisplayName && (\n                  <IconButton\n                    type=\"reset\"\n                    onClick={handleDisplayNameReset}\n                    size=\"300\"\n                    radii=\"300\"\n                    variant=\"Secondary\"\n                    aria-label=\"Reset display name\"\n                    title=\"Reset display name\"\n                  >\n                    {menuIcon(X)}\n                  </IconButton>\n                )\n              }\n            />\n          </Box>\n        </SettingTile>\n      </SequenceCard>\n\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Pronouns\"\n          description=\"Separate sets with commas\"\n          focusId={`pronounsInput-${profileId}`}\n          after={\n            <Input\n              required\n              name=\"pronounsInput\"\n              id={`pronounsInput-${profileId}`}\n              value={newPronounsString}\n              onChange={handlePronounsChange}\n              variant=\"Secondary\"\n              radii=\"300\"\n              style={{\n                paddingRight: config.space.S200,\n                width: '232px',\n              }}\n              placeholder=\"Add pronouns...\"\n              readOnly={changingDisplayName || disableSetDisplayname}\n              aria-label={`Pronouns for ${profileId}`}\n              title={`Pronouns for ${profileId}`}\n              after={\n                newPronounsString !== currentPronounsString && (\n                  <IconButton\n                    type=\"reset\"\n                    onClick={handlePronounsReset}\n                    size=\"300\"\n                    radii=\"300\"\n                    variant=\"Secondary\"\n                    aria-label=\"Reset pronouns\"\n                    title=\"Reset pronouns\"\n                  >\n                    {menuIcon(X)}\n                  </IconButton>\n                )\n              }\n            />\n          }\n        ></SettingTile>\n      </SequenceCard>\n\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <NameColorEditor\n          title=\"Dark theme Name Color\"\n          description=\"This persona's name color for a dark theme user.\"\n          focusId={`nameColorDarkTheme-${profileId}`}\n          current={currentNameColorDark ?? undefined}\n          newNameColor={newNameColorDark ?? undefined}\n          onChange={setNewNameColorDark}\n        />\n        {!newNameColorLight && newNameColorDark && (\n          <Box direction=\"Column\" alignItems=\"End\">\n            <Button\n              size=\"300\"\n              fill=\"Soft\"\n              onClick={() => {\n                setNewNameColorLight(accessibleColor(ThemeKind.Light, newNameColorDark));\n              }}\n            >\n              <Text size=\"T200\">Create new color from dark theme</Text>\n            </Button>\n          </Box>\n        )}\n      </SequenceCard>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <NameColorEditor\n          title=\"Light theme Name Color\"\n          description=\"This persona's name color for a light theme user.\"\n          focusId={`nameColorLightTheme-${profileId}`}\n          current={currentNameColorLight ?? undefined}\n          newNameColor={newNameColorLight ?? undefined}\n          onChange={setNewNameColorLight}\n        />\n        {!newNameColorDark && newNameColorLight && (\n          <Box direction=\"Column\" alignItems=\"End\">\n            <Button\n              size=\"300\"\n              fill=\"Soft\"\n              onClick={() => {\n                setNewNameColorDark(accessibleColor(ThemeKind.Dark, newNameColorLight));\n              }}\n            >\n              <Text size=\"T200\">Create new color from light theme</Text>\n            </Button>\n          </Box>\n        )}\n      </SequenceCard>\n      <Box\n        direction=\"Row\"\n        alignItems=\"Center\"\n        justifyContent=\"End\"\n        gap=\"200\"\n        aria-label={`Save button area for ${profileId}`}\n      >\n        <Button\n          onClick={handleDelete}\n          size=\"400\"\n          radii=\"300\"\n          variant=\"Critical\"\n          disabled={deleteState.status === AsyncStatus.Loading}\n          fill=\"None\"\n          aria-label={`Delete profile ${profileId}`}\n          title={`Delete profile ${profileId}`}\n        >\n          {deleteState.status === AsyncStatus.Loading ? (\n            <Spinner size=\"100\" variant=\"Critical\" fill=\"Solid\" />\n          ) : (\n            <Text size=\"B300\">Delete persona</Text>\n          )}\n        </Button>\n\n        <Button\n          onClick={handleSave}\n          size=\"400\"\n          radii=\"300\"\n          variant=\"Primary\"\n          disabled={!hasChanges || saveState.status === AsyncStatus.Loading}\n          aria-label={`Save profile changes for ${profileId}`}\n          title={`Save profile changes for ${profileId}`}\n        >\n          {saveState.status === AsyncStatus.Loading ? (\n            <Spinner size=\"100\" variant=\"Primary\" fill=\"Solid\" />\n          ) : (\n            <Text size=\"B300\">Save</Text>\n          )}\n        </Button>\n      </Box>\n\n      <Text size=\"L400\">Shorthands</Text>\n      <SequenceCard\n        className={SequenceCardStyle}\n        variant=\"SurfaceVariant\"\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <SettingTile\n          title=\"Shorthands\"\n          description=\"Use this persona for a single message using a prefix or suffix.\"\n          focusId={`shorthandsInput-${profileId}`}\n        >\n          {newShorthands === undefined ? (\n            <Spinner size=\"400\" />\n          ) : (\n            newShorthands.map((shorthand: ShorthandRow) => (\n              <ShorthandListItem\n                key={shorthand.id}\n                id={shorthand.id}\n                prefix={shorthand.prefix}\n                suffix={shorthand.suffix}\n                onDelete={handleDeleteShorthand}\n                onChange={handleSaveShorthand}\n              />\n            ))\n          )}\n          <Button\n            onClick={handleAddShorthand}\n            size=\"400\"\n            radii=\"300\"\n            variant=\"Primary\"\n            disabled={containsBlankShorthand}\n            /* add aria label and title pls */\n          >\n            <Text size=\"B300\">Add new shorthand</Text>\n          </Button>\n        </SettingTile>\n      </SequenceCard>\n    </Box>\n  );\n}\n","import { Box, IconButton, Text, Scroll, Chip } from 'folds';\nimport { ArrowLeft, composerIcon, sizedIcon, X } from '$components/icons/phosphor';\nimport { Page, PageHeader, PageContent } from '$components/page';\nimport type { PerMessageProfileEditorProps } from './PerMessageProfileEditor';\nimport { PerMessageProfileEditor } from './PerMessageProfileEditor';\n\nexport function PerMessageProfileEditorView({\n  requestClose,\n  ...editorProps\n}: Readonly<PerMessageProfileEditorProps & { requestClose: () => void }>) {\n  return (\n    <Page>\n      <PageHeader outlined={false} balance>\n        <Box alignItems=\"Center\" grow=\"Yes\" gap=\"200\">\n          <Box alignItems=\"Inherit\" grow=\"Yes\" gap=\"200\">\n            <Chip\n              size=\"500\"\n              radii=\"Pill\"\n              onClick={requestClose}\n              before={sizedIcon(ArrowLeft, '100')}\n            >\n              <Text size=\"T300\">Persona</Text>\n            </Chip>\n          </Box>\n          <Box shrink=\"No\">\n            <IconButton onClick={requestClose} variant=\"Surface\">\n              {composerIcon(X)}\n            </IconButton>\n          </Box>\n        </Box>\n      </PageHeader>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <PerMessageProfileEditor {...editorProps} onDelete={requestClose} />\n          </PageContent>\n        </Scroll>\n      </Box>\n    </Page>\n  );\n}\n","import { PageContent, SettingsSectionPage } from '$components/page';\nimport { Box, Scroll } from 'folds';\nimport { PerMessageProfileOverview } from './PerMessageProfileOverview';\nimport { PKCompatSettings } from './PKCompat';\nimport { PickerPageSettings } from './PickerPage';\nimport type { PerMessageProfileMsc4461 } from '$hooks/usePerMessageProfile';\nimport { useState } from 'react';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { PerMessageProfileEditorView } from './PerMessageProfileEditorView';\n\ntype PerMessageProfilePageProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\n\nexport function PerMessageProfilePage({ requestBack, requestClose }: PerMessageProfilePageProps) {\n  const mx = useMatrixClient();\n  const [editingProfile, setEditingProfile] = useState<PerMessageProfileMsc4461>();\n\n  const handleEditorClose = () => {\n    setEditingProfile(undefined);\n  };\n\n  if (editingProfile) {\n    return (\n      <PerMessageProfileEditorView\n        mx={mx}\n        profileId={editingProfile.id}\n        avatarMxcUrl={editingProfile.avatar_url}\n        displayName={editingProfile.displayname}\n        pronouns={editingProfile['io.fsky.nyx.pronouns']}\n        nameColorLightTheme={editingProfile['eu.she-a.color']?.on_light}\n        nameColorDarkTheme={editingProfile['eu.she-a.color']?.on_dark}\n        shorthands={editingProfile.triggers ?? []}\n        requestClose={handleEditorClose}\n      />\n    );\n  }\n  return (\n    <SettingsSectionPage title=\"Persona\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box gap=\"700\" direction=\"Column\">\n              <PickerPageSettings />\n              <PKCompatSettings />\n              <PerMessageProfileOverview\n                onCreateProfile={setEditingProfile}\n                onEditProfile={setEditingProfile}\n              />\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { settingsSections, type SettingsSectionId } from './routes';\nimport { humanizeSettingsLinkPart, settingsLinkFocusIdsBySection } from './settingsLink';\n\nexport type SettingsSearchEntry = {\n  section: SettingsSectionId;\n  focusId: string;\n  label: string;\n  sectionLabel: string;\n};\n\nconst settingsSectionLabel = Object.fromEntries(\n  settingsSections.map((section) => [section.id, section.label])\n) as Record<SettingsSectionId, string>;\n\nconst searchIndex: SettingsSearchEntry[] = settingsSections.flatMap((section) =>\n  settingsLinkFocusIdsBySection[section.id].map((focusId) => ({\n    section: section.id,\n    focusId,\n    label: humanizeSettingsLinkPart(focusId),\n    sectionLabel: settingsSectionLabel[section.id],\n  }))\n);\n\nexport const searchSettings = (query: string): SettingsSearchEntry[] => {\n  const q = query.trim().toLowerCase();\n  if (!q) return [];\n  return searchIndex.filter(\n    (entry) => entry.label.toLowerCase().includes(q) || entry.sectionLabel.toLowerCase().includes(q)\n  );\n};\n","import { useEffect, useRef } from 'react';\nimport { useLocation, useNavigate } from 'react-router';\nimport { focusedSettingTile } from './styles.css';\n\nconst focusedSettingTileClasses = focusedSettingTile.split(' ').filter(Boolean);\nconst getHighlightTarget = (target: HTMLElement): HTMLElement =>\n  target.closest<HTMLElement>('[data-sequence-card=\"true\"]') ?? target.parentElement ?? target;\nconst getFocusTarget = (focusId: string): HTMLElement | null =>\n  document.getElementById(focusId) ??\n  Array.from(document.querySelectorAll<HTMLElement>('[data-settings-focus]')).find(\n    (element) => element.getAttribute('data-settings-focus') === focusId\n  ) ??\n  null;\nconst SETTINGS_FOCUS_HANDLED_STATE_KEY = 'settingsFocusHandledKey';\n\ntype SettingsFocusRouteState = {\n  [SETTINGS_FOCUS_HANDLED_STATE_KEY]?: string;\n};\n\nexport function useSettingsFocus() {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const focusId = new URLSearchParams(location.search).get('focus');\n  const focusNavigationKey = focusId ? `${location.pathname}${location.search}` : undefined;\n  const handledFocusNavigationKey = (location.state as SettingsFocusRouteState | null)?.[\n    SETTINGS_FOCUS_HANDLED_STATE_KEY\n  ];\n  const activeTargetRef = useRef<HTMLElement | null>(null);\n  const timeoutRef = useRef<number | undefined>(undefined);\n\n  useEffect(\n    () => () => {\n      if (timeoutRef.current !== undefined) {\n        window.clearTimeout(timeoutRef.current);\n        timeoutRef.current = undefined;\n      }\n      activeTargetRef.current?.classList.remove(...focusedSettingTileClasses);\n      activeTargetRef.current = null;\n    },\n    []\n  );\n\n  useEffect(() => {\n    if (!focusId || !focusNavigationKey || handledFocusNavigationKey === focusNavigationKey) {\n      return;\n    }\n\n    const target = getFocusTarget(focusId);\n\n    if (!target) return;\n\n    const highlightTarget = getHighlightTarget(target);\n\n    if (activeTargetRef.current && activeTargetRef.current !== highlightTarget) {\n      activeTargetRef.current.classList.remove(...focusedSettingTileClasses);\n    }\n    if (timeoutRef.current !== undefined) {\n      window.clearTimeout(timeoutRef.current);\n      timeoutRef.current = undefined;\n    }\n\n    target.scrollIntoView?.({ block: 'center', behavior: 'smooth' });\n    highlightTarget.classList.add(...focusedSettingTileClasses);\n    activeTargetRef.current = highlightTarget;\n\n    navigate(\n      {\n        pathname: location.pathname,\n        search: location.search,\n        hash: location.hash,\n      },\n      {\n        replace: true,\n        state:\n          location.state && typeof location.state === 'object'\n            ? {\n                ...(location.state as Record<string, unknown>),\n                [SETTINGS_FOCUS_HANDLED_STATE_KEY]: focusNavigationKey,\n              }\n            : {\n                [SETTINGS_FOCUS_HANDLED_STATE_KEY]: focusNavigationKey,\n              },\n      }\n    );\n\n    timeoutRef.current = window.setTimeout(() => {\n      highlightTarget.classList.remove(...focusedSettingTileClasses);\n      if (activeTargetRef.current === highlightTarget) {\n        activeTargetRef.current = null;\n      }\n      timeoutRef.current = undefined;\n    }, 3000);\n  }, [\n    focusId,\n    focusNavigationKey,\n    handledFocusNavigationKey,\n    location.hash,\n    location.pathname,\n    location.search,\n    location.state,\n    navigate,\n  ]);\n}\n","import {\n  atomWithLocalStorage,\n  getLocalStorageItem,\n  setLocalStorageItem,\n} from './utils/atomWithLocalStorage';\n\nconst AUTO_UPDATE_CHECK_KEY = 'autoUpdateCheck';\n\nexport const autoUpdateCheckAtom = atomWithLocalStorage<boolean>(\n  AUTO_UPDATE_CHECK_KEY,\n  (key) => getLocalStorageItem<boolean>(key, true),\n  (key, value) => setLocalStorageItem(key, value)\n);\n","import { listen } from '@tauri-apps/api/event';\nimport { Resource, invoke } from '@tauri-apps/api/core';\n\n// Copyright 2019-2023 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n/**\n * Create a new Store or load the existing store with the path.\n *\n * @example\n * ```typescript\n * import { Store } from '@tauri-apps/api/store';\n * const store = await Store.load('store.json');\n * ```\n *\n * @param path Path to save the store in `app_data_dir`\n * @param options Store configuration options\n */\nasync function load(path, options) {\n    return await Store.load(path, options);\n}\n/**\n * Gets an already loaded store.\n *\n * If the store is not loaded, returns `null`. In this case you must {@link Store.load load} it.\n *\n * This function is more useful when you already know the store is loaded\n * and just need to access its instance. Prefer {@link Store.load} otherwise.\n *\n * @example\n * ```typescript\n * import { getStore } from '@tauri-apps/api/store';\n * const store = await getStore('store.json');\n * ```\n *\n * @param path Path of the store.\n */\nasync function getStore(path) {\n    return await Store.get(path);\n}\n/**\n * A lazy loaded key-value store persisted by the backend layer.\n */\nclass LazyStore {\n    get store() {\n        if (!this._store) {\n            this._store = load(this.path, this.options);\n        }\n        return this._store;\n    }\n    /**\n     * Note that the options are not applied if someone else already created the store\n     * @param path Path to save the store in `app_data_dir`\n     * @param options Store configuration options\n     */\n    constructor(path, options) {\n        this.path = path;\n        this.options = options;\n    }\n    /**\n     * Init/load the store if it's not loaded already\n     */\n    async init() {\n        await this.store;\n    }\n    async set(key, value) {\n        return (await this.store).set(key, value);\n    }\n    async get(key) {\n        return (await this.store).get(key);\n    }\n    async has(key) {\n        return (await this.store).has(key);\n    }\n    async delete(key) {\n        return (await this.store).delete(key);\n    }\n    async clear() {\n        await (await this.store).clear();\n    }\n    async reset() {\n        await (await this.store).reset();\n    }\n    async keys() {\n        return (await this.store).keys();\n    }\n    async values() {\n        return (await this.store).values();\n    }\n    async entries() {\n        return (await this.store).entries();\n    }\n    async length() {\n        return (await this.store).length();\n    }\n    async reload(options) {\n        await (await this.store).reload(options);\n    }\n    async save() {\n        await (await this.store).save();\n    }\n    async onKeyChange(key, cb) {\n        return (await this.store).onKeyChange(key, cb);\n    }\n    async onChange(cb) {\n        return (await this.store).onChange(cb);\n    }\n    async close() {\n        if (this._store) {\n            await (await this._store).close();\n        }\n    }\n}\n/**\n * A key-value store persisted by the backend layer.\n */\nclass Store extends Resource {\n    constructor(rid) {\n        super(rid);\n    }\n    /**\n     * Create a new Store or load the existing store with the path.\n     *\n     * @example\n     * ```typescript\n     * import { Store } from '@tauri-apps/api/store';\n     * const store = await Store.load('store.json');\n     * ```\n     *\n     * @param path Path to save the store in `app_data_dir`\n     * @param options Store configuration options\n     */\n    static async load(path, options) {\n        const rid = await invoke('plugin:store|load', {\n            path,\n            options\n        });\n        return new Store(rid);\n    }\n    /**\n     * Gets an already loaded store.\n     *\n     * If the store is not loaded, returns `null`. In this case you must {@link Store.load load} it.\n     *\n     * This function is more useful when you already know the store is loaded\n     * and just need to access its instance. Prefer {@link Store.load} otherwise.\n     *\n     * @example\n     * ```typescript\n     * import { Store } from '@tauri-apps/api/store';\n     * let store = await Store.get('store.json');\n     * if (!store) {\n     *   store = await Store.load('store.json');\n     * }\n     * ```\n     *\n     * @param path Path of the store.\n     */\n    static async get(path) {\n        return await invoke('plugin:store|get_store', { path }).then((rid) => (rid ? new Store(rid) : null));\n    }\n    async set(key, value) {\n        await invoke('plugin:store|set', {\n            rid: this.rid,\n            key,\n            value\n        });\n    }\n    async get(key) {\n        const [value, exists] = await invoke('plugin:store|get', {\n            rid: this.rid,\n            key\n        });\n        return exists ? value : undefined;\n    }\n    async has(key) {\n        return await invoke('plugin:store|has', {\n            rid: this.rid,\n            key\n        });\n    }\n    async delete(key) {\n        return await invoke('plugin:store|delete', {\n            rid: this.rid,\n            key\n        });\n    }\n    async clear() {\n        await invoke('plugin:store|clear', { rid: this.rid });\n    }\n    async reset() {\n        await invoke('plugin:store|reset', { rid: this.rid });\n    }\n    async keys() {\n        return await invoke('plugin:store|keys', { rid: this.rid });\n    }\n    async values() {\n        return await invoke('plugin:store|values', { rid: this.rid });\n    }\n    async entries() {\n        return await invoke('plugin:store|entries', { rid: this.rid });\n    }\n    async length() {\n        return await invoke('plugin:store|length', { rid: this.rid });\n    }\n    async reload(options) {\n        await invoke('plugin:store|reload', { rid: this.rid, ...options });\n    }\n    async save() {\n        await invoke('plugin:store|save', { rid: this.rid });\n    }\n    async onKeyChange(key, cb) {\n        return await listen('store://change', (event) => {\n            if (event.payload.resourceId === this.rid && event.payload.key === key) {\n                cb(event.payload.exists ? event.payload.value : undefined);\n            }\n        });\n    }\n    async onChange(cb) {\n        return await listen('store://change', (event) => {\n            if (event.payload.resourceId === this.rid) {\n                cb(event.payload.key, event.payload.exists ? event.payload.value : undefined);\n            }\n        });\n    }\n}\n\nexport { LazyStore, Store, getStore, load };\n","import { atom } from 'jotai';\nimport { LazyStore } from '@tauri-apps/plugin-store';\nimport { getDesktopRuntimeState, syncDesktopSettings } from '$generated/tauri/commands';\nimport type { DesktopSettings as GeneratedDesktopSettings } from '$generated/tauri/desktop/DesktopSettings';\nimport type { DesktopRuntimeState } from '$generated/tauri/desktop/DesktopRuntimeState';\nimport { getDesktopTauriPlatform, isDesktopTauri } from '$utils/platform';\nimport type { DesktopTauriPlatform } from '$utils/platform';\n\ntype DesktopSettingsState = {\n  ready: boolean;\n  value: DesktopSettings;\n};\n\ntype DesktopRuntimeStateValue = {\n  ready: boolean;\n  value: DesktopRuntimeState;\n};\n\nexport type DesktopSettings = GeneratedDesktopSettings;\nexport type { DesktopRuntimeState };\n\nconst DESKTOP_SETTINGS_STORE_PATH = 'desktop-preferences.json' as const;\nconst LEGACY_KEEP_BACKGROUND_RUNNING_KEY = 'keepBackgroundRunning' as const;\n\ntype DesktopPlatform = DesktopTauriPlatform | undefined;\n\nexport function desktopSettingsDefaultsForPlatform(platform: DesktopPlatform): DesktopSettings {\n  return {\n    closeToBackgroundOnClose: true,\n    showSystemTrayIcon: true,\n    useCustomTitleBar: platform === 'windows',\n    spellcheck: true,\n  };\n}\nexport type DesktopSettingKey = keyof DesktopSettings;\n\nconst DEFAULT_DESKTOP_RUNTIME_STATE: DesktopRuntimeState = {\n  trayAvailable: true,\n};\n\nexport const DEFAULT_DESKTOP_SETTINGS =\n  desktopSettingsDefaultsForPlatform(getDesktopTauriPlatform());\n\nconst DESKTOP_SETTING_KEYS = Object.keys(DEFAULT_DESKTOP_SETTINGS) as DesktopSettingKey[];\n\nconst desktopSettingsStore = new LazyStore(DESKTOP_SETTINGS_STORE_PATH, {\n  defaults: DEFAULT_DESKTOP_SETTINGS,\n});\n\nlet currentDesktopSettings = DEFAULT_DESKTOP_SETTINGS;\nlet currentDesktopRuntimeState = DEFAULT_DESKTOP_RUNTIME_STATE;\n\nfunction readBoolean(value: boolean | undefined, fallback: boolean): boolean {\n  return value === undefined ? fallback : value;\n}\n\nasync function persistDesktopSettings(\n  current: DesktopSettings,\n  next: DesktopSettings\n): Promise<void> {\n  const updates = DESKTOP_SETTING_KEYS.filter((key) => current[key] !== next[key]).map((key) =>\n    desktopSettingsStore.set(key, next[key])\n  );\n\n  if (current.closeToBackgroundOnClose !== next.closeToBackgroundOnClose) {\n    updates.push(\n      desktopSettingsStore.set(LEGACY_KEEP_BACKGROUND_RUNNING_KEY, next.closeToBackgroundOnClose)\n    );\n  }\n\n  await Promise.all(updates);\n}\n\nexport function desktopSettingsFromStoreValues(\n  closeToBackgroundOnClose: boolean | undefined,\n  showSystemTrayIcon: boolean | undefined,\n  legacyKeepBackgroundRunning: boolean | undefined,\n  useCustomTitleBar: boolean | undefined,\n  spellcheck: boolean | undefined,\n  platform = getDesktopTauriPlatform()\n): DesktopSettings {\n  const defaults = desktopSettingsDefaultsForPlatform(platform);\n\n  return {\n    closeToBackgroundOnClose:\n      readBoolean(closeToBackgroundOnClose, defaults.closeToBackgroundOnClose) ||\n      readBoolean(legacyKeepBackgroundRunning, false),\n    showSystemTrayIcon: readBoolean(showSystemTrayIcon, defaults.showSystemTrayIcon),\n    useCustomTitleBar: readBoolean(useCustomTitleBar, defaults.useCustomTitleBar),\n    spellcheck: readBoolean(spellcheck, defaults.spellcheck),\n  };\n}\n\nasync function applyDesktopSettings(\n  current: DesktopSettings,\n  settings: DesktopSettings\n): Promise<DesktopRuntimeState> {\n  currentDesktopSettings = settings;\n\n  if (!isDesktopTauri()) {\n    currentDesktopRuntimeState = DEFAULT_DESKTOP_RUNTIME_STATE;\n    return currentDesktopRuntimeState;\n  }\n\n  await persistDesktopSettings(current, settings);\n\n  currentDesktopRuntimeState = await syncDesktopSettings({ settings });\n  return currentDesktopRuntimeState;\n}\n\nexport async function getDesktopSettings(): Promise<DesktopSettings> {\n  if (!isDesktopTauri()) return DEFAULT_DESKTOP_SETTINGS;\n\n  const [\n    closeToBackgroundOnClose,\n    showSystemTrayIcon,\n    legacyKeepBackgroundRunning,\n    useCustomTitleBar,\n    spellcheck,\n  ] = await Promise.all([\n    desktopSettingsStore.get<boolean>('closeToBackgroundOnClose'),\n    desktopSettingsStore.get<boolean>('showSystemTrayIcon'),\n    desktopSettingsStore.get<boolean>(LEGACY_KEEP_BACKGROUND_RUNNING_KEY),\n    desktopSettingsStore.get<boolean>('useCustomTitleBar'),\n    desktopSettingsStore.get<boolean>('spellcheck'),\n  ]);\n\n  currentDesktopSettings = desktopSettingsFromStoreValues(\n    closeToBackgroundOnClose,\n    showSystemTrayIcon,\n    legacyKeepBackgroundRunning,\n    useCustomTitleBar,\n    spellcheck\n  );\n\n  return currentDesktopSettings;\n}\n\nexport async function getDesktopSetting<K extends DesktopSettingKey>(\n  key: K\n): Promise<DesktopSettings[K]> {\n  const settings = await getDesktopSettings();\n  return settings[key];\n}\n\nexport async function saveDesktopSettings(settings: DesktopSettings): Promise<DesktopRuntimeState> {\n  const current = isDesktopTauri() ? await getDesktopSettings() : currentDesktopSettings;\n  return applyDesktopSettings(current, settings);\n}\n\nexport async function setDesktopSetting<K extends DesktopSettingKey>(\n  key: K,\n  value: DesktopSettings[K]\n): Promise<DesktopRuntimeState> {\n  const current = isDesktopTauri() ? await getDesktopSettings() : currentDesktopSettings;\n  const next = { ...current, [key]: value } as DesktopSettings;\n\n  return applyDesktopSettings(current, next);\n}\n\nconst baseDesktopSettingsAtom = atom<DesktopSettingsState>({\n  ready: false,\n  value: DEFAULT_DESKTOP_SETTINGS,\n});\n\nbaseDesktopSettingsAtom.onMount = (setAtom) => {\n  if (!isDesktopTauri()) {\n    setAtom({\n      ready: true,\n      value: DEFAULT_DESKTOP_SETTINGS,\n    });\n    return undefined;\n  }\n\n  let cancelled = false;\n\n  getDesktopSettings().then((settings) => {\n    if (cancelled) return;\n\n    setAtom({\n      ready: true,\n      value: settings,\n    });\n  });\n\n  return () => {\n    cancelled = true;\n  };\n};\n\nconst baseDesktopRuntimeStateAtom = atom<DesktopRuntimeStateValue>({\n  ready: false,\n  value: DEFAULT_DESKTOP_RUNTIME_STATE,\n});\n\nconst baseDesktopSettingsSyncCountAtom = atom(0);\n\nbaseDesktopRuntimeStateAtom.onMount = (setAtom) => {\n  if (!isDesktopTauri()) {\n    setAtom({\n      ready: true,\n      value: DEFAULT_DESKTOP_RUNTIME_STATE,\n    });\n    return undefined;\n  }\n\n  let cancelled = false;\n\n  getDesktopRuntimeState().then((runtimeState) => {\n    currentDesktopRuntimeState = runtimeState;\n\n    if (cancelled) return;\n\n    setAtom({\n      ready: true,\n      value: runtimeState,\n    });\n  });\n\n  return () => {\n    cancelled = true;\n  };\n};\n\nexport const desktopSettingsAtom = atom(\n  (get) => get(baseDesktopSettingsAtom).value,\n  async (_get, set, settings: DesktopSettings) => {\n    set(baseDesktopSettingsAtom, {\n      ready: true,\n      value: settings,\n    });\n    set(baseDesktopSettingsSyncCountAtom, (count) => count + 1);\n\n    try {\n      const runtimeState = await saveDesktopSettings(settings);\n      set(baseDesktopRuntimeStateAtom, {\n        ready: true,\n        value: runtimeState,\n      });\n    } finally {\n      set(baseDesktopSettingsSyncCountAtom, (count) => Math.max(0, count - 1));\n    }\n  }\n);\n\nexport const desktopRuntimeStateAtom = atom((get) => get(baseDesktopRuntimeStateAtom).value);\nexport const desktopSettingsSyncingAtom = atom((get) => get(baseDesktopSettingsSyncCountAtom) > 0);\n\nexport const desktopSettingsReadyAtom = atom(\n  (get) => get(baseDesktopSettingsAtom).ready && get(baseDesktopRuntimeStateAtom).ready\n);\n","import { atom, useAtomValue, useSetAtom } from 'jotai';\nimport { selectAtom } from 'jotai/utils';\nimport { useMemo } from 'react';\nimport {\n  type DesktopRuntimeState,\n  type DesktopSettingKey,\n  type DesktopSettings,\n  desktopRuntimeStateAtom,\n  desktopSettingsAtom,\n  desktopSettingsReadyAtom,\n  desktopSettingsSyncingAtom,\n} from '$state/desktopSettings';\n\ntype DesktopSettingSetter<K extends DesktopSettingKey> =\n  | DesktopSettings[K]\n  | ((value: DesktopSettings[K]) => DesktopSettings[K]);\n\nfunction resolveDesktopSettingValue<K extends DesktopSettingKey>(\n  current: DesktopSettings[K],\n  value: DesktopSettingSetter<K>\n): DesktopSettings[K] {\n  if (typeof value === 'function') {\n    return (value as (next: DesktopSettings[K]) => DesktopSettings[K])(current);\n  }\n\n  return value;\n}\n\nconst useSetDesktopSetting = <K extends DesktopSettingKey>(key: K) => {\n  const setterAtom = useMemo(\n    () =>\n      atom<null, [DesktopSettingSetter<K>], Promise<void>>(null, (get, set, value) => {\n        const settings = get(desktopSettingsAtom);\n        const nextValue = resolveDesktopSettingValue(settings[key], value);\n        return set(desktopSettingsAtom, { ...settings, [key]: nextValue } as DesktopSettings);\n      }),\n    [key]\n  );\n\n  return useSetAtom(setterAtom);\n};\n\nexport const useDesktopSetting = <K extends DesktopSettingKey>(\n  key: K\n): [DesktopSettings[K], ReturnType<typeof useSetDesktopSetting<K>>] => {\n  const selector = useMemo(() => (settings: DesktopSettings) => settings[key], [key]);\n  const setting = useAtomValue(selectAtom(desktopSettingsAtom, selector));\n  const setter = useSetDesktopSetting(key);\n\n  return [setting, setter];\n};\n\nexport const useDesktopSettingsReady = (): boolean => useAtomValue(desktopSettingsReadyAtom);\nexport const useDesktopSettingsSyncing = (): boolean => useAtomValue(desktopSettingsSyncingAtom);\n\nexport const useDesktopRuntimeState = (): DesktopRuntimeState =>\n  useAtomValue(desktopRuntimeStateAtom);\n","import { isTauri } from '@tauri-apps/api/core';\nimport { useAtom } from 'jotai';\nimport { Box, Text, Scroll, color } from 'folds';\nimport { autoUpdateCheckAtom } from '$state/autoUpdateCheck';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SettingToggle } from '$components/setting-tile';\nimport {\n  useDesktopRuntimeState,\n  useDesktopSetting,\n  useDesktopSettingsReady,\n  useDesktopSettingsSyncing,\n} from '$state/hooks/desktopSettings';\nimport { type as osType } from '@tauri-apps/plugin-os';\n\ntype DesktopProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\n\nexport function Desktop({ requestBack, requestClose }: DesktopProps) {\n  const ready = useDesktopSettingsReady();\n  const syncing = useDesktopSettingsSyncing();\n  const runtimeState = useDesktopRuntimeState();\n  const [closeToBackgroundOnClose, setCloseToBackgroundOnClose] = useDesktopSetting(\n    'closeToBackgroundOnClose'\n  );\n  const [showSystemTrayIcon, setShowSystemTrayIcon] = useDesktopSetting('showSystemTrayIcon');\n  const [useCustomTitleBar, setUseCustomTitleBar] = useDesktopSetting('useCustomTitleBar');\n  const [spellcheck, setSpellcheck] = useDesktopSetting('spellcheck');\n  const [autoUpdateCheck, setAutoUpdateCheck] = useAtom(autoUpdateCheckAtom);\n\n  if (!isTauri() || !ready) return null;\n\n  let type = osType();\n  if (type === 'android' || type === 'ios') return null;\n\n  const trayFallback = showSystemTrayIcon && !runtimeState.trayAvailable && !syncing;\n\n  return (\n    <SettingsSectionPage title=\"Desktop\" requestBack={requestBack} requestClose={requestClose}>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Window</Text>\n                <SettingToggle\n                  title=\"Use custom title bar\"\n                  focusId=\"use-custom-title-bar\"\n                  description=\"Use Sable-drawn window controls and connection status instead of the native window chrome.\"\n                  value={useCustomTitleBar}\n                  onChange={setUseCustomTitleBar}\n                  ariaLabel=\"use-custom-title-bar\"\n                />\n                <SettingToggle\n                  title=\"Close button keeps Sable running\"\n                  focusId=\"close-to-background-on-close\"\n                  description={\n                    type === 'macos'\n                      ? 'When enabled, closing the window keeps Sable running instead of exiting. Reopen it from the Dock.'\n                      : 'When enabled, closing the window keeps Sable running in the system tray instead of exiting. This needs the tray icon below: without a tray to restore from, closing exits Sable.'\n                  }\n                  value={closeToBackgroundOnClose}\n                  onChange={setCloseToBackgroundOnClose}\n                  ariaLabel=\"close-to-background-on-close\"\n                />\n                {type !== 'macos' && (\n                  <SettingToggle\n                    title=\"Show system tray icon\"\n                    focusId=\"show-system-tray-icon\"\n                    description={\n                      trayFallback ? (\n                        <Text as=\"span\" style={{ color: color.Warning.Main }} size=\"T200\">\n                          System tray is unavailable on this system. Without it, closing the window\n                          exits Sable.\n                        </Text>\n                      ) : (\n                        'Show a system tray icon while Sable is running. Disable this if you want Sable to stay available without a tray icon.'\n                      )\n                    }\n                    value={!trayFallback ? showSystemTrayIcon : false}\n                    disabled={trayFallback}\n                    onChange={setShowSystemTrayIcon}\n                    ariaLabel=\"show-system-tray-icon\"\n                  />\n                )}\n              </Box>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Text input</Text>\n                <SettingToggle\n                  title=\"Spellcheck\"\n                  focusId=\"spellcheck\"\n                  description=\"Underline misspelled words and offer corrections in text fields.\"\n                  value={spellcheck}\n                  onChange={setSpellcheck}\n                  ariaLabel=\"spellcheck\"\n                />\n              </Box>\n              <Box direction=\"Column\" gap=\"100\">\n                <Text size=\"L400\">Updates</Text>\n                <SettingToggle\n                  title=\"Automatically check for updates\"\n                  focusId=\"auto-update-check\"\n                  description=\"Check GitHub for a new release on launch. Turn off to avoid contacting GitHub.\"\n                  value={autoUpdateCheck}\n                  onChange={setAutoUpdateCheck}\n                  ariaLabel=\"auto-update-check\"\n                />\n              </Box>\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { useRef } from 'react';\nimport { Box, config, Scroll, Text, toRem } from 'folds';\nimport { PageContent, SettingsSectionPage } from '$components/page';\nimport { SequenceCard, SequenceCardStyle } from '$components/sequence-card';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { SettingTile, SettingToggle } from '$components/setting-tile';\nimport { SettingMenuSelector } from '$components/setting-menu-selector';\n\nfunction MotionPreferences() {\n  const [reducedMotion, setReducedMotion] = useSetting(settingsAtom, 'reducedMotion');\n  const [autoplayGifs, setAutoplayGifs] = useSetting(settingsAtom, 'autoplayGifs');\n  const [autoplayStickers, setAutoplayStickers] = useSetting(settingsAtom, 'autoplayStickers');\n  const [autoplayEmojis, setAutoplayEmojis] = useSetting(settingsAtom, 'autoplayEmojis');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Motion</Text>\n      <SettingToggle\n        title=\"Reduced Motion\"\n        focusId=\"reduced-motion\"\n        description=\"Stops animations and sliding UI elements.\"\n        value={reducedMotion}\n        onChange={setReducedMotion}\n      />\n      <SettingToggle\n        title=\"Autoplay GIFs\"\n        focusId=\"autoplay-gifs\"\n        description=\"Automatically play animated image uploads and links.\"\n        value={autoplayGifs}\n        onChange={setAutoplayGifs}\n      />\n      <SettingToggle\n        title=\"Autoplay Stickers\"\n        focusId=\"autoplay-stickers\"\n        description=\"Automatically play animated stickers.\"\n        value={autoplayStickers}\n        onChange={setAutoplayStickers}\n      />\n      <SettingToggle\n        title=\"Autoplay Emojis\"\n        focusId=\"autoplay-emojis\"\n        description=\"Automatically play animated custom emojis.\"\n        value={autoplayEmojis}\n        onChange={setAutoplayEmojis}\n      />\n    </Box>\n  );\n}\n\nfunction TextColorPreferences() {\n  const [saturation, setSaturation] = useSetting(settingsAtom, 'saturationLevel');\n  const [underlineLinks, setUnderlineLinks] = useSetting(settingsAtom, 'underlineLinks');\n\n  const [renderGlobalColors, setRenderGlobalColors] = useSetting(\n    settingsAtom,\n    'renderGlobalNameColors'\n  );\n  const [renderRoomColors, setRenderRoomColors] = useSetting(settingsAtom, 'renderRoomColors');\n  const [renderPersonaColors, setRenderPersonaColors] = useSetting(\n    settingsAtom,\n    'renderPersonaColors'\n  );\n  const [nameColorLightnessCorrection, setNameColorLightnessCorrection] = useSetting(\n    settingsAtom,\n    'nameColorLightnessCorrection'\n  );\n  const [renderRoomFonts, setRenderRoomFonts] = useSetting(settingsAtom, 'renderRoomFonts');\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Text and Color</Text>\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Saturation\"\n          focusId=\"saturation\"\n          description={`${saturation}%`}\n          after={\n            <input\n              type=\"range\"\n              min=\"0\"\n              max=\"100\"\n              step=\"1\"\n              value={saturation}\n              onChange={(e) => setSaturation(Number.parseInt(e.target.value, 10))}\n              style={{\n                width: toRem(160),\n                cursor: 'pointer',\n                appearance: 'none',\n                height: toRem(6),\n                borderRadius: config.radii.Pill,\n                backgroundColor: 'var(--sable-surface-container-line)',\n                accentColor: 'var(--sable-primary-main)',\n              }}\n            />\n          }\n        />\n      </SequenceCard>\n\n      <SettingToggle\n        title=\"Render Global Username Colors\"\n        focusId=\"render-global-username-colors\"\n        description=\"Display the username colors anyone can set in their account settings.\"\n        value={renderGlobalColors}\n        onChange={setRenderGlobalColors}\n      />\n      <SettingToggle\n        title=\"Render Space/Room Username Colors\"\n        focusId=\"render-space-room-username-colors\"\n        description=\"Display the username colors that can be set with /color.\"\n        value={renderRoomColors}\n        onChange={setRenderRoomColors}\n      />\n      <SettingToggle\n        title=\"Render Persona Username Colors\"\n        focusId=\"render-persona-username-colors\"\n        description=\"Display the username colors that can be set on personas.\"\n        value={renderPersonaColors}\n        onChange={setRenderPersonaColors}\n      />\n      <SettingToggle\n        title=\"Render Space/Room Fonts\"\n        focusId=\"render-space-room-fonts\"\n        description=\"Display the username fonts that can be set with /font.\"\n        value={renderRoomFonts}\n        onChange={setRenderRoomFonts}\n      />\n      <SettingToggle\n        title=\"Underline Links\"\n        focusId=\"underline-links\"\n        description=\"Always show underlines on links in chat, bios and room descriptions.\"\n        value={underlineLinks}\n        onChange={setUnderlineLinks}\n      />\n\n      <SequenceCard className={SequenceCardStyle} variant=\"SurfaceVariant\" direction=\"Column\">\n        <SettingTile\n          title=\"Name color contrast correction\"\n          focusId=\"name-color-lightness-correction\"\n          description=\"Automatically correct the lightness of colors to be more readable.\"\n          after={\n            <SettingMenuSelector\n              value={nameColorLightnessCorrection}\n              options={[\n                { value: 'off', label: 'None' },\n                { value: 'weak', label: 'Weak' },\n                { value: 'strong', label: 'Strong' },\n              ]}\n              onSelect={setNameColorLightnessCorrection}\n            />\n          }\n        />\n      </SequenceCard>\n    </Box>\n  );\n}\n\ntype AccessibilityProps = {\n  requestBack?: () => void;\n  requestClose: () => void;\n};\n\nexport function Accessibility({ requestBack, requestClose }: AccessibilityProps) {\n  const accessibilityScrollRef = useRef<HTMLDivElement | null>(null);\n\n  return (\n    <SettingsSectionPage\n      title=\"Accessibility\"\n      requestBack={requestBack}\n      requestClose={requestClose}\n    >\n      <Box grow=\"Yes\">\n        <Scroll ref={accessibilityScrollRef} hideTrack visibility=\"Hover\">\n          <PageContent>\n            <Box direction=\"Column\" gap=\"700\">\n              <TextColorPreferences />\n              <MotionPreferences />\n            </Box>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </SettingsSectionPage>\n  );\n}\n","import { useMemo, useState } from 'react';\nimport type { ComponentType, JSX, ReactNode } from 'react';\nimport { DesktopIcon, PersonSimpleCircleIcon, type IconProps } from '@phosphor-icons/react';\nimport { Avatar, Box, Button, config, Input, MenuItem, Text } from 'folds';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { useUserProfile } from '$hooks/useUserProfile';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { UserAvatar } from '$components/user-avatar';\nimport { nameInitials } from '$utils/common';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { LogoutDialogOverlay } from '$components/LogoutDialogOverlay';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport {\n  Bell,\n  Devices as DevicesIcon,\n  Flask,\n  GearSix,\n  Info,\n  Keyboard,\n  MagnifyingGlass,\n  menuIcon,\n  SignOut,\n  Palette,\n  sizedIcon,\n  Smiley,\n  Terminal,\n  User,\n  UsersThree,\n} from '$components/icons/phosphor';\nimport { SettingsShell, type SectionDescriptor } from '$components/SettingsShell';\nimport { About } from './about';\nimport { Account } from './account';\nimport { Cosmetics } from './cosmetics/Cosmetics';\nimport { DeveloperTools } from './developer-tools';\nimport { Devices } from './devices';\nimport { EmojisStickers } from './emojis-stickers';\nimport { Experimental } from './experimental/Experimental';\nimport { General } from './general';\nimport { KeyboardShortcuts } from './keyboard-shortcuts';\nimport { Notifications } from './notifications';\nimport { PerMessageProfilePage } from './Persona/ProfilesPage';\nimport { settingsSections, type SettingsSectionId } from './routes';\nimport { searchSettings, type SettingsSearchEntry } from './settingsSearch';\nimport { useSettingsFocus } from './useSettingsFocus';\nimport { SettingsLinkProvider } from './SettingsLinkContext';\nimport { useSettingsLinkBaseUrl } from './useSettingsLinkBaseUrl';\nimport { Desktop } from './desktop';\nimport { isDesktopTauri } from '$utils/platform';\nimport { Accessibility } from './accessibility/Accessibility';\n\nenum SettingsPages {\n  GeneralPage,\n  AccountPage,\n  AccessibilityPage,\n  PerMessageProfilesPage,\n  NotificationPage,\n  DevicesPage,\n  DesktopPage,\n  EmojisStickersPage,\n  CosmeticsPage,\n  DeveloperToolsPage,\n  ExperimentalPage,\n  AboutPage,\n  KeyboardShortcutsPage,\n}\n\ntype PhosphorIcon = ComponentType<IconProps>;\n\nexport type SettingsMenuItem = {\n  id: SettingsSectionId;\n  name: string;\n  icon: PhosphorIcon;\n  activeIcon?: PhosphorIcon;\n};\n\nconst settingsMenuIcons: Record<\n  SettingsSectionId,\n  Pick<SettingsMenuItem, 'icon' | 'activeIcon'>\n> = {\n  general: { icon: GearSix },\n  account: { icon: User },\n  persona: { icon: UsersThree },\n  appearance: { icon: Palette },\n  accessibility: { icon: PersonSimpleCircleIcon },\n  notifications: { icon: Bell },\n  devices: { icon: DevicesIcon },\n  desktop: { icon: DesktopIcon },\n  emojis: { icon: Smiley },\n  'developer-tools': { icon: Terminal },\n  experimental: { icon: Flask },\n  about: { icon: Info },\n  'keyboard-shortcuts': { icon: Keyboard },\n};\n\nconst settingsPageToSectionId: Record<SettingsPages, SettingsSectionId> = {\n  [SettingsPages.GeneralPage]: 'general',\n  [SettingsPages.AccountPage]: 'account',\n  [SettingsPages.AccessibilityPage]: 'accessibility',\n  [SettingsPages.PerMessageProfilesPage]: 'persona',\n  [SettingsPages.NotificationPage]: 'notifications',\n  [SettingsPages.DevicesPage]: 'devices',\n  [SettingsPages.DesktopPage]: 'desktop',\n  [SettingsPages.EmojisStickersPage]: 'emojis',\n  [SettingsPages.CosmeticsPage]: 'appearance',\n  [SettingsPages.DeveloperToolsPage]: 'developer-tools',\n  [SettingsPages.ExperimentalPage]: 'experimental',\n  [SettingsPages.AboutPage]: 'about',\n  [SettingsPages.KeyboardShortcutsPage]: 'keyboard-shortcuts',\n};\n\nconst settingsSectionIdToPage: Record<SettingsSectionId, SettingsPages> = {\n  general: SettingsPages.GeneralPage,\n  account: SettingsPages.AccountPage,\n  persona: SettingsPages.PerMessageProfilesPage,\n  appearance: SettingsPages.CosmeticsPage,\n  accessibility: SettingsPages.AccessibilityPage,\n  notifications: SettingsPages.NotificationPage,\n  devices: SettingsPages.DevicesPage,\n  desktop: SettingsPages.DesktopPage,\n  emojis: SettingsPages.EmojisStickersPage,\n  'developer-tools': SettingsPages.DeveloperToolsPage,\n  experimental: SettingsPages.ExperimentalPage,\n  about: SettingsPages.AboutPage,\n  'keyboard-shortcuts': SettingsPages.KeyboardShortcutsPage,\n};\n\nconst settingsSectionComponents = {\n  general: General,\n  account: Account,\n  persona: PerMessageProfilePage,\n  appearance: Cosmetics,\n  accessibility: Accessibility,\n  notifications: Notifications,\n  devices: Devices,\n  desktop: Desktop,\n  emojis: EmojisStickers,\n  'developer-tools': DeveloperTools,\n  experimental: Experimental,\n  about: About,\n  'keyboard-shortcuts': KeyboardShortcuts,\n} as const satisfies Record<\n  SettingsSectionId,\n  (props: { requestBack?: () => void; requestClose: () => void }) => JSX.Element | null\n>;\n\ntype ControlledSettingsProps = {\n  activeSection?: SettingsSectionId | null;\n  onSelectSection?: (section: SettingsSectionId) => void;\n  onSelectSetting?: (section: SettingsSectionId, focus: string) => void;\n  onBack?: () => void;\n  requestClose: () => void;\n  initialPage?: SettingsPages;\n};\n\ntype SectionWrapperProps = {\n  children: ReactNode;\n  section: SettingsSectionId;\n  baseUrl: string;\n};\n\nfunction SettingsSectionProvider({ children, section, baseUrl }: SectionWrapperProps) {\n  useSettingsFocus();\n  return <SettingsLinkProvider value={{ section, baseUrl }}>{children}</SettingsLinkProvider>;\n}\n\nexport function Settings({\n  activeSection,\n  onSelectSection,\n  onSelectSetting,\n  onBack,\n  requestClose,\n  initialPage,\n}: ControlledSettingsProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const userId = mx.getUserId()!;\n  const profile = useUserProfile(userId);\n  const displayName = profile.displayName ?? getMxIdLocalPart(userId) ?? userId;\n  const avatarUrl = profile.avatarUrl\n    ? (mxcUrlToHttp(mx, profile.avatarUrl, useAuthentication, 96, 96, 'crop') ?? undefined)\n    : undefined;\n\n  const [showPersona] = useSetting(settingsAtom, 'showPersonaSetting');\n  const isDesktop = isDesktopTauri();\n  const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n  const screenSize = useScreenSizeContext();\n  const isControlled = activeSection !== undefined;\n\n  const [legacyActivePage, setLegacyActivePage] = useState<SettingsPages | undefined>(() => {\n    if (initialPage === SettingsPages.PerMessageProfilesPage && !showPersona) {\n      return SettingsPages.GeneralPage;\n    }\n    if (initialPage === SettingsPages.DesktopPage && !isDesktop) {\n      return SettingsPages.GeneralPage;\n    }\n    if (initialPage) return initialPage;\n    return screenSize === ScreenSize.Mobile ? undefined : SettingsPages.GeneralPage;\n  });\n\n  const visibleSection = useMemo<SettingsSectionId | null>(() => {\n    if (isControlled) return activeSection;\n\n    if (legacyActivePage === undefined) {\n      return null;\n    }\n\n    const section = settingsPageToSectionId[legacyActivePage];\n    if (section === 'persona' && !showPersona) {\n      return 'general';\n    }\n    if (section === 'desktop' && !isDesktop) {\n      return 'general';\n    }\n    return section;\n  }, [activeSection, isControlled, legacyActivePage, showPersona, isDesktop]);\n\n  const handleSelectSection = (section: SettingsSectionId) => {\n    if (isControlled) {\n      onSelectSection?.(section);\n      return;\n    }\n\n    setLegacyActivePage(settingsSectionIdToPage[section]);\n  };\n\n  const handleRequestClose = () => {\n    if (isControlled) {\n      requestClose();\n      return;\n    }\n\n    if (screenSize === ScreenSize.Mobile) {\n      setLegacyActivePage(undefined);\n      return;\n    }\n\n    requestClose();\n  };\n\n  const handleRequestBack = () => {\n    if (isControlled) {\n      onBack?.();\n      return;\n    }\n\n    if (screenSize === ScreenSize.Mobile) {\n      setLegacyActivePage(undefined);\n      return;\n    }\n\n    setLegacyActivePage(SettingsPages.GeneralPage);\n  };\n\n  const sections = useMemo<Record<SettingsSectionId, SectionDescriptor>>(() => {\n    const result = {} as Record<SettingsSectionId, SectionDescriptor>;\n    for (const sec of settingsSections) {\n      const icons = settingsMenuIcons[sec.id];\n      result[sec.id] = {\n        label: sec.label,\n        icon: icons.icon,\n        activeIcon: icons.activeIcon,\n        Component: settingsSectionComponents[sec.id],\n      };\n    }\n    return result;\n  }, []);\n\n  const visibleSectionIds = useMemo<SettingsSectionId[]>(\n    () =>\n      settingsSections\n        .filter(\n          (sec) => (showPersona || sec.id !== 'persona') && (isDesktop || sec.id !== 'desktop')\n        )\n        .map((sec) => sec.id),\n    [showPersona, isDesktop]\n  );\n\n  const [searchQuery, setSearchQuery] = useState('');\n  const searchResults = useMemo(() => searchSettings(searchQuery), [searchQuery]);\n  const isSearching = searchQuery.trim().length > 0;\n  const menuItemTextSize = screenSize === ScreenSize.Mobile ? 'T400' : 'T300';\n\n  const handleSearchResultSelect = (entry: SettingsSearchEntry) => {\n    setSearchQuery('');\n    onSelectSetting?.(entry.section, entry.focusId);\n  };\n\n  const renderHeader = useMemo(\n    () =>\n      (closeButton: ReactNode): ReactNode => (\n        <Box grow=\"Yes\" gap=\"200\">\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            <Avatar size=\"200\" radii=\"300\">\n              <UserAvatar\n                userId={userId}\n                src={avatarUrl}\n                renderFallback={() => <Text size=\"H6\">{nameInitials(displayName)}</Text>}\n              />\n            </Avatar>\n            <Text size=\"H4\" truncate>\n              Settings\n            </Text>\n          </Box>\n          <Box shrink=\"No\">{closeButton}</Box>\n        </Box>\n      ),\n    [userId, avatarUrl, displayName]\n  );\n\n  return (\n    <SettingsShell\n      sections={sections}\n      sectionIds={visibleSectionIds}\n      active={visibleSection}\n      onSelect={handleSelectSection}\n      onBack={handleRequestBack}\n      requestClose={handleRequestClose}\n      renderHeader={renderHeader}\n      showCloseInHeader={visibleSection === null}\n      menuItemTextSize={menuItemTextSize}\n      closeButtonAriaLabel=\"Close settings\"\n      searchBar={\n        <Input\n          variant=\"SurfaceVariant\"\n          size=\"400\"\n          placeholder=\"Search settings\"\n          maxLength={50}\n          value={searchQuery}\n          onChange={(e) => setSearchQuery((e.target as HTMLInputElement).value)}\n          before={sizedIcon(MagnifyingGlass, '50')}\n          style={{ width: '100%' }}\n        />\n      }\n      searchResults={\n        isSearching ? (\n          searchResults.length > 0 ? (\n            searchResults.map((entry) => (\n              <MenuItem\n                key={`${entry.section}-${entry.focusId}`}\n                variant=\"Background\"\n                radii=\"400\"\n                before={sizedIcon(MagnifyingGlass, '50')}\n                onClick={() => handleSearchResultSelect(entry)}\n              >\n                <Box direction=\"Column\">\n                  <Text size={menuItemTextSize} truncate>\n                    {entry.label}\n                  </Text>\n                  <Text size=\"T200\" truncate>\n                    {entry.sectionLabel}\n                  </Text>\n                </Box>\n              </MenuItem>\n            ))\n          ) : (\n            <Box style={{ padding: config.space.S300 }} alignItems=\"Center\" justifyContent=\"Center\">\n              <Text size=\"T300\">No results found</Text>\n            </Box>\n          )\n        ) : undefined\n      }\n      renderSection={(viewport) =>\n        visibleSection ? (\n          <SettingsSectionProvider section={visibleSection} baseUrl={settingsLinkBaseUrl}>\n            {viewport}\n          </SettingsSectionProvider>\n        ) : null\n      }\n      footer={\n        <Box style={{ padding: config.space.S200 }} shrink=\"No\" direction=\"Column\">\n          <UseStateProvider initial={false}>\n            {(logout, setLogout) => (\n              <>\n                <Button\n                  size=\"300\"\n                  variant=\"Critical\"\n                  fill=\"None\"\n                  radii=\"Pill\"\n                  before={menuIcon(SignOut)}\n                  onClick={() => setLogout(true)}\n                >\n                  <Text size=\"B400\">Logout</Text>\n                </Button>\n                {logout && <LogoutDialogOverlay requestClose={() => setLogout(false)} />}\n              </>\n            )}\n          </UseStateProvider>\n        </Box>\n      }\n    />\n  );\n}\n","import { useEffect } from 'react';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { getSettingsPath } from '$pages/pathUtils';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { isDesktopTauri } from '$utils/platform';\nimport { trimTrailingSlash } from '$utils/common';\nimport { getShallowCloseTarget } from '$pages/client/shallowRoute';\nimport type { SettingsRouteState } from './navigation';\nimport { Settings } from './Settings';\nimport { isSettingsSectionId, type SettingsSectionId } from './routes';\n\nfunction resolveSettingsSection(\n  section: string | undefined,\n  screenSize: ScreenSize,\n  showPersona: boolean,\n  showDesktop: boolean\n): SettingsSectionId | null {\n  if (section === undefined) {\n    return screenSize === ScreenSize.Mobile ? null : 'general';\n  }\n\n  if (!isSettingsSectionId(section)) {\n    return null;\n  }\n\n  if (section === 'persona' && !showPersona) {\n    return null;\n  }\n\n  if (section === 'desktop' && !showDesktop) {\n    return null;\n  }\n\n  return section;\n}\n\ntype SettingsRouteProps = {\n  routeSection?: string;\n};\n\nexport function SettingsRoute({ routeSection }: SettingsRouteProps) {\n  const { section: paramsSection } = useParams<{ section?: string }>();\n  const section = routeSection ?? paramsSection;\n  const navigate = useNavigate();\n  const location = useLocation();\n  const screenSize = useScreenSizeContext();\n  const [showPersona] = useSetting(settingsAtom, 'showPersonaSetting');\n  const showDesktop = isDesktopTauri();\n  const routeState = location.state as SettingsRouteState | null;\n  const shallowBackgroundState =\n    screenSize !== ScreenSize.Mobile && Boolean(routeState?.backgroundLocation);\n  const canonicalPathname = trimTrailingSlash(location.pathname);\n  const shouldCanonicalizeTrailingSlash =\n    location.pathname.length > canonicalPathname.length &&\n    canonicalPathname.startsWith('/settings');\n  const activeSection = resolveSettingsSection(section, screenSize, showPersona, showDesktop);\n  const shouldRedirectToGeneral = section === undefined && screenSize !== ScreenSize.Mobile;\n  const shouldRedirectToIndex = section !== undefined && activeSection === null;\n\n  useEffect(() => {\n    if (shouldCanonicalizeTrailingSlash) {\n      navigate(\n        {\n          pathname: canonicalPathname,\n          search: location.search,\n          hash: location.hash,\n        },\n        { replace: true, state: routeState }\n      );\n      return;\n    }\n\n    if (shouldRedirectToGeneral) {\n      navigate(getSettingsPath('general'), {\n        replace: true,\n        state: routeState?.backgroundLocation ? routeState : { redirectedFromDesktopRoot: true },\n      });\n      return;\n    }\n\n    if (!shouldRedirectToIndex) return;\n\n    navigate(getSettingsPath(), { replace: true, state: routeState });\n  }, [\n    canonicalPathname,\n    location.hash,\n    location.search,\n    navigate,\n    routeState,\n    shouldCanonicalizeTrailingSlash,\n    shouldRedirectToGeneral,\n    shouldRedirectToIndex,\n  ]);\n\n  if (shouldCanonicalizeTrailingSlash || shouldRedirectToGeneral || shouldRedirectToIndex) {\n    return null;\n  }\n\n  const requestBack = () => {\n    if (section === undefined) return;\n\n    if (screenSize === ScreenSize.Mobile) {\n      if (routeState?.pushedFromSettingsMenu) {\n        navigate(-1);\n        return;\n      }\n\n      navigate(getSettingsPath(), { replace: true, state: routeState });\n      return;\n    }\n\n    let desktopBackState: SettingsRouteState | undefined;\n    if (routeState?.backgroundLocation) {\n      desktopBackState = routeState;\n    } else if (routeState?.redirectedFromDesktopRoot) {\n      desktopBackState = { redirectedFromDesktopRoot: true };\n    }\n\n    navigate(getSettingsPath('general'), {\n      replace: true,\n      state: desktopBackState,\n    });\n  };\n\n  const requestClose = () => {\n    const closeTarget = getShallowCloseTarget(routeState);\n    navigate(closeTarget.to, { replace: true, state: closeTarget.state });\n  };\n\n  const menuPushState = (): SettingsRouteState | null =>\n    screenSize === ScreenSize.Mobile && activeSection === null\n      ? { ...routeState, pushedFromSettingsMenu: true }\n      : routeState;\n\n  const handleSelectSection = (nextSection: SettingsSectionId) => {\n    if (nextSection === activeSection) return;\n\n    navigate(getSettingsPath(nextSection), {\n      replace: shallowBackgroundState,\n      state: menuPushState(),\n    });\n  };\n\n  const handleSelectSetting = (nextSection: SettingsSectionId, focus: string) => {\n    navigate(getSettingsPath(nextSection, focus), {\n      replace: shallowBackgroundState,\n      state: menuPushState(),\n    });\n  };\n\n  return (\n    <Settings\n      activeSection={activeSection}\n      onBack={requestBack}\n      onSelectSection={handleSelectSection}\n      onSelectSetting={handleSelectSetting}\n      requestClose={requestClose}\n    />\n  );\n}\n","import { SidebarAvatar, SidebarItem, SidebarItemTooltip } from '$components/sidebar';\nimport { GearSix, getPhosphorIconSize } from '$components/icons/phosphor';\nimport { useOpenSettings } from '$features/settings';\nimport { matchPath } from 'react-router';\nimport { SETTINGS_PATH } from '$pages/paths';\nimport { color } from 'folds';\n\nexport function SettingsTab({ isBottom, isMobile }: { isBottom?: boolean; isMobile?: boolean }) {\n  const opened = !!matchPath(SETTINGS_PATH, location.pathname);\n  const openSettings = useOpenSettings();\n\n  return (\n    <SidebarItem active={opened} isBottom={isBottom}>\n      <SidebarItemTooltip tooltip=\"Settings\" position={isBottom ? 'Top' : 'Right'}>\n        {(triggerRef) => (\n          <SidebarAvatar as=\"button\" ref={triggerRef} outlined onClick={openSettings} size={'400'}>\n            <GearSix\n              size={getPhosphorIconSize(isBottom ? 'inline' : 'toolbar')}\n              weight={opened ? 'fill' : 'regular'}\n              color={opened && isMobile ? color.Primary.Main : color.Background.OnContainer}\n            />\n          </SidebarAvatar>\n        )}\n      </SidebarItemTooltip>\n    </SidebarItem>\n  );\n}\n","import { useMemo, useRef, useState } from 'react';\nimport type { CSSProperties } from 'react';\nimport {\n  Avatar,\n  Box,\n  color as standardColors,\n  Modal,\n  Scroll,\n  Text,\n  Tooltip,\n  toRem,\n  Chip,\n  config,\n} from 'folds';\nimport classNames from 'classnames';\nimport colorMXID from '$utils/colorMXID';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { BreakWord, LineClamp3 } from '$styles/Text.css';\nimport type { UserPresence } from '$hooks/useUserPresence';\nimport { useRoom } from '$hooks/useRoom';\nimport { useSableCosmetics } from '$hooks/useSableCosmetics';\nimport { ThemeKind, useActiveTheme } from '$hooks/useTheme';\nimport { useAccessibleNameColor } from '$hooks/useAccessibleNameColor';\nimport { useNickname } from '$hooks/useNickname';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport { ImageViewer } from '$components/image-viewer';\nimport { Image as MediaImage } from '$components/media';\nimport { AvatarPresence, PresenceBadge } from '$components/presence';\nimport { UserAvatar } from '$components/user-avatar';\nimport {\n  CaretDown,\n  CaretUp,\n  Check,\n  profileIcon,\n  userFallbackIcon,\n} from '$components/icons/phosphor';\nimport { ClientSideHoverFreeze } from '$components/ClientSideHoverFreeze';\nimport { useUserProfile } from '$hooks/useUserProfile';\nimport { shadeColor, areColorsTooSimilar } from '$utils/shadeColor';\nimport * as css from './styles.css';\nimport { copyToClipboard } from '$utils/dom';\nimport { useTimeoutToggle } from '$hooks/useTimeoutToggle';\nimport { CopyIcon, CrossIcon } from '@phosphor-icons/react';\nimport { useOpenSettings } from '$features/settings';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport type { Persona } from '$app/persona';\n\ntype UserHeroProps = {\n  userId: string;\n  avatarUrl?: string;\n  bannerUrl?: string;\n  presence?: UserPresence;\n  autoplayGifs?: boolean;\n  showColor?: boolean;\n  allowEditing?: boolean;\n};\nexport function UserHero({\n  userId,\n  avatarUrl,\n  bannerUrl,\n  presence,\n  autoplayGifs,\n  allowEditing = false,\n  showColor = true,\n}: UserHeroProps) {\n  const [viewAvatar, setViewAvatar] = useState<string>();\n  const [isFullStatus, setIsFullStatus] = useState(false);\n\n  const cachedBannerUrl = useRenderableMediaUrl(bannerUrl);\n  const cachedAvatarUrl = useRenderableMediaUrl(avatarUrl);\n\n  const coverUrl = cachedBannerUrl || cachedAvatarUrl;\n  const isFallbackCover = !cachedBannerUrl && !!cachedAvatarUrl;\n\n  const isAnimated = useMemo(() => {\n    if (!coverUrl) return false;\n    const url = coverUrl.toLowerCase();\n    const isStatic = url.endsWith('.jpg') || url.endsWith('.jpeg') || url.endsWith('.png');\n\n    return !isStatic || url.includes('gif') || url.includes('webp');\n  }, [coverUrl]);\n\n  const bannerClasses = classNames(css.UserHeroCover, isFallbackCover && css.UserHeroCoverFallback);\n\n  const renderCoverImage = () => (\n    <MediaImage\n      className={classNames(css.UserHeroCover, isFallbackCover && css.UserHeroCoverFallback)}\n      src={coverUrl}\n      alt={`${userId} cover`}\n      draggable=\"false\"\n    />\n  );\n\n  const status = presence?.status;\n  const isExpandable = (status?.length ?? 0) > 70;\n\n  const fetchedProfile = useUserProfile(userId);\n  const backgroundColor = fetchedProfile.heroColor ?? standardColors.Surface.Container;\n  const fetchedBrightness = fetchedProfile?.heroBrightness;\n  const isBackgroundDark = fetchedBrightness ? fetchedBrightness === 'dark' : undefined;\n  const cardColor =\n    shadeColor(backgroundColor, isBackgroundDark ? -80 : 80) ?? standardColors.Background.Container;\n  const innerColor = shadeColor(backgroundColor, isBackgroundDark ? -50 : 50) ?? backgroundColor;\n  const statusSurfaceColor =\n    shadeColor(innerColor, fetchedBrightness === 'light' ? -14 : 32) ?? cardColor;\n  const textColor =\n    ((fetchedBrightness === 'dark' || areColorsTooSimilar('#000000', cardColor)) && '#FFFFFF') ||\n    ((fetchedBrightness === 'light' || areColorsTooSimilar('#FFFFFF', cardColor)) && '#000000') ||\n    undefined;\n  const statusHoverBrightness = fetchedBrightness === 'light' ? 0.94 : 1.08;\n  const openSettings = useOpenSettings();\n\n  return (\n    <Box\n      direction=\"Column\"\n      className={css.UserHero}\n      style={showColor ? { backgroundColor: backgroundColor } : {}}\n    >\n      <div\n        className={css.UserHeroCoverContainer}\n        style={{\n          backgroundColor: colorMXID(userId),\n        }}\n      >\n        {coverUrl && (\n          <>\n            {isAnimated && !autoplayGifs ? (\n              <ClientSideHoverFreeze src={coverUrl} className={bannerClasses}>\n                {renderCoverImage()}\n              </ClientSideHoverFreeze>\n            ) : (\n              renderCoverImage()\n            )}\n          </>\n        )}\n      </div>\n      <Box direction=\"Row\" className={css.UserHeroAvatarStatusContainer}>\n        <div className={css.UserHeroAvatarContainer}>\n          <AvatarPresence\n            className={css.UserAvatarContainer}\n            badge={presence && <PresenceBadge presence={presence.presence} />}\n          >\n            <Avatar\n              as={avatarUrl ? 'button' : 'div'}\n              onClick={avatarUrl ? () => setViewAvatar(avatarUrl) : undefined}\n              className={css.UserHeroAvatar}\n              size=\"500\"\n            >\n              <UserAvatar\n                className={css.UserHeroAvatarImg}\n                userId={userId}\n                src={avatarUrl}\n                alt={userId}\n                renderFallback={() => userFallbackIcon('hero')}\n              />\n            </Avatar>\n          </AvatarPresence>\n          {viewAvatar && (\n            <ModalOverlay requestClose={() => setViewAvatar(undefined)}>\n              <Modal size=\"500\" onContextMenu={(evt: React.MouseEvent) => evt.stopPropagation()}>\n                <ImageViewer\n                  src={viewAvatar}\n                  alt={userId}\n                  requestClose={() => setViewAvatar(undefined)}\n                />\n              </Modal>\n            </ModalOverlay>\n          )}\n        </div>\n        {((status && status.length > 0) || allowEditing) && (\n          <div className={css.UserHeroStatusContainer}>\n            <Tooltip\n              radii=\"400\"\n              variant=\"Surface\"\n              role={allowEditing ? 'button' : undefined}\n              onClick={\n                allowEditing\n                  ? () => openSettings('account', 'status')\n                  : isExpandable\n                    ? () => setIsFullStatus(!isFullStatus)\n                    : undefined\n              }\n              className={classNames(\n                css.UserHeroStatusTooltip,\n                isExpandable && css.UserHeroStatusTooltipInteractive\n              )}\n              style={{\n                maxHeight: isFullStatus ? toRem(105) : toRem(48),\n                cursor: allowEditing || isExpandable ? 'pointer' : 'default',\n                display: 'flex',\n                width: allowEditing && !status ? '100%' : 'fit-content',\n                textAlign: 'center',\n                padding: `${toRem(8)} ${toRem(12)}`,\n                backgroundColor: statusSurfaceColor,\n                color: textColor,\n                borderStyle: 'none',\n                borderWidth: 0,\n                outline: 'none',\n                boxShadow: 'inset 0 1px 1px rgba(0, 0, 0, 0.05)',\n                ...({\n                  '--user-hero-status-hover-brightness': String(statusHoverBrightness),\n                } as CSSProperties),\n              }}\n            >\n              <Box\n                direction=\"Row\"\n                gap=\"100\"\n                style={{ height: '100%', maxWidth: '100%', flex: allowEditing ? 1 : undefined }}\n              >\n                {isFullStatus ? (\n                  <Scroll visibility=\"Hover\" hideTrack style={{ height: '100%', flex: 1 }}>\n                    <Text\n                      size=\"T200\"\n                      style={{\n                        wordBreak: 'break-word',\n                        fontStyle: allowEditing && !status ? 'italic' : 'normal',\n                      }}\n                      truncate={allowEditing}\n                    >\n                      {status || (allowEditing && \"What's on your mind?\")}\n                    </Text>\n                  </Scroll>\n                ) : (\n                  <Text\n                    size=\"T200\"\n                    style={{\n                      flex: 1,\n                      display: '-webkit-box',\n                      overflowWrap: 'anywhere',\n                      WebkitLineClamp: 2,\n                      WebkitBoxOrient: 'vertical',\n                      overflow: 'hidden',\n                      opacity: allowEditing && !status ? config.opacity.Placeholder : 1,\n                    }}\n                  >\n                    {status || (allowEditing && \"What's on your mind?\")}\n                  </Text>\n                )}\n\n                {isExpandable && !allowEditing && (\n                  <Box\n                    shrink=\"No\"\n                    alignItems=\"Center\"\n                    justifyContent=\"Center\"\n                    style={{\n                      alignSelf: isFullStatus ? 'flex-start' : 'center',\n                    }}\n                  >\n                    {profileIcon(isFullStatus ? CaretUp : CaretDown)}\n                  </Box>\n                )}\n              </Box>\n            </Tooltip>\n          </div>\n        )}\n      </Box>\n    </Box>\n  );\n}\n\ntype UserHeroNameProps = {\n  displayName?: string;\n  userId: string;\n  server?: string;\n  customHeroCards?: boolean;\n  pmp?: Persona;\n  clearPmp?: () => void;\n};\n\ntype UserHeroNameInnerProps = {\n  shownName: string;\n  username?: string;\n  nick?: string;\n  server?: string;\n  color?: string;\n  font?: string;\n  customHeroCards?: boolean;\n  isPmp?: boolean;\n  clearPmp?: () => void;\n};\n\nfunction UserHeroNameInner({\n  shownName,\n  nick,\n  username,\n  server,\n  color,\n  font,\n  isPmp,\n  clearPmp,\n}: UserHeroNameInnerProps) {\n  const [copied, setCopied] = useTimeoutToggle();\n  const [isHovered, setIsHovered] = useState(false);\n  const isSuccess = useRef(false);\n\n  return (\n    <Box grow=\"Yes\" direction=\"Column\" gap=\"0\">\n      <Box alignItems=\"Baseline\" gap=\"200\" wrap=\"Wrap\">\n        <Text\n          size=\"H4\"\n          className={classNames(BreakWord, LineClamp3)}\n          title={shownName}\n          style={{ color, fontFamily: font }}\n        >\n          {shownName}\n        </Text>\n        {nick && (\n          <Text size=\"T200\" priority=\"300\" title={`Nickname (real: ${username})`}>\n            (nick)\n          </Text>\n        )}\n      </Box>\n      <Box alignItems=\"Center\" gap=\"100\" wrap=\"Wrap\">\n        <Chip\n          onClick={(evt) => {\n            evt.stopPropagation();\n            if (username && server) {\n              copyToClipboard(`@${username}:${server}`);\n              isSuccess.current = true;\n            } else isSuccess.current = false;\n            setCopied();\n          }}\n          style={{ backgroundColor: 'transparent', color: 'inherit', padding: '0' }}\n          onPointerEnter={() => setIsHovered(true)}\n          onPointerLeave={() => setIsHovered(false)}\n          before={\n            <Text\n              size=\"T200\"\n              className={classNames(BreakWord, LineClamp3)}\n              title={username}\n              truncate\n            >{`@${username}`}</Text>\n          }\n          after={\n            copied || isHovered ? (\n              profileIcon(copied ? (isSuccess ? Check : CrossIcon) : CopyIcon)\n            ) : (\n              <></>\n            )\n          }\n        />\n        {isPmp && (\n          <>\n            {' - '}\n            <Chip\n              onClick={(evt) => {\n                evt.stopPropagation();\n                clearPmp?.();\n              }}\n              style={{ backgroundColor: 'transparent', color: 'inherit', padding: '0' }}\n              before={\n                <Text\n                  size=\"T200\"\n                  className={classNames(BreakWord, LineClamp3, css.LinkUnderline)}\n                  truncate\n                >\n                  View account profile\n                </Text>\n              }\n            />\n          </>\n        )}\n      </Box>\n    </Box>\n  );\n}\n\nexport function UserHeroName({\n  displayName,\n  userId,\n  server,\n  customHeroCards,\n  pmp,\n  clearPmp,\n}: UserHeroNameProps) {\n  const username = getMxIdLocalPart(userId);\n  const nick = useNickname(userId);\n\n  // personas\n  const profile = useUserProfile(userId, useRoom(), undefined, false, true);\n  const themeKind =\n    profile.heroBrightness === 'light'\n      ? ThemeKind.Light\n      : profile.heroBrightness === 'dark'\n        ? ThemeKind.Dark\n        : undefined;\n\n  // had to pull this out of usePersonaCosmetics because i couldn't pass around themeKind properly.\n  const activeTheme = useActiveTheme();\n  const accessibleNameColor = useAccessibleNameColor(themeKind ?? activeTheme.kind);\n\n  const pmpNameColor =\n    pmp &&\n    accessibleNameColor(\n      (themeKind ?? activeTheme.kind) === ThemeKind.Dark\n        ? pmp['eu.she-a.color']?.on_dark\n        : pmp['eu.she-a.color']?.on_light\n    );\n\n  // Sable username color and fonts\n  const { color, font } = useSableCosmetics(userId, useRoom(), customHeroCards);\n  const shownName = pmp?.displayname ?? nick ?? displayName ?? username ?? userId;\n\n  return (\n    <UserHeroNameInner\n      username={username}\n      isPmp={!!pmp}\n      server={server}\n      shownName={shownName}\n      color={pmpNameColor ?? color}\n      font={font}\n      clearPmp={clearPmp}\n    />\n  );\n}\n\nexport function GlobalUserHeroName({ displayName, userId, server }: UserHeroNameProps) {\n  const username = getMxIdLocalPart(userId);\n  const nick = useNickname(userId);\n  const profile = useUserProfile(userId);\n  const activeTheme = useActiveTheme();\n  const accessibleNameColor = useAccessibleNameColor(activeTheme.kind);\n\n  const shownName = nick ?? displayName ?? username ?? userId;\n\n  return (\n    <UserHeroNameInner\n      username={username}\n      server={server}\n      shownName={shownName}\n      font={profile.resolvedFont}\n      color={accessibleNameColor(profile.resolvedColor)}\n    />\n  );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { Session } from '$state/sessions';\nimport { fetch } from '$utils/fetch';\nimport { fetchMediaBlob } from '$utils/mediaTransport';\n\nexport type SessionProfile = {\n  displayName?: string;\n  avatarHttpUrl?: string;\n};\n\ntype SessionProfiles = Record<string, SessionProfile>;\n\nconst parseMxc = (mxcUrl: string): { serverName: string; mediaId: string } | undefined => {\n  const match = mxcUrl.match(/^mxc:\\/\\/([^/]+)\\/(.+)$/);\n  if (!match) return undefined;\n  const serverName = match[1];\n  const mediaId = match[2];\n  if (!serverName || !mediaId) return undefined;\n  return { serverName, mediaId };\n};\n\nconst fetchAvatarBlobUrl = async (\n  session: Session,\n  mxcUrl: string\n): Promise<string | undefined> => {\n  const parsed = parseMxc(mxcUrl);\n  if (!parsed) return undefined;\n  const { serverName, mediaId } = parsed;\n\n  const tryFetch = async (url: string) => {\n    const blob = await fetchMediaBlob(url, {\n      accessToken: session.accessToken,\n      sessionScope: session.userId,\n    });\n    return URL.createObjectURL(blob);\n  };\n\n  try {\n    return await tryFetch(\n      `${session.baseUrl}/_matrix/client/v1/media/thumbnail/${encodeURIComponent(serverName)}/${encodeURIComponent(mediaId)}?width=96&height=96&method=crop`\n    );\n  } catch {\n    try {\n      return await tryFetch(\n        `${session.baseUrl}/_matrix/media/v3/thumbnail/${encodeURIComponent(serverName)}/${encodeURIComponent(mediaId)}?width=96&height=96&method=crop`\n      );\n    } catch {\n      return undefined;\n    }\n  }\n};\n\nexport const useSessionProfiles = (sessions: Session[], enabled = true): SessionProfiles => {\n  const [profiles, setProfiles] = useState<SessionProfiles>({});\n\n  const sessionsRef = useRef(sessions);\n  sessionsRef.current = sessions;\n\n  const sessionIdentityKey = sessions\n    .map((session) =>\n      [session.userId, session.baseUrl, session.accessToken, session.deviceId].join('\\x01')\n    )\n    .join('\\x00');\n\n  useEffect(() => {\n    if (!enabled) return undefined;\n    let cancelled = false;\n    const newBlobUrls: string[] = [];\n\n    sessionsRef.current.forEach(async (session) => {\n      try {\n        const profileUrl = `${session.baseUrl}/_matrix/client/v3/profile/${encodeURIComponent(session.userId)}`;\n        const res = await fetch(profileUrl, {\n          headers: { Authorization: `Bearer ${session.accessToken}` },\n        });\n        if (!res.ok || cancelled) return;\n        const data = (await res.json()) as { displayname?: string; avatar_url?: string };\n        if (cancelled) return;\n\n        let avatarHttpUrl: string | undefined;\n        if (data.avatar_url) {\n          avatarHttpUrl = await fetchAvatarBlobUrl(session, data.avatar_url);\n          if (avatarHttpUrl) newBlobUrls.push(avatarHttpUrl);\n        }\n\n        if (cancelled) {\n          if (avatarHttpUrl) URL.revokeObjectURL(avatarHttpUrl);\n          return;\n        }\n\n        setProfiles((prev) => ({\n          ...prev,\n          [session.userId]: {\n            displayName: data.displayname ?? undefined,\n            avatarHttpUrl,\n          },\n        }));\n      } catch {\n        // ignore\n      }\n    });\n\n    return () => {\n      cancelled = true;\n      newBlobUrls.forEach((url) => URL.revokeObjectURL(url));\n    };\n  }, [enabled, sessionIdentityKey]);\n\n  return profiles;\n};\n","import type { MatrixClient } from 'matrix-js-sdk';\nimport { SetPresence } from 'matrix-js-sdk';\nimport { getPresenceSyncManager } from '$client/initMatrix';\nimport { Presence } from '../hooks/useUserPresence';\n\nconst PRESENCE_TO_SET_PRESENCE: Record<Presence, SetPresence> = {\n  [Presence.Online]: SetPresence.Online,\n  [Presence.Unavailable]: SetPresence.Unavailable,\n  [Presence.Offline]: SetPresence.Offline,\n};\n\nconst presenceToSetPresence = (presence: Presence): SetPresence =>\n  PRESENCE_TO_SET_PRESENCE[presence];\n\nexport const setUserPresence = async (\n  mx: MatrixClient,\n  presence: Presence,\n  statusMsg?: string\n): Promise<void> => {\n  const setPresence = presenceToSetPresence(presence);\n  getPresenceSyncManager(mx)?.setDesiredPresence(setPresence);\n  await Promise.all([\n    mx.setSyncPresence(setPresence),\n    mx.setPresence({\n      presence,\n      status_msg: statusMsg,\n    }),\n  ]);\n};\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport {\n  Badge,\n  Box,\n  Button,\n  Chip,\n  Dialog,\n  Header,\n  Line,\n  Menu,\n  MenuItem,\n  Spinner,\n  Text,\n  color,\n  config,\n  toRem,\n} from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport { FocusTrap } from 'focus-trap-react';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { SidebarAvatar, SidebarItem, SidebarItemBadge } from '../../../components/sidebar';\nimport { UserAvatar } from '../../../components/user-avatar';\nimport { useMatrixClient } from '../../../hooks/useMatrixClient';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '../../../utils/matrix';\nimport { nameInitials } from '../../../utils/common';\nimport { useMediaAuthentication } from '../../../hooks/useMediaAuthentication';\nimport { useOpenSettings } from '../../../features/settings';\nimport { useUserProfile } from '../../../hooks/useUserProfile';\nimport { stopPropagation } from '../../../utils/keyboard';\nimport { useUserPresence, Presence } from '../../../hooks/useUserPresence';\nimport { UserHero, GlobalUserHeroName } from '../../../components/user-profile/UserHero';\nimport { AvatarPresence, PresenceBadge, PresenceToColor } from '../../../components/presence';\nimport { createLogger } from '$utils/debug';\nimport type { Session } from '$state/sessions';\nimport { activeSessionIdAtom, backgroundUnreadCountsAtom, sessionsAtom } from '$state/sessions';\nimport { UnreadBadge, UnreadBadgeCenter } from '$components/unread-badge';\nimport { Check, chipIcon, menuIcon, Plus } from '$components/icons/phosphor';\nimport { useSessionProfiles } from '$hooks/useSessionProfiles';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { getHomePath, getLoginPath, getProfilePath, withSearchParam } from '$pages/pathUtils';\nimport { initClient, logoutClient, stopClient } from '$client/initMatrix';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport { useNavigate } from 'react-router';\nimport { useFocusWithin, useHover } from 'react-aria';\nimport { setUserPresence } from '$utils/presence';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useProfileSelected } from '$hooks/router/useRouteSelected';\nimport { useDeviceIds, useDeviceList, useSplitCurrentDevice } from '$hooks/useDeviceList';\nimport {\n  useDeviceVerificationStatus,\n  useUnverifiedDeviceCount,\n  VerificationStatus,\n} from '$hooks/useDeviceVerificationStatus';\nimport {\n  CaretDownIcon,\n  CaretRightIcon,\n  GearSixIcon,\n  PencilSimpleIcon,\n  ShieldWarningIcon,\n  UserIcon,\n} from '@phosphor-icons/react';\nimport * as css from './UserMenuTab.css';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport { useMobileTapActivation } from '$hooks/useMobileTapActivation';\n\nconst log = createLogger('AccountSwitcherTab');\n\nfunction AccountRow({\n  session,\n  isActive,\n  displayName,\n  avatarUrl,\n  isBusy,\n  isMobile,\n  unread,\n  onSwitch,\n  onSignOut,\n}: {\n  session: Session;\n  isActive: boolean;\n  displayName?: string;\n  avatarUrl?: string;\n  isBusy?: boolean;\n  isMobile?: boolean;\n  unread?: { total: number; highlight: number };\n  onSwitch: (session: Session) => void;\n  onSignOut: (session: Session) => void;\n}) {\n  const localPart = getMxIdLocalPart(session.userId) ?? session.userId;\n  const server = session.userId.split(':')[1] ?? session.baseUrl;\n  const label = displayName ?? localPart;\n\n  return (\n    <MenuItem\n      size=\"400\"\n      radii=\"300\"\n      style={{\n        opacity: isBusy ? 0.6 : undefined,\n        height: 'auto',\n        background: isMobile ? color.Background.Container : undefined,\n      }}\n      before={\n        <SidebarAvatar size=\"200\" style={{ width: toRem(28), height: toRem(28) }}>\n          <UserAvatar\n            userId={session.userId}\n            src={avatarUrl}\n            alt={label}\n            renderFallback={() => <Text size=\"H6\">{nameInitials(label)}</Text>}\n          />\n        </SidebarAvatar>\n      }\n      after={\n        <Box gap=\"200\" alignItems=\"Center\" shrink=\"No\">\n          {!isActive && unread && unread.total > 0 && (\n            <UnreadBadgeCenter>\n              <UnreadBadge highlight={unread.highlight > 0} count={unread.total} />\n            </UnreadBadgeCenter>\n          )}\n          {isActive && chipIcon(Check, { style: { color: 'var(--mx-c-success)' } })}\n          {isBusy ? (\n            <Spinner size=\"200\" variant=\"Secondary\" />\n          ) : (\n            <Chip\n              variant=\"Critical\"\n              fill=\"None\"\n              size=\"400\"\n              radii=\"300\"\n              onClick={(e) => {\n                e.stopPropagation();\n                onSignOut(session);\n              }}\n            >\n              <Text size=\"T200\">Sign out</Text>\n            </Chip>\n          )}\n        </Box>\n      }\n      onClick={() => !isActive && !isBusy && onSwitch(session)}\n    >\n      <Box\n        direction=\"Column\"\n        grow=\"Yes\"\n        style={{\n          paddingTop: config.space.S100,\n          paddingBottom: config.space.S100,\n          justifyContent: 'Center',\n        }}\n      >\n        <Text size=\"T300\" truncate>\n          {label}\n        </Text>\n        <Text size=\"T200\" priority=\"300\" truncate>\n          {isActive ? session.userId : server}\n        </Text>\n      </Box>\n    </MenuItem>\n  );\n}\n\nexport function AccountMenuOption({ isMobile, isRight }: { isMobile: boolean; isRight?: boolean }) {\n  const mx = useMatrixClient();\n  const navigate = useNavigate();\n  const sessions = useAtomValue(sessionsAtom);\n  const [activeSessionId, setActiveSessionId] = useAtom(activeSessionIdAtom);\n  const setSessions = useSetAtom(sessionsAtom);\n  const useAuthentication = useMediaAuthentication();\n  const backgroundUnreads = useAtomValue(backgroundUnreadCountsAtom);\n  const setBackgroundUnreads = useSetAtom(backgroundUnreadCountsAtom);\n\n  const [isOpen, setIsOpen] = useState(false);\n  const { hoverProps } = useHover({\n    onHoverChange: (h) => {\n      if (!isMobile) setIsOpen(h);\n    },\n  });\n  const { focusWithinProps } = useFocusWithin({\n    onFocusWithinChange: (f) => {\n      if (!isMobile) setIsOpen(f);\n    },\n  });\n\n  const [busyUserIds, setBusyUserIds] = useState(new Set());\n  const [confirmSignOutSession, setConfirmSignOutSession] = useState<Session | undefined>(\n    undefined\n  );\n\n  const activeSession = sessions.find((s) => s.userId === activeSessionId) ?? sessions[0];\n\n  const myUserId = mx.getUserId() ?? '';\n  const activeProfile = useUserProfile(myUserId);\n  const activeAvatarUrl = activeProfile.avatarUrl\n    ? (mxcUrlToHttp(mx, activeProfile.avatarUrl, useAuthentication, 96, 96, 'crop') ?? undefined)\n    : undefined;\n  const activeDisplayName = activeProfile.displayName;\n\n  const sessionProfiles = useSessionProfiles(sessions, isOpen);\n\n  const { disableAccountSwitcher } = useClientConfig();\n\n  const handleSwitch = useCallback(\n    (session: Session) => {\n      log.log('switching to account', session.userId);\n      navigate(getHomePath(), { replace: true });\n      setActiveSessionId(session.userId);\n      // Clear the unread badge for the account we're now switching into.\n      setBackgroundUnreads((prev) => {\n        const next = { ...prev };\n        delete next[session.userId];\n        return next;\n      });\n    },\n    [navigate, setActiveSessionId, setBackgroundUnreads]\n  );\n\n  const handleSignOut = useCallback(\n    async (session: Session) => {\n      log.log('signing out', session.userId);\n      setBusyUserIds((prev) => new Set(prev).add(session.userId));\n      try {\n        if (session.userId === mx.getUserId()) {\n          await logoutClient(mx, session);\n          setSessions({ type: 'DELETE', session });\n          setActiveSessionId(\n            sessions.find((s) => s.userId !== session.userId)?.userId ?? undefined\n          );\n          window.location.reload();\n        } else {\n          try {\n            const tempMx = await initClient(session);\n            await logoutClient(tempMx, session);\n          } catch (err) {\n            log.error('failed to logout background session, IndexedDB may remain', err);\n          }\n          setSessions({ type: 'DELETE', session });\n          if (activeSessionId === session.userId) {\n            setActiveSessionId(\n              sessions.find((s) => s.userId !== session.userId)?.userId ?? undefined\n            );\n          }\n        }\n      } catch (err) {\n        log.error('Logout failed', err);\n      } finally {\n        setBusyUserIds((prev) => {\n          const next = new Set(prev);\n          next.delete(session.userId);\n          return next;\n        });\n      }\n    },\n    [mx, sessions, activeSessionId, setSessions, setActiveSessionId]\n  );\n\n  const handleAddAccount = () => {\n    const url = withSearchParam(getLoginPath(), { addAccount: '1' });\n    stopClient(mx);\n    setTimeout(() => window.location.assign(url), 100);\n  };\n\n  if (!activeSession || disableAccountSwitcher) return null;\n\n  return (\n    <>\n      <Line variant=\"Surface\" size=\"300\" />\n      <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n        <MenuItem\n          size=\"300\"\n          radii=\"300\"\n          before={menuIcon(UserIcon)}\n          after={isOpen && isMobile ? menuIcon(CaretDownIcon) : menuIcon(CaretRightIcon)}\n          style={{\n            position: 'relative',\n            background: isMobile\n              ? isOpen\n                ? color.Background.ContainerHover\n                : color.Background.Container\n              : isOpen\n                ? color.Surface.ContainerHover\n                : color.Surface.Container,\n          }}\n          onClick={() => isMobile && setIsOpen(!isOpen)}\n          {...hoverProps}\n          {...focusWithinProps}\n        >\n          <Text style={{ flexGrow: 1 }} size=\"T300\">\n            Switch account\n          </Text>\n        </MenuItem>\n      </Box>\n      {isOpen && (\n        <div\n          {...hoverProps}\n          {...focusWithinProps}\n          style={\n            isMobile\n              ? {}\n              : {\n                  minWidth: toRem(240),\n                  position: 'absolute',\n                  left: isRight ? undefined : '98%',\n                  right: isRight ? '98%' : undefined,\n                  padding: toRem(15),\n                  bottom: toRem(-15),\n                }\n          }\n        >\n          <Menu\n            style={\n              isMobile\n                ? {\n                    border: 0,\n                    boxShadow: 'none',\n                    gap: 0,\n                    background: color.Background.Container,\n                  }\n                : {}\n            }\n          >\n            <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n              {sessions.map((session) => {\n                const isActive = session.userId === (activeSessionId ?? sessions[0]?.userId);\n                let rowDisplayName: string | undefined;\n                let rowAvatarUrl: string | undefined;\n                if (isActive) {\n                  rowDisplayName = activeDisplayName;\n                  rowAvatarUrl = activeAvatarUrl;\n                } else {\n                  const prof = sessionProfiles[session.userId];\n                  rowDisplayName = prof?.displayName;\n                  rowAvatarUrl = prof?.avatarHttpUrl;\n                }\n                return (\n                  <AccountRow\n                    key={session.userId}\n                    session={session}\n                    isActive={isActive}\n                    displayName={rowDisplayName}\n                    avatarUrl={rowAvatarUrl}\n                    isBusy={busyUserIds.has(session.userId)}\n                    unread={!isActive ? backgroundUnreads[session.userId] : undefined}\n                    onSwitch={handleSwitch}\n                    onSignOut={(pendingSession) => {\n                      setConfirmSignOutSession(pendingSession);\n                    }}\n                    isMobile={isMobile}\n                  />\n                );\n              })}\n              <MenuItem\n                size=\"300\"\n                radii=\"300\"\n                before={chipIcon(Plus)}\n                onClick={handleAddAccount}\n                style={{ background: isMobile ? color.Background.Container : undefined }}\n              >\n                <Text size=\"T300\">Add Account</Text>\n              </MenuItem>\n            </Box>\n          </Menu>\n        </div>\n      )}\n      {confirmSignOutSession && (\n        <ModalOverlay requestClose={() => setConfirmSignOutSession(undefined)}>\n          <Dialog variant=\"Surface\">\n            <Header\n              style={{\n                padding: `0 ${config.space.S200} 0 ${config.space.S400}`,\n                borderBottomWidth: config.borderWidth.B300,\n              }}\n              variant=\"Surface\"\n              size=\"500\"\n            >\n              <Box grow=\"Yes\">\n                <Text size=\"H4\">Sign out</Text>\n              </Box>\n            </Header>\n            <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n              <Text priority=\"400\">\n                Are you sure you want to sign out of <b>{confirmSignOutSession.userId}</b>?\n              </Text>\n              <Box direction=\"Column\" gap=\"200\">\n                <Button\n                  variant=\"Critical\"\n                  onClick={() => {\n                    handleSignOut(confirmSignOutSession);\n                    setConfirmSignOutSession(undefined);\n                  }}\n                >\n                  <Text size=\"B400\">Sign out</Text>\n                </Button>\n                <Button variant=\"Secondary\" onClick={() => setConfirmSignOutSession(undefined)}>\n                  <Text size=\"B400\">Cancel</Text>\n                </Button>\n              </Box>\n            </Box>\n          </Dialog>\n        </ModalOverlay>\n      )}\n    </>\n  );\n}\n\nconst PresenceOptions: Array<{ value: Presence; label: string }> = [\n  { value: Presence.Online, label: 'Online' },\n  { value: Presence.Unavailable, label: 'Busy' },\n  { value: Presence.Offline, label: 'Offline' },\n];\n\nexport function PresenceMenuOption({\n  isMobile,\n  isRight,\n}: {\n  isMobile: boolean;\n  isRight?: boolean;\n}) {\n  const mx = useMatrixClient();\n  const [sendPresence] = useSetting(settingsAtom, 'sendPresence');\n\n  const userId = mx.getUserId() ?? '';\n  const presence = useUserPresence(userId);\n  const currentPresence = presence?.presence ?? Presence.Online;\n\n  const [isOpen, setIsOpen] = useState(isMobile);\n\n  const { hoverProps } = useHover({\n    onHoverChange: (h) => {\n      if (!isMobile) setIsOpen(h);\n    },\n  });\n  const { focusWithinProps } = useFocusWithin({\n    onFocusWithinChange: (f) => {\n      if (!isMobile) setIsOpen(f);\n    },\n  });\n\n  const [savingStatus, setSavingStatus] = useState(false);\n  const [submittedState, setSubmittedState] = useState<Presence | null>(null);\n\n  useEffect(() => {\n    if (!submittedState) return;\n    if (currentPresence === submittedState) {\n      setSubmittedState(null);\n      setSavingStatus(false);\n    }\n  }, [currentPresence, submittedState]);\n\n  const handleSelectPresence = async (presenceValue: Presence) => {\n    if (savingStatus) return;\n    setSavingStatus(true);\n    setSubmittedState(presenceValue);\n    try {\n      await setUserPresence(mx, presenceValue);\n    } catch {\n      setSubmittedState(null);\n      setSavingStatus(false);\n    }\n  };\n\n  if (!sendPresence) return null;\n\n  return (\n    <>\n      <MenuItem\n        size=\"300\"\n        radii=\"300\"\n        before={\n          <div\n            style={{\n              display: 'flex',\n              justifyContent: 'center',\n              alignContent: 'center',\n              width: toRem(20),\n            }}\n          >\n            {savingStatus ? (\n              <Spinner\n                variant={PresenceToColor[submittedState ?? currentPresence]}\n                fill=\"Soft\"\n                size=\"50\"\n              />\n            ) : (\n              <PresenceBadge presence={currentPresence} size=\"300\" />\n            )}\n          </div>\n        }\n        after={isOpen && isMobile ? menuIcon(CaretDownIcon) : menuIcon(CaretRightIcon)}\n        style={{\n          position: 'relative',\n          background: isMobile\n            ? isOpen\n              ? color.Background.ContainerHover\n              : color.Background.Container\n            : isOpen\n              ? color.Surface.ContainerHover\n              : color.Surface.Container,\n        }}\n        onClick={() => isMobile && setIsOpen(!isOpen)}\n        {...hoverProps}\n        {...focusWithinProps}\n      >\n        <Text style={{ flexGrow: 1 }} size=\"T300\">\n          {PresenceOptions.find((v) => v.value == currentPresence)?.label}\n        </Text>\n      </MenuItem>\n      {isOpen && (\n        <div\n          {...hoverProps}\n          {...focusWithinProps}\n          style={\n            isMobile\n              ? {}\n              : {\n                  minWidth: toRem(240),\n                  position: 'absolute',\n                  left: isRight ? undefined : '98%',\n                  right: isRight ? '98%' : undefined,\n                  padding: toRem(15),\n                  bottom: toRem(25),\n                }\n          }\n        >\n          <Menu\n            style={\n              isMobile\n                ? {\n                    border: 0,\n                    boxShadow: 'none',\n                    gap: 0,\n                    background: color.Background.Container,\n                  }\n                : {}\n            }\n          >\n            <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n              {PresenceOptions.map((option) => (\n                <MenuItem\n                  key={option.value}\n                  size=\"300\"\n                  radii=\"300\"\n                  variant={currentPresence === option.value ? 'Primary' : 'Surface'}\n                  fill={currentPresence === option.value ? 'Soft' : 'None'}\n                  aria-pressed={currentPresence === option.value}\n                  disabled={savingStatus}\n                  onClick={() => {\n                    handleSelectPresence(option.value).catch(() => undefined);\n                  }}\n                  after={<PresenceBadge presence={option.value} size=\"400\" />}\n                >\n                  <Text\n                    size=\"T300\"\n                    style={{\n                      flexGrow: 1,\n                      fontWeight:\n                        currentPresence === option.value ? config.fontWeight.W600 : undefined,\n                    }}\n                  >\n                    {option.label}\n                  </Text>\n                </MenuItem>\n              ))}\n            </Box>\n          </Menu>\n        </div>\n      )}\n    </>\n  );\n}\n\nexport function useIsUnverified() {\n  const mx = useMatrixClient();\n\n  const crypto = mx.getCrypto();\n  const [devices] = useDeviceList();\n\n  const [currentDevice] = useSplitCurrentDevice(devices);\n\n  const verificationStatus = useDeviceVerificationStatus(\n    crypto,\n    mx.getSafeUserId(),\n    currentDevice?.device_id\n  );\n  const unverified = verificationStatus === VerificationStatus.Unverified;\n  return unverified;\n}\n\nexport function useUnverifiedDevices() {\n  const mx = useMatrixClient();\n\n  const crypto = mx.getCrypto();\n  const [devices] = useDeviceList();\n\n  const devicesId = useDeviceIds(devices);\n  const unverifiedDeviceCount = useUnverifiedDeviceCount(crypto, mx.getSafeUserId(), devicesId);\n  return unverifiedDeviceCount;\n}\n\nexport function UnverifiedMenuOption() {\n  const openSettings = useOpenSettings();\n  const [reducedMotion] = useSetting(settingsAtom, 'reducedMotion');\n\n  const unverifiedDeviceCount = useUnverifiedDevices();\n  const unverified = useIsUnverified();\n\n  const hasUnverified = (unverifiedDeviceCount ?? 0) > 0;\n\n  return (\n    <>\n      {hasUnverified && (\n        <MenuItem\n          className={\n            !reducedMotion\n              ? css.UnverifiedDevices({ critical: unverified })\n              : css.UnverifiedDevicesReduced({ critical: unverified })\n          }\n          size=\"300\"\n          radii=\"300\"\n          before={<ShieldWarningIcon size={20} />}\n          onClick={() => openSettings('devices')}\n        >\n          <Text style={{ flexGrow: 1 }} size=\"T300\">\n            {`Verify ${unverified ? 'this' : 'your'} device${!unverified && (unverifiedDeviceCount ?? 0) > 1 ? 's' : ''}`}\n          </Text>\n        </MenuItem>\n      )}\n    </>\n  );\n}\n\nexport function UserMenuTab({ isBottom, isMobile }: { isBottom?: boolean; isMobile?: boolean }) {\n  const mx = useMatrixClient();\n  const [oldSidebar] = useSetting(settingsAtom, 'oldSidebar');\n  const useAuthentication = useMediaAuthentication();\n  const profileSelected = useProfileSelected();\n  const navigate = useNavigate();\n\n  const userId = mx.getUserId() ?? '';\n  const server = getMxIdServer(userId);\n  const profile = useUserProfile(userId);\n  const presence = useUserPresence(userId);\n  const currentPresence = presence?.presence ?? Presence.Online;\n\n  const [menuAnchor, setMenuAnchor] = useState<RectCords>();\n  const openSettings = useOpenSettings();\n\n  const unverifiedDeviceCount = useUnverifiedDevices();\n  const unverified = useIsUnverified();\n  const hasUnverified = (unverifiedDeviceCount ?? 0) > 0;\n\n  const displayName = profile.displayName ?? getMxIdLocalPart(userId) ?? userId;\n  const avatarUrl = profile.avatarUrl\n    ? (mxcUrlToHttp(mx, profile.avatarUrl, useAuthentication, 96, 96, 'crop') ?? undefined)\n    : undefined;\n  const heroAvatarUrl = profile.avatarUrl\n    ? (mxcUrlToHttp(mx, profile.avatarUrl, useAuthentication, 160, 160, 'crop') ?? undefined)\n    : undefined;\n\n  const parsedBanner =\n    typeof profile.bannerUrl === 'string' ? profile.bannerUrl.replace(/^\"|\"$/g, '') : undefined;\n  const heroBannerUrl = parsedBanner\n    ? (mxcUrlToHttp(mx, parsedBanner, useAuthentication, 640, 192, 'scale') ?? undefined)\n    : undefined;\n\n  const handleToggle: MouseEventHandler<HTMLButtonElement | HTMLDivElement> = (evt) => {\n    if (isMobile) {\n      navigate(getProfilePath());\n      return;\n    }\n\n    const cords = evt.currentTarget.getBoundingClientRect();\n    setMenuAnchor(() => cords);\n  };\n\n  const handleCloseMenu = () => setMenuAnchor(undefined);\n  const mobileTapActivation = useMobileTapActivation(\n    isMobile ?? false,\n    () => {\n      navigate(getProfilePath());\n    },\n    handleToggle\n  );\n\n  const isActive = (!!menuAnchor || profileSelected) && !isMobile;\n\n  return (\n    <SidebarItem active={isActive} isBottom={isBottom}>\n      <Box\n        direction=\"Column\"\n        alignItems=\"Center\"\n        {...mobileTapActivation}\n        style={\n          isMobile\n            ? {\n                height: '100%',\n                justifyContent: 'Center',\n                paddingTop: config.space.S100,\n                gap: config.space.S100,\n              }\n            : {}\n        }\n      >\n        <AvatarPresence badge={<PresenceBadge presence={currentPresence} size=\"200\" />}>\n          <SidebarAvatar size={isMobile ? '300' : '400'} as=\"button\">\n            <UserAvatar\n              userId={userId}\n              src={avatarUrl}\n              alt={userId}\n              renderFallback={() => <Text size=\"H4\">{nameInitials(displayName)}</Text>}\n            />\n          </SidebarAvatar>\n        </AvatarPresence>\n        {isMobile && (\n          <Text size=\"B300\" priority=\"300\">\n            Account\n          </Text>\n        )}\n      </Box>\n\n      {hasUnverified && (\n        <SidebarItemBadge mode=\"count\">\n          <Badge\n            variant={unverified ? 'Critical' : 'Warning'}\n            size=\"300\"\n            fill=\"Solid\"\n            radii=\"Pill\"\n            outlined={false}\n          >\n            <Text as=\"span\" size=\"L400\">\n              {unverifiedDeviceCount}\n            </Text>\n          </Badge>\n        </SidebarItemBadge>\n      )}\n\n      <PopOut\n        anchor={menuAnchor}\n        position={isBottom ? 'Top' : 'Right'}\n        align=\"End\"\n        offset={6}\n        content={\n          <FocusTrap\n            focusTrapOptions={{\n              initialFocus: false,\n              returnFocusOnDeactivate: false,\n              onDeactivate: handleCloseMenu,\n              clickOutsideDeactivates: true,\n              isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown',\n              isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp',\n              escapeDeactivates: stopPropagation,\n            }}\n          >\n            <Menu style={{ width: toRem(320) }}>\n              <Box direction=\"Column\" gap=\"0\">\n                <Box direction=\"Column\" gap=\"200\">\n                  <UserHero\n                    userId={userId}\n                    avatarUrl={heroAvatarUrl}\n                    bannerUrl={heroBannerUrl}\n                    presence={presence}\n                    showColor={false}\n                    allowEditing={true}\n                  />\n                  <Box style={{ padding: `0 ${config.space.S400} 0` }}>\n                    <GlobalUserHeroName displayName={displayName} userId={userId} server={server} />\n                  </Box>\n                </Box>\n\n                <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                  <UnverifiedMenuOption />\n                  <MenuItem\n                    onClick={() => openSettings('account')}\n                    size=\"300\"\n                    radii=\"300\"\n                    before={menuIcon(PencilSimpleIcon)}\n                  >\n                    <Text style={{ flexGrow: 1 }} size=\"T300\">\n                      Edit Profile\n                    </Text>\n                  </MenuItem>\n                </Box>\n                <Line variant=\"Surface\" size=\"300\" />\n                <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                  <PresenceMenuOption\n                    isMobile={isMobile ?? false}\n                    isRight={(menuAnchor?.x ?? 0) > window.innerWidth / 2}\n                  />\n                </Box>\n\n                <AccountMenuOption\n                  isMobile={isMobile ?? false}\n                  isRight={(menuAnchor?.x ?? 0) > window.innerWidth / 2}\n                />\n                {(oldSidebar || isMobile) && (\n                  <>\n                    <Line variant=\"Surface\" size=\"300\" />\n                    <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n                      <MenuItem\n                        size=\"300\"\n                        radii=\"300\"\n                        before={menuIcon(GearSixIcon)}\n                        onClick={() => openSettings()}\n                      >\n                        <Text style={{ flexGrow: 1 }} size=\"T300\">\n                          Settings\n                        </Text>\n                      </MenuItem>\n                    </Box>\n                  </>\n                )}\n              </Box>\n            </Menu>\n          </FocusTrap>\n        }\n      />\n    </SidebarItem>\n  );\n}\n","import { atom } from 'jotai';\n\n// It is not particularly accurate and shouldn't be used for much else\n// unless you plan major refractors\nexport const lastVisitedSpaceIdAtom = atom<string | undefined>(undefined);\n","import {\n  SidebarAvatar,\n  SidebarItem,\n  SidebarItemTooltip,\n  SidebarUnreadBadge,\n} from '$components/sidebar';\nimport { getPhosphorIconSize } from '$components/icons/phosphor';\nimport { matchPath, useNavigate } from 'react-router';\nimport { HOME_PATH, SETTINGS_PATH } from '$pages/paths';\nimport { ChatTextIcon } from '@phosphor-icons/react';\nimport { useAtomValue } from 'jotai';\nimport { useInboxSelected } from '$hooks/router/useRouteSelected';\nimport { Box, color, Text, toRem } from 'folds';\nimport { useNavigateSelected } from '$hooks/router/useRouteSelected';\nimport { useProfileSelected } from '$hooks/router/useRouteSelected';\nimport { getSpacePath } from '$pages/pathUtils';\nimport { lastVisitedSpaceIdAtom } from '$state/room/lastSpace';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { useRoomsUnread } from '$state/hooks/unread';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { resolveUnreadBadgeMode } from '$components/unread-badge';\nimport { useMobileTapActivation } from '$hooks/useMobileTapActivation';\n\nexport function MessageTab({ isBottom, isMobile }: { isBottom?: boolean; isMobile?: boolean }) {\n  const rooms = useAtomValue(allRoomsAtom);\n  const unread = useRoomsUnread(rooms, roomToUnreadAtom);\n\n  const navigate = useNavigate();\n  const lastSpaceId = useAtomValue(lastVisitedSpaceIdAtom);\n  const navigateRouteActive = useNavigateSelected();\n  const profileRouteActive = useProfileSelected();\n  const inboxSelected = useInboxSelected();\n  const opened = !(\n    matchPath(SETTINGS_PATH, location.pathname) ||\n    navigateRouteActive ||\n    profileRouteActive ||\n    inboxSelected\n  );\n  const onBack = () => {\n    if (!lastSpaceId) {\n      navigate(HOME_PATH);\n      return;\n    }\n\n    navigate(getSpacePath(lastSpaceId));\n  };\n  const mobileTapActivation = useMobileTapActivation(isMobile ?? false, onBack, onBack);\n\n  const [showUnreadCounts] = useSetting(settingsAtom, 'showUnreadCounts');\n  const [badgeCountDMsOnly] = useSetting(settingsAtom, 'badgeCountDMsOnly');\n  const [showPingCounts] = useSetting(settingsAtom, 'showPingCounts');\n  const resolvedMode = unread\n    ? resolveUnreadBadgeMode({\n        highlight: !!unread.highlight,\n        count: unread.total,\n        showUnreadCounts,\n        badgeCountDMsOnly,\n        showPingCounts,\n      })\n    : undefined;\n\n  return (\n    <SidebarItem active={opened && !isMobile} isBottom={isBottom}>\n      <SidebarItemTooltip tooltip=\"Messages\" position={isBottom ? 'Top' : 'Right'}>\n        {(triggerRef) => (\n          <Box direction=\"Column\" alignItems=\"Center\">\n            <SidebarAvatar\n              as=\"button\"\n              ref={triggerRef}\n              outlined={!isMobile}\n              {...mobileTapActivation}\n              size={'400'}\n            >\n              <ChatTextIcon\n                size={getPhosphorIconSize(isBottom ? 'inline' : 'toolbar')}\n                weight={opened ? 'fill' : 'regular'}\n                mirrored\n                color={opened && isMobile ? color.Primary.Main : color.Background.OnContainer}\n              />\n            </SidebarAvatar>\n            {unread && (\n              <Box\n                style={\n                  resolvedMode === 'dot'\n                    ? { position: 'relative', left: toRem(-10), top: toRem(-30) }\n                    : { position: 'relative', left: toRem(-12), top: toRem(-34) }\n                }\n              >\n                <SidebarUnreadBadge\n                  highlight={unread.highlight > 0}\n                  count={unread.highlight > 0 ? unread.highlight : unread.total}\n                />\n              </Box>\n            )}\n            {isMobile && (\n              <Text size=\"B300\" priority=\"300\">\n                Messages\n              </Text>\n            )}\n          </Box>\n        )}\n      </SidebarItemTooltip>\n    </SidebarItem>\n  );\n}\n","import { Box, config, toRem } from 'folds';\nimport { InboxTab } from './InboxTab';\nimport { NavigateTab } from './NavigateTab';\nimport { SettingsTab } from './SettingsTab';\nimport * as css from './UserQuickTools.css';\nimport { UserMenuTab } from './UserMenuTab';\nimport { MessageTab } from './MessageTab';\n\nexport function UserQuickTools({\n  width,\n  compact,\n}: {\n  isCollapsed?: boolean;\n  underOutstep?: boolean;\n  width?: number;\n  compact: boolean;\n}) {\n  const isCollapsed = compact ? false : (width ?? 0) < 190 + 66;\n\n  return (\n    <>\n      {/* Doing it properly and nicely would require a major rewrite that would cause more trouble*/}\n      {!isCollapsed && (\n        <div style={{ position: 'relative' }}>\n          <Box\n            direction=\"Row\"\n            justifyContent={compact ? 'SpaceAround' : 'SpaceBetween'}\n            alignItems=\"Center\"\n            className={css.UserQuickTools}\n            style={\n              compact\n                ? {\n                    borderTopLeftRadius: config.radii.R500,\n                    borderTopRightRadius: config.radii.R500,\n                    width: '100vw',\n                  }\n                : {\n                    width: toRem(width ?? 100),\n                    position: 'absolute',\n                    right: '0',\n                    padding: `0 ${config.space.S300}`,\n                  }\n            }\n          >\n            {compact ? (\n              <>\n                <MessageTab isBottom isMobile />\n                <InboxTab isBottom isMobile />\n                <NavigateTab isBottom isMobile />\n                <Box style={{ paddingTop: config.space.S0 }}>\n                  <UserMenuTab isBottom isMobile />\n                </Box>\n              </>\n            ) : (\n              <>\n                <UserMenuTab isBottom />\n                <Box\n                  shrink=\"No\"\n                  grow=\"No\"\n                  style={{\n                    gap: config.space.S300,\n                  }}\n                >\n                  {!isCollapsed && (\n                    <>\n                      <InboxTab isBottom />\n                      <NavigateTab isBottom />\n                      <SettingsTab isBottom />\n                    </>\n                  )}\n                </Box>\n              </>\n            )}\n          </Box>\n        </div>\n      )}\n    </>\n  );\n}\n","import type { Dispatch, ReactNode, SetStateAction } from 'react';\nimport { Box, toRem } from 'folds';\nimport { PageNav } from '$components/page';\nimport { SidebarResizer } from '$pages/client/sidebar/SidebarResizer';\nimport { UserQuickTools } from '$pages/client/sidebar/UserQuickTools';\n\ntype PageNavShellProps = {\n  header: ReactNode;\n  children: ReactNode;\n  curWidth: number;\n  setCurWidth: Dispatch<SetStateAction<number>>;\n  roomSidebarWidth: number;\n  setRoomSidebarWidth: (width: number) => void;\n  setIsResizingSidebar: (is: boolean) => void;\n  isMobile: boolean;\n  oldSidebar: boolean;\n};\n\nexport function PageNavShell({\n  header,\n  children,\n  curWidth,\n  setCurWidth,\n  roomSidebarWidth,\n  setRoomSidebarWidth,\n  setIsResizingSidebar,\n  isMobile,\n  oldSidebar,\n}: PageNavShellProps) {\n  return (\n    <Box\n      shrink=\"No\"\n      style={{\n        position: 'relative',\n        width: isMobile ? '100%' : toRem(curWidth),\n      }}\n    >\n      <PageNav>\n        {header}\n        {children}\n      </PageNav>\n      {!isMobile && (\n        <SidebarResizer\n          setCurWidth={setCurWidth}\n          sidebarWidth={roomSidebarWidth}\n          setSidebarWidth={setRoomSidebarWidth}\n          instep={50}\n          outstep={190}\n          minValue={50}\n          maxValue={500}\n          setAnnouncement={setIsResizingSidebar}\n        />\n      )}\n      {!oldSidebar && !isMobile && <UserQuickTools width={curWidth + 66} compact={false} />}\n    </Box>\n  );\n}\n","import { createContext, useContext } from 'react';\nimport type { ClosedNavCategoriesAtom } from '$state/closedNavCategories';\n\nconst ClosedNavCategoriesAtomContext = createContext<ClosedNavCategoriesAtom | null>(null);\nexport const ClosedNavCategoriesProvider = ClosedNavCategoriesAtomContext.Provider;\n\nexport const useClosedNavCategoriesAtom = (): ClosedNavCategoriesAtom => {\n  const anAtom = useContext(ClosedNavCategoriesAtomContext);\n\n  if (!anAtom) {\n    throw new Error('ClosedNavCategoriesAtom is not provided!');\n  }\n\n  return anAtom;\n};\n","import type { FormEventHandler } from 'react';\nimport { useState } from 'react';\nimport { config, Box, Text, Button, Input, color } from 'folds';\nimport { isRoomAlias, isRoomId } from '$utils/matrix';\nimport { parseMatrixToRoom, parseMatrixToRoomEvent, testMatrixTo } from '$plugins/matrix-to';\nimport { PromptDialog } from '$components/modal-overlay/PromptDialog';\n\ntype JoinAddressProps = {\n  onOpen: (roomIdOrAlias: string, via?: string[], eventId?: string) => void;\n  onCancel: () => void;\n};\nexport function JoinAddressPrompt({ onOpen, onCancel }: JoinAddressProps) {\n  const [invalid, setInvalid] = useState(false);\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    setInvalid(false);\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const addressInput = target?.addressInput as HTMLInputElement | undefined;\n    const address = addressInput?.value.trim();\n    if (!address) return;\n\n    if (isRoomId(address) || isRoomAlias(address)) {\n      onOpen(address);\n      return;\n    }\n\n    if (testMatrixTo(address)) {\n      const encodedAddress = address;\n      const decodedAddress = encodedAddress && decodeURIComponent(encodedAddress);\n      const toRoom = parseMatrixToRoom(decodedAddress);\n      if (toRoom) {\n        onOpen(toRoom.roomIdOrAlias, toRoom.viaServers);\n        return;\n      }\n\n      const toEvent = parseMatrixToRoomEvent(decodedAddress);\n      if (toEvent) {\n        onOpen(toEvent.roomIdOrAlias, toEvent.viaServers, toEvent.eventId);\n        return;\n      }\n    }\n\n    setInvalid(true);\n  };\n\n  return (\n    <PromptDialog title=\"Join with Address\" requestClose={onCancel}>\n      <Box\n        as=\"form\"\n        onSubmit={handleSubmit}\n        style={{ padding: config.space.S400, paddingTop: 0 }}\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <Box direction=\"Column\" gap=\"200\">\n          <Text priority=\"400\" size=\"T300\">\n            Enter public address to join the community. Addresses looks like:\n          </Text>\n          <Text as=\"ul\" size=\"T200\" priority=\"300\" style={{ paddingLeft: config.space.S400 }}>\n            <li>#community:server</li>\n            <li>https://matrix.to/#/#community:server</li>\n            <li>https://matrix.to/#/!xYzAj?via=server</li>\n          </Text>\n        </Box>\n        <Box direction=\"Column\" gap=\"100\">\n          <Text size=\"L400\">Address</Text>\n          <Input\n            size=\"500\"\n            autoFocus\n            name=\"addressInput\"\n            variant=\"Background\"\n            placeholder=\"#community:server\"\n            required\n          />\n          {invalid && (\n            <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n              <b>Invalid Address</b>\n            </Text>\n          )}\n        </Box>\n        <Button type=\"submit\" variant=\"Primary\">\n          <Text size=\"B400\">Open</Text>\n        </Button>\n      </Box>\n    </PromptDialog>\n  );\n}\n","import { useAtomValue } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { useOrphanRooms } from '$state/hooks/roomList';\n\nexport const useHomeRooms = (isShowingAllRoomsInHome?: boolean) => {\n  const mx = useMatrixClient();\n  const mDirects = useAtomValue(mDirectAtom);\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const rooms = useOrphanRooms(mx, allRoomsAtom, mDirects, roomToParents, isShowingAllRoomsInHome);\n  return rooms;\n};\n","import { atom } from 'jotai';\n\nexport const isResizingSidebarAtom = atom(false);\n","import { useEffect, useState } from 'react';\nimport { useSetAtom } from 'jotai';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { isResizingSidebarAtom } from '$state/isResizingSidebar';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\n\nexport function useSidebarWidth() {\n  const setIsResizingSidebar = useSetAtom(isResizingSidebarAtom);\n  const [roomSidebarWidth, setRoomSidebarWidth] = useSetting(settingsAtom, 'roomSidebarWidth');\n  const [curWidth, setCurWidth] = useState(roomSidebarWidth);\n  useEffect(() => {\n    setCurWidth(roomSidebarWidth);\n  }, [roomSidebarWidth]);\n  const screenSize = useScreenSizeContext();\n  const isMobile = screenSize === ScreenSize.Mobile;\n  const hideText = curWidth <= 80 && !isMobile;\n  const [oldSidebar] = useSetting(settingsAtom, 'oldSidebar');\n  return {\n    curWidth,\n    setCurWidth,\n    roomSidebarWidth,\n    setRoomSidebarWidth,\n    setIsResizingSidebar,\n    isMobile,\n    hideText,\n    oldSidebar,\n  };\n}\n","import type { ReactNode } from 'react';\nimport { forwardRef } from 'react';\nimport { Box, Menu, MenuItem, Text, config, toRem } from 'folds';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { useRoomsUnread } from '$state/hooks/unread';\nimport { markAsRead } from '$utils/notifications';\nimport { Checks, menuIcon } from '$components/icons/phosphor';\n\ntype NavMenuProps = {\n  rooms: string[];\n  requestClose: () => void;\n  children?: ReactNode;\n};\n\nexport const NavMenu = forwardRef<HTMLDivElement, NavMenuProps>(\n  ({ rooms, requestClose, children }, ref) => {\n    const mx = useMatrixClient();\n    const [hideReads] = useSetting(settingsAtom, 'hideReads');\n    const unread = useRoomsUnread(rooms, roomToUnreadAtom);\n\n    const handleMarkAsRead = () => {\n      if (!unread) return;\n      rooms.forEach((rId) => markAsRead(mx, rId, hideReads, true));\n      requestClose();\n    };\n\n    return (\n      <Menu ref={ref} style={{ maxWidth: toRem(160), width: '100vw' }}>\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n          <MenuItem\n            onClick={handleMarkAsRead}\n            size=\"300\"\n            after={menuIcon(Checks)}\n            radii=\"300\"\n            aria-disabled={!unread}\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Mark as Read\n            </Text>\n          </MenuItem>\n          {children}\n        </Box>\n      </Menu>\n    );\n  }\n);\nNavMenu.displayName = 'NavMenu';\n","import { forwardRef, useCallback, useMemo, useRef } from 'react';\nimport { useNavigate } from 'react-router';\nimport { Avatar, Box, Button, MenuItem, Text, toRem } from 'folds';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { useAtom, useAtomValue } from 'jotai';\nimport { factoryRoomIdByActivity, factoryRoomIdByAtoZ } from '$utils/sort';\nimport {\n  NavButton,\n  NavCategory,\n  NavCategoryHeader,\n  NavEmptyCenter,\n  NavEmptyLayout,\n  NavItem,\n  NavItemContent,\n  NavLink,\n} from '$components/nav';\nimport {\n  encodeSearchParamValueArray,\n  getExploreFeaturedPath,\n  getExplorePath,\n  getExploreServerPath,\n  getCreateRoomPath,\n  getHomeForumPath,\n  getHomeRoomPath,\n  getHomeSearchPath,\n  withSearchParam,\n} from '$pages/pathUtils';\nimport { CustomRoomType } from '$types/matrix/room';\nimport { useOpenShallowRoute } from '$pages/client/useShallowRoute';\nimport { getCanonicalAliasOrRoomId } from '$utils/matrix';\nimport { useSelectedOrLastRoom } from '$hooks/router/useSelectedRoom';\nimport { useHomeCreateSelected, useHomeSearchSelected } from '$hooks/router/useRouteSelected';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { VirtualTile } from '$components/virtualizer';\nimport { RoomNavCategoryButton, RoomNavItem } from '$features/room-nav';\nimport { makeNavCategoryId } from '$state/closedNavCategories';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { useCategoryHandler } from '$hooks/useCategoryHandler';\nimport { useNavToActivePathMapper } from '$hooks/useNavToActivePathMapper';\nimport { PageNavHeaderWithMenu, PageNavContent } from '$components/page';\nimport { PageNavShell } from '$components/page/PageNavShell';\nimport { useClosedNavCategoriesAtom } from '$state/hooks/closedNavCategories';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom, ShowRoomIcon } from '$state/settings';\nimport {\n  getRoomNotificationMode,\n  useRoomsNotificationPreferencesContext,\n} from '$hooks/useRoomsNotificationPreferences';\nimport {\n  composerIcon,\n  dropzoneIcon,\n  Globe,\n  Hash,\n  House,\n  Link,\n  MagnifyingGlass,\n  menuIcon,\n  Plus,\n  UsersThree,\n} from '$components/icons/phosphor';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { JoinAddressPrompt } from '$components/join-address-prompt';\nimport { useHomeRooms } from './useHomeRooms';\nimport { useSidebarWidth } from '$hooks/useSidebarWidth';\nimport { useClientConfig } from '$hooks/useClientConfig';\nimport { getMxIdServer } from '$utils/mxIdHelper';\nimport { NavMenu } from '$components/nav/NavMenu';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\n\ntype HomeMenuProps = {\n  requestClose: () => void;\n};\nconst HomeMenu = forwardRef<HTMLDivElement, HomeMenuProps>(({ requestClose }, ref) => {\n  const orphanRooms = useHomeRooms();\n  const [isShowingAllRoomsInHome, setIsShowingAllRoomsInHome] = useSetting(\n    settingsAtom,\n    'isShowingAllRoomsInHome'\n  );\n\n  return (\n    <NavMenu ref={ref} rooms={orphanRooms} requestClose={requestClose}>\n      <MenuItem\n        onClick={() => setIsShowingAllRoomsInHome(!isShowingAllRoomsInHome)}\n        size=\"300\"\n        after={menuIcon(isShowingAllRoomsInHome ? House : Globe)}\n        radii=\"300\"\n      >\n        <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n          {isShowingAllRoomsInHome ? 'Show Home Rooms' : 'Show All Rooms'}\n        </Text>\n      </MenuItem>\n    </NavMenu>\n  );\n});\n\nfunction HomeHeader({ hideText }: { hideText?: boolean }) {\n  const menu = useMenuAnchor<HTMLButtonElement>();\n\n  return (\n    <PageNavHeaderWithMenu\n      hideText={hideText}\n      title=\"Home\"\n      collapsedIcon={composerIcon(House, { weight: menu.anchor ? 'fill' : 'regular' })}\n      menu={<HomeMenu requestClose={menu.close} />}\n      anchor={menu.anchor}\n      requestClose={menu.close}\n      triggerProps={menu.triggerProps}\n    />\n  );\n}\n\nfunction HomeEmpty() {\n  const navigate = useNavigate();\n  const openShallowRoute = useOpenShallowRoute();\n\n  return (\n    <NavEmptyCenter>\n      <NavEmptyLayout\n        icon={dropzoneIcon(Hash)}\n        title={\n          <Text size=\"H5\" align=\"Center\">\n            No Rooms\n          </Text>\n        }\n        content={\n          <Text size=\"T300\" align=\"Center\">\n            You do not have any rooms yet.\n          </Text>\n        }\n        options={\n          <>\n            <Button\n              onClick={() => openShallowRoute(getCreateRoomPath())}\n              variant=\"Secondary\"\n              size=\"300\"\n            >\n              <Text size=\"B300\" truncate>\n                Create Room\n              </Text>\n            </Button>\n            <Button\n              onClick={() => navigate(getExplorePath())}\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              size=\"300\"\n            >\n              <Text size=\"B300\" truncate>\n                Explore Community Rooms\n              </Text>\n            </Button>\n          </>\n        }\n      />\n    </NavEmptyCenter>\n  );\n}\n\nconst DEFAULT_CATEGORY_ID = makeNavCategoryId('home', 'room');\nexport function Home() {\n  const mx = useMatrixClient();\n  useNavToActivePathMapper('home');\n  const clientConfig = useClientConfig();\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const [isShowingAllRoomsInHome] = useSetting(settingsAtom, 'isShowingAllRoomsInHome');\n  const rooms = useHomeRooms(isShowingAllRoomsInHome);\n  const notificationPreferences = useRoomsNotificationPreferencesContext();\n  const roomToUnread = useAtomValue(roomToUnreadAtom);\n  const navigate = useNavigate();\n\n  const {\n    curWidth,\n    setCurWidth,\n    roomSidebarWidth,\n    setRoomSidebarWidth,\n    setIsResizingSidebar,\n    isMobile,\n    hideText,\n    oldSidebar,\n  } = useSidebarWidth();\n\n  const [showRoomIconGeneral] = useSetting(settingsAtom, 'showRoomIcon');\n  const [showRoomIconArray] = useSetting(settingsAtom, 'perRoomShowRoomIcon');\n  const showRoomIcon =\n    showRoomIconArray.find((item) => item.roomId === 'Home')?.display ?? showRoomIconGeneral;\n  const showIcons = () => {\n    if (showRoomIcon === ShowRoomIcon.Always) return true;\n    if (showRoomIcon === ShowRoomIcon.Never) return false;\n    return curWidth < 144;\n  };\n\n  const [joinCallOnSingleClick] = useSetting(settingsAtom, 'joinCallOnSingleClick');\n\n  const selectedRoomId = useSelectedOrLastRoom();\n  const createRoomSelected = useHomeCreateSelected();\n  const openShallowRoute = useOpenShallowRoute();\n  const searchSelected = useHomeSearchSelected();\n  const noRoomToDisplay = rooms.length === 0;\n  const [closedCategories, setClosedCategories] = useAtom(useClosedNavCategoriesAtom());\n\n  const defaultCategoryClosed = closedCategories.has(DEFAULT_CATEGORY_ID);\n  const sortRoomsByActivity = defaultCategoryClosed || isShowingAllRoomsInHome;\n  const orderedRooms = useMemo(\n    () =>\n      Array.from(rooms).toSorted(\n        sortRoomsByActivity ? factoryRoomIdByActivity(mx) : factoryRoomIdByAtoZ(mx)\n      ),\n    [mx, rooms, sortRoomsByActivity]\n  );\n\n  const sortedRooms = useMemo(() => {\n    if (!defaultCategoryClosed) return orderedRooms;\n\n    const hasUnread = (roomId: string) => {\n      const unread = roomToUnread.get(roomId);\n      return !!unread && (unread.total > 0 || unread.highlight > 0);\n    };\n    return orderedRooms.filter((rId) => hasUnread(rId) || rId === selectedRoomId);\n  }, [orderedRooms, defaultCategoryClosed, roomToUnread, selectedRoomId]);\n\n  const getItemKey = useCallback((index: number) => sortedRooms[index] ?? index, [sortedRooms]);\n\n  const virtualizer = useVirtualizer({\n    count: sortedRooms.length,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: () => 38,\n    overscan: 10,\n    getItemKey,\n  });\n\n  const handleCategoryClick = useCategoryHandler(setClosedCategories, (categoryId) =>\n    closedCategories.has(categoryId)\n  );\n\n  const handleExploreClick = () => {\n    if (isMobile) {\n      navigate(getExplorePath());\n      return;\n    }\n\n    if (clientConfig.featuredCommunities?.openAsDefault) {\n      navigate(getExploreFeaturedPath());\n      return;\n    }\n    const userId = mx.getUserId();\n    const userServer = userId ? getMxIdServer(userId) : undefined;\n    if (userServer) {\n      navigate(getExploreServerPath(userServer));\n      return;\n    }\n    navigate(getExplorePath());\n  };\n\n  return (\n    <PageNavShell\n      header={<HomeHeader hideText={hideText} />}\n      curWidth={curWidth}\n      setCurWidth={setCurWidth}\n      roomSidebarWidth={roomSidebarWidth}\n      setRoomSidebarWidth={setRoomSidebarWidth}\n      setIsResizingSidebar={setIsResizingSidebar}\n      isMobile={isMobile}\n      oldSidebar={oldSidebar}\n    >\n      {noRoomToDisplay ? (\n        <HomeEmpty />\n      ) : (\n        <PageNavContent scrollRef={scrollRef}>\n          <Box direction=\"Column\" gap=\"300\">\n            <NavCategory>\n              <NavItem variant=\"Background\" radii=\"400\" aria-selected={createRoomSelected}>\n                <NavButton onClick={() => openShallowRoute(getCreateRoomPath())}>\n                  <NavItemContent>\n                    <Box as=\"span\" grow=\"Yes\" alignItems=\"Center\" justifyContent=\"Start\" gap=\"200\">\n                      <Avatar\n                        size={hideText ? undefined : '200'}\n                        radii=\"400\"\n                        style={hideText ? { width: '100%', padding: '0' } : undefined}\n                      >\n                        {menuIcon(Plus)}\n                      </Avatar>\n                      {!hideText && (\n                        <Box as=\"span\" grow=\"Yes\">\n                          <Text as=\"span\" size=\"Inherit\" truncate>\n                            Create Room\n                          </Text>\n                        </Box>\n                      )}\n                    </Box>\n                  </NavItemContent>\n                </NavButton>\n              </NavItem>\n              <UseStateProvider initial={false}>\n                {(open, setOpen) => (\n                  <>\n                    <NavItem variant=\"Background\" radii=\"400\">\n                      <NavButton onClick={() => setOpen(true)}>\n                        <NavItemContent>\n                          <Box\n                            as=\"span\"\n                            grow=\"Yes\"\n                            alignItems=\"Center\"\n                            justifyContent=\"Start\"\n                            gap=\"200\"\n                          >\n                            <Avatar\n                              size={hideText ? undefined : '200'}\n                              radii=\"400\"\n                              style={hideText ? { width: '100%', padding: '0' } : undefined}\n                            >\n                              {menuIcon(Link)}\n                            </Avatar>\n                            {!hideText && (\n                              <Box as=\"span\" grow=\"Yes\">\n                                <Text as=\"span\" size=\"Inherit\" truncate>\n                                  Join with Address\n                                </Text>\n                              </Box>\n                            )}\n                          </Box>\n                        </NavItemContent>\n                      </NavButton>\n                    </NavItem>\n                    {open && (\n                      <JoinAddressPrompt\n                        onCancel={() => setOpen(false)}\n                        onOpen={(roomIdOrAlias, viaServers, eventId) => {\n                          setOpen(false);\n                          const path = getHomeRoomPath(roomIdOrAlias, eventId);\n                          navigate(\n                            viaServers\n                              ? withSearchParam(path, {\n                                  viaServers: encodeSearchParamValueArray(viaServers),\n                                })\n                              : path\n                          );\n                        }}\n                      />\n                    )}\n                  </>\n                )}\n              </UseStateProvider>\n              <NavItem variant=\"Background\" radii=\"400\">\n                <NavButton onClick={handleExploreClick}>\n                  <NavItemContent>\n                    <Box as=\"span\" grow=\"Yes\" alignItems=\"Center\" justifyContent=\"Start\" gap=\"200\">\n                      <Avatar\n                        size={hideText ? undefined : '200'}\n                        radii=\"400\"\n                        style={hideText ? { width: '100%' } : undefined}\n                      >\n                        {menuIcon(UsersThree, {\n                          weight: 'regular',\n                        })}\n                      </Avatar>\n                      {!hideText && (\n                        <Box as=\"span\" grow=\"Yes\">\n                          <Text as=\"span\" size=\"Inherit\" truncate>\n                            Explore Spaces\n                          </Text>\n                        </Box>\n                      )}\n                    </Box>\n                  </NavItemContent>\n                </NavButton>\n              </NavItem>\n              <NavItem variant=\"Background\" radii=\"400\" aria-selected={searchSelected}>\n                <NavLink to={getHomeSearchPath()}>\n                  <NavItemContent>\n                    <Box as=\"span\" grow=\"Yes\" alignItems=\"Center\" justifyContent=\"Start\" gap=\"200\">\n                      <Avatar\n                        size={hideText ? undefined : '200'}\n                        radii=\"400\"\n                        style={hideText ? { width: '100%' } : undefined}\n                      >\n                        {menuIcon(MagnifyingGlass, {\n                          weight: searchSelected ? 'fill' : 'regular',\n                        })}\n                      </Avatar>\n                      {!hideText && (\n                        <Box as=\"span\" grow=\"Yes\">\n                          <Text as=\"span\" size=\"Inherit\" truncate>\n                            Message Search\n                          </Text>\n                        </Box>\n                      )}\n                    </Box>\n                  </NavItemContent>\n                </NavLink>\n              </NavItem>\n            </NavCategory>\n            <NavCategory>\n              <NavCategoryHeader>\n                <RoomNavCategoryButton\n                  closed={closedCategories.has(DEFAULT_CATEGORY_ID)}\n                  data-category-id={DEFAULT_CATEGORY_ID}\n                  onClick={handleCategoryClick}\n                >\n                  {!hideText && 'Rooms'}\n                </RoomNavCategoryButton>\n              </NavCategoryHeader>\n              <div\n                style={{\n                  position: 'relative',\n                  height: virtualizer.getTotalSize(),\n                  overflow: 'visible',\n                }}\n              >\n                {virtualizer.getVirtualItems().map((vItem) => {\n                  const roomId = sortedRooms[vItem.index];\n                  if (!roomId) return null;\n                  const room = mx.getRoom(roomId);\n                  if (!room) return null;\n                  const selected = selectedRoomId === roomId;\n                  const canonicalName = getCanonicalAliasOrRoomId(mx, roomId);\n\n                  return (\n                    <VirtualTile\n                      virtualItem={vItem}\n                      key={vItem.key}\n                      ref={virtualizer.measureElement}\n                    >\n                      <div\n                        style={\n                          hideText\n                            ? {\n                                padding: '0',\n                                width: '100%',\n                                aspectRatio: 1,\n                                display: 'flex',\n                                flexDirection: 'column',\n                              }\n                            : {}\n                        }\n                      >\n                        <RoomNavItem\n                          room={room}\n                          selected={selected}\n                          showAvatar={showIcons()}\n                          hideText={hideText}\n                          linkPath={\n                            room.getType() === CustomRoomType.Forum\n                              ? getHomeForumPath(canonicalName)\n                              : getHomeRoomPath(canonicalName)\n                          }\n                          notificationMode={getRoomNotificationMode(\n                            notificationPreferences,\n                            room.roomId\n                          )}\n                          joinCallOnSingleClick={joinCallOnSingleClick}\n                        />\n                      </div>\n                    </VirtualTile>\n                  );\n                })}\n              </div>\n            </NavCategory>\n            {!isMobile && <div style={{ height: toRem(40) }} />}\n          </Box>\n        </PageNavContent>\n      )}\n    </PageNavShell>\n  );\n}\n","import type {\n  IEventWithRoomId,\n  IResultContext,\n  ISearchRequestBody,\n  ISearchResponse,\n  ISearchResult,\n  SearchOrderBy,\n} from '$types/matrix-sdk';\nimport { useCallback } from 'react';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\n\nexport type ResultItem = {\n  rank: number;\n  event: IEventWithRoomId;\n  context: IResultContext;\n};\n\nexport type ResultGroup = {\n  roomId: string;\n  items: ResultItem[];\n};\n\nexport type SearchResult = {\n  nextToken?: string;\n  highlights: string[];\n  groups: ResultGroup[];\n};\n\nconst groupSearchResult = (results: ISearchResult[]): ResultGroup[] => {\n  const groups: ResultGroup[] = [];\n\n  results.forEach((item) => {\n    const roomId = item.result.room_id;\n    const resultItem: ResultItem = {\n      rank: item.rank,\n      event: item.result,\n      context: item.context,\n    };\n\n    const lastAddedGroup: ResultGroup | undefined = groups[groups.length - 1];\n    if (lastAddedGroup && roomId === lastAddedGroup.roomId) {\n      lastAddedGroup.items.push(resultItem);\n      return;\n    }\n    groups.push({\n      roomId,\n      items: [resultItem],\n    });\n  });\n\n  return groups;\n};\n\nconst parseSearchResult = (result: ISearchResponse): SearchResult => {\n  const roomEvents = result.search_categories.room_events;\n\n  const searchResult: SearchResult = {\n    nextToken: roomEvents?.next_batch,\n    highlights: roomEvents?.highlights ?? [],\n    groups: groupSearchResult(roomEvents?.results ?? []),\n  };\n\n  return searchResult;\n};\n\nexport type MessageSearchParams = {\n  term?: string;\n  order?: string;\n  rooms?: string[];\n  senders?: string[];\n};\nexport const useMessageSearch = (params: MessageSearchParams) => {\n  const mx = useMatrixClient();\n  const { term, order, rooms, senders } = params;\n\n  const searchMessages = useCallback(\n    async (nextBatch?: string) => {\n      if (!term)\n        return {\n          highlights: [],\n          groups: [],\n        };\n      const limit = 20;\n\n      const requestBody: ISearchRequestBody = {\n        search_categories: {\n          room_events: {\n            event_context: {\n              before_limit: 0,\n              after_limit: 0,\n              include_profile: true,\n            },\n            filter: {\n              limit,\n              rooms,\n              senders,\n            },\n            include_state: false,\n            order_by: order as SearchOrderBy.Recent,\n            search_term: term,\n          },\n        },\n      };\n\n      const r = await mx.search({\n        body: requestBody,\n        next_batch: nextBatch === '' ? undefined : nextBatch,\n      });\n      return parseSearchResult(r);\n    },\n    [mx, term, order, rooms, senders]\n  );\n\n  return searchMessages;\n};\n","import type { MouseEventHandler } from 'react';\nimport { useMemo } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport { JoinRule, MatrixEvent, RelationType } from '$types/matrix-sdk';\nimport { Avatar, Box, Chip, Header, Text, config } from 'folds';\nimport { RoomAvatar, RoomIcon } from '$components/room-avatar';\nimport { MessagePreview, useRoomMessagePreviewRenderer } from '$components/message-preview';\nimport { SequenceCard } from '$components/sequence-card';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRoomAvatar, useRoomName } from '$hooks/useRoomMeta';\nimport { makeHighlightRegex } from '$plugins/react-custom-html-parser';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport type { UserProfile } from '$hooks/useUserProfile';\nimport type { ResultItem } from './useMessageSearch';\n\ntype SearchResultItemProps = {\n  room: Room;\n  item: ResultItem;\n  renderContent: ReturnType<typeof useRoomMessagePreviewRenderer>;\n  hour24Clock: boolean;\n  dateFormatString: string;\n  onOpen: (roomId: string, eventId: string) => void;\n};\n\nfunction SearchResultItem({\n  room,\n  item,\n  renderContent,\n  hour24Clock,\n  dateFormatString,\n  onOpen,\n}: SearchResultItemProps) {\n  const event = useMemo(() => new MatrixEvent(item.event), [item.event]);\n  const sender = event.getSender() ?? '';\n  const contextProfile = item.context?.profile_info?.[sender];\n  const profile = useMemo<Partial<UserProfile> | undefined>(\n    () =>\n      contextProfile\n        ? {\n            displayName: contextProfile.displayname,\n            avatarUrl: contextProfile.avatar_url,\n          }\n        : undefined,\n    [contextProfile]\n  );\n  const relation = item.event.content['m.relates_to'];\n  const openEventId =\n    relation?.rel_type === RelationType.Replace ? relation.event_id : item.event.event_id;\n\n  const handleOpen: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    evt.stopPropagation();\n    if (openEventId) onOpen(room.roomId, openEventId);\n  };\n\n  return (\n    <SequenceCard\n      style={{ padding: config.space.S400 }}\n      variant=\"SurfaceVariant\"\n      direction=\"Column\"\n    >\n      <MessagePreview\n        room={room}\n        event={event}\n        profile={profile}\n        renderContent={renderContent}\n        actions={\n          <Chip onClick={handleOpen} variant=\"Secondary\" radii=\"400\">\n            <Text size=\"T200\">Open</Text>\n          </Chip>\n        }\n        onOpen={handleOpen}\n        hour24Clock={hour24Clock}\n        dateFormatString={dateFormatString}\n      />\n    </SequenceCard>\n  );\n}\n\ntype SearchResultGroupProps = {\n  room: Room;\n  highlights: string[];\n  items: ResultItem[];\n  onOpen: (roomId: string, eventId: string) => void;\n  hour24Clock: boolean;\n  dateFormatString: string;\n};\n\nexport function SearchResultGroup({\n  room,\n  highlights,\n  items,\n  onOpen,\n  hour24Clock,\n  dateFormatString,\n}: SearchResultGroupProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const roomName = useRoomName(room);\n  const roomAvatarMxc = useRoomAvatar(room);\n  const highlightRegex = useMemo(() => makeHighlightRegex(highlights), [highlights]);\n  const renderContent = useRoomMessagePreviewRenderer(room, { highlightRegex });\n\n  return (\n    <Box direction=\"Column\" gap=\"200\">\n      <Header size=\"300\">\n        <Box gap=\"200\" grow=\"Yes\">\n          <Avatar size=\"200\" radii=\"300\">\n            <RoomAvatar\n              roomId={room.roomId}\n              src={\n                roomAvatarMxc\n                  ? (mxcUrlToHttp(mx, roomAvatarMxc, useAuthentication, 96, 96, 'crop') ??\n                    undefined)\n                  : undefined\n              }\n              alt={roomName}\n              renderFallback={() => (\n                <RoomIcon\n                  size=\"50\"\n                  roomType={room.getType()}\n                  joinRule={room.getJoinRule() ?? JoinRule.Restricted}\n                  filled\n                />\n              )}\n            />\n          </Avatar>\n          <Text size=\"H4\" truncate>\n            {roomName}\n          </Text>\n        </Box>\n      </Header>\n      <Box direction=\"Column\" gap=\"100\">\n        {items.map((item) => (\n          <SearchResultItem\n            key={item.event.event_id}\n            room={room}\n            item={item}\n            renderContent={renderContent}\n            hour24Clock={hour24Clock}\n            dateFormatString={dateFormatString}\n            onOpen={onOpen}\n          />\n        ))}\n      </Box>\n    </Box>\n  );\n}\n","import type { FormEventHandler, RefObject } from 'react';\nimport { Box, Text, Input, Spinner, Chip, config } from 'folds';\nimport { sizedIcon, MagnifyingGlass, X } from '$components/icons/phosphor';\n\ntype SearchProps = {\n  active?: boolean;\n  loading?: boolean;\n  searchInputRef: RefObject<HTMLInputElement | null>;\n  onSearch: (term: string) => void;\n  onReset: () => void;\n};\nexport function SearchInput({ active, loading, searchInputRef, onSearch, onReset }: SearchProps) {\n  const handleSearchSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    const { searchInput } = evt.target as HTMLFormElement & {\n      searchInput: HTMLInputElement;\n    };\n\n    const searchTerm = searchInput.value.trim() || undefined;\n    if (searchTerm) {\n      onSearch(searchTerm);\n    }\n  };\n\n  return (\n    <Box as=\"form\" direction=\"Column\" gap=\"100\" onSubmit={handleSearchSubmit}>\n      <span data-spacing-node />\n      <Text size=\"L400\">Search</Text>\n      <Input\n        ref={searchInputRef}\n        style={{ paddingRight: config.space.S300 }}\n        name=\"searchInput\"\n        autoFocus\n        size=\"500\"\n        variant=\"Background\"\n        placeholder=\"Search for keyword\"\n        autoComplete=\"off\"\n        before={\n          active && loading ? (\n            <Spinner variant=\"Secondary\" size=\"200\" />\n          ) : (\n            sizedIcon(MagnifyingGlass, '200')\n          )\n        }\n        after={\n          active ? (\n            <Chip\n              key=\"resetButton\"\n              type=\"reset\"\n              variant=\"Secondary\"\n              size=\"400\"\n              radii=\"Pill\"\n              outlined\n              after={sizedIcon(X, '50')}\n              onClick={onReset}\n            >\n              <Text size=\"B300\">Clear</Text>\n            </Chip>\n          ) : (\n            <Chip type=\"submit\" variant=\"Primary\" size=\"400\" radii=\"Pill\" outlined>\n              <Text size=\"B300\">Enter</Text>\n            </Chip>\n          )\n        }\n      />\n    </Box>\n  );\n}\n","import type { ChangeEventHandler, MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport {\n  Box,\n  Chip,\n  Text,\n  Line,\n  config,\n  Menu,\n  MenuItem,\n  Header,\n  toRem,\n  Scroll,\n  Button,\n  Input,\n  Badge,\n} from 'folds';\nimport { PopOut } from '$components/overlay-stack';\nimport FocusTrap from 'focus-trap-react';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { getRoomIconComponent } from '$components/icons/roomIcons';\nimport { Check, sizedIcon, PlusCircle, SortAscending, X } from '$components/icons/phosphor';\nimport { SearchOrderBy } from '$types/matrix-sdk';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { factoryRoomIdByAtoZ } from '$utils/sort';\nimport type { SearchItemStrGetter, UseAsyncSearchOptions } from '$hooks/useAsyncSearch';\nimport { useAsyncSearch } from '$hooks/useAsyncSearch';\nimport type { DebounceOptions } from '$hooks/useDebounce';\nimport { useDebounce } from '$hooks/useDebounce';\nimport { VirtualTile } from '$components/virtualizer';\nimport { stopPropagation } from '$utils/keyboard';\n\ntype OrderButtonProps = {\n  order?: string;\n  onChange: (order?: string) => void;\n};\nfunction OrderButton({ order, onChange }: OrderButtonProps) {\n  const menuAnchor = useMenuAnchor<HTMLButtonElement>();\n  const rankOrder = order === SearchOrderBy.Rank;\n\n  const setOrder = (o?: string) => {\n    menuAnchor.close();\n    onChange(o);\n  };\n  const handleOpenMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    menuAnchor.openAt(evt.currentTarget);\n  };\n\n  return (\n    <ResponsiveMenu\n      anchor={menuAnchor.anchor}\n      requestClose={menuAnchor.close}\n      align=\"End\"\n      position=\"Bottom\"\n      menu={\n        <Menu variant=\"Surface\">\n          <Header size=\"300\" variant=\"Surface\" style={{ padding: `0 ${config.space.S300}` }}>\n            <Text size=\"L400\">Sort by</Text>\n          </Header>\n          <Line variant=\"Surface\" size=\"300\" />\n          <div style={{ padding: config.space.S100 }}>\n            <MenuItem\n              onClick={() => setOrder()}\n              variant=\"Surface\"\n              size=\"300\"\n              radii=\"300\"\n              aria-pressed={!rankOrder}\n            >\n              <Text size=\"T300\">Recent</Text>\n            </MenuItem>\n            <MenuItem\n              onClick={() => setOrder(SearchOrderBy.Rank)}\n              variant=\"Surface\"\n              size=\"300\"\n              radii=\"300\"\n              aria-pressed={rankOrder}\n            >\n              <Text size=\"T300\">Relevance</Text>\n            </MenuItem>\n          </div>\n        </Menu>\n      }\n    >\n      <Chip\n        variant=\"SurfaceVariant\"\n        radii=\"Pill\"\n        after={sizedIcon(SortAscending, '50')}\n        onClick={handleOpenMenu}\n      >\n        {rankOrder ? <Text size=\"T200\">Relevance</Text> : <Text size=\"T200\">Recent</Text>}\n      </Chip>\n    </ResponsiveMenu>\n  );\n}\n\nconst SEARCH_OPTS: UseAsyncSearchOptions = {\n  limit: 20,\n  matchOptions: {\n    contain: true,\n  },\n};\nconst SEARCH_DEBOUNCE_OPTS: DebounceOptions = {\n  wait: 200,\n};\n\ntype SelectRoomButtonProps = {\n  roomList: string[];\n  selectedRooms?: string[];\n  onChange: (rooms?: string[]) => void;\n};\nfunction SelectRoomButton({ roomList, selectedRooms, onChange }: SelectRoomButtonProps) {\n  const mx = useMatrixClient();\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const [menuAnchor, setMenuAnchor] = useState<RectCords>();\n  const [localSelected, setLocalSelected] = useState(selectedRooms);\n\n  const getRoomNameStr: SearchItemStrGetter<string> = useCallback(\n    (rId) => mx.getRoom(rId)?.name ?? rId,\n    [mx]\n  );\n\n  const [searchResult, searchRoomRaw, resetSearch] = useAsyncSearch(\n    roomList,\n    getRoomNameStr,\n    SEARCH_OPTS\n  );\n  const rooms = Array.from(searchResult?.items ?? roomList).toSorted(factoryRoomIdByAtoZ(mx));\n\n  const virtualizer = useVirtualizer({\n    count: rooms.length,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: () => 32,\n    overscan: 5,\n  });\n  const vItems = virtualizer.getVirtualItems();\n\n  const searchRoom = useDebounce(searchRoomRaw, SEARCH_DEBOUNCE_OPTS);\n  const handleSearchChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n    const value = evt.currentTarget.value.trim();\n    if (!value) {\n      resetSearch();\n      return;\n    }\n    searchRoom(value);\n  };\n\n  const handleRoomClick: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    const roomId = evt.currentTarget.getAttribute('data-room-id');\n    if (!roomId) return;\n    if (localSelected?.includes(roomId)) {\n      setLocalSelected(localSelected?.filter((rId) => rId !== roomId));\n      return;\n    }\n    const addedRooms = [...(localSelected ?? [])];\n    addedRooms.push(roomId);\n    setLocalSelected(addedRooms);\n  };\n\n  const handleSave = () => {\n    setMenuAnchor(undefined);\n    onChange(localSelected);\n  };\n\n  const handleDeselectAll = () => {\n    setMenuAnchor(undefined);\n    onChange(undefined);\n  };\n\n  useEffect(() => {\n    setLocalSelected(selectedRooms);\n    resetSearch();\n  }, [menuAnchor, selectedRooms, resetSearch]);\n\n  const handleOpenMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setMenuAnchor(evt.currentTarget.getBoundingClientRect());\n  };\n\n  return (\n    <PopOut\n      anchor={menuAnchor}\n      align=\"Center\"\n      position=\"Bottom\"\n      content={\n        <FocusTrap\n          focusTrapOptions={{\n            initialFocus: false,\n            onDeactivate: () => setMenuAnchor(undefined),\n            clickOutsideDeactivates: true,\n            escapeDeactivates: stopPropagation,\n          }}\n        >\n          <Menu variant=\"Surface\" style={{ width: toRem(250) }}>\n            <Box direction=\"Column\" style={{ maxHeight: toRem(450), maxWidth: toRem(300) }}>\n              <Box\n                shrink=\"No\"\n                direction=\"Column\"\n                gap=\"100\"\n                style={{ padding: config.space.S200, paddingBottom: 0 }}\n              >\n                <Text size=\"L400\">Search</Text>\n                <Input\n                  onChange={handleSearchChange}\n                  size=\"300\"\n                  radii=\"300\"\n                  after={\n                    searchResult && searchResult.items.length > 0 ? (\n                      <Badge variant=\"Secondary\" size=\"400\" radii=\"Pill\">\n                        <Text size=\"L400\">{searchResult.items.length}</Text>\n                      </Badge>\n                    ) : null\n                  }\n                />\n              </Box>\n              <Scroll ref={scrollRef} size=\"300\" hideTrack>\n                <Box\n                  direction=\"Column\"\n                  gap=\"100\"\n                  style={{\n                    padding: config.space.S200,\n                    paddingRight: 0,\n                  }}\n                >\n                  {!searchResult && <Text size=\"L400\">Rooms</Text>}\n                  {searchResult && <Text size=\"L400\">{`Rooms for \"${searchResult.query}\"`}</Text>}\n                  {searchResult && searchResult.items.length === 0 && (\n                    <Text style={{ padding: config.space.S400 }} size=\"T300\" align=\"Center\">\n                      No match found!\n                    </Text>\n                  )}\n                  <div\n                    style={{\n                      position: 'relative',\n                      height: virtualizer.getTotalSize(),\n                    }}\n                  >\n                    {vItems.map((vItem) => {\n                      const roomId = rooms[vItem.index]!;\n                      const room = mx.getRoom(roomId);\n                      if (!room) return null;\n                      const selected = localSelected?.includes(roomId);\n\n                      return (\n                        <VirtualTile\n                          virtualItem={vItem}\n                          style={{ paddingBottom: config.space.S100 }}\n                          ref={virtualizer.measureElement}\n                          key={vItem.index}\n                        >\n                          <MenuItem\n                            data-room-id={roomId}\n                            onClick={handleRoomClick}\n                            variant={selected ? 'Success' : 'Surface'}\n                            size=\"300\"\n                            radii=\"300\"\n                            aria-pressed={selected}\n                            before={sizedIcon(\n                              getRoomIconComponent(room.getType(), room.getJoinRule()),\n                              '50'\n                            )}\n                          >\n                            <Text truncate size=\"T300\">\n                              {room.name}\n                            </Text>\n                          </MenuItem>\n                        </VirtualTile>\n                      );\n                    })}\n                  </div>\n                </Box>\n              </Scroll>\n              <Line variant=\"Surface\" size=\"300\" />\n              <Box shrink=\"No\" direction=\"Column\" gap=\"100\" style={{ padding: config.space.S200 }}>\n                <Button size=\"300\" variant=\"Secondary\" radii=\"300\" onClick={handleSave}>\n                  {localSelected && localSelected.length > 0 ? (\n                    <Text size=\"B300\">Save ({localSelected.length})</Text>\n                  ) : (\n                    <Text size=\"B300\">Save</Text>\n                  )}\n                </Button>\n                <Button\n                  size=\"300\"\n                  radii=\"300\"\n                  variant=\"Secondary\"\n                  fill=\"Soft\"\n                  onClick={handleDeselectAll}\n                  disabled={!localSelected || localSelected.length === 0}\n                >\n                  <Text size=\"B300\">Deselect All</Text>\n                </Button>\n              </Box>\n            </Box>\n          </Menu>\n        </FocusTrap>\n      }\n    >\n      <Chip\n        onClick={handleOpenMenu}\n        variant=\"SurfaceVariant\"\n        radii=\"Pill\"\n        before={sizedIcon(PlusCircle, '100')}\n      >\n        <Text size=\"T200\">Select Rooms</Text>\n      </Chip>\n    </PopOut>\n  );\n}\n\ntype SearchFiltersProps = {\n  defaultRoomsFilterName: string;\n  allowGlobal?: boolean;\n  roomList: string[];\n  selectedRooms?: string[];\n  onSelectedRoomsChange: (selectedRooms?: string[]) => void;\n  global?: boolean;\n  onGlobalChange: (global?: boolean) => void;\n  order?: string;\n  onOrderChange: (order?: string) => void;\n};\nexport function SearchFilters({\n  defaultRoomsFilterName,\n  allowGlobal,\n  roomList,\n  selectedRooms,\n  onSelectedRoomsChange,\n  global,\n  order,\n  onGlobalChange,\n  onOrderChange,\n}: SearchFiltersProps) {\n  const mx = useMatrixClient();\n\n  return (\n    <Box direction=\"Column\" gap=\"100\">\n      <Text size=\"L400\">Filter</Text>\n      <Box gap=\"200\" wrap=\"Wrap\">\n        <Chip\n          variant={!global ? 'Success' : 'Surface'}\n          aria-pressed={!global}\n          before={!global && sizedIcon(Check, '100')}\n          outlined\n          onClick={() => onGlobalChange()}\n        >\n          <Text size=\"T200\">{defaultRoomsFilterName}</Text>\n        </Chip>\n        {allowGlobal && (\n          <Chip\n            variant={global ? 'Success' : 'Surface'}\n            aria-pressed={global}\n            before={global && sizedIcon(Check, '100')}\n            outlined\n            onClick={() => onGlobalChange(true)}\n          >\n            <Text size=\"T200\">Global</Text>\n          </Chip>\n        )}\n        <Line\n          style={{ margin: `${config.space.S100} 0` }}\n          direction=\"Vertical\"\n          variant=\"Surface\"\n          size=\"300\"\n        />\n        {selectedRooms?.map((roomId) => {\n          const room = mx.getRoom(roomId);\n          if (!room) return null;\n\n          return (\n            <Chip\n              key={roomId}\n              variant=\"Success\"\n              onClick={() => onSelectedRoomsChange(selectedRooms.filter((rId) => rId !== roomId))}\n              radii=\"Pill\"\n              before={sizedIcon(getRoomIconComponent(room.getType(), room.getJoinRule()), '50')}\n              after={sizedIcon(X, '50')}\n            >\n              <Text size=\"T200\">{room.name}</Text>\n            </Chip>\n          );\n        })}\n        <SelectRoomButton\n          roomList={roomList}\n          selectedRooms={selectedRooms}\n          onChange={onSelectedRoomsChange}\n        />\n        <Box grow=\"Yes\" data-spacing-node />\n        <OrderButton order={order} onChange={onOrderChange} />\n      </Box>\n    </Box>\n  );\n}\n","import type { RefObject } from 'react';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { Text, Box, config, Spinner, IconButton, Line, toRem } from 'folds';\nimport { CaretUp, ChatCircle, dropzoneIcon, sizedIcon, Info } from '$components/icons/phosphor';\nimport { useAtomValue } from 'jotai';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useSearchParams } from 'react-router';\nimport { SearchOrderBy } from '$types/matrix-sdk';\nimport { PageHero, PageHeroEmpty, PageHeroSection } from '$components/page';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { SearchPathSearchParams } from '$pages/paths';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { SequenceCard } from '$components/sequence-card';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { ScrollTopContainer } from '$components/scroll-top-container';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { decodeSearchParamValueArray, encodeSearchParamValueArray } from '$pages/pathUtils';\nimport { useRooms } from '$state/hooks/roomList';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { VirtualTile } from '$components/virtualizer';\nimport type { MessageSearchParams } from './useMessageSearch';\nimport { useMessageSearch } from './useMessageSearch';\nimport { SearchResultGroup } from './SearchResultGroup';\nimport { SearchInput } from './SearchInput';\nimport { SearchFilters } from './SearchFilters';\n\nconst useSearchPathSearchParams = (searchParams: URLSearchParams): SearchPathSearchParams =>\n  useMemo(\n    () => ({\n      global: searchParams.get('global') ?? undefined,\n      term: searchParams.get('term') ?? undefined,\n      order: searchParams.get('order') ?? undefined,\n      rooms: searchParams.get('rooms') ?? undefined,\n      senders: searchParams.get('senders') ?? undefined,\n    }),\n    [searchParams]\n  );\n\ntype MessageSearchProps = {\n  defaultRoomsFilterName: string;\n  allowGlobal?: boolean;\n  rooms: string[];\n  senders?: string[];\n  scrollRef: RefObject<HTMLDivElement | null>;\n};\nexport function MessageSearch({\n  defaultRoomsFilterName,\n  allowGlobal,\n  rooms,\n  senders,\n  scrollRef,\n}: Readonly<MessageSearchProps>) {\n  const mx = useMatrixClient();\n  const mDirects = useAtomValue(mDirectAtom);\n  const allRooms = useRooms(mx, allRoomsAtom, mDirects);\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n  const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n\n  const searchInputRef = useRef<HTMLInputElement>(null);\n  const scrollTopAnchorRef = useRef<HTMLDivElement>(null);\n  const [searchParams, setSearchParams] = useSearchParams();\n  const searchPathSearchParams = useSearchPathSearchParams(searchParams);\n  const { navigateRoom } = useRoomNavigate();\n\n  const searchParamRooms = useMemo(() => {\n    if (searchPathSearchParams.rooms) {\n      const joinedRoomIds = decodeSearchParamValueArray(searchPathSearchParams.rooms).filter(\n        (rId) => allRooms.includes(rId)\n      );\n      return joinedRoomIds;\n    }\n    return undefined;\n  }, [allRooms, searchPathSearchParams.rooms]);\n  const searchParamsSenders = useMemo(() => {\n    if (searchPathSearchParams.senders) {\n      return decodeSearchParamValueArray(searchPathSearchParams.senders);\n    }\n    return undefined;\n  }, [searchPathSearchParams.senders]);\n\n  const msgSearchParams: MessageSearchParams = useMemo(() => {\n    const isGlobal = searchPathSearchParams.global === 'true';\n    const defaultRooms = isGlobal ? undefined : rooms;\n\n    return {\n      term: searchPathSearchParams.term,\n      order: searchPathSearchParams.order ?? SearchOrderBy.Recent,\n      rooms: searchParamRooms ?? defaultRooms,\n      senders: searchParamsSenders ?? senders,\n    };\n  }, [searchPathSearchParams, searchParamRooms, searchParamsSenders, rooms, senders]);\n\n  const searchMessages = useMessageSearch(msgSearchParams);\n\n  const { status, data, error, fetchNextPage, hasNextPage, isFetchingNextPage } = useInfiniteQuery({\n    enabled: !!msgSearchParams.term,\n    queryKey: [\n      'search',\n      msgSearchParams.term,\n      msgSearchParams.order,\n      msgSearchParams.rooms,\n      msgSearchParams.senders,\n    ],\n    queryFn: ({ pageParam }) => searchMessages(pageParam),\n    initialPageParam: '',\n    getNextPageParam: (lastPage) => lastPage.nextToken,\n  });\n\n  const groups = useMemo(() => data?.pages.flatMap((result) => result.groups) ?? [], [data]);\n  const highlights = useMemo(() => {\n    const mixed = data?.pages.flatMap((result) => result.highlights);\n    return Array.from(new Set(mixed));\n  }, [data]);\n\n  const virtualizer = useVirtualizer({\n    count: groups.length,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: () => 40,\n    overscan: 1,\n  });\n  const vItems = virtualizer.getVirtualItems();\n\n  const handleSearch = (term: string) => {\n    setSearchParams((prevParams) => {\n      const newParams = new URLSearchParams(prevParams);\n      newParams.delete('term');\n      newParams.append('term', term);\n      return newParams;\n    });\n  };\n  const handleSearchClear = () => {\n    if (searchInputRef.current) {\n      searchInputRef.current.value = '';\n    }\n    setSearchParams((prevParams) => {\n      const newParams = new URLSearchParams(prevParams);\n      newParams.delete('term');\n      return newParams;\n    });\n  };\n\n  const handleSelectedRoomsChange = (selectedRooms?: string[]) => {\n    setSearchParams((prevParams) => {\n      const newParams = new URLSearchParams(prevParams);\n      newParams.delete('rooms');\n      if (selectedRooms && selectedRooms.length > 0) {\n        newParams.append('rooms', encodeSearchParamValueArray(selectedRooms));\n      }\n      return newParams;\n    });\n  };\n  const handleGlobalChange = (global?: boolean) => {\n    setSearchParams((prevParams) => {\n      const newParams = new URLSearchParams(prevParams);\n      newParams.delete('global');\n      if (global) {\n        newParams.append('global', 'true');\n      }\n      return newParams;\n    });\n  };\n\n  const handleOrderChange = (order?: string) => {\n    setSearchParams((prevParams) => {\n      const newParams = new URLSearchParams(prevParams);\n      newParams.delete('order');\n      if (order) {\n        newParams.append('order', order);\n      }\n      return newParams;\n    });\n  };\n\n  const lastVItem = vItems.at(-1);\n  const lastVItemIndex: number | undefined = lastVItem?.index;\n  const lastGroupIndex = groups.length - 1;\n  useEffect(() => {\n    if (\n      lastGroupIndex > -1 &&\n      lastGroupIndex === lastVItemIndex &&\n      !isFetchingNextPage &&\n      hasNextPage\n    ) {\n      fetchNextPage();\n    }\n  }, [lastVItemIndex, lastGroupIndex, fetchNextPage, isFetchingNextPage, hasNextPage]);\n\n  return (\n    <Box direction=\"Column\" gap=\"700\">\n      <ScrollTopContainer scrollRef={scrollRef} anchorRef={scrollTopAnchorRef}>\n        <IconButton\n          onClick={() => virtualizer.scrollToOffset(0)}\n          variant=\"SurfaceVariant\"\n          radii=\"Pill\"\n          outlined\n          size=\"300\"\n          aria-label=\"Scroll to Top\"\n        >\n          {sizedIcon(CaretUp, '300')}\n        </IconButton>\n      </ScrollTopContainer>\n      <Box ref={scrollTopAnchorRef} direction=\"Column\" gap=\"300\">\n        <SearchInput\n          active={!!msgSearchParams.term}\n          loading={status === 'pending'}\n          searchInputRef={searchInputRef}\n          onSearch={handleSearch}\n          onReset={handleSearchClear}\n        />\n        <SearchFilters\n          defaultRoomsFilterName={defaultRoomsFilterName}\n          allowGlobal={allowGlobal}\n          roomList={searchPathSearchParams.global === 'true' ? allRooms : rooms}\n          selectedRooms={searchParamRooms}\n          onSelectedRoomsChange={handleSelectedRoomsChange}\n          global={searchPathSearchParams.global === 'true'}\n          onGlobalChange={handleGlobalChange}\n          order={msgSearchParams.order}\n          onOrderChange={handleOrderChange}\n        />\n      </Box>\n\n      {!msgSearchParams.term && status === 'pending' && (\n        <PageHeroEmpty>\n          <PageHeroSection>\n            <PageHero\n              icon={dropzoneIcon(ChatCircle)}\n              title=\"Search Messages\"\n              subTitle=\"Find helpful messages in your community by searching with related keywords.\"\n            />\n          </PageHeroSection>\n        </PageHeroEmpty>\n      )}\n\n      {msgSearchParams.term && groups.length === 0 && status === 'success' && (\n        <Box\n          className={ContainerColor({ variant: 'Warning' })}\n          style={{ padding: config.space.S300, borderRadius: config.radii.R400 }}\n          alignItems=\"Center\"\n          gap=\"200\"\n        >\n          {sizedIcon(Info, '200')}\n          <Text>\n            No results found for <b>{`\"${msgSearchParams.term}\"`}</b>\n          </Text>\n        </Box>\n      )}\n\n      {((msgSearchParams.term && status === 'pending') ||\n        (groups.length > 0 && vItems.length === 0)) && (\n        <Box direction=\"Column\" gap=\"100\">\n          {Array.from({ length: 8 }).map(() => (\n            <SequenceCard\n              variant=\"SurfaceVariant\"\n              key={crypto.randomUUID()}\n              style={{ minHeight: toRem(80) }}\n            />\n          ))}\n        </Box>\n      )}\n\n      {vItems.length > 0 && (\n        <Box direction=\"Column\" gap=\"300\">\n          <Box direction=\"Column\" gap=\"200\">\n            <Text size=\"H5\">{`Results for \"${msgSearchParams.term}\"`}</Text>\n            <Line size=\"300\" variant=\"Surface\" />\n          </Box>\n          <div\n            style={{\n              position: 'relative',\n              height: virtualizer.getTotalSize(),\n            }}\n          >\n            {vItems.map((vItem) => {\n              const group = groups[vItem.index];\n              if (!group) return null;\n              const groupRoom = mx.getRoom(group.roomId);\n              if (!groupRoom) return null;\n\n              return (\n                <VirtualTile\n                  virtualItem={vItem}\n                  style={{ paddingBottom: config.space.S500 }}\n                  ref={virtualizer.measureElement}\n                  key={vItem.index}\n                >\n                  <SearchResultGroup\n                    room={groupRoom}\n                    highlights={highlights}\n                    items={group.items}\n                    onOpen={navigateRoom}\n                    hour24Clock={hour24Clock}\n                    dateFormatString={dateFormatString}\n                  />\n                </VirtualTile>\n              );\n            })}\n          </div>\n          {isFetchingNextPage && (\n            <Box justifyContent=\"Center\" alignItems=\"Center\">\n              <Spinner size=\"600\" variant=\"Secondary\" />\n            </Box>\n          )}\n        </Box>\n      )}\n\n      {error && (\n        <Box\n          className={ContainerColor({ variant: 'Critical' })}\n          style={{\n            padding: config.space.S300,\n            borderRadius: config.radii.R400,\n          }}\n          direction=\"Column\"\n          gap=\"200\"\n        >\n          <Text size=\"L400\">{error.name}</Text>\n          <Text size=\"T300\">{error.message}</Text>\n        </Box>\n      )}\n    </Box>\n  );\n}\n","import { useRef } from 'react';\nimport { Box, Scroll } from 'folds';\nimport { MessageSearchHeader, Page, PageContent, PageContentCenter } from '$components/page';\nimport { MessageSearch } from '$features/message-search';\nimport { useHomeRooms } from './useHomeRooms';\n\nexport function HomeSearch() {\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const rooms = useHomeRooms();\n\n  return (\n    <Page>\n      <MessageSearchHeader />\n      <Box style={{ position: 'relative' }} grow=\"Yes\">\n        <Scroll ref={scrollRef} hideTrack visibility=\"Hover\">\n          <PageContent>\n            <PageContentCenter>\n              <MessageSearch\n                defaultRoomsFilterName=\"Home\"\n                allowGlobal\n                rooms={rooms}\n                scrollRef={scrollRef}\n              />\n            </PageContentCenter>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </Page>\n  );\n}\n","import { useMemo } from 'react';\nimport { getCanonicalAliasRoomId, isRoomAlias } from '$utils/matrix';\nimport { useMatrixClient } from './useMatrixClient';\n\nexport const useJoinedRoomId = (allRooms: string[], roomIdOrAlias: string): string | undefined => {\n  const mx = useMatrixClient();\n\n  const joinedRoomId = useMemo(() => {\n    const roomId = isRoomAlias(roomIdOrAlias)\n      ? getCanonicalAliasRoomId(mx, roomIdOrAlias)\n      : roomIdOrAlias;\n\n    if (roomId && allRooms.includes(roomId)) return roomId;\n    return undefined;\n  }, [mx, allRooms, roomIdOrAlias]);\n\n  return joinedRoomId;\n};\n","import type { FormEventHandler } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport { config, Box, Text, Input } from 'folds';\nimport type { MatrixError } from '$types/matrix-sdk';\n\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport { PromptDialog } from '$components/modal-overlay/PromptDialog';\nimport { AsyncError } from '$components/AsyncError';\nimport { Button } from '$components/button';\n\nconst debugLog = createDebugLogger('KnockRoomPrompt');\n\ntype KnockRoomProps = {\n  roomId: string;\n  via?: string | string[];\n  onDone: () => void;\n  onCancel: () => void;\n};\nexport function KnockRoomPrompt({ roomId, via, onDone, onCancel }: KnockRoomProps) {\n  const mx = useMatrixClient();\n\n  const [knockState, knockRoom] = useAsyncCallback<undefined, MatrixError, [string?]>(\n    useCallback(\n      async (reason?: string) => {\n        debugLog.info('ui', 'Knock room button clicked', { roomId });\n        mx.knockRoom(roomId, { viaServers: via || undefined, reason });\n      },\n      [mx, roomId, via]\n    )\n  );\n\n  const handleKnock: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    const target = evt.target as HTMLFormElement;\n    const reasonInput = (target?.reasonInput as HTMLInputElement) || undefined;\n    const reason = reasonInput?.value.trim() || undefined;\n    knockRoom(reason);\n  };\n\n  useEffect(() => {\n    if (knockState.status === AsyncStatus.Success) {\n      debugLog.info('ui', 'Successfully knocked on room', { roomId });\n      onDone();\n    }\n  }, [knockState, onDone, roomId]);\n\n  return (\n    <PromptDialog title=\"Knock On Room\" requestClose={onCancel}>\n      <Box\n        as=\"form\"\n        onSubmit={handleKnock}\n        style={{ padding: config.space.S400 }}\n        direction=\"Column\"\n        gap=\"400\"\n      >\n        <Box direction=\"Column\" gap=\"200\">\n          <Text priority=\"400\">\n            Request to join this room. You can optionally leave a reason for the moderators.\n          </Text>\n          <Box direction=\"Column\" gap=\"100\">\n            <Text size=\"L400\">\n              Reason{' '}\n              <Text as=\"span\" size=\"T200\">\n                (Optional)\n              </Text>\n            </Text>\n            <Input name=\"reasonInput\" variant=\"Background\" />\n            <AsyncError state={knockState} prefix=\"Failed to knock\" size=\"T300\" />\n          </Box>\n        </Box>\n        <Button\n          type=\"submit\"\n          variant=\"Primary\"\n          loading={knockState.status === AsyncStatus.Loading}\n          spinnerVariant=\"Primary\"\n          spinnerSize=\"200\"\n          aria-disabled={\n            knockState.status === AsyncStatus.Loading || knockState.status === AsyncStatus.Success\n          }\n        >\n          <Text size=\"B400\">\n            {knockState.status === AsyncStatus.Loading ? 'Knocking...' : 'Knock'}\n          </Text>\n        </Button>\n      </Box>\n    </PromptDialog>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { useCallback, useRef, useState } from 'react';\nimport type { MatrixError, Room } from '$types/matrix-sdk';\nimport { JoinRule, EventType, RoomType } from '$types/matrix-sdk';\nimport { Avatar, Badge, Box, Button, Dialog, Spinner, Text, as, color, config, toRem } from 'folds';\nimport classNames from 'classnames';\nimport { userFallbackIcon } from '$components/icons/phosphor';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport { nameInitials } from '$utils/common';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { onEnterOrSpace } from '$utils/keyboard';\n\nimport { useJoinedRoomId } from '$hooks/useJoinedRoomId';\nimport { useElementSizeObserver } from '$hooks/useElementSizeObserver';\nimport { getRoomAvatarUrl } from '$utils/room/display';\nimport { getStateEvent } from '$utils/room/hierarchy';\nimport { useStateEventCallback } from '$hooks/useStateEventCallback';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { KnockRoomPrompt } from '$components/knock-room-prompt';\nimport { RoomAvatar } from '$components/room-avatar';\nimport { formatCompactNumber } from '$utils/formatCompactNumber';\nimport * as css from './style.css';\nimport type { RoomBannerContent } from '$types/matrix-sdk-events';\nimport { CustomStateEvent } from '$types/matrix/room';\nimport colorMXID from '$utils/colorMXID';\nimport { reportMediaLoadFailure } from '$utils/mediaLoadDiagnostics';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { Image as MediaImage } from '$components/media';\n\ntype GridColumnCount = '1' | '2' | '3';\nconst getGridColumnCount = (gridWidth: number): GridColumnCount => {\n  if (gridWidth <= 498) return '1';\n  if (gridWidth <= 748) return '2';\n  return '3';\n};\n\nconst setGridColumnCount = (grid: HTMLElement, count: GridColumnCount): void => {\n  grid.style.setProperty('grid-template-columns', `repeat(${count}, 1fr)`);\n};\n\nexport function RoomCardGrid({ children }: { children: ReactNode }) {\n  const gridRef = useRef<HTMLDivElement>(null);\n\n  useElementSizeObserver(\n    useCallback(() => gridRef.current, []),\n    useCallback((width, _, target) => setGridColumnCount(target, getGridColumnCount(width)), [])\n  );\n\n  return (\n    <Box className={css.CardGrid} direction=\"Row\" gap=\"400\" wrap=\"Wrap\" ref={gridRef}>\n      {children}\n    </Box>\n  );\n}\n\nexport const RoomCardBase = as<'div'>(({ className, ...props }, ref) => (\n  <Box\n    direction=\"Column\"\n    className={classNames(css.RoomCardBase, className)}\n    {...props}\n    ref={ref}\n  />\n));\n\nconst RoomCardName = as<'h6'>(({ children, ...props }, ref) => (\n  <Text as=\"h6\" size=\"H6\" truncate {...props} ref={ref}>\n    {children}\n  </Text>\n));\n\nconst RoomCardTopic = as<'p'>(({ children, className, ...props }, ref) => (\n  <Text\n    as=\"p\"\n    size=\"T200\"\n    className={classNames(css.RoomCardTopic, className)}\n    {...props}\n    priority=\"400\"\n    ref={ref}\n  >\n    {children}\n  </Text>\n));\n\nfunction ErrorDialog({\n  title,\n  message,\n  children,\n}: {\n  title: string;\n  message: string;\n  children: (openError: () => void) => ReactNode;\n}) {\n  const [viewError, setViewError] = useState(false);\n  const closeError = () => setViewError(false);\n  const openError = () => setViewError(true);\n\n  return (\n    <>\n      {children(openError)}\n      <ModalOverlay open={viewError} requestClose={closeError}>\n        <Dialog variant=\"Surface\">\n          <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n            <Box direction=\"Column\" gap=\"100\">\n              <Text>{title}</Text>\n              <Text style={{ color: color.Critical.Main }} size=\"T300\" priority=\"400\">\n                {message}\n              </Text>\n            </Box>\n            <Button size=\"400\" variant=\"Secondary\" fill=\"Soft\" onClick={closeError}>\n              <Text size=\"B400\">Cancel</Text>\n            </Button>\n          </Box>\n        </Dialog>\n      </ModalOverlay>\n    </>\n  );\n}\n\ntype RoomCardProps = {\n  roomIdOrAlias: string;\n  allRooms: string[];\n  avatarUrl?: string;\n  name?: string;\n  topic?: string;\n  memberCount?: number;\n  roomType?: string;\n  joinRule?: JoinRule;\n  viaServers?: string[];\n  onView?: (roomId: string) => void;\n  renderTopicViewer: (name: string, topic: string, requestClose: () => void) => ReactNode;\n};\n\nexport const RoomCard = as<'div', RoomCardProps>(\n  (\n    {\n      roomIdOrAlias,\n      allRooms,\n      avatarUrl,\n      name,\n      topic,\n      memberCount,\n      roomType,\n      joinRule,\n      viaServers,\n      onView,\n      renderTopicViewer,\n      ...props\n    },\n    ref\n  ) => {\n    const mx = useMatrixClient();\n    const useAuthentication = useMediaAuthentication();\n    const joinedRoomId = useJoinedRoomId(allRooms, roomIdOrAlias);\n    const joinedRoom = mx.getRoom(joinedRoomId);\n    const [topicEvent, setTopicEvent] = useState(() =>\n      joinedRoom ? getStateEvent(joinedRoom, EventType.RoomTopic) : undefined\n    );\n    const [knocking, setKnocking] = useState(false);\n    const fallbackName = getMxIdLocalPart(roomIdOrAlias) ?? roomIdOrAlias;\n    const fallbackTopic = roomIdOrAlias;\n\n    const avatar = joinedRoom\n      ? getRoomAvatarUrl(mx, joinedRoom, 96, useAuthentication)\n      : avatarUrl && mxcUrlToHttp(mx, avatarUrl, useAuthentication, 96, 96, 'crop');\n\n    const bannerState = joinedRoom\n      ? getStateEvent(joinedRoom, CustomStateEvent.RoomBanner)\n      : undefined;\n    const bannerMXC = bannerState?.getContent<RoomBannerContent>()?.url;\n    const bannerURI = mxcUrlToHttp(mx, bannerMXC ?? '', useAuthentication);\n    const roomName = joinedRoom?.name || name || fallbackName;\n    const roomTopic =\n      (topicEvent?.getContent().topic as string) || undefined || topic || fallbackTopic;\n    const joinedMemberCount = joinedRoom?.getJoinedMemberCount() ?? memberCount;\n\n    useStateEventCallback(\n      mx,\n      useCallback(\n        (event) => {\n          if (\n            joinedRoom &&\n            event.getRoomId() === joinedRoom.roomId &&\n            event.getType() === (EventType.RoomTopic as string)\n          ) {\n            setTopicEvent(getStateEvent(joinedRoom, EventType.RoomTopic));\n          }\n        },\n        [joinedRoom]\n      )\n    );\n\n    const [joinState, join] = useAsyncCallback<Room, MatrixError, []>(\n      useCallback(() => mx.joinRoom(roomIdOrAlias, { viaServers }), [mx, roomIdOrAlias, viaServers])\n    );\n    const joining =\n      joinState.status === AsyncStatus.Loading || joinState.status === AsyncStatus.Success;\n\n    const [viewTopic, setViewTopic] = useState(false);\n    const closeTopic = () => setViewTopic(false);\n    const openTopic = () => setViewTopic(true);\n    return (\n      <RoomCardBase {...props} ref={ref}>\n        <Box style={{ height: toRem(120) }} direction=\"Column\">\n          {!bannerURI && !avatar ? (\n            <span\n              className={css.RoomCardBanner({ trueBanner: false })}\n              style={{\n                backgroundColor: colorMXID(roomIdOrAlias),\n              }}\n            />\n          ) : (\n            <MediaImage\n              className={css.RoomCardBanner({ trueBanner: !!bannerURI })}\n              src={bannerURI || avatar || undefined}\n              alt={`${name} cover`}\n              draggable=\"false\"\n              onError={() => reportMediaLoadFailure('room_card_banner')}\n            />\n          )}\n          <Avatar className={css.RoomCardAvatar} size=\"500\">\n            <RoomAvatar\n              roomId={roomIdOrAlias}\n              src={avatar ?? undefined}\n              alt={roomIdOrAlias}\n              renderFallback={() => (\n                <Text as=\"span\" size=\"H3\">\n                  {nameInitials(roomName)}\n                </Text>\n              )}\n            />\n          </Avatar>\n        </Box>\n        <Box className={css.RoomCardItems} direction=\"Column\" gap=\"300\">\n          <Box gap=\"200\" justifyContent=\"SpaceBetween\">\n            <Box grow=\"Yes\" direction=\"Column\" gap=\"100\">\n              <RoomCardName>{roomName}</RoomCardName>\n              <RoomCardTopic onClick={openTopic} onKeyDown={onEnterOrSpace(openTopic)} tabIndex={0}>\n                {roomTopic}\n              </RoomCardTopic>\n            </Box>\n            <ModalOverlay open={viewTopic} requestClose={closeTopic}>\n              {renderTopicViewer(roomName, roomTopic, closeTopic)}\n            </ModalOverlay>\n            {(roomType === RoomType.Space || joinedRoom?.isSpaceRoom()) && (\n              <Badge variant=\"Secondary\" fill=\"Soft\" outlined>\n                <Text size=\"L400\">Space</Text>\n              </Badge>\n            )}\n          </Box>\n          {typeof joinedMemberCount === 'number' && (\n            <Box gap=\"100\">\n              {userFallbackIcon('sm')}\n              <Text size=\"T200\">{`${formatCompactNumber(joinedMemberCount)} Members`}</Text>\n            </Box>\n          )}\n          {typeof joinedRoomId === 'string' && (\n            <Button\n              onClick={onView ? () => onView(joinedRoomId) : undefined}\n              variant=\"Secondary\"\n              fill=\"Soft\"\n              size=\"300\"\n            >\n              <Text size=\"B300\" truncate>\n                View\n              </Text>\n            </Button>\n          )}\n          {typeof joinedRoomId !== 'string' &&\n            joinState.status !== AsyncStatus.Error &&\n            (joinRule === JoinRule.Knock ? (\n              <>\n                <Button onClick={() => setKnocking(true)} variant=\"Secondary\" size=\"300\">\n                  <Text size=\"B300\" truncate>\n                    Knock\n                  </Text>\n                </Button>\n\n                {knocking && (\n                  <KnockRoomPrompt\n                    roomId={roomIdOrAlias}\n                    via={viaServers}\n                    onDone={() => setKnocking(false)}\n                    onCancel={() => setKnocking(false)}\n                  />\n                )}\n              </>\n            ) : (\n              <Button\n                onClick={join}\n                variant=\"Secondary\"\n                size=\"300\"\n                disabled={joining}\n                before={\n                  joining && (\n                    <Spinner\n                      size=\"50\"\n                      variant=\"Secondary\"\n                      fill=\"Soft\"\n                      style={{ background: 'transparent' }}\n                    />\n                  )\n                }\n              >\n                <Text size=\"B300\" truncate>\n                  {joining ? 'Joining' : 'Join'}\n                </Text>\n              </Button>\n            ))}\n          {typeof joinedRoomId !== 'string' && joinState.status === AsyncStatus.Error && (\n            <Box gap=\"200\">\n              <Button\n                onClick={join}\n                className={css.ActionButton}\n                variant=\"Critical\"\n                fill=\"Solid\"\n                size=\"300\"\n              >\n                <Text size=\"B300\" truncate>\n                  Retry\n                </Text>\n              </Button>\n              <ErrorDialog\n                title=\"Join Error\"\n                message={joinState.error.message || 'Failed to join. Unknown Error.'}\n              >\n                {(openError) => (\n                  <Button\n                    onClick={openError}\n                    className={css.ActionButton}\n                    variant=\"Critical\"\n                    fill=\"Soft\"\n                    outlined\n                    size=\"300\"\n                  >\n                    <Text size=\"B300\" truncate>\n                      View Error\n                    </Text>\n                  </Button>\n                )}\n              </ErrorDialog>\n            </Box>\n          )}\n        </Box>\n      </RoomCardBase>\n    );\n  }\n);\n","import type { JoinRule, Room } from '$types/matrix-sdk';\nimport { GuestAccess, HistoryVisibility, EventType } from '$types/matrix-sdk';\n\nimport { getStateEvent } from '$utils/room/hierarchy';\n\nexport type LocalRoomSummary = {\n  roomId: string;\n  name: string;\n  topic?: string;\n  avatarUrl?: string;\n  canonicalAlias?: string;\n  worldReadable?: boolean;\n  guestCanJoin?: boolean;\n  memberCount?: number;\n  roomType?: string;\n  joinRule?: JoinRule;\n};\nexport const useLocalRoomSummary = (room: Room): LocalRoomSummary => {\n  const topicEvent = getStateEvent(room, EventType.RoomTopic);\n  const topicContent = topicEvent?.getContent();\n  const topic =\n    topicContent && typeof topicContent.topic === 'string' ? topicContent.topic : undefined;\n\n  const historyEvent = getStateEvent(room, EventType.RoomHistoryVisibility);\n  const historyContent = historyEvent?.getContent();\n  const worldReadable =\n    historyContent && typeof historyContent.history_visibility === 'string'\n      ? historyContent.history_visibility === (HistoryVisibility.WorldReadable as string)\n      : undefined;\n\n  const guestCanJoin = (room.getGuestAccess() as string) === (GuestAccess.CanJoin as string);\n\n  return {\n    roomId: room.roomId,\n    name: room.name,\n    topic,\n    avatarUrl: room.getMxcAvatarUrl() ?? undefined,\n    canonicalAlias: room.getCanonicalAlias() ?? undefined,\n    worldReadable,\n    guestCanJoin,\n    memberCount: room.getJoinedMemberCount(),\n    roomType: room.getType(),\n    joinRule: room.getJoinRule(),\n  };\n};\n","import type { ReactNode } from 'react';\nimport { useCallback } from 'react';\nimport type { MatrixClient, Room } from '$types/matrix-sdk';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport type { LocalRoomSummary } from '$hooks/useLocalRoomSummary';\nimport { useLocalRoomSummary } from '$hooks/useLocalRoomSummary';\n\ntype IRoomSummary = Awaited<ReturnType<MatrixClient['getRoomSummary']>>;\n\ntype RoomSummaryLoaderProps = {\n  roomIdOrAlias: string;\n  children: (roomSummary?: IRoomSummary) => ReactNode;\n};\n\nexport function RoomSummaryLoader({ roomIdOrAlias, children }: RoomSummaryLoaderProps) {\n  const mx = useMatrixClient();\n\n  const fetchSummary = useCallback(() => mx.getRoomSummary(roomIdOrAlias), [mx, roomIdOrAlias]);\n\n  const { data } = useQuery({\n    queryKey: [roomIdOrAlias, `summary`],\n    queryFn: fetchSummary,\n  });\n\n  return children(data);\n}\n\nexport function LocalRoomSummaryLoader({\n  room,\n  children,\n}: {\n  room: Room;\n  children: (roomSummary: LocalRoomSummary) => ReactNode;\n}) {\n  const summary = useLocalRoomSummary(room);\n\n  return children(summary);\n}\n","import { Box, IconButton, Scroll, Text, toRem } from 'folds';\nimport { ArrowLeft, composerIcon } from '$components/icons/phosphor';\nimport { useAtomValue } from 'jotai';\nimport { RoomType } from '$types/matrix-sdk';\nimport { RoomCard } from '$components/room-card';\nimport { RoomTopicViewer } from '$components/room-topic-viewer';\nimport { Page, PageHeader } from '$components/page';\nimport { RoomSummaryLoader } from '$components/RoomSummaryLoader';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { BackRouteHandler } from '$components/BackRouteHandler';\n\ntype JoinBeforeNavigateProps = { roomIdOrAlias: string; eventId?: string; viaServers?: string[] };\nexport function JoinBeforeNavigate({\n  roomIdOrAlias,\n  eventId,\n  viaServers,\n}: JoinBeforeNavigateProps) {\n  const mx = useMatrixClient();\n  const allRooms = useAtomValue(allRoomsAtom);\n  const { navigateRoom, navigateSpace } = useRoomNavigate();\n\n  const handleView = (roomId: string, roomType?: string) => {\n    if (mx.getRoom(roomId)?.isSpaceRoom() || roomType === RoomType.Space) {\n      navigateSpace(roomId);\n      return;\n    }\n    navigateRoom(roomId, eventId);\n  };\n\n  return (\n    <Page>\n      <PageHeader balance>\n        <Box grow=\"Yes\" gap=\"200\">\n          <Box shrink=\"No\">\n            <BackRouteHandler>\n              {(onBack) => (\n                <IconButton aria-label=\"Back\" onClick={onBack}>\n                  {composerIcon(ArrowLeft)}\n                </IconButton>\n              )}\n            </BackRouteHandler>\n          </Box>\n          <Box grow=\"Yes\" justifyContent=\"Center\" alignItems=\"Center\" gap=\"200\">\n            <Text size=\"H3\" truncate>\n              {roomIdOrAlias}\n            </Text>\n          </Box>\n        </Box>\n      </PageHeader>\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\" size=\"0\">\n          <Box style={{ height: '100%' }} grow=\"Yes\" alignItems=\"Center\" justifyContent=\"Center\">\n            <RoomSummaryLoader roomIdOrAlias={roomIdOrAlias}>\n              {(summary) => (\n                <RoomCard\n                  style={{ maxWidth: toRem(364), width: '100%' }}\n                  roomIdOrAlias={roomIdOrAlias}\n                  allRooms={allRooms}\n                  avatarUrl={summary?.avatar_url}\n                  name={summary?.name}\n                  topic={summary?.topic}\n                  memberCount={summary?.num_joined_members}\n                  roomType={summary?.room_type}\n                  joinRule={summary?.join_rule}\n                  viaServers={viaServers}\n                  renderTopicViewer={(name, topic, requestClose) => (\n                    <RoomTopicViewer name={name} topic={topic} requestClose={requestClose} />\n                  )}\n                  onView={(roomId) => handleView(roomId, summary?.room_type)}\n                />\n              )}\n            </RoomSummaryLoader>\n          </Box>\n        </Scroll>\n      </Box>\n    </Page>\n  );\n}\n","import type { RoomSearchParams, DirectCreateSearchParams } from './paths';\n\ntype SearchParamsGetter<T> = (searchParams: URLSearchParams) => T;\n\nexport const getRoomSearchParams: SearchParamsGetter<RoomSearchParams> = (searchParams) => ({\n  viaServers: searchParams.get('viaServers') ?? undefined,\n});\n\nexport const getDirectCreateSearchParams: SearchParamsGetter<DirectCreateSearchParams> = (\n  searchParams\n) => ({\n  userId: searchParams.get('userId') ?? undefined,\n});\n","import { useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { getRoomSearchParams } from '$pages/pathSearchParam';\nimport { decodeSearchParamValueArray } from '$pages/pathUtils';\n\nexport const useSearchParamsViaServers = (): string[] | undefined => {\n  const [searchParams] = useSearchParams();\n  const roomSearchParams = useMemo(() => getRoomSearchParams(searchParams), [searchParams]);\n  const viaServers = roomSearchParams.viaServers\n    ? decodeSearchParamValueArray(roomSearchParams.viaServers)\n    : undefined;\n\n  return viaServers;\n};\n","import type { ReactNode } from 'react';\nimport { Spinner } from 'folds';\nimport { useParams } from 'react-router';\nimport { useResolvedRoomIdOrAlias } from '$hooks/router/useResolvedRoomId';\nimport { IsDirectRoomProvider, DisplayedEventIdProvider, RoomProvider } from '$hooks/useRoom';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { JoinBeforeNavigate } from '$features/join-before-navigate';\nimport { useSearchParamsViaServers } from '$hooks/router/useSearchParamsViaServers';\nimport { useHomeRooms } from './useHomeRooms';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\n\nexport function HomeRouteRoomProvider({\n  roomIdOrAlias: roomIdOrAliasProp,\n  eventId: eventIdProp,\n  children,\n}: {\n  roomIdOrAlias?: string;\n  eventId?: string;\n  children: ReactNode;\n}) {\n  const mx = useMatrixClient();\n  const [isShowingAllRoomsInHome] = useSetting(settingsAtom, 'isShowingAllRoomsInHome');\n  const rooms = useHomeRooms();\n\n  const { roomIdOrAlias: encodedRoomIdOrAlias, eventId: encodedEventId } = useParams();\n  const roomIdOrAlias =\n    roomIdOrAliasProp ?? (encodedRoomIdOrAlias && decodeURIComponent(encodedRoomIdOrAlias));\n  const eventId = eventIdProp ?? (encodedEventId && decodeURIComponent(encodedEventId));\n  const viaServers = useSearchParamsViaServers();\n  const { roomId, resolving } = useResolvedRoomIdOrAlias(roomIdOrAlias);\n  const room = mx.getRoom(roomId);\n\n  if (resolving) return <Spinner variant=\"Secondary\" size=\"600\" />;\n\n  if (!room || (!isShowingAllRoomsInHome && !rooms.includes(room.roomId))) {\n    return (\n      <JoinBeforeNavigate\n        roomIdOrAlias={roomIdOrAlias!}\n        eventId={eventId}\n        viaServers={viaServers}\n      />\n    );\n  }\n\n  return (\n    <RoomProvider key={room.roomId} value={room}>\n      <IsDirectRoomProvider value={false}>\n        <DisplayedEventIdProvider value={eventId}>{children}</DisplayedEventIdProvider>\n      </IsDirectRoomProvider>\n    </RoomProvider>\n  );\n}\n","import { useAtomValue } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { useDirects } from '$state/hooks/roomList';\n\nexport const useDirectRooms = () => {\n  const mx = useMatrixClient();\n  const mDirects = useAtomValue(mDirectAtom);\n  const directs = useDirects(mx, allRoomsAtom, mDirects);\n  return directs;\n};\n","import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useAtom, useAtomValue } from 'jotai';\nimport { Avatar, Box, Button, Text, toRem } from 'folds';\nimport {\n  At,\n  dropzoneIcon,\n  menuIcon,\n  getPhosphorSize,\n  Plus,\n  User,\n} from '$components/icons/phosphor';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { useNavigate } from 'react-router';\nimport { RoomEvent } from '$types/matrix-sdk';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { factoryRoomIdByActivity } from '$utils/sort';\nimport {\n  NavButton,\n  NavCategory,\n  NavCategoryHeader,\n  NavEmptyCenter,\n  NavEmptyLayout,\n  NavItem,\n  NavItemContent,\n} from '$components/nav';\nimport { getDirectCreatePath, getDirectForumPath, getDirectRoomPath } from '$pages/pathUtils';\nimport { getCanonicalAliasOrRoomId } from '$utils/matrix';\nimport { useSelectedOrLastRoom } from '$hooks/router/useSelectedRoom';\nimport { VirtualTile } from '$components/virtualizer';\nimport { RoomNavCategoryButton, RoomNavItem } from '$features/room-nav';\nimport { makeNavCategoryId } from '$state/closedNavCategories';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { useCategoryHandler } from '$hooks/useCategoryHandler';\nimport { useNavToActivePathMapper } from '$hooks/useNavToActivePathMapper';\nimport { PageNavContent, PageNavHeaderWithMenu } from '$components/page';\nimport { PageNavShell } from '$components/page/PageNavShell';\nimport { useClosedNavCategoriesAtom } from '$state/hooks/closedNavCategories';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport {\n  getRoomNotificationMode,\n  useRoomsNotificationPreferencesContext,\n} from '$hooks/useRoomsNotificationPreferences';\nimport { useDirectCreateSelected } from '$hooks/router/useRouteSelected';\nimport { useDirectRooms } from './useDirectRooms';\nimport { useSidebarWidth } from '$hooks/useSidebarWidth';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { NavMenu } from '$components/nav/NavMenu';\nimport { CustomRoomType } from '$types/matrix/room';\n\ntype DirectMenuProps = {\n  requestClose: () => void;\n};\nconst DirectMenu = forwardRef<HTMLDivElement, DirectMenuProps>(({ requestClose }, ref) => {\n  const orphanRooms = useDirectRooms();\n\n  return <NavMenu ref={ref} rooms={orphanRooms} requestClose={requestClose} />;\n});\nDirectMenu.displayName = 'DirectMenu';\n\nfunction DirectHeader({ hideText }: { hideText?: boolean }) {\n  const menu = useMenuAnchor<HTMLButtonElement>();\n\n  return (\n    <PageNavHeaderWithMenu\n      hideText={hideText}\n      title=\"Direct Messages\"\n      collapsedIcon={\n        <User size={getPhosphorSize().toolbar} weight={menu.anchor ? 'fill' : 'regular'} />\n      }\n      menu={<DirectMenu requestClose={menu.close} />}\n      anchor={menu.anchor}\n      requestClose={menu.close}\n      triggerProps={menu.triggerProps}\n    />\n  );\n}\n\nfunction DirectEmpty() {\n  const navigate = useNavigate();\n\n  return (\n    <NavEmptyCenter>\n      <NavEmptyLayout\n        icon={dropzoneIcon(At)}\n        title={\n          <Text size=\"H5\" align=\"Center\">\n            No Direct Messages\n          </Text>\n        }\n        content={\n          <Text size=\"T300\" align=\"Center\">\n            You do not have any direct messages yet.\n          </Text>\n        }\n        options={\n          <Button variant=\"Secondary\" size=\"300\" onClick={() => navigate(getDirectCreatePath())}>\n            <Text size=\"B300\" truncate>\n              Direct Message\n            </Text>\n          </Button>\n        }\n      />\n    </NavEmptyCenter>\n  );\n}\n\nconst DEFAULT_CATEGORY_ID = makeNavCategoryId('direct', 'direct');\nexport function Direct() {\n  const mx = useMatrixClient();\n  useNavToActivePathMapper('direct');\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const directs = useDirectRooms();\n  const notificationPreferences = useRoomsNotificationPreferencesContext();\n  const roomToUnread = useAtomValue(roomToUnreadAtom);\n  const navigate = useNavigate();\n  const [customDMCards] = useSetting(settingsAtom, 'customDMCards');\n  const {\n    curWidth,\n    setCurWidth,\n    roomSidebarWidth,\n    setRoomSidebarWidth,\n    setIsResizingSidebar,\n    isMobile,\n    hideText,\n    oldSidebar,\n  } = useSidebarWidth();\n\n  const [joinCallOnSingleClick] = useSetting(settingsAtom, 'joinCallOnSingleClick');\n\n  const createDirectSelected = useDirectCreateSelected();\n\n  const selectedRoomId = useSelectedOrLastRoom();\n  const noRoomToDisplay = directs.length === 0;\n  const [closedCategories, setClosedCategories] = useAtom(useClosedNavCategoriesAtom());\n\n  // Track timeline activity to trigger re-sorting when messages arrive.\n  // Without this, DMs only re-sort when you switch rooms because getLastActiveTimestamp()\n  // is internal SDK state not tracked by React dependencies.\n  const [activityCounter, setActivityCounter] = useState(0);\n  const directsSetRef = useRef(directs);\n  directsSetRef.current = directs;\n\n  useEffect(() => {\n    const handleTimeline = () => {\n      // Increment counter to trigger re-sort when any timeline event happens\n      setActivityCounter((prev) => prev + 1);\n    };\n\n    // Listen to timeline events only for direct message rooms\n    directsSetRef.current.forEach((roomId) => {\n      const room = mx.getRoom(roomId);\n      room?.on(RoomEvent.Timeline, handleTimeline);\n    });\n\n    return () => {\n      directsSetRef.current.forEach((roomId) => {\n        const room = mx.getRoom(roomId);\n        room?.off(RoomEvent.Timeline, handleTimeline);\n      });\n    };\n  }, [mx, directs]);\n\n  const sortedDirects = useMemo(() => {\n    void activityCounter;\n    const items = Array.from(directs).toSorted(factoryRoomIdByActivity(mx));\n    const hasUnread = (roomId: string) => {\n      const unread = roomToUnread.get(roomId);\n      return !!unread && (unread.total > 0 || unread.highlight > 0);\n    };\n    if (closedCategories.has(DEFAULT_CATEGORY_ID)) {\n      return items.filter((rId) => hasUnread(rId) || rId === selectedRoomId);\n    }\n    return items;\n  }, [mx, directs, closedCategories, roomToUnread, selectedRoomId, activityCounter]);\n\n  const getItemKey = useCallback((index: number) => sortedDirects[index] ?? index, [sortedDirects]);\n\n  const virtualizer = useVirtualizer({\n    count: sortedDirects.length,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: () => 38,\n    overscan: 10,\n    getItemKey,\n  });\n\n  const handleCategoryClick = useCategoryHandler(setClosedCategories, (categoryId) =>\n    closedCategories.has(categoryId)\n  );\n\n  return (\n    <PageNavShell\n      header={<DirectHeader hideText={hideText} />}\n      curWidth={curWidth}\n      setCurWidth={setCurWidth}\n      roomSidebarWidth={roomSidebarWidth}\n      setRoomSidebarWidth={setRoomSidebarWidth}\n      setIsResizingSidebar={setIsResizingSidebar}\n      isMobile={isMobile}\n      oldSidebar={oldSidebar}\n    >\n      {noRoomToDisplay ? (\n        <DirectEmpty />\n      ) : (\n        <PageNavContent scrollRef={scrollRef}>\n          <Box direction=\"Column\" gap=\"300\">\n            <NavCategory>\n              <NavItem variant=\"Background\" radii=\"400\" aria-selected={createDirectSelected}>\n                <NavButton onClick={() => navigate(getDirectCreatePath())}>\n                  <NavItemContent>\n                    <Box as=\"span\" grow=\"Yes\" alignItems=\"Center\" gap=\"200\" justifyContent=\"Center\">\n                      <Avatar size=\"200\" radii=\"400\">\n                        {menuIcon(Plus)}\n                      </Avatar>\n                      {!hideText && (\n                        <Box as=\"span\" grow=\"Yes\">\n                          <Text as=\"span\" size=\"Inherit\" truncate>\n                            Create Chat\n                          </Text>\n                        </Box>\n                      )}\n                    </Box>\n                  </NavItemContent>\n                </NavButton>\n              </NavItem>\n            </NavCategory>\n            <NavCategory>\n              <NavCategoryHeader>\n                <RoomNavCategoryButton\n                  closed={closedCategories.has(DEFAULT_CATEGORY_ID)}\n                  data-category-id={DEFAULT_CATEGORY_ID}\n                  onClick={handleCategoryClick}\n                >\n                  {!hideText && 'Chats'}\n                </RoomNavCategoryButton>\n              </NavCategoryHeader>\n              <div\n                style={{\n                  position: 'relative',\n                  height: virtualizer.getTotalSize(),\n                  overflow: 'clip',\n                }}\n              >\n                {virtualizer.getVirtualItems().map((vItem) => {\n                  const roomId = sortedDirects[vItem.index];\n                  if (!roomId) return null;\n                  const room = mx.getRoom(roomId);\n                  if (!room) return null;\n                  const selected = selectedRoomId === roomId;\n\n                  return (\n                    <VirtualTile\n                      virtualItem={vItem}\n                      key={vItem.key}\n                      ref={virtualizer.measureElement}\n                    >\n                      <div\n                        style={\n                          hideText\n                            ? {\n                                padding: '0',\n                                width: '100%',\n                                aspectRatio: 1,\n                                display: 'flex',\n                                flexDirection: 'column',\n                              }\n                            : {}\n                        }\n                      >\n                        <RoomNavItem\n                          room={room}\n                          selected={selected}\n                          showAvatar\n                          direct\n                          customDMCards={customDMCards}\n                          hideText={hideText}\n                          linkPath={\n                            room.getType() === CustomRoomType.Forum\n                              ? getDirectForumPath(getCanonicalAliasOrRoomId(mx, roomId))\n                              : getDirectRoomPath(getCanonicalAliasOrRoomId(mx, roomId))\n                          }\n                          notificationMode={getRoomNotificationMode(\n                            notificationPreferences,\n                            room.roomId\n                          )}\n                          joinCallOnSingleClick={joinCallOnSingleClick}\n                        />\n                      </div>\n                    </VirtualTile>\n                  );\n                })}\n              </div>\n            </NavCategory>\n            <div style={{ height: toRem(40) }} />\n          </Box>\n        </PageNavContent>\n      )}\n    </PageNavShell>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Spinner } from 'folds';\nimport { useParams } from 'react-router';\nimport { useResolvedRoomIdOrAlias } from '$hooks/router/useResolvedRoomId';\nimport { IsDirectRoomProvider, DisplayedEventIdProvider, RoomProvider } from '$hooks/useRoom';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { JoinBeforeNavigate } from '$features/join-before-navigate';\nimport { useDirectRooms } from './useDirectRooms';\n\nexport function DirectRouteRoomProvider({\n  roomIdOrAlias: roomIdOrAliasProp,\n  eventId: eventIdProp,\n  children,\n}: {\n  roomIdOrAlias?: string;\n  eventId?: string;\n  children: ReactNode;\n}) {\n  const mx = useMatrixClient();\n  const rooms = useDirectRooms();\n\n  const { roomIdOrAlias: encodedRoomIdOrAlias, eventId: encodedEventId } = useParams();\n  const roomIdOrAlias =\n    roomIdOrAliasProp ?? (encodedRoomIdOrAlias && decodeURIComponent(encodedRoomIdOrAlias));\n  const eventId = eventIdProp ?? (encodedEventId && decodeURIComponent(encodedEventId));\n  const { roomId, resolving } = useResolvedRoomIdOrAlias(roomIdOrAlias);\n  const room = mx.getRoom(roomId);\n\n  if (resolving) return <Spinner variant=\"Secondary\" size=\"600\" />;\n\n  if (!room || !rooms.includes(room.roomId)) {\n    return <JoinBeforeNavigate roomIdOrAlias={roomIdOrAlias!} eventId={eventId} />;\n  }\n\n  return (\n    <RoomProvider key={room.roomId} value={room}>\n      <IsDirectRoomProvider value>\n        <DisplayedEventIdProvider value={eventId}>{children}</DisplayedEventIdProvider>\n      </IsDirectRoomProvider>\n    </RoomProvider>\n  );\n}\n","import { Box, color, config, Input, Switch, Text } from 'folds';\nimport { sizedIcon, Warning } from '$components/icons/phosphor';\nimport type { FormEventHandler } from 'react';\nimport { useCallback, useState } from 'react';\nimport type { ICreateRoomStateEvent } from '$types/matrix-sdk';\nimport { MatrixError, Preset, Visibility } from '$types/matrix-sdk';\nimport { useNavigate } from 'react-router';\nimport { SettingTile } from '$components/setting-tile';\nimport { SequenceCard } from '$components/sequence-card';\nimport { addRoomIdToMDirect, isUserId } from '$utils/matrix';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { millisecondsToMinutes } from '$utils/common';\nimport { createRoomEncryptionState } from '$components/create-room';\nimport { useAlive } from '$hooks/useAlive';\nimport { getDirectRoomPath } from '$pages/pathUtils';\nimport { ErrorCode } from '../../cs-errorcode';\nimport { Button } from '$components/button';\n\ntype CreateChatProps = {\n  defaultUserId?: string;\n};\nexport function CreateChat({ defaultUserId }: CreateChatProps) {\n  const mx = useMatrixClient();\n  const alive = useAlive();\n  const navigate = useNavigate();\n\n  const [encryption, setEncryption] = useState(true);\n  const [invalidUserId, setInvalidUserId] = useState(false);\n\n  const [createState, create] = useAsyncCallback<string, Error | MatrixError, [string, boolean]>(\n    useCallback(\n      async (userId, encrypted) => {\n        const initialState: ICreateRoomStateEvent[] = [];\n\n        if (encrypted) initialState.push(createRoomEncryptionState());\n\n        const result = await mx.createRoom({\n          is_direct: true,\n          invite: [userId],\n          visibility: Visibility.Private,\n          preset: Preset.TrustedPrivateChat,\n          initial_state: initialState,\n          creation_content: {\n            additional_creators: [userId],\n          },\n        });\n\n        addRoomIdToMDirect(mx, result.room_id, userId);\n\n        return result.room_id;\n      },\n      [mx]\n    )\n  );\n  const loading = createState.status === AsyncStatus.Loading;\n  const error = createState.status === AsyncStatus.Error ? createState.error : undefined;\n  const disabled = createState.status === AsyncStatus.Loading;\n\n  const handleSubmit: FormEventHandler<HTMLFormElement> = (evt) => {\n    evt.preventDefault();\n    setInvalidUserId(false);\n\n    const target = evt.target as HTMLFormElement | undefined;\n    const userIdInput = target?.userIdInput as HTMLInputElement | undefined;\n    const userId = userIdInput?.value.trim();\n\n    if (!userIdInput || !userId) return;\n    if (!isUserId(userId)) {\n      setInvalidUserId(true);\n      return;\n    }\n\n    create(userId, encryption).then((roomId) => {\n      if (alive()) {\n        userIdInput.value = '';\n        navigate(getDirectRoomPath(roomId));\n      }\n    });\n  };\n\n  return (\n    <Box as=\"form\" onSubmit={handleSubmit} grow=\"Yes\" direction=\"Column\" gap=\"500\">\n      <Box direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">User ID</Text>\n        <Input\n          defaultValue={defaultUserId}\n          placeholder=\"@username:server\"\n          name=\"userIdInput\"\n          variant=\"SurfaceVariant\"\n          size=\"500\"\n          radii=\"400\"\n          required\n          autoFocus\n          autoComplete=\"off\"\n          disabled={disabled}\n        />\n        {invalidUserId && (\n          <Box style={{ color: color.Critical.Main }} alignItems=\"Center\" gap=\"100\">\n            {sizedIcon(Warning, '50', { filled: true })}\n            <Text size=\"T200\" style={{ color: color.Critical.Main }}>\n              <b>Please enter a valid User ID.</b>\n            </Text>\n          </Box>\n        )}\n      </Box>\n      <Box shrink=\"No\" direction=\"Column\" gap=\"100\">\n        <Text size=\"L400\">Options</Text>\n        <SequenceCard\n          style={{ padding: config.space.S300 }}\n          variant=\"SurfaceVariant\"\n          direction=\"Column\"\n          gap=\"500\"\n        >\n          <SettingTile\n            title=\"End-to-End Encryption\"\n            description=\"Once this feature is enabled, it can't be disabled after the room is created.\"\n            after={\n              <Switch\n                variant=\"Primary\"\n                value={encryption}\n                onChange={setEncryption}\n                disabled={disabled}\n              />\n            }\n          />\n        </SequenceCard>\n      </Box>\n      {error && (\n        <Box style={{ color: color.Critical.Main }} alignItems=\"Center\" gap=\"200\">\n          {sizedIcon(Warning, '100', { filled: true })}\n          <Text size=\"T300\" style={{ color: color.Critical.Main }}>\n            <b>\n              {error instanceof MatrixError && error.name === (ErrorCode.M_LIMIT_EXCEEDED as string)\n                ? `Server rate-limited your request for ${millisecondsToMinutes(\n                    (error.data.retry_after_ms as number | undefined) ?? 0\n                  )} minutes!`\n                : error.message}\n            </b>\n          </Text>\n        </Box>\n      )}\n      <Box shrink=\"No\" direction=\"Column\" gap=\"200\">\n        <Button\n          type=\"submit\"\n          size=\"500\"\n          variant=\"Primary\"\n          radii=\"400\"\n          disabled={disabled}\n          loading={loading}\n          spinnerVariant=\"Primary\"\n          spinnerSize=\"200\"\n        >\n          <Text size=\"B400\">Create Chat</Text>\n        </Button>\n      </Box>\n    </Box>\n  );\n}\n","import { useEffect } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { Box, IconButton, Scroll } from 'folds';\nimport { ArrowLeft, At, composerIcon, dropzoneIcon } from '$components/icons/phosphor';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { getDirectCreateSearchParams } from '$pages/pathSearchParam';\nimport { getDMRoomFor } from '$utils/matrix';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport {\n  Page,\n  PageContent,\n  PageContentCenter,\n  PageHeader,\n  PageHero,\n  PageHeroSection,\n} from '$components/page';\nimport { BackRouteHandler } from '$components/BackRouteHandler';\nimport { CreateChat } from '$features/create-chat';\n\nexport function DirectCreate() {\n  const mx = useMatrixClient();\n  const screenSize = useScreenSizeContext();\n\n  const { navigateRoom } = useRoomNavigate();\n  const [searchParams] = useSearchParams();\n  const { userId } = getDirectCreateSearchParams(searchParams);\n\n  useEffect(() => {\n    if (!userId) return;\n    const roomId = getDMRoomFor(mx, userId)?.roomId;\n    if (roomId) {\n      navigateRoom(roomId, undefined, { replace: true });\n    }\n  }, [mx, navigateRoom, userId]);\n\n  return (\n    <Page>\n      {screenSize === ScreenSize.Mobile && (\n        <PageHeader balance outlined={false}>\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            <BackRouteHandler>\n              {(onBack) => <IconButton onClick={onBack}>{composerIcon(ArrowLeft)}</IconButton>}\n            </BackRouteHandler>\n          </Box>\n        </PageHeader>\n      )}\n      <Box grow=\"Yes\">\n        <Scroll hideTrack visibility=\"Hover\">\n          <PageContent>\n            <PageContentCenter>\n              <PageHeroSection>\n                <Box direction=\"Column\" gap=\"700\">\n                  <PageHero\n                    icon={dropzoneIcon(At)}\n                    title=\"Create Chat\"\n                    subTitle=\"Start a private, encrypted chat by entering a user ID.\"\n                  />\n                  <CreateChat defaultUserId={userId} />\n                </Box>\n              </PageHeroSection>\n            </PageContentCenter>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </Page>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Spinner } from 'folds';\nimport { useParams } from 'react-router';\nimport { useAtomValue } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { useResolvedSelectedSpace } from '$hooks/router/useResolvedRoomId';\nimport { SpaceProvider } from '$hooks/useSpace';\nimport { JoinBeforeNavigate } from '$features/join-before-navigate';\nimport { useSearchParamsViaServers } from '$hooks/router/useSearchParamsViaServers';\n\ntype RouteSpaceProviderProps = {\n  children: ReactNode;\n};\nexport function RouteSpaceProvider({ children }: RouteSpaceProviderProps) {\n  const mx = useMatrixClient();\n  const allRooms = useAtomValue(allRoomsAtom);\n\n  const { spaceIdOrAlias: encodedSpaceIdOrAlias } = useParams();\n  const spaceIdOrAlias = encodedSpaceIdOrAlias && decodeURIComponent(encodedSpaceIdOrAlias);\n  const viaServers = useSearchParamsViaServers();\n\n  const { roomId: selectedSpaceId, resolving } = useResolvedSelectedSpace();\n  const space = mx.getRoom(selectedSpaceId);\n\n  if (resolving) return <Spinner variant=\"Secondary\" size=\"600\" />;\n\n  if (!space || !allRooms.includes(space.roomId)) {\n    return <JoinBeforeNavigate roomIdOrAlias={spaceIdOrAlias ?? ''} viaServers={viaServers} />;\n  }\n\n  return <SpaceProvider value={space}>{children}</SpaceProvider>;\n}\n","import { atom } from 'jotai';\nimport { produce } from 'immer';\nimport {\n  atomWithLocalStorage,\n  getLocalStorageItem,\n  setLocalStorageItem,\n} from './utils/atomWithLocalStorage';\n\nconst SPACE_ROOMS = 'spaceRooms';\n\nconst baseSpaceRoomsAtom = atomWithLocalStorage<Set<string>>(\n  SPACE_ROOMS,\n  (key) => {\n    const arrayValue = getLocalStorageItem<string[]>(key, []);\n    return new Set(arrayValue);\n  },\n  (key, value) => {\n    const arrayValue = Array.from(value);\n    setLocalStorageItem(key, arrayValue);\n  }\n);\n\ntype SpaceRoomsAction =\n  | {\n      type: 'PUT';\n      roomIds: string[];\n    }\n  | {\n      type: 'DELETE';\n      roomIds: string[];\n    };\n\nexport const spaceRoomsAtom = atom<Set<string>, [SpaceRoomsAction], undefined>(\n  (get) => get(baseSpaceRoomsAtom),\n  (get, set, action) => {\n    const current = get(baseSpaceRoomsAtom);\n    const { type, roomIds } = action;\n\n    if (type === 'DELETE' && roomIds.find((roomId) => current.has(roomId))) {\n      set(\n        baseSpaceRoomsAtom,\n        produce(current, (draft) => {\n          roomIds.forEach((roomId) => draft.delete(roomId));\n        })\n      );\n      return;\n    }\n    if (type === 'PUT') {\n      const newEntries = roomIds.filter((roomId) => !current.has(roomId));\n      if (newEntries.length > 0)\n        set(\n          baseSpaceRoomsAtom,\n          produce(current, (draft) => {\n            newEntries.forEach((roomId) => draft.add(roomId));\n          })\n        );\n    }\n  }\n);\n","import type { MouseEventHandler } from 'react';\nimport type { Room } from '$types/matrix-sdk';\nimport { Box, Text, config, Avatar } from 'folds';\nimport { useNavigate } from 'react-router';\nimport { NavButton, NavItem, NavItemContent } from '$components/nav';\nimport { useRoomName } from '$hooks/useRoomMeta';\nimport { menuIcon, SquaresFour } from '$components/icons/phosphor';\n\ntype SpaceNavItemProps = {\n  room: Room;\n  selected: boolean;\n  linkPath: string;\n  hideText?: boolean;\n};\n\nexport function SpaceNavItem({ room, selected, linkPath, hideText }: SpaceNavItemProps) {\n  const matrixRoomName = useRoomName(room);\n  const roomName = matrixRoomName;\n\n  const navigate = useNavigate();\n\n  const handleNavItemClick: MouseEventHandler<HTMLElement> = () => {\n    navigate(linkPath);\n  };\n\n  const ariaLabel = [roomName, 'Space'].flat().filter(Boolean).join(', ');\n\n  return (\n    <Box direction=\"Column\" grow=\"Yes\">\n      <NavItem variant=\"Background\" radii=\"400\" highlight={false} aria-selected={selected}>\n        <NavButton onClick={handleNavItemClick} aria-label={ariaLabel}>\n          <NavItemContent>\n            <Box\n              as=\"span\"\n              grow=\"Yes\"\n              alignItems=\"Center\"\n              gap=\"200\"\n              style={{ padding: hideText ? '0' : '1' }}\n            >\n              <Avatar size=\"200\" radii=\"400\">\n                {menuIcon(SquaresFour, {\n                  style: { opacity: config.opacity.P300 },\n                  weight: selected ? 'fill' : 'regular',\n                })}\n              </Avatar>\n              {!hideText && (\n                <Box as=\"span\" grow=\"Yes\">\n                  <Text priority=\"300\" as=\"span\" size=\"Inherit\" truncate>\n                    {roomName}\n                  </Text>\n                </Box>\n              )}\n            </Box>\n          </NavItemContent>\n        </NavButton>\n      </NavItem>\n    </Box>\n  );\n}\n","import { makeStringSetAtom } from './utils/stringSetAtom';\nimport type { StringSetAtom } from './utils/stringSetAtom';\n\nconst CLOSED_LOBBY_CATEGORY = 'closedLobbyCategories';\n\nexport type ClosedLobbyCategoriesAtom = StringSetAtom;\n\nexport const makeClosedLobbyCategoriesAtom = (userId: string): ClosedLobbyCategoriesAtom =>\n  makeStringSetAtom(`${CLOSED_LOBBY_CATEGORY}${userId}`);\n\nexport const makeLobbyCategoryId = (...args: string[]): string => args.join('|');\n","import { useAtomValue } from 'jotai';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { MatrixEvent, Room, IHierarchyRoom } from '$types/matrix-sdk';\nimport { MatrixError, EventType } from '$types/matrix-sdk';\nimport type { QueryFunction } from '@tanstack/react-query';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { MSpaceChildContent } from '$types/matrix/room';\n\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { getAllParents, getStateEvents, isValidChild } from '$utils/room/hierarchy';\nimport { isRoomId } from '$utils/matrix';\nimport type { SortFunc } from '$utils/sort';\nimport { byOrderKey, byTsOldToNew, factoryRoomIdByActivity } from '$utils/sort';\nimport { useMatrixClient } from './useMatrixClient';\nimport { makeLobbyCategoryId } from '../state/closedLobbyCategories';\nimport { useStateEventCallback } from './useStateEventCallback';\nimport { ErrorCode } from '../cs-errorcode';\n\nexport type HierarchyItemSpace = {\n  roomId: string;\n  content: MSpaceChildContent;\n  ts: number;\n  space: true;\n  parentId?: string;\n  depth: number;\n};\n\nexport type HierarchyItemRoom = {\n  roomId: string;\n  content: MSpaceChildContent;\n  ts: number;\n  parentId: string;\n  depth: number;\n};\n\nexport type HierarchyItem = HierarchyItemSpace | HierarchyItemRoom;\n\nexport const getSpaceHierarchyItemKey = (spaceId: string, item: HierarchyItem): string =>\n  `${spaceId}:${item.parentId ?? ''}:${item.roomId}:${item.depth}`;\n\ntype GetRoomCallback = (roomId: string) => Room | undefined;\n\nconst hierarchyItemSort: SortFunc<HierarchyItem> = (a, b) => {\n  const orderCmp = byOrderKey(a.content.order, b.content.order);\n  if (orderCmp !== 0) return orderCmp;\n  return byTsOldToNew(a.ts, b.ts);\n};\n\nconst childEventSort: SortFunc<MatrixEvent> = (a, b) => {\n  const orderCmp = byOrderKey(\n    a.getContent<MSpaceChildContent>().order,\n    b.getContent<MSpaceChildContent>().order\n  );\n  if (orderCmp !== 0) return orderCmp;\n  return byTsOldToNew(a.getTs(), b.getTs());\n};\n\nconst getHierarchySpaces = (\n  rootSpaceId: string,\n  getRoom: GetRoomCallback,\n  excludeRoom: (parentId: string, roomId: string, depth: number) => boolean,\n  spaceRooms: Set<string>\n): HierarchyItemSpace[] => {\n  const rootSpaceItem: HierarchyItemSpace = {\n    roomId: rootSpaceId,\n    content: { via: [] },\n    ts: 0,\n    space: true,\n    depth: 0,\n  };\n  const spaceItems: HierarchyItemSpace[] = [];\n\n  const findAndCollectHierarchySpaces = (\n    spaceItem: HierarchyItemSpace,\n    parentSpaceId: string,\n    visited: Set<string> = new Set()\n  ) => {\n    const spaceItemId = makeLobbyCategoryId(parentSpaceId, spaceItem.roomId);\n\n    // Prevent infinite recursion\n    if (visited.has(spaceItemId)) return;\n    visited.add(spaceItemId);\n\n    const space = getRoom(spaceItem.roomId);\n    spaceItems.push(spaceItem);\n\n    if (!space) return;\n    const childEvents = getStateEvents(space, EventType.SpaceChild)\n      .filter((childEvent) => {\n        if (!isValidChild(childEvent)) return false;\n        const childId = childEvent.getStateKey();\n        if (!childId || !isRoomId(childId)) return false;\n        if (excludeRoom(spaceItem.roomId, childId, spaceItem.depth)) return false;\n\n        // because we can not find if a childId is space without joining\n        // or requesting room summary, we will look it into spaceRooms local\n        // cache which we maintain as we load summary in UI.\n        return getRoom(childId)?.isSpaceRoom() || spaceRooms.has(childId);\n      })\n      .toSorted(childEventSort);\n\n    childEvents.forEach((childEvent) => {\n      const childId = childEvent.getStateKey();\n      if (!childId || !isRoomId(childId)) return;\n\n      const childItem: HierarchyItemSpace = {\n        roomId: childId,\n        content: childEvent.getContent<MSpaceChildContent>(),\n        ts: childEvent.getTs(),\n        space: true,\n        parentId: spaceItem.roomId,\n        depth: spaceItem.depth + 1,\n      };\n      findAndCollectHierarchySpaces(childItem, spaceItem.roomId, visited);\n    });\n  };\n  findAndCollectHierarchySpaces(rootSpaceItem, rootSpaceId);\n\n  return spaceItems;\n};\n\nexport type SpaceHierarchy = {\n  space: HierarchyItemSpace;\n  rooms?: HierarchyItemRoom[];\n};\nconst getSpaceHierarchy = (\n  rootSpaceId: string,\n  spaceRooms: Set<string>,\n  getRoom: (roomId: string) => Room | undefined,\n  excludeRoom: (parentId: string, roomId: string, depth: number) => boolean,\n  closedCategory: (spaceId: string) => boolean\n): SpaceHierarchy[] => {\n  const spaceItems: HierarchyItemSpace[] = getHierarchySpaces(\n    rootSpaceId,\n    getRoom,\n    excludeRoom,\n    spaceRooms\n  );\n\n  const hierarchy: SpaceHierarchy[] = spaceItems.map((spaceItem) => {\n    const space = getRoom(spaceItem.roomId);\n    if (!space || closedCategory(spaceItem.roomId)) {\n      return {\n        space: spaceItem,\n      };\n    }\n    const childEvents = getStateEvents(space, EventType.SpaceChild);\n    const childItems: HierarchyItemRoom[] = [];\n    childEvents.forEach((childEvent) => {\n      if (!isValidChild(childEvent)) return;\n      const childId = childEvent.getStateKey();\n      if (!childId || !isRoomId(childId)) return;\n      if (getRoom(childId)?.isSpaceRoom() || spaceRooms.has(childId)) return;\n\n      const childItem: HierarchyItemRoom = {\n        roomId: childId,\n        content: childEvent.getContent<MSpaceChildContent>(),\n        ts: childEvent.getTs(),\n        parentId: spaceItem.roomId,\n        depth: spaceItem.depth,\n      };\n      childItems.push(childItem);\n    });\n\n    return {\n      space: spaceItem,\n      rooms: childItems.toSorted(hierarchyItemSort),\n    };\n  });\n\n  return hierarchy;\n};\n\n/**\n * Shared reactive wrapper: compute a hierarchy value and re-compute when a\n * SpaceChild event fires on the space or any of its descendants.\n *\n * The {@link useMemo} factory receives the spaceId as its single argument so\n * callers can pass their own parameterized closure (e.g.\n * {@link getSpaceHierarchy} or {@link getSpaceJoinedHierarchy}).\n */\nconst useReactiveHierarchy = <T>(\n  spaceId: string,\n  factory: (spaceId: string) => T,\n  deps: unknown[]\n): T => {\n  const mx = useMatrixClient();\n  const roomToParents = useAtomValue(roomToParentsAtom);\n\n  const [hierarchyKey, setHierarchyKey] = useState(0);\n\n  const hierarchy = useMemo(() => {\n    void hierarchyKey;\n    return factory(spaceId);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [spaceId, ...deps, hierarchyKey]);\n\n  useStateEventCallback(\n    mx,\n    useCallback(\n      (mEvent) => {\n        if (mEvent.getType() !== (EventType.SpaceChild as string)) return;\n        const eventRoomId = mEvent.getRoomId();\n        if (!eventRoomId) return;\n\n        if (spaceId === eventRoomId || getAllParents(roomToParents, eventRoomId).has(spaceId)) {\n          setHierarchyKey((k) => k + 1);\n        }\n      },\n      [spaceId, roomToParents, setHierarchyKey]\n    )\n  );\n\n  return hierarchy;\n};\n\nexport const useSpaceHierarchy = (\n  spaceId: string,\n  spaceRooms: Set<string>,\n  getRoom: (roomId: string) => Room | undefined,\n  excludeRoom: (parentId: string, roomId: string, depth: number) => boolean,\n  closedCategory: (spaceId: string) => boolean\n): SpaceHierarchy[] =>\n  useReactiveHierarchy(\n    spaceId,\n    (sid) => getSpaceHierarchy(sid, spaceRooms, getRoom, excludeRoom, closedCategory),\n    [spaceRooms, getRoom, closedCategory, excludeRoom]\n  );\n\nconst getSpaceJoinedHierarchy = (\n  rootSpaceId: string,\n  getRoom: GetRoomCallback,\n  excludeRoom: (parentId: string, roomId: string, depth: number) => boolean,\n  sortRoomItems: (parentId: string, items: HierarchyItem[]) => HierarchyItem[]\n): HierarchyItem[] => {\n  const spaceItems: HierarchyItemSpace[] = getHierarchySpaces(\n    rootSpaceId,\n    getRoom,\n    excludeRoom,\n    new Set()\n  );\n\n  /**\n   * Recursively checks if the given space or any of its descendants contain non-space rooms.\n   *\n   * @param spaceId - The space ID to check.\n   * @param visited - Set used to prevent recursion errors.\n   * @returns True if the space or any descendant contains non-space rooms.\n   */\n  const getContainsRoom = (spaceId: string, visited: Set<string> = new Set()) => {\n    // Prevent infinite recursion\n    if (visited.has(spaceId)) return false;\n    visited.add(spaceId);\n\n    const space = getRoom(spaceId);\n    if (!space) return false;\n\n    const childEvents = getStateEvents(space, EventType.SpaceChild);\n\n    return childEvents.some((childEvent): boolean => {\n      if (!isValidChild(childEvent)) return false;\n      const childId = childEvent.getStateKey();\n      if (!childId || !isRoomId(childId)) return false;\n      const room = getRoom(childId);\n      if (!room) return false;\n\n      if (!room.isSpaceRoom()) return true;\n      return getContainsRoom(childId, visited);\n    });\n  };\n\n  const hierarchy: HierarchyItem[] = spaceItems.flatMap((spaceItem) => {\n    const space = getRoom(spaceItem.roomId);\n    if (!space) {\n      return [];\n    }\n    const joinedRoomEvents = getStateEvents(space, EventType.SpaceChild).filter((childEvent) => {\n      if (!isValidChild(childEvent)) return false;\n      const childId = childEvent.getStateKey();\n      if (!childId || !isRoomId(childId)) return false;\n      const room = getRoom(childId);\n      if (!room || room.isSpaceRoom()) return false;\n\n      return true;\n    });\n\n    if (!getContainsRoom(spaceItem.roomId)) return [];\n\n    const childItems: HierarchyItemRoom[] = [];\n    joinedRoomEvents.forEach((childEvent) => {\n      const childId = childEvent.getStateKey();\n      if (!childId) return;\n\n      if (excludeRoom(space.roomId, childId, spaceItem.depth)) return;\n\n      const childItem: HierarchyItemRoom = {\n        roomId: childId,\n        content: childEvent.getContent<MSpaceChildContent>(),\n        ts: childEvent.getTs(),\n        parentId: spaceItem.roomId,\n        depth: spaceItem.depth,\n      };\n      childItems.push(childItem);\n    });\n    return ([spaceItem] as HierarchyItem[]).concat(sortRoomItems(spaceItem.roomId, childItems));\n  });\n\n  return hierarchy;\n};\n\nexport const useSpaceJoinedHierarchy = (\n  spaceId: string,\n  getRoom: GetRoomCallback,\n  excludeRoom: (parentId: string, roomId: string, depth: number) => boolean,\n  sortByActivity: (spaceId: string) => boolean\n): HierarchyItem[] => {\n  const mx = useMatrixClient();\n\n  const sortRoomItems = useCallback(\n    (sId: string, items: HierarchyItem[]) => {\n      if (sortByActivity(sId)) {\n        return items.toSorted((a, b) => factoryRoomIdByActivity(mx)(a.roomId, b.roomId));\n      }\n      return items.toSorted(hierarchyItemSort);\n    },\n    [mx, sortByActivity]\n  );\n\n  return useReactiveHierarchy(\n    spaceId,\n    (sid) => getSpaceJoinedHierarchy(sid, getRoom, excludeRoom, sortRoomItems),\n    [getRoom, excludeRoom, sortRoomItems]\n  );\n};\n\n// we will paginate until 5000 items\nconst PER_PAGE_COUNT = 100;\nconst MAX_AUTO_PAGE_COUNT = 50;\nexport type FetchSpaceHierarchyLevelData = {\n  fetching: boolean;\n  error: Error | null;\n  rooms: Map<string, IHierarchyRoom>;\n};\nexport const useFetchSpaceHierarchyLevel = (\n  roomId: string,\n  enable: boolean\n): FetchSpaceHierarchyLevelData => {\n  const mx = useMatrixClient();\n  const pageNoRef = useRef(0);\n\n  const fetchLevel: QueryFunction<\n    Awaited<ReturnType<typeof mx.getRoomHierarchy>>,\n    string[],\n    string | undefined\n  > = useCallback(\n    ({ pageParam }) => mx.getRoomHierarchy(roomId, PER_PAGE_COUNT, 1, false, pageParam),\n    [roomId, mx]\n  );\n\n  const queryResponse = useInfiniteQuery({\n    refetchOnMount: enable,\n    queryKey: [roomId, 'hierarchy_level'],\n    initialPageParam: undefined,\n    queryFn: fetchLevel,\n    getNextPageParam: (result) => {\n      if (result.next_batch) return result.next_batch;\n      return undefined;\n    },\n    retry: 5,\n    retryDelay: (failureCount, error) => {\n      if (\n        error instanceof MatrixError &&\n        error.errcode === (ErrorCode.M_LIMIT_EXCEEDED as string)\n      ) {\n        const { retry_after_ms: delay } = error.data;\n        if (typeof delay === 'number') {\n          return delay;\n        }\n      }\n\n      return 500 * failureCount;\n    },\n  });\n\n  const { data, isLoading, isFetchingNextPage, error, fetchNextPage, hasNextPage } = queryResponse;\n\n  useEffect(() => {\n    if (\n      hasNextPage &&\n      pageNoRef.current <= MAX_AUTO_PAGE_COUNT &&\n      !error &&\n      data &&\n      data.pages.length > 0\n    ) {\n      pageNoRef.current += 1;\n      fetchNextPage();\n    }\n  }, [fetchNextPage, hasNextPage, data, error]);\n\n  const rooms: Map<string, IHierarchyRoom> = useMemo(() => {\n    const roomsMap: Map<string, IHierarchyRoom> = new Map();\n    if (!data) return roomsMap;\n\n    const rms = data.pages.flatMap((result) => result.rooms);\n    rms.forEach((r) => {\n      roomsMap.set(r.room_id, r);\n    });\n\n    return roomsMap;\n  }, [data]);\n\n  const fetching = isLoading || isFetchingNextPage;\n\n  return {\n    fetching,\n    error,\n    rooms,\n  };\n};\n","import { atom } from 'jotai';\nimport { roomToParentsAtom } from './roomToParents';\n\nexport const roomToChildrenAtom = atom((get) => {\n  const roomToParents = get(roomToParentsAtom);\n  const map = new Map<string, Set<string>>();\n\n  roomToParents.forEach((parentSet, childId) => {\n    parentSet.forEach((parentId) => {\n      if (!map.has(parentId)) map.set(parentId, new Set());\n      map.get(parentId)?.add(childId);\n    });\n  });\n\n  return map;\n});\n","import { useCallback, useEffect, useMemo } from 'react';\nimport { config, Box, Text } from 'folds';\nimport type { MatrixError } from '$types/matrix-sdk';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { getJoinedSpaceChildrenSummary, getRecursiveSpaceLeaveOrder } from '$utils/room/hierarchy';\nimport { rateLimitedActions } from '$utils/matrix';\nimport { PromptDialog } from '$components/modal-overlay/PromptDialog';\nimport { AsyncError } from '$components/AsyncError';\nimport { Button } from '$components/button';\n\ntype LeaveSpacePromptProps = {\n  roomId: string;\n  onDone: () => void;\n  onCancel: () => void;\n};\n\nconst formatJoinedContentsMessage = (roomCount: number, subspaceCount: number): string => {\n  const parts: string[] = [];\n  if (roomCount > 0) {\n    parts.push(`${roomCount} ${roomCount === 1 ? 'room' : 'rooms'}`);\n  }\n  if (subspaceCount > 0) {\n    parts.push(`${subspaceCount} ${subspaceCount === 1 ? 'subspace' : 'subspaces'}`);\n  }\n  return `You are also joined to ${parts.join(' and ')} in this space. Leaving the space alone will not remove you from them.`;\n};\n\nconst formatRecursiveLeaveLabel = (\n  leaving: boolean,\n  roomCount: number,\n  subspaceCount: number\n): string => {\n  if (leaving) {\n    return 'Leaving space, rooms, and subspaces...';\n  }\n\n  const parts: string[] = [];\n  if (roomCount > 0) {\n    parts.push('Rooms');\n  }\n  if (subspaceCount > 0) {\n    parts.push('Subspaces');\n  }\n\n  return `Leave Space and All ${parts.join(' & ')}`;\n};\n\nexport function LeaveSpacePrompt({ roomId, onDone, onCancel }: LeaveSpacePromptProps) {\n  const mx = useMatrixClient();\n\n  const { leaveOrder, roomCount, subspaceCount } = useMemo(\n    () => getJoinedSpaceChildrenSummary(mx, roomId),\n    [mx, roomId]\n  );\n  const joinedChildrenCount = leaveOrder.length;\n\n  const [leaveState, leaveSpace] = useAsyncCallback<undefined, MatrixError, []>(\n    useCallback(async () => {\n      await mx.leave(roomId);\n    }, [mx, roomId])\n  );\n\n  const [leaveAllState, leaveAll] = useAsyncCallback<undefined, MatrixError, []>(\n    useCallback(async () => {\n      await rateLimitedActions(getRecursiveSpaceLeaveOrder(mx, roomId), (id) => mx.leave(id));\n    }, [mx, roomId])\n  );\n\n  const leaving = leaveState.status === AsyncStatus.Loading;\n  const leavingAll = leaveAllState.status === AsyncStatus.Loading;\n  const isBusy = leaving || leavingAll;\n\n  useEffect(() => {\n    if (leaveState.status === AsyncStatus.Success || leaveAllState.status === AsyncStatus.Success) {\n      onDone();\n    }\n  }, [leaveState, leaveAllState, onDone]);\n\n  return (\n    <PromptDialog title=\"Leave Space\" requestClose={onCancel}>\n      <Box style={{ padding: config.space.S400 }} direction=\"Column\" gap=\"400\">\n        <Box direction=\"Column\" gap=\"200\">\n          <Text priority=\"400\">Are you sure you want to leave this space?</Text>\n          {joinedChildrenCount > 0 && (\n            <Text priority=\"300\" size=\"T300\">\n              {formatJoinedContentsMessage(roomCount, subspaceCount)}\n            </Text>\n          )}\n          <AsyncError state={leaveState} prefix=\"Failed to leave space\" size=\"T300\" />\n          <AsyncError\n            state={leaveAllState}\n            prefix=\"Failed to leave space, rooms, and subspaces\"\n            size=\"T300\"\n          />\n        </Box>\n        <Box direction=\"Column\" gap=\"200\">\n          <Button\n            type=\"submit\"\n            variant=\"Critical\"\n            onClick={() => leaveSpace()}\n            loading={leaving}\n            spinnerVariant=\"Critical\"\n            spinnerSize=\"200\"\n            aria-disabled={isBusy || leaveState.status === AsyncStatus.Success}\n          >\n            <Text size=\"B400\">{leaving ? 'Leaving...' : 'Leave Space Only'}</Text>\n          </Button>\n          {joinedChildrenCount > 0 && (\n            <Button\n              variant=\"Critical\"\n              fill=\"Soft\"\n              onClick={() => leaveAll()}\n              loading={leavingAll}\n              spinnerVariant=\"Critical\"\n              spinnerSize=\"200\"\n              aria-disabled={isBusy || leaveAllState.status === AsyncStatus.Success}\n            >\n              <Text size=\"B400\">\n                {formatRecursiveLeaveLabel(leavingAll, roomCount, subspaceCount)}\n              </Text>\n            </Button>\n          )}\n        </Box>\n      </Box>\n    </PromptDialog>\n  );\n}\n","import type { ReactElement } from 'react';\nimport { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useAtom, useAtomValue } from 'jotai';\nimport {\n  Avatar,\n  Box,\n  IconButton,\n  Line,\n  Menu,\n  MenuItem,\n  Modal,\n  Text,\n  color,\n  config,\n  toRem,\n} from 'folds';\nimport type { VirtualItem } from '@tanstack/react-virtual';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport type { MatrixClient, Room, RoomJoinRulesEventContent } from '$types/matrix-sdk';\nimport { JoinRule, EventType, KnownMembership } from '$types/matrix-sdk';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { NavCategory, NavCategoryHeader, NavItem, NavItemContent, NavLink } from '$components/nav';\nimport {\n  getSpaceLobbyPath,\n  getSpaceRoomPath,\n  getSpaceForumPath,\n  getSpaceSearchPath,\n} from '$pages/pathUtils';\nimport { getCanonicalAliasOrRoomId, isRoomAlias, mxcUrlToHttp } from '$utils/matrix';\nimport { useSelectedOrLastRoom } from '$hooks/router/useSelectedRoom';\nimport { useSpaceLobbySelected, useSpaceSearchSelected } from '$hooks/router/useSelectedSpace';\nimport { useSpace } from '$hooks/useSpace';\nimport { VirtualTile } from '$components/virtualizer';\nimport { spaceRoomsAtom } from '$state/spaceRooms';\nimport { RoomNavCategoryButton, RoomNavItem } from '$features/room-nav';\nimport { SpaceNavItem } from '$features/space-nav';\nimport { makeNavCategoryId } from '$state/closedNavCategories';\nimport { roomToUnreadAtom } from '$state/room/roomToUnread';\nimport { useCategoryHandler } from '$hooks/useCategoryHandler';\nimport { useNavToActivePathMapper } from '$hooks/useNavToActivePathMapper';\nimport { useRoomName } from '$hooks/useRoomMeta';\nimport type { HierarchyItem } from '$hooks/useSpaceHierarchy';\nimport { getSpaceHierarchyItemKey, useSpaceJoinedHierarchy } from '$hooks/useSpaceHierarchy';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { PageNavContent, PageNavHeader } from '$components/page';\nimport { PageNavShell } from '$components/page/PageNavShell';\nimport { usePowerLevels } from '$hooks/usePowerLevels';\nimport { useRecursiveChildScopeFactory, useSpaceChildren } from '$state/hooks/roomList';\nimport {\n  Checks,\n  chipIcon,\n  composerIcon,\n  DotsThreeOutlineVerticalIcon,\n  Flag,\n  GearSix,\n  Link,\n  Lock,\n  MagnifyingGlass,\n  menuIcon,\n  ShareNetwork,\n  SignOut,\n  Terminal,\n  UserPlus,\n} from '$components/icons/phosphor';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { roomToChildrenAtom } from '$state/room/roomToChildren';\nimport { markAsRead } from '$utils/notifications';\nimport { useRoomsUnread } from '$state/hooks/unread';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { LeaveSpacePrompt } from '$components/leave-space-prompt';\nimport { copyToClipboard } from '$utils/dom';\nimport { shareText } from '$utils/share';\nimport { useClosedNavCategoriesAtom } from '$state/hooks/closedNavCategories';\nimport { useStateEvent } from '$hooks/useStateEvent';\n\nimport { getMatrixToRoom } from '$plugins/matrix-to';\nimport { getViaServers } from '$plugins/via-servers';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom, ShowRoomIcon } from '$state/settings';\nimport {\n  getRoomNotificationMode,\n  useRoomsNotificationPreferencesContext,\n} from '$hooks/useRoomsNotificationPreferences';\nimport { useRoomNavigate } from '$hooks/useRoomNavigate';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback';\nimport { AsyncError } from '$components/AsyncError';\nimport { InviteUserPrompt } from '$components/invite-user-prompt';\nimport { useCallEmbed } from '$hooks/useCallEmbed';\nimport { createDebugLogger } from '$utils/debugLogger';\nimport { SidebarResizer } from '$pages/client/sidebar/SidebarResizer';\nimport { useSidebarWidth } from '$hooks/useSidebarWidth';\nimport { RoomAvatar } from '$components/room-avatar';\nimport { getRoomAvatarUrl } from '$utils/room/display';\nimport { nameInitials } from '$utils/common';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { CustomStateEvent, CustomRoomType } from '$types/matrix/room';\nimport type { RoomBannerContent } from '$types/matrix-sdk-events';\nimport { ModalWide } from '$styles/Modal.css';\nimport { ImageViewer } from '$components/image-viewer';\nimport { reportMediaLoadFailure } from '$utils/mediaLoadDiagnostics';\nimport * as css from './styles.css';\nimport { Image as MediaImage } from '$components/media';\nimport { useRenderableMediaUrl } from '$hooks/useRenderableMediaUrl';\nimport { ModalOverlay } from '$components/modal-overlay/ModalOverlay';\nimport { useOpenRoomSettings } from '$state/hooks/roomSettings';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { Button } from '$components/button';\n\nconst debugLog = createDebugLogger('Space');\n\ntype SpaceMenuProps = {\n  room: Room;\n  requestClose: () => void;\n};\n\nconst SpaceMenu = forwardRef<HTMLDivElement, SpaceMenuProps>(({ room, requestClose }, ref) => {\n  const mx = useMatrixClient();\n  const [hideReads] = useSetting(settingsAtom, 'hideReads');\n  const [developerTools] = useSetting(settingsAtom, 'developerTools');\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const powerLevels = usePowerLevels(room);\n  const creators = useRoomCreators(room);\n\n  const permissions = useRoomPermissions(creators, powerLevels);\n  const canInvite = permissions.action('invite', mx.getSafeUserId());\n  const openRoomSettings = useOpenRoomSettings();\n  const { navigateRoom } = useRoomNavigate();\n\n  const [invitePrompt, setInvitePrompt] = useState(false);\n\n  const allChild = useSpaceChildren(\n    allRoomsAtom,\n    room.roomId,\n    useRecursiveChildScopeFactory(mx, roomToParents)\n  );\n  const unread = useRoomsUnread(allChild, roomToUnreadAtom);\n\n  const handleMarkAsRead = () => {\n    allChild.forEach((childRoomId) => markAsRead(mx, childRoomId, hideReads, true));\n    requestClose();\n  };\n\n  const handleCopyLink = () => {\n    const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, room.roomId);\n    const viaServers = isRoomAlias(roomIdOrAlias) ? undefined : getViaServers(room);\n    copyToClipboard(getMatrixToRoom(roomIdOrAlias, viaServers));\n    requestClose();\n  };\n\n  const handleShareLink = () => {\n    const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, room.roomId);\n    const viaServers = isRoomAlias(roomIdOrAlias) ? undefined : getViaServers(room);\n    shareText(getMatrixToRoom(roomIdOrAlias, viaServers)).catch(() => {});\n    requestClose();\n  };\n\n  const handleInvite = () => {\n    setInvitePrompt(true);\n  };\n\n  const handleRoomSettings = () => {\n    openRoomSettings(room.roomId);\n    requestClose();\n  };\n\n  const handleOpenTimeline = () => {\n    debugLog.info('ui', 'Space timeline opened', { roomId: room.roomId });\n    navigateRoom(room.roomId);\n    requestClose();\n  };\n\n  return (\n    <Menu ref={ref} style={{ maxWidth: toRem(160), width: '100vw' }}>\n      <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n        {invitePrompt && room && (\n          <InviteUserPrompt\n            room={room}\n            requestClose={() => {\n              setInvitePrompt(false);\n              requestClose();\n            }}\n          />\n        )}\n        <MenuItem\n          onClick={handleMarkAsRead}\n          size=\"300\"\n          after={menuIcon(Checks)}\n          radii=\"300\"\n          disabled={!unread}\n        >\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Mark as Read\n          </Text>\n        </MenuItem>\n      </Box>\n      <Line variant=\"Surface\" size=\"300\" />\n      <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n        <MenuItem\n          onClick={handleInvite}\n          variant=\"Primary\"\n          fill=\"None\"\n          size=\"300\"\n          after={menuIcon(UserPlus)}\n          radii=\"300\"\n          aria-pressed={invitePrompt}\n          disabled={!canInvite}\n        >\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Invite\n          </Text>\n        </MenuItem>\n        <MenuItem onClick={handleCopyLink} size=\"300\" after={menuIcon(Link)} radii=\"300\">\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Copy Link\n          </Text>\n        </MenuItem>\n        <MenuItem onClick={handleShareLink} size=\"300\" after={menuIcon(ShareNetwork)} radii=\"300\">\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Share Link\n          </Text>\n        </MenuItem>\n        <MenuItem onClick={handleRoomSettings} size=\"300\" after={menuIcon(GearSix)} radii=\"300\">\n          <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n            Space Settings\n          </Text>\n        </MenuItem>\n        {developerTools && (\n          <MenuItem onClick={handleOpenTimeline} size=\"300\" after={menuIcon(Terminal)} radii=\"300\">\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Event Timeline\n            </Text>\n          </MenuItem>\n        )}\n      </Box>\n      <Line variant=\"Surface\" size=\"300\" />\n      <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n        <UseStateProvider initial={false}>\n          {(promptLeave, setPromptLeave) => (\n            <>\n              <MenuItem\n                onClick={() => setPromptLeave(true)}\n                variant=\"Critical\"\n                fill=\"None\"\n                size=\"300\"\n                after={menuIcon(SignOut)}\n                radii=\"300\"\n                aria-pressed={promptLeave}\n              >\n                <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n                  Leave Space\n                </Text>\n              </MenuItem>\n              {promptLeave && (\n                <LeaveSpacePrompt\n                  roomId={room.roomId}\n                  onDone={requestClose}\n                  onCancel={() => setPromptLeave(false)}\n                />\n              )}\n            </>\n          )}\n        </UseStateProvider>\n      </Box>\n    </Menu>\n  );\n});\n\nfunction SpaceHeader({ hideText, mx }: { hideText?: boolean; mx: MatrixClient }) {\n  const space = useSpace();\n  const spaceName = useRoomName(space);\n  const menu = useMenuAnchor();\n  const useAuthentication = useMediaAuthentication();\n\n  const joinRules = useStateEvent(\n    space,\n    EventType.RoomJoinRules\n  )?.getContent<RoomJoinRulesEventContent>();\n\n  const [showBanners] = useSetting(settingsAtom, 'showRoomBanners');\n  const [roomBannerHeight, setRoomBannerHeight] = useSetting(settingsAtom, 'roomBannerHeight');\n  const [curHeight, setCurHeight] = useState(roomBannerHeight);\n  useEffect(() => {\n    setCurHeight(roomBannerHeight);\n  }, [roomBannerHeight]);\n\n  const bannerState = useStateEvent(space, CustomStateEvent.RoomBanner);\n  const bannerMXC = bannerState?.getContent<RoomBannerContent>()?.url;\n  const rawBannerURI = mxcUrlToHttp(mx, bannerMXC ?? '', useAuthentication);\n  const bannerURI = useRenderableMediaUrl(rawBannerURI || undefined);\n  const hasBanner = !!(bannerURI && !hideText && showBanners);\n\n  const [bannerViewerOpen, setBannerViewerOpen] = useState(false);\n  useEffect(() => {\n    if (!hasBanner) setBannerViewerOpen(false);\n  }, [hasBanner]);\n\n  return (\n    <>\n      <div className={hasBanner ? css.RoomCoverHeaderContainer : ''}>\n        <div\n          className={\n            hasBanner ? css.RoomCoverNavContainer : css.RoomCoverlessNavContainer({ hideText })\n          }\n        >\n          <PageNavHeader outlined={!hasBanner} size=\"600\">\n            {hideText ? (\n              <Box alignItems=\"Center\" grow=\"Yes\" justifyContent=\"Center\">\n                <Avatar\n                  size={hideText ? undefined : '200'}\n                  radii=\"400\"\n                  onClick={menu.triggerProps.onClick}\n                >\n                  <RoomAvatar\n                    roomId={space.roomId}\n                    src={getRoomAvatarUrl(mx, space, 96, useAuthentication)}\n                    uniformIcons\n                    alt={spaceName}\n                    renderFallback={() => (\n                      <Text as=\"span\" size=\"H6\">\n                        {nameInitials(spaceName)}\n                      </Text>\n                    )}\n                  />\n                </Avatar>\n              </Box>\n            ) : (\n              <Box grow=\"Yes\" gap=\"300\">\n                <Box\n                  grow=\"Yes\"\n                  alignItems=\"Center\"\n                  gap=\"100\"\n                  style={hasBanner ? { color: '#fff' } : {}}\n                >\n                  <Text size=\"H4\" truncate>\n                    {spaceName}\n                  </Text>\n                  {joinRules?.join_rule !== JoinRule.Public && chipIcon(Lock)}\n                </Box>\n                <Box shrink=\"No\">\n                  <IconButton\n                    aria-pressed={!!menu.anchor}\n                    variant=\"Background\"\n                    style={hasBanner ? { backgroundColor: 'transparent', color: '#fff' } : {}}\n                    onClick={menu.triggerProps.onClick}\n                  >\n                    {composerIcon(DotsThreeOutlineVerticalIcon, {\n                      weight: menu.anchor ? 'fill' : 'regular',\n                    })}\n                  </IconButton>\n                </Box>\n              </Box>\n            )}\n          </PageNavHeader>\n          <ResponsiveMenu\n            anchor={menu.anchor}\n            requestClose={menu.close}\n            position=\"Bottom\"\n            align=\"End\"\n            offset={6}\n            menu={<SpaceMenu room={space} requestClose={menu.close} />}\n          />\n        </div>\n      </div>\n      {hasBanner && (\n        <>\n          <Box shrink=\"No\" className={css.RoomCoverContainer} style={{ height: toRem(curHeight) }}>\n            <div className={css.RoomCover}>\n              <button\n                type=\"button\"\n                className={css.RoomCoverImageButton}\n                data-no-button-motion\n                aria-label={`View ${spaceName} banner`}\n                onClick={() => setBannerViewerOpen(true)}\n                onKeyDown={(e) => {\n                  if (e.key === 'Enter' || e.key === ' ') {\n                    e.preventDefault();\n                    setBannerViewerOpen(true);\n                  }\n                }}\n              >\n                <MediaImage\n                  className={css.RoomCoverImage}\n                  src={bannerURI}\n                  alt=\"\"\n                  draggable=\"false\"\n                  onError={() => reportMediaLoadFailure('room_banner')}\n                />\n              </button>\n              <SidebarResizer\n                setCurWidth={setCurHeight}\n                sidebarWidth={roomBannerHeight}\n                setSidebarWidth={setRoomBannerHeight}\n                instep={56}\n                outstep={66}\n                minValue={56}\n                maxValue={500}\n                topSided\n              />\n            </div>\n          </Box>\n        </>\n      )}\n      {hasBanner && bannerViewerOpen && (\n        <ModalOverlay requestClose={() => setBannerViewerOpen(false)}>\n          <Modal\n            className={ModalWide}\n            size=\"500\"\n            onContextMenu={(evt: React.MouseEvent) => evt.stopPropagation()}\n          >\n            <ImageViewer\n              src={bannerURI}\n              alt={`${spaceName} banner`}\n              requestClose={() => setBannerViewerOpen(false)}\n            />\n          </Modal>\n        </ModalOverlay>\n      )}\n    </>\n  );\n}\n\ntype SpaceTombstoneProps = { roomId: string; replacementRoomId: string };\nfunction SpaceTombstone({ roomId, replacementRoomId }: SpaceTombstoneProps) {\n  const mx = useMatrixClient();\n  const { navigateSpace } = useRoomNavigate();\n\n  const [joinState, handleJoin] = useAsyncCallback(\n    useCallback(() => {\n      const currentRoom = mx.getRoom(roomId);\n      const via = currentRoom ? getViaServers(currentRoom) : [];\n      return mx.joinRoom(replacementRoomId, {\n        viaServers: via,\n      });\n    }, [mx, roomId, replacementRoomId])\n  );\n  const replacementRoom = mx.getRoom(replacementRoomId);\n\n  const handleOpen = () => {\n    if (replacementRoom) navigateSpace(replacementRoom.roomId);\n    if (joinState.status === AsyncStatus.Success) navigateSpace(joinState.data.roomId);\n  };\n\n  return (\n    <Box\n      style={{\n        padding: config.space.S200,\n        borderRadius: config.radii.R400,\n        borderWidth: config.borderWidth.B300,\n      }}\n      className={ContainerColor({ variant: 'Surface' })}\n      direction=\"Column\"\n      gap=\"300\"\n    >\n      <Box direction=\"Column\" grow=\"Yes\" gap=\"100\">\n        <Text size=\"L400\">Space Upgraded</Text>\n        <Text size=\"T200\">This space has been replaced and is no longer active.</Text>\n        <AsyncError state={joinState} />\n      </Box>\n      <Box direction=\"Column\" shrink=\"No\">\n        {replacementRoom?.getMyMembership() === KnownMembership.Join ||\n        joinState.status === AsyncStatus.Success ? (\n          <Button onClick={handleOpen} size=\"300\" variant=\"Success\" fill=\"Solid\" radii=\"300\">\n            <Text size=\"B300\">Open New Space</Text>\n          </Button>\n        ) : (\n          <Button\n            loading={joinState.status === AsyncStatus.Loading}\n            spinnerSize=\"100\"\n            spinnerVariant=\"Primary\"\n            spinnerFill=\"Solid\"\n            size=\"300\"\n            variant=\"Primary\"\n            fill=\"Solid\"\n            radii=\"300\"\n            onClick={handleJoin}\n          >\n            <Text size=\"B300\">Join New Space</Text>\n          </Button>\n        )}\n      </Box>\n    </Box>\n  );\n}\n\nconst getCategoryPadding = (depth: number): string | undefined => {\n  if (depth === 0) return undefined;\n  if (depth === 1) return config.space.S400;\n  return config.space.S0;\n};\n\nexport function Space() {\n  const mx = useMatrixClient();\n  const space = useSpace();\n  useNavToActivePathMapper(space.roomId);\n  const spaceIdOrAlias = getCanonicalAliasOrRoomId(mx, space.roomId);\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const mDirects = useAtomValue(mDirectAtom);\n  const roomToUnread = useAtomValue(roomToUnreadAtom);\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const roomToChildren = useAtomValue(roomToChildrenAtom);\n  const allRooms = useAtomValue(allRoomsAtom);\n  const [spaceRooms] = useAtom(spaceRoomsAtom);\n  const allJoinedRooms = useMemo(() => new Set(allRooms), [allRooms]);\n  const notificationPreferences = useRoomsNotificationPreferencesContext();\n\n  const {\n    curWidth,\n    setCurWidth,\n    roomSidebarWidth,\n    setRoomSidebarWidth,\n    setIsResizingSidebar,\n    isMobile,\n    hideText,\n    oldSidebar,\n  } = useSidebarWidth();\n\n  const [showRoomIconGeneral] = useSetting(settingsAtom, 'showRoomIcon');\n  const [showRoomIconArray] = useSetting(settingsAtom, 'perRoomShowRoomIcon');\n  const showRoomIcon =\n    showRoomIconArray.find((item) => item.roomId === space.roomId)?.display ?? showRoomIconGeneral;\n  const showIcons = () => {\n    if (showRoomIcon === ShowRoomIcon.Always) return true;\n    if (showRoomIcon === ShowRoomIcon.Never) return false;\n    return curWidth < 144;\n  };\n  const [joinCallOnSingleClick] = useSetting(settingsAtom, 'joinCallOnSingleClick');\n\n  const tombstoneEvent = useStateEvent(space, EventType.RoomTombstone);\n  const selectedRoomId = useSelectedOrLastRoom();\n  const lobbySelected = useSpaceLobbySelected(spaceIdOrAlias);\n  const searchSelected = useSpaceSearchSelected(spaceIdOrAlias);\n  const callEmbed = useCallEmbed();\n\n  const [closedCategories, setClosedCategories] = useAtom(useClosedNavCategoriesAtom());\n\n  const getRoom = useCallback(\n    (rId: string): Room | undefined => {\n      if (allJoinedRooms.has(rId)) {\n        return mx.getRoom(rId) ?? undefined;\n      }\n      return undefined;\n    },\n    [mx, allJoinedRooms]\n  );\n\n  const closedCategoriesCache = useRef(new Map());\n  closedCategoriesCache.current.clear();\n\n  /**\n   * Recursively checks if a given parentId (or all its ancestors) is in a closed category.\n   *\n   * @param spaceId - The root space ID.\n   * @param parentId - The parent space ID to start the check from.\n   * @param previousId - The last ID checked, only used to ignore root collapse state.\n   * @param visited - Set used to prevent recursion errors.\n   * @returns True if parentId or all ancestors is in a closed category.\n   */\n  const getInClosedCategories = useCallback(\n    (\n      spaceId: string,\n      parentId: string,\n      previousId?: string,\n      visited: Set<string> = new Set()\n    ): boolean => {\n      // Ignore root space being collapsed if in a subspace,\n      // this is due to many spaces dumping all rooms in the top-level space.\n      if (parentId === spaceId && previousId) {\n        if (spaceRooms.has(previousId) || getRoom(previousId)?.isSpaceRoom()) {\n          return false;\n        }\n      }\n\n      const categoryId = makeNavCategoryId(spaceId, parentId);\n\n      // Prevent infinite recursion\n      if (visited.has(categoryId)) return false;\n      visited.add(categoryId);\n\n      if (closedCategoriesCache.current.has(categoryId)) {\n        return closedCategoriesCache.current.get(categoryId);\n      }\n\n      if (closedCategories.has(categoryId)) {\n        closedCategoriesCache.current.set(categoryId, true);\n        return true;\n      }\n\n      const parentParentIds = roomToParents.get(parentId);\n      if (!parentParentIds || parentParentIds.size === 0) {\n        closedCategoriesCache.current.set(categoryId, false);\n        return false;\n      }\n\n      // As a subspace can be in multiple spaces,\n      // only return true if all parent spaces are closed.\n      const allClosed = !Array.from(parentParentIds).some(\n        (id) => !getInClosedCategories(spaceId, id, parentId, visited)\n      );\n      visited.delete(categoryId);\n      closedCategoriesCache.current.set(categoryId, allClosed);\n      return allClosed;\n    },\n    [closedCategories, getRoom, roomToParents, spaceRooms]\n  );\n\n  /**\n   * Recursively checks if the given room or any of its descendants should be visible.\n   *\n   * @param roomId - The room ID to check.\n   * @param visited - Set used to prevent recursion errors.\n   * @returns True if the room or any descendant should be visible.\n   */\n  const getContainsShowRoom = useCallback(\n    (roomId: string, visited: Set<string> = new Set()): boolean => {\n      if (roomToUnread.has(roomId) || roomId === selectedRoomId) {\n        return true;\n      }\n\n      // Prevent infinite recursion\n      if (visited.has(roomId)) return false;\n      visited.add(roomId);\n\n      const childIds = roomToChildren.get(roomId);\n      if (!childIds || childIds.size === 0) {\n        return false;\n      }\n\n      return Array.from(childIds).some((id) => getContainsShowRoom(id, visited));\n    },\n    [roomToUnread, selectedRoomId, roomToChildren]\n  );\n\n  /**\n   * Determines the depth limit for the joined space hierarchy and the SpaceNavItems to start appearing\n   */\n  const [subspaceHierarchyLimit] = useSetting(settingsAtom, 'subspaceHierarchyLimit');\n  /**\n   * Creates an SVG used for connecting spaces to their subrooms.\n   * @param virtualizedItems - The virtualized item list that will be used to render elements in the nav\n   * @returns React SVG Element that can be overlayed on top of the nav category for rooms.\n   */\n  const getConnectorSVG = (\n    hierarchy: HierarchyItem[],\n    virtualizedItems: VirtualItem[]\n  ): ReactElement => {\n    const DEPTH_START = 2;\n    const PADDING_LEFT_DEPTH_OFFSET = 15.75;\n    const PADDING_LEFT_DEPTH_OFFSET_START = -15.75;\n    const RADIUS = 5;\n\n    let connectorStack: { aX: number; aY: number }[] = [];\n    // Holder for the paths\n    const pathHolder: ReactElement[] = [];\n    virtualizedItems.forEach((vItem) => {\n      const hierarchyItem = hierarchy[vItem.index];\n      if (!hierarchyItem) return;\n      const { roomId, depth: itemDepth } = hierarchyItem;\n      const depth = itemDepth ?? 0;\n      const room = getRoom(roomId);\n      // We will render spaces at a level above their normal depth, since we want their children to be \"under\" them\n      const renderDepth = room?.isSpaceRoom() ? depth : depth + 1;\n      // for the root items, we are not doing anything with it.\n      if (renderDepth < DEPTH_START) {\n        return;\n      }\n      // for nearly root level text/call rooms, we will not be drawing any arcs.\n      if (renderDepth === DEPTH_START - 1 && !room?.isSpaceRoom() && connectorStack.length === 0) {\n        return;\n      }\n\n      // for the sub-root items, we will not draw any arcs from root to it.\n      // however, we should capture the aX and aY to draw starter arcs for next depths.\n      if (renderDepth === DEPTH_START) {\n        connectorStack = [\n          {\n            aX: PADDING_LEFT_DEPTH_OFFSET * DEPTH_START + PADDING_LEFT_DEPTH_OFFSET_START,\n            aY: vItem.end,\n          },\n        ];\n        return;\n      }\n      // adjust the stack to be at the correct depth, which is the \"parent\" of the current item.\n      while (connectorStack.length + DEPTH_START > renderDepth && connectorStack.length !== 0) {\n        connectorStack.pop();\n      }\n\n      // Fixes crash in case the top level virtual item is unrendered.\n      if (connectorStack.length === 0) {\n        connectorStack = [{ aX: Math.round(renderDepth * PADDING_LEFT_DEPTH_OFFSET), aY: 0 }];\n      }\n\n      const lastConnector = connectorStack[connectorStack.length - 1];\n      if (!lastConnector) return;\n\n      // aX: numeric x where the vertical connector starts\n      // aY: end of parent (already numeric)\n      const { aX, aY } = lastConnector;\n\n      // bX: point where the vertical connector ends\n      const bX = Math.round(\n        (renderDepth - 0.5) * PADDING_LEFT_DEPTH_OFFSET + PADDING_LEFT_DEPTH_OFFSET_START\n      );\n      // bY: center of current item\n      const bY = vItem.end - vItem.size / 2;\n\n      const pathString =\n        `M ${aX} ${aY} ` +\n        `L ${aX} ${bY - RADIUS} ` +\n        `A ${RADIUS} ${RADIUS} 0 0 0 ${aX + RADIUS} ${bY} ` +\n        `L ${bX} ${bY}`;\n\n      pathHolder.push(\n        <path\n          d={pathString}\n          fill=\"none\"\n          stroke={color.Surface.ContainerLine}\n          strokeWidth=\"2\"\n          display=\"block\"\n        />\n      );\n\n      // add this item to the connector stack, in case the next item's depth is higher.\n      connectorStack.push({\n        aX: Math.round(renderDepth * PADDING_LEFT_DEPTH_OFFSET) + PADDING_LEFT_DEPTH_OFFSET_START,\n        aY: vItem.end,\n      });\n    });\n    return (\n      <svg\n        style={{\n          position: 'absolute',\n          inset: 0,\n          width: '100%',\n          height: '100%',\n          pointerEvents: 'none',\n        }}\n      >\n        {pathHolder}\n      </svg>\n    );\n  };\n\n  const hierarchy = useSpaceJoinedHierarchy(\n    space.roomId,\n    getRoom,\n    useCallback(\n      (parentId, roomId, depth) => {\n        if (depth >= subspaceHierarchyLimit) {\n          // we will exclude items above this depth\n          return true;\n        }\n        if (!getInClosedCategories(space.roomId, parentId, roomId)) {\n          return false;\n        }\n        const unread = roomToUnread.get(roomId);\n        const containsShowRoom = getContainsShowRoom(roomId);\n        const hasUnread = !!unread && (unread.total > 0 || unread.highlight > 0);\n        const showRoomAnyway =\n          hasUnread || roomId === selectedRoomId || callEmbed?.roomId === roomId;\n        return containsShowRoom || !showRoomAnyway;\n      },\n      [\n        getContainsShowRoom,\n        getInClosedCategories,\n        space.roomId,\n        callEmbed,\n        subspaceHierarchyLimit,\n        roomToUnread,\n        selectedRoomId,\n      ]\n    ),\n    useCallback(\n      (sId) => getInClosedCategories(space.roomId, sId),\n      [getInClosedCategories, space.roomId]\n    )\n  );\n\n  const getItemKey = useCallback(\n    (index: number) => {\n      const item = hierarchy[index];\n      if (!item) return index;\n      return getSpaceHierarchyItemKey(space.roomId, item);\n    },\n    [hierarchy, space.roomId]\n  );\n\n  const virtualizer = useVirtualizer({\n    count: hierarchy.length,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: () => 32,\n    overscan: 10,\n    getItemKey,\n  });\n\n  const virtualizedItems = virtualizer.getVirtualItems();\n\n  const handleCategoryClick = useCategoryHandler(setClosedCategories, (categoryId) =>\n    closedCategories.has(categoryId)\n  );\n\n  const getToLink = (roomId: string) => {\n    const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, roomId);\n    if (mx.getRoom(roomId)?.getType() === CustomRoomType.Forum) {\n      return getSpaceForumPath(spaceIdOrAlias, roomIdOrAlias);\n    }\n    return getSpaceRoomPath(spaceIdOrAlias, roomIdOrAlias);\n  };\n\n  return (\n    <PageNavShell\n      header={<SpaceHeader hideText={hideText} mx={mx} />}\n      curWidth={curWidth}\n      setCurWidth={setCurWidth}\n      roomSidebarWidth={roomSidebarWidth}\n      setRoomSidebarWidth={setRoomSidebarWidth}\n      setIsResizingSidebar={setIsResizingSidebar}\n      isMobile={isMobile}\n      oldSidebar={oldSidebar}\n    >\n      <PageNavContent scrollRef={scrollRef}>\n        <Box direction=\"Column\" gap=\"300\">\n          {tombstoneEvent && (\n            <SpaceTombstone\n              roomId={space.roomId}\n              replacementRoomId={tombstoneEvent.getContent().replacement_room}\n            />\n          )}\n          <NavCategory>\n            <NavItem variant=\"Background\" radii=\"400\" aria-selected={lobbySelected}>\n              <NavLink to={getSpaceLobbyPath(getCanonicalAliasOrRoomId(mx, space.roomId))}>\n                <NavItemContent>\n                  <Box as=\"span\" grow=\"Yes\" alignItems=\"Center\" justifyContent=\"Start\" gap=\"200\">\n                    <Avatar\n                      size={hideText ? undefined : '200'}\n                      radii=\"400\"\n                      style={hideText ? { width: '100%', padding: '0' } : undefined}\n                    >\n                      {menuIcon(Flag, { weight: lobbySelected ? 'fill' : 'regular' })}\n                    </Avatar>\n                    {!hideText && (\n                      <Box as=\"span\" grow=\"Yes\">\n                        <Text as=\"span\" size=\"Inherit\" truncate>\n                          Lobby\n                        </Text>\n                      </Box>\n                    )}\n                  </Box>\n                </NavItemContent>\n              </NavLink>\n            </NavItem>\n            <NavItem variant=\"Background\" radii=\"400\" aria-selected={searchSelected}>\n              <NavLink to={getSpaceSearchPath(getCanonicalAliasOrRoomId(mx, space.roomId))}>\n                <NavItemContent>\n                  <Box as=\"span\" grow=\"Yes\" alignItems=\"Center\" justifyContent=\"Start\" gap=\"200\">\n                    <Avatar\n                      size={hideText ? undefined : '200'}\n                      radii=\"400\"\n                      style={hideText ? { width: '100%' } : undefined}\n                    >\n                      {menuIcon(MagnifyingGlass, {\n                        weight: searchSelected ? 'fill' : 'regular',\n                      })}\n                    </Avatar>\n                    <Box as=\"span\" grow=\"Yes\">\n                      {!hideText && (\n                        <Text as=\"span\" size=\"Inherit\" truncate>\n                          Message Search\n                        </Text>\n                      )}\n                    </Box>\n                  </Box>\n                </NavItemContent>\n              </NavLink>\n            </NavItem>\n          </NavCategory>\n          <NavCategory\n            style={{\n              height: virtualizer.getTotalSize(),\n              position: 'relative',\n              overflow: 'visible',\n            }}\n          >\n            {virtualizedItems.map((vItem) => {\n              const hierarchyItem = hierarchy[vItem.index];\n              if (!hierarchyItem) return null;\n              const { roomId, depth: itemDepth } = hierarchyItem;\n              const depth = itemDepth ?? 0;\n              const room = mx.getRoom(roomId);\n              const renderDepth = room?.isSpaceRoom() ? depth - 2 : depth - 1;\n              if (!room) return null;\n              if (depth === subspaceHierarchyLimit && room.isSpaceRoom()) {\n                return (\n                  <VirtualTile virtualItem={vItem} key={vItem.key} ref={virtualizer.measureElement}>\n                    <div\n                      style={\n                        hideText\n                          ? {}\n                          : {\n                              paddingLeft: `calc(${renderDepth} * ${config.space.S400})`,\n                            }\n                      }\n                    >\n                      <SpaceNavItem\n                        room={room}\n                        selected={selectedRoomId === roomId}\n                        linkPath={getSpaceLobbyPath(getCanonicalAliasOrRoomId(mx, roomId))}\n                        hideText={hideText}\n                      />\n                    </div>\n                  </VirtualTile>\n                );\n              }\n\n              const paddingTop = getCategoryPadding(depth);\n              const paddingLeft = `calc(${renderDepth} * ${config.space.S400})`;\n\n              if (room.isSpaceRoom()) {\n                const categoryId = makeNavCategoryId(space.roomId, roomId);\n                const closedViaCategory = getInClosedCategories(space.roomId, roomId);\n\n                return (\n                  <VirtualTile virtualItem={vItem} key={vItem.key} ref={virtualizer.measureElement}>\n                    <div style={hideText ? { paddingTop: '0' } : { paddingTop, paddingLeft }}>\n                      <NavCategoryHeader style={hideText ? { justifyContent: 'Center' } : {}}>\n                        <RoomNavCategoryButton\n                          data-category-id={categoryId}\n                          onClick={handleCategoryClick}\n                          closed={closedCategories.has(categoryId) || closedViaCategory}\n                        >\n                          {!hideText && (roomId === space.roomId ? 'Rooms' : room?.name)}\n                        </RoomNavCategoryButton>\n                      </NavCategoryHeader>\n                    </div>\n                  </VirtualTile>\n                );\n              }\n\n              return (\n                <VirtualTile virtualItem={vItem} key={vItem.key} ref={virtualizer.measureElement}>\n                  <div\n                    style={\n                      hideText\n                        ? {\n                            padding: '0',\n                            width: '100%',\n                            aspectRatio: 1,\n                            display: 'flex',\n                            flexDirection: 'column',\n                          }\n                        : { paddingLeft }\n                    }\n                  >\n                    <RoomNavItem\n                      room={room}\n                      selected={selectedRoomId === roomId}\n                      showAvatar={mDirects.has(roomId) || showIcons()}\n                      direct={mDirects.has(roomId)}\n                      linkPath={getToLink(roomId)}\n                      hideText={hideText}\n                      notificationMode={getRoomNotificationMode(\n                        notificationPreferences,\n                        room.roomId\n                      )}\n                      joinCallOnSingleClick={joinCallOnSingleClick}\n                      isStrict={showRoomIcon === ShowRoomIcon.Strict}\n                    />\n                  </div>\n                </VirtualTile>\n              );\n            })}\n            {getConnectorSVG(hierarchy, virtualizedItems)}\n          </NavCategory>\n          {!isMobile && <div style={{ height: toRem(40) }} />}\n        </Box>\n      </PageNavContent>\n    </PageNavShell>\n  );\n}\n","import { useRef } from 'react';\nimport { Box, Scroll } from 'folds';\nimport { useAtomValue } from 'jotai';\nimport { MessageSearchHeader, Page, PageContent, PageContentCenter } from '$components/page';\nimport { MessageSearch } from '$features/message-search';\nimport { useSpace } from '$hooks/useSpace';\nimport { useRecursiveChildRoomScopeFactory, useSpaceChildren } from '$state/hooks/roomList';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\n\nexport function SpaceSearch() {\n  const mx = useMatrixClient();\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const space = useSpace();\n\n  const mDirects = useAtomValue(mDirectAtom);\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const rooms = useSpaceChildren(\n    allRoomsAtom,\n    space.roomId,\n    useRecursiveChildRoomScopeFactory(mx, mDirects, roomToParents)\n  );\n\n  return (\n    <Page>\n      <MessageSearchHeader />\n      <Box style={{ position: 'relative' }} grow=\"Yes\">\n        <Scroll ref={scrollRef} hideTrack visibility=\"Hover\">\n          <PageContent>\n            <PageContentCenter>\n              <MessageSearch\n                defaultRoomsFilterName={space.name}\n                allowGlobal\n                rooms={rooms}\n                scrollRef={scrollRef}\n              />\n            </PageContentCenter>\n          </PageContent>\n        </Scroll>\n      </Box>\n    </Page>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Spinner } from 'folds';\nimport { useParams } from 'react-router';\nimport { useAtom, useAtomValue } from 'jotai';\nimport { useResolvedRoomIdOrAlias } from '$hooks/router/useResolvedRoomId';\nimport { IsDirectRoomProvider, DisplayedEventIdProvider, RoomProvider } from '$hooks/useRoom';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { JoinBeforeNavigate } from '$features/join-before-navigate';\nimport { useSpace } from '$hooks/useSpace';\nimport { getAllParents, getSpaceChildren } from '$utils/room/hierarchy';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { allRoomsAtom } from '$state/room-list/roomList';\nimport { useSearchParamsViaServers } from '$hooks/router/useSearchParamsViaServers';\nimport { mDirectAtom } from '$state/mDirectList';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\n\nexport function SpaceRouteRoomProvider({\n  roomIdOrAlias: roomIdOrAliasProp,\n  eventId: eventIdProp,\n  children,\n}: {\n  roomIdOrAlias?: string;\n  eventId?: string;\n  children: ReactNode;\n}) {\n  const mx = useMatrixClient();\n  const space = useSpace();\n  const [developerTools] = useSetting(settingsAtom, 'developerTools');\n  const [roomToParents, setRoomToParents] = useAtom(roomToParentsAtom);\n  const mDirects = useAtomValue(mDirectAtom);\n  const allRooms = useAtomValue(allRoomsAtom);\n\n  const { roomIdOrAlias: encodedRoomIdOrAlias, eventId: encodedEventId } = useParams();\n  const roomIdOrAlias =\n    roomIdOrAliasProp ?? (encodedRoomIdOrAlias && decodeURIComponent(encodedRoomIdOrAlias));\n  const eventId = eventIdProp ?? (encodedEventId && decodeURIComponent(encodedEventId));\n  const viaServers = useSearchParamsViaServers();\n  const { roomId, resolving } = useResolvedRoomIdOrAlias(roomIdOrAlias);\n  const room = mx.getRoom(roomId);\n\n  if (resolving) return <Spinner variant=\"Secondary\" size=\"600\" />;\n\n  if (!room || !allRooms.includes(room.roomId)) {\n    // room is not joined\n    return (\n      <JoinBeforeNavigate\n        roomIdOrAlias={roomIdOrAlias!}\n        eventId={eventId}\n        viaServers={viaServers}\n      />\n    );\n  }\n\n  if (developerTools && room.isSpaceRoom() && room.roomId === space.roomId) {\n    // allow to view space timeline\n    return (\n      <RoomProvider key={room.roomId} value={room}>\n        <IsDirectRoomProvider value={mDirects.has(room.roomId)}>\n          <DisplayedEventIdProvider value={eventId}>{children}</DisplayedEventIdProvider>\n        </IsDirectRoomProvider>\n      </RoomProvider>\n    );\n  }\n\n  if (!getAllParents(roomToParents, room.roomId).has(space.roomId)) {\n    if (getSpaceChildren(space).includes(room.roomId)) {\n      // fill missing roomToParent mapping\n      setRoomToParents({\n        type: 'PUT',\n        parent: space.roomId,\n        children: [room.roomId],\n      });\n    }\n\n    return (\n      <JoinBeforeNavigate\n        roomIdOrAlias={roomIdOrAlias!}\n        eventId={eventId}\n        viaServers={viaServers}\n      />\n    );\n  }\n\n  return (\n    <RoomProvider key={room.roomId} value={room}>\n      <IsDirectRoomProvider value={mDirects.has(room.roomId)}>\n        <DisplayedEventIdProvider value={eventId}>{children}</DisplayedEventIdProvider>\n      </IsDirectRoomProvider>\n    </RoomProvider>\n  );\n}\n","import { forwardRef, useState } from 'react';\nimport { Box, Line, Menu, MenuItem, Text, config, toRem } from 'folds';\nimport type { Room } from 'matrix-js-sdk';\nimport { useNavigate } from 'react-router';\nimport { InviteUserPrompt } from '$components/invite-user-prompt';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useIsDirectRoom } from '$hooks/useRoom';\nimport { useSpaceOptionally } from '$hooks/useSpace';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport type { IPowerLevels } from '$hooks/usePowerLevels';\nimport { useOpenRoomSettings } from '$state/hooks/roomSettings';\nimport { useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { markAsRead } from '$utils/notifications';\nimport { copyToClipboard } from '$utils/dom';\nimport { getCanonicalAliasOrRoomId, isRoomAlias } from '$utils/matrix';\nimport {\n  getHomeRoomPath,\n  getDirectRoomPath,\n  getSpaceRoomPath,\n  withSearchParam,\n} from '$pages/pathUtils';\nimport { ROOM_TIMELINE_SEARCH_PARAM } from '$pages/paths';\nimport { getMatrixToRoom } from '$plugins/matrix-to';\nimport { getViaServers } from '$plugins/via-servers';\nimport {\n  Checks,\n  GearSix,\n  Link,\n  menuIcon,\n  SignOut,\n  Terminal,\n  UserCircle,\n  UserPlus,\n} from '$components/icons/phosphor';\nimport { useRoomMenuActions } from '$hooks/useRoomMenuActions';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { RoomSettingsPage } from '$state/roomSettings';\n\ntype ForumMenuProps = {\n  room: Room;\n  powerLevels: IPowerLevels;\n  requestClose: () => void;\n};\nexport const ForumMenu = forwardRef<HTMLDivElement, ForumMenuProps>(\n  ({ room, powerLevels, requestClose }, ref) => {\n    const mx = useMatrixClient();\n    const [hideReads] = useSetting(settingsAtom, 'hideReads');\n    const [developerTools] = useSetting(settingsAtom, 'developerTools');\n    const creators = useRoomCreators(room);\n    const permissions = useRoomPermissions(creators, powerLevels);\n    const canInvite = permissions.action('invite', mx.getSafeUserId());\n    const openRoomSettings = useOpenRoomSettings();\n    const screenSize = useScreenSizeContext();\n    const navigate = useNavigate();\n    const parentSpace = useSpaceOptionally();\n    const isDirectRoom = useIsDirectRoom();\n    const { handleLeaveRoom } = useRoomMenuActions(room);\n\n    const [invitePrompt, setInvitePrompt] = useState(false);\n\n    const handleMarkAsRead = () => {\n      markAsRead(mx, room.roomId, hideReads, true);\n      requestClose();\n    };\n\n    const handleCopyLink = () => {\n      const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, room.roomId);\n      const viaServers = isRoomAlias(roomIdOrAlias) ? undefined : getViaServers(room);\n      copyToClipboard(getMatrixToRoom(roomIdOrAlias, viaServers));\n      requestClose();\n    };\n\n    const handleInvite = () => {\n      setInvitePrompt(true);\n    };\n\n    const handleRoomSettings = () => {\n      openRoomSettings(room.roomId);\n      requestClose();\n    };\n\n    const handleOpenTimeline = () => {\n      const roomIdOrAlias = getCanonicalAliasOrRoomId(mx, room.roomId);\n      let path: string;\n      if (parentSpace) {\n        const spaceIdOrAlias = getCanonicalAliasOrRoomId(mx, parentSpace.roomId);\n        path = getSpaceRoomPath(spaceIdOrAlias, roomIdOrAlias);\n      } else if (isDirectRoom) {\n        path = getDirectRoomPath(roomIdOrAlias);\n      } else {\n        path = getHomeRoomPath(roomIdOrAlias);\n      }\n      navigate(withSearchParam(path, { [ROOM_TIMELINE_SEARCH_PARAM]: 'true' }));\n      requestClose();\n    };\n\n    return (\n      <Menu ref={ref} style={{ maxWidth: toRem(160), width: '100vw' }}>\n        {invitePrompt && (\n          <InviteUserPrompt\n            room={room}\n            requestClose={() => {\n              setInvitePrompt(false);\n              requestClose();\n            }}\n          />\n        )}\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n          <MenuItem onClick={handleMarkAsRead} size=\"300\" after={menuIcon(Checks)} radii=\"300\">\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Mark as Read\n            </Text>\n          </MenuItem>\n        </Box>\n        <Line variant=\"Surface\" size=\"300\" />\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n          <MenuItem\n            onClick={handleInvite}\n            variant=\"Primary\"\n            fill=\"None\"\n            size=\"300\"\n            after={menuIcon(UserPlus)}\n            radii=\"300\"\n            aria-pressed={invitePrompt}\n            disabled={!canInvite}\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Invite\n            </Text>\n          </MenuItem>\n          <MenuItem onClick={handleCopyLink} size=\"300\" after={menuIcon(Link)} radii=\"300\">\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Copy Link\n            </Text>\n          </MenuItem>\n          {screenSize !== ScreenSize.Desktop && (\n            <MenuItem\n              onClick={() => {\n                openRoomSettings(room.roomId, parentSpace?.roomId, RoomSettingsPage.MembersPage);\n                requestClose();\n              }}\n              size=\"300\"\n              after={menuIcon(UserCircle)}\n              radii=\"300\"\n            >\n              <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n                Members\n              </Text>\n            </MenuItem>\n          )}\n          <MenuItem onClick={handleRoomSettings} size=\"300\" after={menuIcon(GearSix)} radii=\"300\">\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Room Settings\n            </Text>\n          </MenuItem>\n          {developerTools && (\n            <MenuItem\n              onClick={handleOpenTimeline}\n              size=\"300\"\n              after={menuIcon(Terminal)}\n              radii=\"300\"\n            >\n              <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n                Event Timeline\n              </Text>\n            </MenuItem>\n          )}\n        </Box>\n        <Line variant=\"Surface\" size=\"300\" />\n        <Box direction=\"Column\" gap=\"100\" style={{ padding: config.space.S100 }}>\n          <MenuItem\n            onClick={async () => {\n              if (await handleLeaveRoom()) requestClose();\n            }}\n            variant=\"Critical\"\n            fill=\"None\"\n            size=\"300\"\n            after={menuIcon(SignOut)}\n            radii=\"300\"\n          >\n            <Text style={{ flexGrow: 1 }} as=\"span\" size=\"T300\" truncate>\n              Leave Room\n            </Text>\n          </MenuItem>\n        </Box>\n      </Menu>\n    );\n  }\n);\n","import type { MouseEventHandler } from 'react';\nimport { useEffect, useState } from 'react';\nimport type { RectCords } from 'folds';\nimport { Avatar, Badge, Box, IconButton, Text, Tooltip, toRem } from 'folds';\nimport FocusTrap from 'focus-trap-react';\nimport type { Room } from 'matrix-js-sdk';\nimport { PageHeader } from '$components/page';\nimport { useSetSetting, useSetting } from '$state/hooks/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useRoomAvatar, useRoomName } from '$hooks/useRoomMeta';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { RoomAvatar } from '$components/room-avatar';\nimport {\n  ArrowLeft,\n  composerIcon,\n  DotsThreeOutlineVerticalIcon,\n  PushPin,\n  UserCircle,\n} from '$components/icons/phosphor';\nimport { nameInitials } from '$utils/common';\nimport { stopPropagation } from '$utils/keyboard';\nimport type { IPowerLevels } from '$hooks/usePowerLevels';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { BackRouteHandler } from '$components/BackRouteHandler';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRoomPinnedEvents } from '$hooks/useRoomPinnedEvents';\nimport { PopOut, TooltipProvider } from '$components/overlay-stack';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\nimport { useMenuAnchor } from '$hooks/useMenuAnchor';\nimport { RoomPinMenu } from '$features/room/room-pin-menu';\nimport { ForumMenu } from './ForumMenu';\nimport * as css from './ForumView.css';\n\nconst getPinsHash = async (pinnedIds: string[]): Promise<string> =>\n  crypto.subtle\n    .digest('SHA-256', new TextEncoder().encode(pinnedIds.join()))\n    .then((hash) =>\n      Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, '0')).join('')\n    );\n\ntype ForumHeaderProps = {\n  room: Room;\n  showProfile?: boolean;\n  powerLevels: IPowerLevels;\n};\nexport function ForumHeader({ room, showProfile, powerLevels }: ForumHeaderProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer');\n  const [peopleDrawer] = useSetting(settingsAtom, 'isPeopleDrawer');\n  const menu = useMenuAnchor<HTMLButtonElement>();\n  const [pinMenuAnchor, setPinMenuAnchor] = useState<RectCords>();\n  const screenSize = useScreenSizeContext();\n  const pinnedEvents = useRoomPinnedEvents(room);\n  const [currentHash, setCurrentHash] = useState('');\n\n  useEffect(() => {\n    getPinsHash(pinnedEvents)\n      .then(setCurrentHash)\n      .catch(() => undefined);\n  }, [pinnedEvents]);\n\n  const name = useRoomName(room);\n  const avatarMxc = useRoomAvatar(room);\n  const avatarUrl = avatarMxc\n    ? (mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96, 'crop') ?? undefined)\n    : undefined;\n\n  const handleOpenPinMenu: MouseEventHandler<HTMLButtonElement> = (evt) => {\n    setPinMenuAnchor(evt.currentTarget.getBoundingClientRect());\n  };\n\n  return (\n    <PageHeader className={showProfile ? undefined : css.Header} balance>\n      <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n        {screenSize === ScreenSize.Mobile ? (\n          <>\n            <Box shrink=\"No\">\n              <BackRouteHandler>\n                {(onBack) => (\n                  <IconButton fill=\"None\" onClick={onBack}>\n                    {composerIcon(ArrowLeft)}\n                  </IconButton>\n                )}\n              </BackRouteHandler>\n            </Box>\n            <Box grow=\"Yes\" justifyContent=\"Center\">\n              {showProfile && (\n                <Text size=\"H3\" truncate>\n                  {name}\n                </Text>\n              )}\n            </Box>\n          </>\n        ) : (\n          <>\n            <Box grow=\"Yes\" basis=\"No\" />\n            <Box justifyContent=\"Center\" alignItems=\"Center\" gap=\"300\">\n              {showProfile && (\n                <>\n                  <Avatar size=\"300\">\n                    <RoomAvatar\n                      roomId={room.roomId}\n                      src={avatarUrl}\n                      alt={name}\n                      renderFallback={() => <Text size=\"H4\">{nameInitials(name)}</Text>}\n                    />\n                  </Avatar>\n                  <Text size=\"H3\" truncate>\n                    {name}\n                  </Text>\n                </>\n              )}\n            </Box>\n          </>\n        )}\n        <Box\n          shrink=\"No\"\n          grow={screenSize === ScreenSize.Mobile ? 'No' : 'Yes'}\n          basis={screenSize === ScreenSize.Mobile ? 'Yes' : 'No'}\n          justifyContent=\"End\"\n        >\n          <TooltipProvider\n            position=\"Bottom\"\n            offset={4}\n            tooltip={\n              <Tooltip>\n                <Text>Pinned Messages</Text>\n              </Tooltip>\n            }\n          >\n            {(triggerRef) => (\n              <IconButton\n                fill=\"None\"\n                style={{ position: 'relative' }}\n                onClick={handleOpenPinMenu}\n                ref={triggerRef}\n                aria-pressed={!!pinMenuAnchor}\n              >\n                {pinnedEvents.length > 0 && (\n                  <Badge\n                    style={{\n                      position: 'absolute',\n                      left: toRem(3),\n                      top: toRem(3),\n                    }}\n                    variant=\"Secondary\"\n                    size=\"400\"\n                    fill=\"Solid\"\n                    radii=\"Pill\"\n                  >\n                    <Text as=\"span\" size=\"L400\">\n                      {pinnedEvents.length}\n                    </Text>\n                  </Badge>\n                )}\n                {composerIcon(PushPin, { weight: pinMenuAnchor ? 'fill' : 'regular' })}\n              </IconButton>\n            )}\n          </TooltipProvider>\n          <PopOut\n            anchor={pinMenuAnchor}\n            position=\"Bottom\"\n            content={\n              <FocusTrap\n                focusTrapOptions={{\n                  initialFocus: false,\n                  returnFocusOnDeactivate: false,\n                  onDeactivate: () => setPinMenuAnchor(undefined),\n                  clickOutsideDeactivates: true,\n                  isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown',\n                  isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp',\n                  escapeDeactivates: stopPropagation,\n                }}\n              >\n                <RoomPinMenu\n                  room={room}\n                  requestClose={() => setPinMenuAnchor(undefined)}\n                  currentHash={currentHash}\n                />\n              </FocusTrap>\n            }\n          />\n          {screenSize === ScreenSize.Desktop && (\n            <TooltipProvider\n              position=\"Bottom\"\n              offset={4}\n              tooltip={\n                <Tooltip>\n                  <Text>{peopleDrawer ? 'Hide Members' : 'Show Members'}</Text>\n                </Tooltip>\n              }\n            >\n              {(triggerRef) => (\n                <IconButton\n                  fill=\"None\"\n                  ref={triggerRef}\n                  onClick={() => setPeopleDrawer((drawer) => !drawer)}\n                >\n                  {composerIcon(UserCircle, { weight: peopleDrawer ? 'fill' : 'regular' })}\n                </IconButton>\n              )}\n            </TooltipProvider>\n          )}\n          <ResponsiveMenu\n            anchor={menu.anchor}\n            requestClose={menu.close}\n            position=\"Bottom\"\n            align=\"End\"\n            menu={<ForumMenu room={room} powerLevels={powerLevels} requestClose={menu.close} />}\n          >\n            <TooltipProvider\n              position=\"Bottom\"\n              align=\"End\"\n              offset={4}\n              tooltip={\n                <Tooltip>\n                  <Text>More Options</Text>\n                </Tooltip>\n              }\n            >\n              {(triggerRef) => (\n                <IconButton\n                  fill=\"None\"\n                  onClick={menu.triggerProps.onClick}\n                  ref={triggerRef}\n                  aria-label=\"More Options\"\n                  aria-pressed={!!menu.anchor}\n                >\n                  {composerIcon(DotsThreeOutlineVerticalIcon, {\n                    weight: menu.anchor ? 'fill' : 'regular',\n                  })}\n                </IconButton>\n              )}\n            </TooltipProvider>\n          </ResponsiveMenu>\n        </Box>\n      </Box>\n    </PageHeader>\n  );\n}\n","import { Avatar, OverlayBackdrop, OverlayCenter, Text } from 'folds';\nimport FocusTrap from 'focus-trap-react';\nimport type { Room } from 'matrix-js-sdk';\nimport { useRoomAvatar, useRoomName, useRoomTopic } from '$hooks/useRoomMeta';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { RoomAvatar } from '$components/room-avatar';\nimport { nameInitials } from '$utils/common';\nimport { UseStateProvider } from '$components/UseStateProvider';\nimport { RoomTopicViewer } from '$components/room-topic-viewer';\nimport { PageHero } from '$components/page';\nimport { onEnterOrSpace, stopPropagation } from '$utils/keyboard';\nimport { mxcUrlToHttp } from '$utils/matrix';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { Overlay } from '$components/overlay-stack';\nimport * as css from './ForumView.css';\n\ntype ForumHeroProps = {\n  room: Room;\n};\n\nexport function ForumHero({ room }: ForumHeroProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n\n  const name = useRoomName(room);\n  const topic = useRoomTopic(room);\n  const avatarMxc = useRoomAvatar(room);\n  const avatarUrl = avatarMxc\n    ? (mxcUrlToHttp(mx, avatarMxc, useAuthentication, 96, 96, 'crop') ?? undefined)\n    : undefined;\n\n  return (\n    <PageHero\n      icon={\n        <Avatar size=\"500\">\n          <RoomAvatar\n            roomId={room.roomId}\n            src={avatarUrl}\n            alt={name}\n            renderFallback={() => <Text size=\"H4\">{nameInitials(name)}</Text>}\n          />\n        </Avatar>\n      }\n      title={name}\n      subTitle={\n        topic && (\n          <UseStateProvider initial={false}>\n            {(viewTopic, setViewTopic) => (\n              <>\n                <Overlay open={viewTopic} backdrop={<OverlayBackdrop />}>\n                  <OverlayCenter>\n                    <FocusTrap\n                      focusTrapOptions={{\n                        initialFocus: false,\n                        clickOutsideDeactivates: true,\n                        onDeactivate: () => setViewTopic(false),\n                        escapeDeactivates: stopPropagation,\n                      }}\n                    >\n                      <RoomTopicViewer\n                        name={name}\n                        topic={topic}\n                        requestClose={() => setViewTopic(false)}\n                      />\n                    </FocusTrap>\n                  </OverlayCenter>\n                </Overlay>\n                <Text\n                  as=\"span\"\n                  onClick={() => setViewTopic(true)}\n                  onKeyDown={onEnterOrSpace(() => setViewTopic(true))}\n                  tabIndex={0}\n                  className={css.ForumHeroTopic}\n                  size=\"Inherit\"\n                  priority=\"300\"\n                >\n                  {topic}\n                </Text>\n              </>\n            )}\n          </UseStateProvider>\n        )\n      }\n    />\n  );\n}\n","import type { MouseEventHandler } from 'react';\nimport { Box, Scroll, config } from 'folds';\nimport type { MatrixEvent, Room } from 'matrix-js-sdk';\nimport { EventType } from 'matrix-js-sdk';\nimport type { Thread } from 'matrix-js-sdk/lib/models/thread';\nimport { useAtomValue } from 'jotai';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport type { Opts as LinkifyOpts } from 'linkifyjs';\nimport { Image } from '$components/media';\nimport { ImageViewer } from '$components/image-viewer';\nimport { getMemberDisplayName } from '$utils/room/display';\nimport { getEditedEvent, getEventReactions } from '$utils/room/relations';\nimport { getMxIdLocalPart } from '$utils/matrix';\nimport { ImageContent, MSticker, RedactedContent, Reply } from '$components/message';\nimport { RenderMessageContent } from '$components/RenderMessageContent';\nimport type { MessageLayout, MessageSpacing } from '$state/settings';\nimport { settingsAtom } from '$state/settings';\nimport { useSetting } from '$state/hooks/settings';\nimport type { GetContentCallback } from '$types/matrix/room';\nimport { nicknamesAtom } from '$state/nicknames';\nimport { EncryptedContent, Message, Reactions } from './message';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\n\nexport type ThreadRootItemProps = {\n  room: Room;\n  mEvent: MatrixEvent;\n  thread?: Thread;\n  editId: string | undefined;\n  onEditId: (id?: string) => void;\n  messageLayout: MessageLayout;\n  messageSpacing: MessageSpacing;\n  canDelete: boolean;\n  canSendReaction: boolean;\n  canPinEvent: boolean;\n  imagePackRooms: Room[];\n  hour24Clock: boolean;\n  dateFormatString: string;\n  onUserClick: MouseEventHandler<HTMLButtonElement>;\n  onUsernameClick: MouseEventHandler<HTMLButtonElement>;\n  onReplyClick: MouseEventHandler<HTMLButtonElement>;\n  onReactionToggle: (targetEventId: string, key: string, shortcode?: string) => void;\n  linkifyOpts: LinkifyOpts;\n  htmlReactParserOptions: HTMLReactParserOptions;\n  showHideReads: boolean;\n  showDeveloperTools: boolean;\n  onReferenceClick: MouseEventHandler<HTMLButtonElement>;\n  hideReplyButton?: boolean;\n  showMaps?: boolean;\n};\n\nexport function ThreadRootItem({\n  room,\n  mEvent,\n  thread,\n  editId,\n  onEditId,\n  messageLayout,\n  messageSpacing,\n  canDelete,\n  canSendReaction,\n  canPinEvent,\n  imagePackRooms,\n  hour24Clock,\n  dateFormatString,\n  onUserClick,\n  onUsernameClick,\n  onReplyClick,\n  onReactionToggle,\n  linkifyOpts,\n  htmlReactParserOptions,\n  showHideReads,\n  showDeveloperTools,\n  onReferenceClick,\n  hideReplyButton,\n  showMaps,\n}: ThreadRootItemProps) {\n  const mx = useMatrixClient();\n  const nicknames = useAtomValue(nicknamesAtom);\n  const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad');\n  const [urlPreview] = useSetting(settingsAtom, 'urlPreview');\n\n  const mEventId = mEvent.getId();\n  if (!mEventId) return null;\n\n  const senderId = mEvent.getSender() ?? '';\n  const senderDisplayName =\n    getMemberDisplayName(room, senderId, nicknames) ?? getMxIdLocalPart(senderId) ?? senderId;\n\n  const timelineSet = thread?.timelineSet ?? room.getUnfilteredTimelineSet();\n  const editedEvent = getEditedEvent(mEventId, mEvent, timelineSet);\n  const editedNewContent = editedEvent?.getContent()['m.new_content'];\n  const baseContent = mEvent.getContent();\n  const safeContent =\n    Object.keys(baseContent).length > 0 ? baseContent : mEvent.getOriginalContent();\n  const getContent = (() => editedNewContent ?? safeContent) as GetContentCallback;\n\n  const reactionRelations = getEventReactions(timelineSet, mEventId);\n  const reactions = reactionRelations?.getSortedAnnotationsByKey();\n  const hasReactions = reactions && reactions.length > 0;\n\n  const { replyEventId } = mEvent;\n  const showUrlPreview = room.hasEncryptionStateEvent() ? false : urlPreview;\n\n  return (\n    <>\n      <Message\n        data-message-id={mEventId}\n        room={room}\n        mEvent={mEvent}\n        senderId={senderId}\n        senderDisplayName={senderDisplayName}\n        messageSpacing={messageSpacing}\n        messageLayout={messageLayout}\n        collapse={false}\n        highlight={false}\n        edit={editId === mEventId}\n        canDelete={canDelete}\n        canSendReaction={canSendReaction}\n        canPinEvent={canPinEvent}\n        imagePackRooms={imagePackRooms}\n        relations={hasReactions ? reactionRelations : undefined}\n        onUserClick={onUserClick}\n        onUsernameClick={onUsernameClick}\n        onReplyClick={onReplyClick}\n        onReactionToggle={onReactionToggle}\n        onEditId={onEditId}\n        hour24Clock={hour24Clock}\n        dateFormatString={dateFormatString}\n        hideReadReceipts={showHideReads}\n        hideReplyButton={hideReplyButton}\n        showDeveloperTools={showDeveloperTools}\n        reply={\n          replyEventId && (\n            <Reply\n              room={room}\n              timelineSet={timelineSet}\n              replyEventId={replyEventId}\n              onClick={onReferenceClick}\n            />\n          )\n        }\n      >\n        {mEvent.isRedacted() ? (\n          <RedactedContent reason={mEvent.getUnsigned().redacted_because?.content.reason} />\n        ) : (\n          <Scroll\n            variant=\"Background\"\n            visibility=\"Hover\"\n            direction=\"Vertical\"\n            hideTrack={false}\n            style={{\n              maxHeight: '200px',\n              flexShrink: 0,\n              height: 'auto',\n            }}\n          >\n            <EncryptedContent mEvent={mEvent}>\n              {() => {\n                if (mEvent.isRedacted()) {\n                  return (\n                    <RedactedContent\n                      reason={mEvent.getUnsigned().redacted_because?.content.reason}\n                    />\n                  );\n                }\n\n                if (mEvent.getType() === (EventType.Sticker as string)) {\n                  return (\n                    <MSticker\n                      content={mEvent.getContent()}\n                      renderImageContent={(props) => (\n                        <ImageContent\n                          {...props}\n                          autoPlay={mediaAutoLoad}\n                          renderImage={(p) => <Image {...p} loading=\"lazy\" />}\n                          renderViewer={(p) => <ImageViewer {...p} />}\n                        />\n                      )}\n                    />\n                  );\n                }\n\n                return (\n                  <RenderMessageContent\n                    displayName={senderDisplayName}\n                    msgType={\n                      ((editedNewContent ?? safeContent) as { msgtype?: string }).msgtype ?? ''\n                    }\n                    ts={mEvent.getTs()}\n                    edited={!!editedEvent}\n                    getContent={getContent}\n                    mediaAutoLoad={mediaAutoLoad}\n                    urlPreview={showUrlPreview}\n                    htmlReactParserOptions={htmlReactParserOptions}\n                    linkifyOpts={linkifyOpts}\n                    outlineAttachment\n                    mEvent={mEvent}\n                    mx={mx}\n                    room={room}\n                    showMaps={showMaps}\n                  />\n                );\n              }}\n            </EncryptedContent>\n          </Scroll>\n        )}\n      </Message>\n\n      {/* Reactions — outside scroll so always visible */}\n      {hasReactions && reactionRelations && (\n        <Box style={{ paddingLeft: config.space.S700 }}>\n          <Reactions\n            style={{ marginTop: config.space.S200 }}\n            room={room}\n            relations={reactionRelations}\n            mEventId={mEventId}\n            canSendReaction={canSendReaction}\n            canDeleteOwn={canDelete}\n            onReactionToggle={onReactionToggle}\n          />\n        </Box>\n      )}\n    </>\n  );\n}\n","import { Avatar, Box, Chip, Text, config } from 'folds';\nimport type { Thread } from 'matrix-js-sdk/lib/models/thread';\nimport { useAtomValue } from 'jotai';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { getMemberAvatarMxc, getMemberDisplayName } from '$utils/room/display';\nimport { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix';\nimport { UserAvatar } from '$components/user-avatar';\nimport { nicknamesAtom } from '$state/nicknames';\nimport type { ThreadRootItemProps } from '$features/room/ThreadRootItem';\nimport { ThreadRootItem } from '$features/room/ThreadRootItem';\nimport { getThreadReplyEvents } from '$utils/room/relations';\nimport * as css from './ForumView.css';\n\ntype ForumThreadItemProps = ThreadRootItemProps & {\n  thread?: Thread;\n  onClick: (eventId: string) => void;\n};\n\nexport function ForumThreadItem({ thread, onClick, ...rootProps }: ForumThreadItemProps) {\n  const mx = useMatrixClient();\n  const useAuthentication = useMediaAuthentication();\n  const nicknames = useAtomValue(nicknamesAtom);\n  const { room, mEvent } = rootProps;\n\n  const mEventId = mEvent.getId();\n\n  // Thread reply info for the chip — uses the same reply resolution as the thread drawer.\n  const replies = mEventId ? getThreadReplyEvents(room, mEventId) : [];\n  const replyCount = replies.length;\n\n  const uniqueSenders = thread\n    ? [...new Set(replies.map((ev) => ev.getSender()).filter((id): id is string => !!id))]\n    : [];\n\n  const lastReply = replies.at(-1);\n  const lastSenderId = lastReply?.getSender() ?? '';\n  const lastDisplayName =\n    getMemberDisplayName(room, lastSenderId, nicknames) ??\n    getMxIdLocalPart(lastSenderId) ??\n    lastSenderId;\n  const lastContent = lastReply?.getContent();\n  const lastBody: string = typeof lastContent?.body === 'string' ? lastContent.body : '';\n\n  if (!mEventId) return null;\n\n  const handleCardClick = (evt: React.MouseEvent) => {\n    // Don't open thread if the click originated from a button, link, or other interactive element\n    const target = evt.target as HTMLElement;\n    if (target.closest('button, a, [role=\"button\"]')) return;\n    onClick(mEventId);\n  };\n\n  return (\n    <Box\n      className={css.ForumThreadItem}\n      direction=\"Row\"\n      alignItems=\"Center\"\n      onClick={handleCardClick}\n      style={{ marginTop: config.space.S200 }}\n    >\n      <Box direction=\"Column\" grow=\"Yes\" style={{ minWidth: 0 }}>\n        <ThreadRootItem {...rootProps} thread={thread} hideReplyButton />\n\n        {replyCount > 0 && (\n          <Box style={{ paddingLeft: config.space.S700, paddingTop: config.space.S100 }}>\n            <Chip\n              as=\"button\"\n              style={{ alignSelf: 'flex-start' }}\n              size=\"400\"\n              variant=\"SurfaceVariant\"\n              radii=\"300\"\n              onClick={(evt: React.MouseEvent) => {\n                evt.stopPropagation();\n                onClick(mEventId);\n              }}\n              before={\n                uniqueSenders.length > 0 ? (\n                  <Box alignItems=\"Center\" style={{ gap: 0 }}>\n                    {uniqueSenders.slice(0, 3).map((sid, index) => {\n                      const avatarMxc = getMemberAvatarMxc(room, sid);\n                      const avatarUrl = avatarMxc\n                        ? (mxcUrlToHttp(mx, avatarMxc, useAuthentication, 20, 20, 'crop') ??\n                          undefined)\n                        : undefined;\n                      const dn =\n                        getMemberDisplayName(room, sid, nicknames) ?? getMxIdLocalPart(sid) ?? sid;\n                      return (\n                        <Avatar key={sid} size=\"200\" style={{ marginLeft: index > 0 ? '-4px' : 0 }}>\n                          <UserAvatar\n                            userId={sid}\n                            src={avatarUrl}\n                            alt={dn}\n                            renderFallback={() => (\n                              <span style={{ fontSize: '10px', fontWeight: 'bold', lineHeight: 1 }}>\n                                {dn[0]?.toUpperCase() ?? '?'}\n                              </span>\n                            )}\n                          />\n                        </Avatar>\n                      );\n                    })}\n                  </Box>\n                ) : undefined\n              }\n            >\n              <Text size=\"T300\" style={{ whiteSpace: 'nowrap' }}>\n                {replyCount}&nbsp;{replyCount === 1 ? 'reply' : 'replies'}\n              </Text>\n              {lastBody && (\n                <Text\n                  size=\"T300\"\n                  style={{\n                    opacity: 0.7,\n                    overflow: 'hidden',\n                    textOverflow: 'ellipsis',\n                    whiteSpace: 'nowrap',\n                  }}\n                >\n                  &nbsp;·&nbsp;{lastDisplayName}:&nbsp;{lastBody.slice(0, 60)}\n                </Text>\n              )}\n            </Chip>\n          </Box>\n        )}\n      </Box>\n    </Box>\n  );\n}\n","import type { MouseEventHandler } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Button, IconButton, Line, Scroll, Text, color, config } from 'folds';\nimport { useAtom, useAtomValue } from 'jotai';\nimport type { EventTimeline, MatrixEvent, Room } from 'matrix-js-sdk';\nimport { Direction, EventType, RoomEvent } from 'matrix-js-sdk';\nimport { type RoomEventHandlerMap } from 'matrix-js-sdk/lib/models/room';\nimport type { Thread } from 'matrix-js-sdk/lib/models/thread';\nimport { ThreadEvent } from 'matrix-js-sdk/lib/models/thread';\nimport type { HTMLReactParserOptions } from 'html-react-parser';\nimport type { Opts as LinkifyOpts } from 'linkifyjs';\nimport { useDisplayedEventId, useRoom } from '$hooks/useRoom';\nimport { useMatrixClient } from '$hooks/useMatrixClient';\nimport { Page, PageContent, PageContentCenter, PageHeroSection } from '$components/page';\nimport { CaretUp, Chats, composerIcon, sizedIcon } from '$components/icons/phosphor';\nimport { MembersDrawer } from '$features/room/MembersDrawer';\nimport { ThreadDrawer } from '$features/room/ThreadDrawer';\nimport { useSetting } from '$state/hooks/settings';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { settingsAtom } from '$state/settings';\nimport { ForumHeader } from './ForumHeader';\nimport { ForumHero } from './ForumHero';\nimport { ForumThreadItem } from './ForumThreadItem';\nimport { ScrollTopContainer } from '$components/scroll-top-container';\nimport { PowerLevelsContextProvider, usePowerLevels } from '$hooks/usePowerLevels';\nimport { roomIdToOpenThreadAtomFamily } from '$state/room/roomToOpenThread';\nimport { useMediaAuthentication } from '$hooks/useMediaAuthentication';\nimport { useRoomMembers } from '$hooks/useRoomMembers';\nimport { getThreadReplyEvents, reactionOrEditEvent } from '$utils/room/relations';\nimport { mxcUrlToHttp, toggleReaction } from '$utils/matrix';\nimport { useStateEvent } from '$hooks/useStateEvent';\nimport { useRoomCreators } from '$hooks/useRoomCreators';\nimport { useRoomPermissions } from '$hooks/useRoomPermissions';\nimport { useEditor } from '$components/editor';\nimport { RoomInputPlaceholder } from '$features/room/RoomInputPlaceholder';\nimport { RoomTombstone } from '$features/room/RoomTombstone';\nimport { RoomInput } from '$features/room/RoomInput';\nimport { useImagePackRooms } from '$hooks/useImagePackRooms';\nimport { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile';\nimport { roomToParentsAtom } from '$state/room/roomToParents';\nimport { CustomStateEvent } from '$types/matrix/room';\nimport type { RoomBannerContent } from '$types/matrix-sdk-events';\nimport { useMentionClickHandler } from '$hooks/useMentionClickHandler';\nimport { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler';\nimport {\n  factoryRenderLinkifyWithMention,\n  getReactCustomHtmlParser,\n  LINKIFY_OPTS,\n  makeMentionCustomProps,\n  renderMatrixMention,\n} from '$plugins/react-custom-html-parser';\nimport { useSettingsLinkBaseUrl } from '$features/settings/useSettingsLinkBaseUrl';\nimport { GlobalModalManager } from '$components/message/modals/GlobalModalManager';\n\ntype ForumPost = {\n  eventId: string;\n  mEvent: MatrixEvent;\n  thread?: Thread;\n  ts: number;\n};\n\n/**\n * Collect all top-level messages (not thread replies, not reactions/edits/redacted)\n * and return them as ForumPost items, sorted by latest activity descending.\n */\nconst isPlainReplyEvent = (event: MatrixEvent): boolean => {\n  const content = event.getContent<Record<string, unknown>>();\n  const relation = content['m.relates_to'];\n  if (relation && typeof relation === 'object') {\n    const inReplyTo = (relation as { ['m.in_reply_to']?: unknown })['m.in_reply_to'];\n    if (inReplyTo && typeof inReplyTo === 'object') {\n      return typeof (inReplyTo as { event_id?: unknown }).event_id === 'string';\n    }\n  }\n\n  const inReplyTo = content['m.in_reply_to'];\n  return (\n    !!inReplyTo &&\n    typeof inReplyTo === 'object' &&\n    typeof (inReplyTo as { event_id?: unknown }).event_id === 'string'\n  );\n};\n\nexport const collectForumPosts = (room: Room): ForumPost[] => {\n  const threadMap = new Map<string, Thread>();\n  room.getThreads().forEach((thread) => {\n    threadMap.set(thread.id, thread);\n  });\n\n  const posts = new Map<string, ForumPost>();\n\n  // Add all thread roots (even if not in the visible timeline)\n  threadMap.forEach((thread, threadId) => {\n    const { rootEvent } = thread;\n    if (!rootEvent) return;\n    // Skip redacted root messages with no visible replies\n    if (rootEvent.isRedacted()) {\n      const replies = getThreadReplyEvents(room, threadId);\n      if (replies.length === 0) return;\n    }\n    const lastTs = thread.events.at(-1)?.getTs() ?? rootEvent.getTs();\n    posts.set(threadId, {\n      eventId: threadId,\n      mEvent: rootEvent,\n      thread,\n      ts: lastTs,\n    });\n  });\n\n  const events = room\n    .getUnfilteredTimelineSet()\n    .getTimelines()\n    .flatMap((timeline) => timeline.getEvents());\n  events.forEach((ev) => {\n    const evId = ev.getId();\n    if (!evId) return;\n    if (posts.has(evId)) return; // already added as thread root\n    if (ev.isRedacted()) return;\n    if (reactionOrEditEvent(ev)) return;\n    if (\n      ev.getType() !== (EventType.RoomMessage as string) &&\n      ev.getType() !== (EventType.RoomMessageEncrypted as string) &&\n      ev.getType() !== (EventType.Sticker as string)\n    ) {\n      return;\n    }\n    if (ev.getRelation()?.rel_type === 'm.thread') return;\n    if (isPlainReplyEvent(ev)) return;\n    if (ev.isState()) return; // skip state events\n\n    posts.set(evId, {\n      eventId: evId,\n      mEvent: ev,\n      thread: undefined,\n      ts: ev.getTs(),\n    });\n  });\n\n  // Sort by latest activity descending\n  return Array.from(posts.values()).toSorted((a, b) => b.ts - a.ts);\n};\n\nexport function ForumView() {\n  const mx = useMatrixClient();\n  const room = useRoom();\n  const eventId = useDisplayedEventId();\n  const powerLevels = usePowerLevels(room);\n  const members = useRoomMembers(mx, room.roomId);\n\n  const useAuthentication = useMediaAuthentication();\n  const bannerState = useStateEvent(room, CustomStateEvent.RoomBanner);\n  const bannerMxc = bannerState?.getContent<RoomBannerContent>()?.url;\n  const bannerUrl = bannerMxc\n    ? (mxcUrlToHttp(mx, bannerMxc, useAuthentication) ?? undefined)\n    : undefined;\n\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const roomViewRef = useRef<HTMLDivElement>(null);\n  const heroSectionRef = useRef<HTMLDivElement>(null);\n  const editor = useEditor();\n  const [isDrawer] = useSetting(settingsAtom, 'isPeopleDrawer');\n  const screenSize = useScreenSizeContext();\n  const [onTop, setOnTop] = useState(true);\n\n  const [openThreadId, setOpenThread] = useAtom(roomIdToOpenThreadAtomFamily(room.roomId));\n  const [updateKey, forceUpdate] = useState(0);\n  const [editId, setEditId] = useState<string | undefined>(undefined);\n  const [loadingOlderPosts, setLoadingOlderPosts] = useState(false);\n  const [canLoadOlderPosts, setCanLoadOlderPosts] = useState(\n    () => room.getLiveTimeline().getPaginationToken(Direction.Backward) !== null\n  );\n\n  // Settings\n  const [messageLayout] = useSetting(settingsAtom, 'messageLayout');\n  const [messageSpacing] = useSetting(settingsAtom, 'messageSpacing');\n  const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock');\n  const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString');\n  const [hideReads] = useSetting(settingsAtom, 'hideReads');\n  const [showDeveloperTools] = useSetting(settingsAtom, 'developerTools');\n\n  const mentionClickHandler = useMentionClickHandler(room.roomId);\n  const spoilerClickHandler = useSpoilerClickHandler();\n  const settingsLinkBaseUrl = useSettingsLinkBaseUrl();\n\n  const linkifyOpts = useMemo<LinkifyOpts>(\n    () => ({\n      ...LINKIFY_OPTS,\n      render: factoryRenderLinkifyWithMention(\n        settingsLinkBaseUrl,\n        (href) =>\n          renderMatrixMention(mx, room.roomId, href, makeMentionCustomProps(mentionClickHandler)),\n        mentionClickHandler\n      ),\n    }),\n    [mx, room, mentionClickHandler, settingsLinkBaseUrl]\n  );\n\n  const htmlReactParserOptions = useMemo<HTMLReactParserOptions>(\n    () =>\n      getReactCustomHtmlParser(mx, room.roomId, {\n        settingsLinkBaseUrl,\n        linkifyOpts,\n        useAuthentication,\n        handleSpoilerClick: spoilerClickHandler,\n        handleMentionClick: mentionClickHandler,\n      }),\n    [\n      mx,\n      room,\n      settingsLinkBaseUrl,\n      linkifyOpts,\n      spoilerClickHandler,\n      mentionClickHandler,\n      useAuthentication,\n    ]\n  );\n\n  // Power levels & permissions\n  const creators = useRoomCreators(room);\n  const permissions = useRoomPermissions(creators, powerLevels);\n  const canRedact = permissions.action('redact', mx.getSafeUserId());\n  const canDeleteOwn = permissions.event(EventType.RoomRedaction, mx.getSafeUserId());\n  const canSendReaction = permissions.event(EventType.Reaction, mx.getSafeUserId());\n  const canPinEvent = permissions.stateEvent(EventType.RoomPinnedEvents, mx.getSafeUserId());\n  const canMessage = permissions.event(EventType.RoomMessage, mx.getSafeUserId());\n  const tombstoneEvent = useStateEvent(room, EventType.RoomTombstone);\n\n  // Image packs\n  const roomToParents = useAtomValue(roomToParentsAtom);\n  const imagePackRooms: Room[] = useImagePackRooms(room.roomId, roomToParents);\n\n  // User profile popup\n  const openUserRoomProfile = useOpenUserRoomProfile();\n\n  // Fetch threads from server on mount (same as RoomViewHeader does)\n  useEffect(() => {\n    const scanTimelineForThreads = (timeline: EventTimeline) => {\n      const events = timeline.getEvents();\n      const threadRoots = new Set<string>();\n\n      events.forEach((event: MatrixEvent) => {\n        if (event.isThreadRoot) {\n          const rootId = event.getId();\n          if (rootId && !room.getThread(rootId)) {\n            threadRoots.add(rootId);\n          }\n        }\n\n        const { threadRootId } = event;\n        if (threadRootId && !room.getThread(threadRootId)) {\n          threadRoots.add(threadRootId);\n        }\n      });\n\n      threadRoots.forEach((rootId) => {\n        const rootEvent = room.findEventById(rootId);\n        if (rootEvent) {\n          room.createThread(rootId, rootEvent, [], false);\n        }\n      });\n    };\n\n    const liveTimeline = room.getLiveTimeline();\n    scanTimelineForThreads(liveTimeline);\n\n    let backwardTimeline = liveTimeline.getNeighbouringTimeline(Direction.Backward);\n    while (backwardTimeline) {\n      scanTimelineForThreads(backwardTimeline);\n      backwardTimeline = backwardTimeline.getNeighbouringTimeline(Direction.Backward);\n    }\n\n    let cancelled = false;\n    const loadThreads = async () => {\n      const sets = await room.createThreadsTimelineSets();\n      const [threadListTimelineSet] = sets ?? [];\n      if (!threadListTimelineSet || cancelled) return;\n\n      await room.fetchRoomThreads();\n      await mx.paginateEventTimeline(threadListTimelineSet.getLiveTimeline(), {\n        backwards: true,\n      });\n\n      threadListTimelineSet\n        .getLiveTimeline()\n        .getEvents()\n        .forEach((rootEvent) => {\n          const rootId = rootEvent.getId();\n          if (!rootId) return;\n          const thread = room.getThread(rootId);\n          if (!thread) {\n            room.createThread(rootId, rootEvent, [], false);\n          } else if (!thread.rootEvent) {\n            thread.rootEvent = rootEvent;\n            thread.setEventMetadata(rootEvent);\n          }\n        });\n\n      if (!cancelled) {\n        setCanLoadOlderPosts(\n          room.getLiveTimeline().getPaginationToken(Direction.Backward) !== null\n        );\n        forceUpdate((n) => n + 1);\n      }\n    };\n\n    loadThreads().catch(() => {\n      // Silently ignore, server may not support threads.\n    });\n\n    return () => {\n      cancelled = true;\n    };\n  }, [mx, room]);\n\n  useEffect(() => {\n    if (!eventId) return;\n\n    const event = room.findEventById(eventId);\n    let threadRootId = event?.threadRootId;\n    if (!threadRootId && room.getThread(eventId)) {\n      threadRootId = eventId;\n    }\n    if (!threadRootId) {\n      const thread = room\n        .getThreads()\n        .find(\n          (candidate) =>\n            candidate.id === eventId || candidate.events.some((ev) => ev.getId() === eventId)\n        );\n      threadRootId = thread?.id;\n    }\n\n    if (threadRootId && openThreadId !== threadRootId) {\n      setOpenThread(threadRootId);\n    }\n  }, [eventId, openThreadId, room, setOpenThread, updateKey]);\n\n  // Re-render when threads or timeline change\n  useEffect(() => {\n    const createdThreads = new Set<string>();\n    const onThreadNew: RoomEventHandlerMap[ThreadEvent.New] = () => {\n      forceUpdate((n) => n + 1);\n    };\n    const onThreadUpdate: RoomEventHandlerMap[ThreadEvent.Update] = () => {\n      forceUpdate((n) => n + 1);\n    };\n    const onThreadReply: RoomEventHandlerMap[ThreadEvent.NewReply] = () => {\n      forceUpdate((n) => n + 1);\n    };\n    const onTimeline: RoomEventHandlerMap[RoomEvent.Timeline] = (mEvent) => {\n      if (mEvent.isThreadRoot) {\n        const rootId = mEvent.getId();\n        if (rootId && !room.getThread(rootId) && !createdThreads.has(rootId)) {\n          const rootEvent = room.findEventById(rootId);\n          if (rootEvent) {\n            createdThreads.add(rootId);\n            room.createThread(rootId, rootEvent, [], false);\n          }\n        }\n        forceUpdate((n) => n + 1);\n        return;\n      }\n\n      const { threadRootId } = mEvent;\n      if (threadRootId) {\n        if (!room.getThread(threadRootId) && !createdThreads.has(threadRootId)) {\n          const rootEvent = room.findEventById(threadRootId);\n          if (rootEvent) {\n            createdThreads.add(threadRootId);\n            room.createThread(threadRootId, rootEvent, [], false);\n          }\n        }\n        forceUpdate((n) => n + 1);\n        return;\n      }\n      if (mEvent.isState()) return;\n      if (reactionOrEditEvent(mEvent)) return;\n      if (!mEvent.getContent()?.msgtype) return;\n      forceUpdate((n) => n + 1);\n    };\n    const onRedaction: RoomEventHandlerMap[RoomEvent.Redaction] = (mEvent) => {\n      if (mEvent.threadRootId || mEvent.isThreadRoot) {\n        forceUpdate((n) => n + 1);\n        return;\n      }\n      forceUpdate((n) => n + 1);\n    };\n\n    const onUnreadNotifications = () => forceUpdate((n) => n + 1);\n\n    room.on(RoomEvent.Timeline, onTimeline);\n    room.on(RoomEvent.Redaction, onRedaction);\n    room.on(RoomEvent.UnreadNotifications, onUnreadNotifications);\n    room.on(ThreadEvent.New, onThreadNew);\n    room.on(ThreadEvent.Update, onThreadUpdate);\n    room.on(ThreadEvent.NewReply, onThreadReply);\n    const cleanup = () => {\n      room.removeListener(RoomEvent.Timeline, onTimeline);\n      room.removeListener(RoomEvent.Redaction, onRedaction);\n      room.removeListener(RoomEvent.UnreadNotifications, onUnreadNotifications);\n      room.removeListener(ThreadEvent.New, onThreadNew);\n      room.removeListener(ThreadEvent.Update, onThreadUpdate);\n      room.removeListener(ThreadEvent.NewReply, onThreadReply);\n    };\n\n    return cleanup;\n  }, [room]);\n\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const posts = useMemo(() => collectForumPosts(room), [room, updateKey]);\n\n  const handleLoadOlderPosts = useCallback(async () => {\n    if (loadingOlderPosts || !canLoadOlderPosts) return;\n\n    setLoadingOlderPosts(true);\n    try {\n      const hasMore = await mx.paginateEventTimeline(room.getLiveTimeline(), {\n        backwards: true,\n        limit: 50,\n      });\n      setCanLoadOlderPosts(\n        hasMore && room.getLiveTimeline().getPaginationToken(Direction.Backward) !== null\n      );\n      forceUpdate((n) => n + 1);\n    } catch {\n      setCanLoadOlderPosts(false);\n    } finally {\n      setLoadingOlderPosts(false);\n    }\n  }, [canLoadOlderPosts, loadingOlderPosts, mx, room]);\n\n  const handleOpenThread = useCallback(\n    (postEventId: string) => {\n      setOpenThread(postEventId);\n    },\n    [setOpenThread]\n  );\n\n  const handleUserClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      const userId = evt.currentTarget.getAttribute('data-user-id');\n      if (!userId) return;\n      openUserRoomProfile(\n        room.roomId,\n        undefined,\n        userId,\n        undefined,\n        evt.currentTarget.getBoundingClientRect()\n      );\n    },\n    [room, openUserRoomProfile]\n  );\n\n  const handleUsernameClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      const userId = evt.currentTarget.getAttribute('data-user-id');\n      if (!userId) return;\n      // In forum view, username click opens profile (no editor to insert mention into)\n      openUserRoomProfile(\n        room.roomId,\n        undefined,\n        userId,\n        undefined,\n        evt.currentTarget.getBoundingClientRect()\n      );\n    },\n    [room, openUserRoomProfile]\n  );\n\n  const handleReplyClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      const replyId = evt.currentTarget.getAttribute('data-event-id');\n      if (!replyId) return;\n      // In forum view, clicking reply opens the thread\n      setOpenThread(replyId);\n    },\n    [setOpenThread]\n  );\n\n  const handleReactionToggle = useCallback(\n    (targetEventId: string, key: string, shortcode?: string) => {\n      const thread = room.getThread(targetEventId);\n      const threadTimelineSet = thread?.timelineSet;\n      toggleReaction(mx, room, targetEventId, key, shortcode, threadTimelineSet);\n    },\n    [mx, room]\n  );\n\n  const handleEdit = useCallback((evtId?: string) => {\n    setEditId(evtId);\n  }, []);\n\n  const handleOpenReply: MouseEventHandler<HTMLButtonElement> = useCallback(\n    (evt) => {\n      const targetId = evt.currentTarget.getAttribute('data-event-id');\n      if (!targetId) return;\n      // Scroll to the post or open thread\n      setOpenThread(targetId);\n    },\n    [setOpenThread]\n  );\n\n  const [showInteractiveMap] = useSetting(settingsAtom, 'showInteractiveMap');\n  const [showEncInteractiveMap] = useSetting(settingsAtom, 'showEncInteractiveMap');\n  const showMaps = room.hasEncryptionStateEvent() ? showEncInteractiveMap : showInteractiveMap;\n\n  return (\n    <PowerLevelsContextProvider value={powerLevels}>\n      <Box grow=\"Yes\">\n        <Page>\n          <ForumHeader showProfile={!onTop} room={room} powerLevels={powerLevels} />\n          <Box style={{ position: 'relative' }} grow=\"Yes\">\n            <Scroll ref={scrollRef} hideTrack visibility=\"Hover\">\n              <PageContent>\n                <PageContentCenter>\n                  <ScrollTopContainer\n                    scrollRef={scrollRef}\n                    anchorRef={heroSectionRef}\n                    onVisibilityChange={setOnTop}\n                  >\n                    <IconButton\n                      onClick={() => scrollRef.current?.scrollTo({ top: 0, behavior: 'smooth' })}\n                      variant=\"SurfaceVariant\"\n                      radii=\"Pill\"\n                      outlined\n                      size=\"300\"\n                      aria-label=\"Scroll to Top\"\n                    >\n                      {composerIcon(CaretUp)}\n                    </IconButton>\n                  </ScrollTopContainer>\n                  <PageHeroSection\n                    ref={heroSectionRef}\n                    style={{\n                      padding: bannerUrl ? 40 : 0,\n                      borderTopLeftRadius: config.radii.R400,\n                      borderTopRightRadius: config.radii.R400,\n                      overflow: 'hidden',\n                      backgroundSize: 'cover',\n                      backgroundPosition: 'center',\n                      backgroundRepeat: 'no-repeat',\n                      backgroundImage: bannerUrl\n                        ? `linear-gradient(to bottom, transparent, ${color.Surface.Container} 77%), url(${bannerUrl})`\n                        : undefined,\n                      maxWidth: bannerUrl ? 'unset' : undefined,\n                      textShadow: bannerUrl\n                        ? `1px 1px 0px ${color.Surface.Container}, -1px -1px 0px ${color.Surface.Container}, 1px -1px 0px ${color.Surface.Container}, -1px 1px 0px ${color.Surface.Container}`\n                        : undefined,\n                    }}\n                  >\n                    <ForumHero room={room} />\n                  </PageHeroSection>\n                  <Box\n                    ref={roomViewRef}\n                    shrink=\"No\"\n                    direction=\"Column\"\n                    style={{ padding: `${config.space.S400} 0` }}\n                  >\n                    {tombstoneEvent ? (\n                      <RoomTombstone\n                        roomId={room.roomId}\n                        body={tombstoneEvent.getContent().body}\n                        replacementRoomId={tombstoneEvent.getContent().replacement_room}\n                      />\n                    ) : (\n                      <>\n                        {canMessage && (\n                          <RoomInput\n                            room={room}\n                            editor={editor}\n                            roomId={room.roomId}\n                            fileDropContainerRef={roomViewRef}\n                          />\n                        )}\n                        {!canMessage && (\n                          <RoomInputPlaceholder\n                            style={{ padding: config.space.S200 }}\n                            alignItems=\"Center\"\n                            justifyContent=\"Center\"\n                          >\n                            <Text align=\"Center\">\n                              You do not have permission to post in this room\n                            </Text>\n                          </RoomInputPlaceholder>\n                        )}\n                      </>\n                    )}\n                  </Box>\n                  {posts.map((post) => (\n                    <ForumThreadItem\n                      key={post.eventId}\n                      room={room}\n                      mEvent={post.mEvent}\n                      thread={post.thread}\n                      editId={editId}\n                      onEditId={handleEdit}\n                      messageLayout={messageLayout}\n                      messageSpacing={messageSpacing}\n                      canDelete={canRedact || canDeleteOwn}\n                      canSendReaction={canSendReaction}\n                      canPinEvent={canPinEvent}\n                      imagePackRooms={imagePackRooms}\n                      hour24Clock={hour24Clock}\n                      dateFormatString={dateFormatString}\n                      onUserClick={handleUserClick}\n                      onUsernameClick={handleUsernameClick}\n                      onReplyClick={handleReplyClick}\n                      onReactionToggle={handleReactionToggle}\n                      linkifyOpts={linkifyOpts}\n                      htmlReactParserOptions={htmlReactParserOptions}\n                      showHideReads={hideReads}\n                      showDeveloperTools={showDeveloperTools}\n                      onReferenceClick={handleOpenReply}\n                      onClick={handleOpenThread}\n                      showMaps={showMaps}\n                    />\n                  ))}\n                  {canLoadOlderPosts && (\n                    <Box\n                      alignItems=\"Center\"\n                      justifyContent=\"Center\"\n                      style={{ paddingTop: config.space.S300 }}\n                    >\n                      <Button\n                        size=\"300\"\n                        variant=\"Secondary\"\n                        fill=\"Soft\"\n                        radii=\"300\"\n                        disabled={loadingOlderPosts}\n                        onClick={handleLoadOlderPosts}\n                      >\n                        <Text size=\"B300\">\n                          {loadingOlderPosts ? 'Loading older posts…' : 'Load older posts'}\n                        </Text>\n                      </Button>\n                    </Box>\n                  )}\n                  {posts.length === 0 && (\n                    <Box\n                      direction=\"Column\"\n                      alignItems=\"Center\"\n                      justifyContent=\"Center\"\n                      style={{ padding: config.space.S700, gap: config.space.S300 }}\n                    >\n                      {sizedIcon(Chats, '400')}\n                      <Text size=\"T300\" align=\"Center\" priority=\"300\">\n                        No posts yet.\n                      </Text>\n                    </Box>\n                  )}\n                </PageContentCenter>\n              </PageContent>\n            </Scroll>\n          </Box>\n        </Page>\n        {screenSize === ScreenSize.Desktop && openThreadId && (\n          <>\n            <Line variant=\"Background\" direction=\"Vertical\" size=\"300\" />\n            <ThreadDrawer\n              key={`thread-${room.roomId}-${openThreadId}`}\n              room={room}\n              threadRootId={openThreadId}\n              onClose={() => setOpenThread(undefined)}\n            />\n          </>\n        )}\n        {screenSize === ScreenSize.Desktop && !openThreadId && isDrawer && (\n          <>\n            <Line variant=\"Background\" direction=\"Vertical\" size=\"300\" />\n            <MembersDrawer key={room.roomId} room={room} members={members} />\n          </>\n        )}\n        {screenSize !== ScreenSize.Desktop && openThreadId && (\n          <ThreadDrawer\n            key={`thread-${room.roomId}-${openThreadId}`}\n            room={room}\n            threadRootId={openThreadId}\n            onClose={() => setOpenThread(undefined)}\n            overlay\n          />\n        )}\n      </Box>\n      <GlobalModalManager />\n    </PowerLevelsContextProvider>\n  );\n}\n","import { useEffect } from 'react';\nimport { useNavigate, useParams, useSearchParams } from 'react-router';\nimport { ForumView } from '$features/forum';\nimport { Room } from '$features/room';\nimport { useRoom } from '$hooks/useRoom';\nimport {\n  getDirectForumPath,\n  getDirectRoomPath,\n  getHomeForumPath,\n  getHomeRoomPath,\n  getSpaceForumPath,\n  getSpaceRoomPath,\n} from '$pages/pathUtils';\nimport { ROOM_TIMELINE_SEARCH_PARAM } from '$pages/paths';\nimport { CustomRoomType } from '$types/matrix/room';\n\nexport type RoomRouteSection = 'home' | 'direct' | 'space';\n\ntype RoomGateProps = {\n  section: RoomRouteSection;\n  /** Which view the current route shows: forum or timeline. */\n  forum: boolean;\n  roomIdOrAlias?: string;\n  spaceIdOrAlias?: string;\n  eventId?: string;\n};\n\n/** Renders the view matching the room type, redirecting when the route shows the other one. */\nexport function RoomGate({\n  section,\n  forum,\n  roomIdOrAlias,\n  spaceIdOrAlias,\n  eventId,\n}: RoomGateProps) {\n  const room = useRoom();\n  const navigate = useNavigate();\n  const [searchParams] = useSearchParams();\n  // Lets the developer tools open a forum room's timeline without being redirected back.\n  const timelineRequested = !forum && searchParams.get(ROOM_TIMELINE_SEARCH_PARAM) === 'true';\n  const isForum = room.getType() === CustomRoomType.Forum && !timelineRequested;\n\n  useEffect(() => {\n    if (isForum === forum) return;\n\n    if (!roomIdOrAlias) return;\n\n    let path: string;\n    if (section === 'space') {\n      if (!spaceIdOrAlias) return;\n      path = isForum\n        ? getSpaceForumPath(spaceIdOrAlias, roomIdOrAlias, eventId)\n        : getSpaceRoomPath(spaceIdOrAlias, roomIdOrAlias, eventId);\n    } else if (section === 'direct') {\n      path = isForum\n        ? getDirectForumPath(roomIdOrAlias, eventId)\n        : getDirectRoomPath(roomIdOrAlias, eventId);\n    } else {\n      path = isForum\n        ? getHomeForumPath(roomIdOrAlias, eventId)\n        : getHomeRoomPath(roomIdOrAlias, eventId);\n    }\n\n    navigate(path, { replace: true });\n  }, [eventId, forum, isForum, navigate, roomIdOrAlias, section, spaceIdOrAlias]);\n\n  if (isForum !== forum) return null;\n  return forum ? <ForumView /> : <Room />;\n}\n\ntype RoomRouteProps = {\n  section: RoomRouteSection;\n  forum: boolean;\n};\n\nconst decodeParam = (value: string | undefined): string | undefined =>\n  value ? decodeURIComponent(value) : undefined;\n\nexport function RoomRoute({ section, forum }: RoomRouteProps) {\n  const { roomIdOrAlias, spaceIdOrAlias, eventId } = useParams();\n  return (\n    <RoomGate\n      section={section}\n      forum={forum}\n      roomIdOrAlias={decodeParam(roomIdOrAlias)}\n      spaceIdOrAlias={decodeParam(spaceIdOrAlias)}\n      eventId={decodeParam(eventId)}\n    />\n  );\n}\n","import type { ReactNode } from 'react';\nimport { useLocation } from 'react-router';\nimport { useAtomValue } from 'jotai';\nimport { Room } from '$features/room';\nimport { IsInactivePanelProvider } from '$hooks/useRoom';\nimport { HomeRouteRoomProvider } from '$pages/client/home';\nimport { DirectRouteRoomProvider } from '$pages/client/direct';\nimport { SpaceRouteRoomProvider } from '$pages/client/space';\nimport { RoomGate, type RoomRouteSection } from '$pages/client/RoomRoute';\nimport { lastVisitedRoomAtom } from '$state/room/lastRoom';\nimport { resolveSection, type SectionNav } from '$pages/pathUtils';\nimport { matchRoomRoute, type RoomRouteMatch } from '$pages/roomRouteMatch';\n\nfunction useDisplayedRoom(\n  section: SectionNav | null,\n  roomRoute: RoomRouteMatch | undefined\n): RoomRouteMatch | undefined {\n  const lastRoom = useAtomValue(lastVisitedRoomAtom);\n\n  if (!section || !section.getRoomPath) return undefined;\n\n  if (roomRoute) return roomRoute;\n\n  const lastRoomId = lastRoom?.[section.key];\n  if (lastRoomId) {\n    return { roomIdOrAlias: lastRoomId };\n  }\n\n  return undefined;\n}\n\nfunction sectionRoute(\n  sectionKey: string\n): { kind: RoomRouteSection; spaceIdOrAlias?: string } | undefined {\n  if (sectionKey === 'home') return { kind: 'home' };\n  if (sectionKey === 'direct') return { kind: 'direct' };\n  if (sectionKey.startsWith('space:')) {\n    return { kind: 'space', spaceIdOrAlias: sectionKey.slice('space:'.length) };\n  }\n  return undefined;\n}\n\nexport function PersistentRoomHost({ inactive }: { inactive: boolean }) {\n  const location = useLocation();\n  const section = resolveSection(location.pathname);\n  const roomRoute = matchRoomRoute(location.pathname);\n  const displayed = useDisplayedRoom(section, roomRoute);\n\n  if (!displayed) return null;\n\n  // The gate redirects forum rooms opened on a timeline route; list preloads keep the plain timeline.\n  const hostedSection = section ? sectionRoute(section.key) : undefined;\n  const roomNode =\n    roomRoute && hostedSection ? (\n      <RoomGate\n        section={hostedSection.kind}\n        forum={false}\n        roomIdOrAlias={displayed.roomIdOrAlias}\n        spaceIdOrAlias={hostedSection.spaceIdOrAlias}\n        eventId={displayed.eventId}\n      />\n    ) : (\n      <Room />\n    );\n\n  let hosted: ReactNode = null;\n  if (section?.key === 'home') {\n    hosted = (\n      <HomeRouteRoomProvider roomIdOrAlias={displayed.roomIdOrAlias} eventId={displayed.eventId}>\n        {roomNode}\n      </HomeRouteRoomProvider>\n    );\n  } else if (section?.key === 'direct') {\n    hosted = (\n      <DirectRouteRoomProvider roomIdOrAlias={displayed.roomIdOrAlias} eventId={displayed.eventId}>\n        {roomNode}\n      </DirectRouteRoomProvider>\n    );\n  } else if (section?.key.startsWith('space:')) {\n    hosted = (\n      <SpaceRouteRoomProvider roomIdOrAlias={displayed.roomIdOrAlias} eventId={displayed.eventId}>\n        {roomNode}\n      </SpaceRouteRoomProvider>\n    );\n  }\n\n  if (!hosted) return null;\n\n  return <IsInactivePanelProvider value={inactive}>{hosted}</IsInactivePanelProvider>;\n}\n","import type { ReactNode } from 'react';\nimport {\n  startTransition,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { matchPath, useLocation, useNavigate } from 'react-router';\nimport { lastVisitedRoomAtom } from '$state/room/lastRoom';\nimport { usePrefersReducedMotion } from '$hooks/usePrefersReducedMotion';\nimport { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, INBOX_PATH, SPACE_PATH } from '$pages/paths';\nimport { resolveSection } from '$pages/pathUtils';\nimport { matchRoomRoute } from '$pages/roomRouteMatch';\nimport { PersistentRoomHost } from './PersistentRoomHost';\nimport { MobileNavDrawerContext, type MobileSwipeTarget } from './MobileNavDrawerContext';\nimport {\n  classifyMobileGesture,\n  getDrawerSettlePosition,\n  type MobileGestureMode,\n} from './mobileSwipeCoordinator';\n\ntype MobileNavDrawerProps = {\n  nav: ReactNode;\n  rail?: ReactNode;\n  bottomNav?: ReactNode;\n  children: ReactNode;\n};\n\nconst DRAWER_TRANSITION_MS = 220;\n\ntype ActiveTouchGesture = {\n  startX: number;\n  startY: number;\n  startPosition: number;\n  lastX: number;\n  lastTime: number;\n  velocityX: number;\n  mode: MobileGestureMode;\n  message?: MobileSwipeTarget;\n  chat?: MobileSwipeTarget;\n};\n\n/** Sliding mobile drawer with one touch coordinator and a GPU-transformed panel track. */\nexport function MobileNavDrawer({ nav, rail, bottomNav, children }: MobileNavDrawerProps) {\n  const reduceMotion = usePrefersReducedMotion();\n  const location = useLocation();\n  const navigate = useNavigate();\n  const setLastRoom = useSetAtom(lastVisitedRoomAtom);\n  const lastRoom = useAtomValue(lastVisitedRoomAtom);\n\n  const openableSection = resolveSection(location.pathname);\n  const canOpenRoom = Boolean(\n    openableSection && openableSection.getRoomPath && lastRoom?.[openableSection.key]\n  );\n\n  const roomRoute = matchRoomRoute(location.pathname);\n  const matchedRoomId = roomRoute?.roomIdOrAlias;\n  const isRoomRoute = roomRoute !== undefined;\n\n  const listView =\n    matchPath({ path: HOME_PATH, end: true }, location.pathname) !== null ||\n    matchPath({ path: DIRECT_PATH, end: true }, location.pathname) !== null ||\n    matchPath({ path: SPACE_PATH, end: true }, location.pathname) !== null ||\n    matchPath({ path: EXPLORE_PATH, end: true }, location.pathname) !== null ||\n    matchPath({ path: INBOX_PATH, end: true }, location.pathname) !== null;\n  const contentOpen = !listView;\n\n  const viewportRef = useRef<HTMLDivElement | null>(null);\n  const trackRef = useRef<HTMLDivElement | null>(null);\n  const navPanelRef = useRef<HTMLDivElement | null>(null);\n  const contentPanelRef = useRef<HTMLDivElement | null>(null);\n  const [width, setWidth] = useState(0);\n  const widthRef = useRef(0);\n  const positionRef = useRef(0);\n\n  const [panelIntent, setPanelIntent] = useState(contentOpen ? 1 : 0);\n  const gestureRef = useRef<ActiveTouchGesture | undefined>(undefined);\n  const messageTargetsRef = useRef(new WeakMap<HTMLElement, MobileSwipeTarget>());\n  const chatTargetsRef = useRef(new WeakMap<HTMLElement, MobileSwipeTarget>());\n  const settleAnimationRef = useRef<number | undefined>(undefined);\n  const programmaticTargetRef = useRef<number | undefined>(undefined);\n\n  const setTrackPosition = useCallback((position: number) => {\n    positionRef.current = position;\n    if (trackRef.current) {\n      trackRef.current.style.transform = `translate3d(${position}px, 0, 0)`;\n    }\n  }, []);\n\n  const settleToPanel = useCallback(\n    (targetPosition: number, onComplete?: () => void) => {\n      if (!trackRef.current) return;\n\n      window.cancelAnimationFrame(settleAnimationRef.current ?? 0);\n      if (reduceMotion) {\n        setTrackPosition(targetPosition);\n        onComplete?.();\n        return;\n      }\n\n      const startPosition = positionRef.current;\n      const distance = targetPosition - startPosition;\n      if (Math.abs(distance) <= 1) {\n        setTrackPosition(targetPosition);\n        onComplete?.();\n        return;\n      }\n\n      const startTime = window.performance.now();\n      const tick = (time: number) => {\n        const progress = Math.min(1, (time - startTime) / DRAWER_TRANSITION_MS);\n        const eased = 1 - (1 - progress) ** 3;\n        setTrackPosition(startPosition + distance * eased);\n\n        if (progress < 1) {\n          settleAnimationRef.current = window.requestAnimationFrame(tick);\n        } else {\n          setTrackPosition(targetPosition);\n          settleAnimationRef.current = undefined;\n          onComplete?.();\n        }\n      };\n\n      settleAnimationRef.current = window.requestAnimationFrame(tick);\n    },\n    [reduceMotion, setTrackPosition]\n  );\n\n  const registerMessageSwipe = useCallback((element: HTMLElement, target: MobileSwipeTarget) => {\n    messageTargetsRef.current.set(element, target);\n    return () => {\n      if (messageTargetsRef.current.get(element) === target) {\n        messageTargetsRef.current.delete(element);\n      }\n    };\n  }, []);\n\n  const registerChatSwipe = useCallback((element: HTMLElement, target: MobileSwipeTarget) => {\n    chatTargetsRef.current.set(element, target);\n    return () => {\n      if (chatTargetsRef.current.get(element) === target) {\n        chatTargetsRef.current.delete(element);\n      }\n    };\n  }, []);\n\n  const [roomArmed, setRoomArmed] = useState(() => isRoomRoute || canOpenRoom);\n  useEffect(() => {\n    if (isRoomRoute || canOpenRoom) {\n      setRoomArmed(true);\n      return undefined;\n    }\n    if (roomArmed) return undefined;\n    const ric = window.requestIdleCallback ?? ((cb: () => void) => window.setTimeout(cb, 200));\n    const cic = window.cancelIdleCallback ?? window.clearTimeout;\n    const handle = ric(() => setRoomArmed(true));\n    return () => cic(handle as number);\n  }, [isRoomRoute, canOpenRoom, roomArmed]);\n\n  const openContent = useCallback(\n    (path: string) => {\n      const viewport = viewportRef.current;\n      if (!viewport || width === 0) {\n        startTransition(() => {\n          void navigate(path);\n        });\n        return;\n      }\n\n      setRoomArmed(true);\n      programmaticTargetRef.current = -width;\n\n      // Start the exact same settle used after a swipe immediately, while the\n      // selected room renders concurrently in the panel being revealed.\n      settleToPanel(-width, () => {\n        if (programmaticTargetRef.current === -width) {\n          programmaticTargetRef.current = undefined;\n        }\n        setPanelIntent(1);\n      });\n      startTransition(() => {\n        void navigate(path);\n      });\n    },\n    [navigate, settleToPanel, width]\n  );\n\n  useLayoutEffect(() => {\n    const el = viewportRef.current;\n    if (!el) return undefined;\n    const update = () => {\n      const nextWidth = el.clientWidth;\n      const previousWidth = widthRef.current;\n      const nextPosition =\n        previousWidth > 0\n          ? (positionRef.current / previousWidth) * nextWidth\n          : contentOpen\n            ? -nextWidth\n            : 0;\n      widthRef.current = nextWidth;\n      setTrackPosition(nextPosition);\n      setWidth(nextWidth);\n    };\n    update();\n    const observer = new ResizeObserver(update);\n    observer.observe(el);\n    return () => observer.disconnect();\n  }, [contentOpen, setTrackPosition]);\n\n  useLayoutEffect(() => {\n    navPanelRef.current?.toggleAttribute('inert', panelIntent === 1);\n    contentPanelRef.current?.toggleAttribute('inert', panelIntent === 0);\n    // `inert` alone does not drop a mobile keyboard.\n    const hiddenPanel = panelIntent === 0 ? contentPanelRef.current : navPanelRef.current;\n    const focused = document.activeElement;\n    if (hiddenPanel && focused instanceof HTMLElement && hiddenPanel.contains(focused)) {\n      focused.blur();\n    }\n  }, [panelIntent]);\n\n  useLayoutEffect(() => {\n    const el = viewportRef.current;\n    if (!el || width === 0) return;\n    const targetPosition = contentOpen ? -width : 0;\n\n    if (programmaticTargetRef.current === targetPosition) return;\n\n    if (Math.abs(positionRef.current - targetPosition) > 5) {\n      settleToPanel(targetPosition, () => setPanelIntent(contentOpen ? 1 : 0));\n    } else {\n      setPanelIntent(contentOpen ? 1 : 0);\n    }\n  }, [contentOpen, settleToPanel, width]);\n\n  const commitPanel = useCallback(\n    (roomVisible: boolean) => {\n      if (width === 0) return;\n\n      setTrackPosition(roomVisible ? -width : 0);\n      setPanelIntent(roomVisible ? 1 : 0);\n\n      if (roomVisible === contentOpen) return;\n\n      if (roomVisible) {\n        const section = resolveSection(location.pathname);\n        if (section?.getRoomPath) {\n          const lastRoomId = lastRoom?.[section.key];\n          if (lastRoomId) {\n            startTransition(() => {\n              void navigate(section.getRoomPath!(lastRoomId));\n            });\n            return;\n          }\n        }\n        settleToPanel(0);\n        setPanelIntent(0);\n        return;\n      }\n\n      const section = resolveSection(location.pathname);\n      if (!section) return;\n      if (section.getRoomPath && matchedRoomId && isRoomRoute) {\n        setLastRoom((prev) => ({ ...prev, [section.key]: matchedRoomId }));\n      }\n      startTransition(() => {\n        void navigate(section.listPath);\n      });\n    },\n    [\n      contentOpen,\n      isRoomRoute,\n      lastRoom,\n      location.pathname,\n      matchedRoomId,\n      navigate,\n      settleToPanel,\n      setLastRoom,\n      setTrackPosition,\n      width,\n    ]\n  );\n\n  const finishGesture = useCallback(\n    (cancelled: boolean) => {\n      const gesture = gestureRef.current;\n      gestureRef.current = undefined;\n      if (!gesture) return;\n\n      const distanceX = gesture.lastX - gesture.startX;\n      if (gesture.mode === 'message') {\n        if (cancelled) gesture.message?.cancel();\n        else gesture.message?.end({ distanceX, velocityX: gesture.velocityX });\n        return;\n      }\n      if (gesture.mode === 'chat') {\n        if (cancelled) gesture.chat?.cancel();\n        else gesture.chat?.end({ distanceX, velocityX: gesture.velocityX });\n        return;\n      }\n      if (gesture.mode !== 'drawer' || width === 0) return;\n\n      const targetPosition = getDrawerSettlePosition({\n        startPosition: gesture.startPosition,\n        distanceX,\n        velocityX: gesture.velocityX,\n        width,\n        cancelled,\n      });\n\n      settleToPanel(targetPosition, () => commitPanel(targetPosition === -width));\n    },\n    [commitPanel, settleToPanel, width]\n  );\n\n  useEffect(() => {\n    return () => {\n      window.cancelAnimationFrame(settleAnimationRef.current ?? 0);\n      const gesture = gestureRef.current;\n      gestureRef.current = undefined;\n      gesture?.message?.cancel();\n      gesture?.chat?.cancel();\n    };\n  }, []);\n\n  const contextValue = useMemo(\n    () => ({ openContent, registerChatSwipe, registerMessageSwipe }),\n    [openContent, registerChatSwipe, registerMessageSwipe]\n  );\n\n  const drawer = (\n    <div\n      ref={viewportRef}\n      className=\"no-scrollbar\"\n      data-testid=\"mobile-nav-drawer-viewport\"\n      onTouchStartCapture={(event) => {\n        const viewport = viewportRef.current;\n        const touch = event.touches[0];\n        if (!viewport || !touch) return;\n        if (event.touches.length !== 1) {\n          finishGesture(true);\n          return;\n        }\n\n        const target = event.target instanceof Element ? event.target : event.currentTarget;\n        const messageElement = target.closest<HTMLElement>('[data-message-swipe]');\n        const chatElement = target.closest<HTMLElement>('[data-chat-swipe]');\n        const ignoredElement = target.closest<HTMLElement>('[data-gestures=\"ignore\"]');\n        const scrollingElement = target.closest<HTMLElement>('[data-gestures=\"scroll\"]');\n        const message = messageElement ? messageTargetsRef.current.get(messageElement) : undefined;\n        const chat = chatElement ? chatTargetsRef.current.get(chatElement) : undefined;\n        // Nested ignore markers (e.g. inline media) don't block swipe if they're part of\n        // this message/chat's own surface, only if they sit outside it.\n        const blockedIgnored =\n          ignoredElement !== null &&\n          !(messageElement && messageElement.contains(ignoredElement)) &&\n          !(chatElement && chatElement.contains(ignoredElement));\n\n        // If the element is horizontally scrollable (scrollWidth > clientWidth), block gestures\n        const blockedScroll =\n          scrollingElement !== null && scrollingElement.scrollWidth > scrollingElement.clientWidth;\n\n        const blocked = blockedScroll || blockedIgnored;\n\n        gestureRef.current = {\n          startX: touch.clientX,\n          startY: touch.clientY,\n          startPosition: positionRef.current,\n          lastX: touch.clientX,\n          lastTime: event.timeStamp,\n          velocityX: 0,\n          mode: blocked ? 'blocked' : 'pending',\n          message,\n          chat,\n        };\n        if (positionRef.current > -width && canOpenRoom) setRoomArmed(true);\n      }}\n      onTouchMoveCapture={(event) => {\n        const viewport = viewportRef.current;\n        const gesture = gestureRef.current;\n        const touch = event.touches[0];\n        if (!viewport || !gesture || !touch || gesture.mode === 'blocked') return;\n\n        const distanceX = touch.clientX - gesture.startX;\n        const distanceY = touch.clientY - gesture.startY;\n        const elapsed = event.timeStamp - gesture.lastTime;\n        if (elapsed > 0) {\n          gesture.velocityX = (touch.clientX - gesture.lastX) / elapsed;\n          gesture.lastX = touch.clientX;\n          gesture.lastTime = event.timeStamp;\n        }\n\n        if (gesture.mode === 'pending') {\n          gesture.mode = classifyMobileGesture({\n            distanceX,\n            distanceY,\n            startPosition: positionRef.current,\n            width,\n            canOpenRoom,\n            hasMessage: gesture.message !== undefined,\n            hasChat: gesture.chat !== undefined,\n          });\n          if (gesture.mode === 'drawer' || gesture.mode === 'message' || gesture.mode === 'chat') {\n            const animationActive = settleAnimationRef.current !== undefined;\n            window.cancelAnimationFrame(settleAnimationRef.current ?? 0);\n            settleAnimationRef.current = undefined;\n            programmaticTargetRef.current = undefined;\n            if (animationActive) gesture.startPosition = positionRef.current - distanceX;\n          }\n        }\n\n        if (gesture.mode === 'drawer') {\n          setTrackPosition(Math.max(-width, Math.min(0, gesture.startPosition + distanceX)));\n        } else if (gesture.mode === 'message') {\n          gesture.message?.move(distanceX);\n        } else if (gesture.mode === 'chat') {\n          gesture.chat?.move(distanceX);\n        }\n      }}\n      onTouchEndCapture={() => finishGesture(false)}\n      onTouchCancelCapture={() => finishGesture(true)}\n      style={{\n        display: 'flex',\n        flexGrow: 1,\n        height: '100%',\n        width: '100%',\n        // `clip`, not `hidden`: hidden keeps a scrollport, so a focus or scrollIntoView on\n        // the revealed panel scrolls it a full panel width out of frame, permanently.\n        overflow: 'clip',\n        overscrollBehaviorX: 'none',\n        touchAction: 'pan-y',\n      }}\n    >\n      <style>{`\n        .no-scrollbar::-webkit-scrollbar {\n          display: none;\n        }\n        .no-scrollbar {\n          -ms-overflow-style: none;\n          scrollbar-width: none;\n        }\n      `}</style>\n      <div\n        ref={trackRef}\n        style={{\n          display: 'flex',\n          width: '200%',\n          height: '100%',\n          flexShrink: 0,\n          transform: 'translate3d(0, 0, 0)',\n          willChange: 'transform',\n        }}\n      >\n        <div\n          ref={navPanelRef}\n          className=\"no-scrollbar\"\n          style={{\n            width: '50%',\n            flexBasis: '50%',\n            height: '100%',\n            flexShrink: 0,\n            display: 'flex',\n            flexDirection: 'column',\n            overflow: 'hidden',\n            transform: 'translateZ(0)',\n            backfaceVisibility: 'hidden',\n          }}\n        >\n          <div\n            style={{\n              flexGrow: 1,\n              minHeight: 0,\n              display: 'flex',\n              flexDirection: 'row',\n              overflow: 'hidden',\n            }}\n          >\n            {rail && (\n              <div style={{ flexShrink: 0, display: 'flex', overflow: 'hidden' }}>{rail}</div>\n            )}\n            <div style={{ flexGrow: 1, minWidth: 0, display: 'flex', overflow: 'hidden' }}>\n              {nav}\n            </div>\n          </div>\n          {bottomNav}\n        </div>\n        <div\n          ref={contentPanelRef}\n          className=\"no-scrollbar\"\n          style={{\n            width: '50%',\n            flexBasis: '50%',\n            height: '100%',\n            flexShrink: 0,\n            display: 'flex',\n            overflow: 'hidden',\n            transform: 'translateZ(0)',\n            backfaceVisibility: 'hidden',\n          }}\n        >\n          {isRoomRoute ? (\n            <PersistentRoomHost inactive={panelIntent === 0} />\n          ) : listView ? (\n            roomArmed ? (\n              <PersistentRoomHost inactive={panelIntent === 0} />\n            ) : null\n          ) : (\n            children\n          )}\n        </div>\n      </div>\n    </div>\n  );\n\n  return (\n    <MobileNavDrawerContext.Provider value={contextValue}>{drawer}</MobileNavDrawerContext.Provider>\n  );\n}\n","import type { ComponentProps, MutableRefObject, ReactNode } from 'react';\nimport { Box, Header, Line, Scroll, Text, as } from 'folds';\nimport classNames from 'classnames';\nimport { ContainerColor } from '$styles/ContainerColor.css';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { MobileNavDrawer } from './MobileNavDrawer';\nimport * as css from './style.css';\n\ntype PageRootProps = {\n  nav: ReactNode;\n  rail?: ReactNode;\n  bottomNav?: ReactNode;\n  children: ReactNode;\n  mobileDrawer?: boolean;\n};\n\nexport function PageRoot({ nav, rail, bottomNav, children, mobileDrawer = true }: PageRootProps) {\n  const screenSize = useScreenSizeContext();\n  const isMobile = screenSize === ScreenSize.Mobile;\n\n  if (isMobile && mobileDrawer) {\n    return (\n      <Box grow=\"Yes\" className={ContainerColor({ variant: 'Background' })} style={{ minWidth: 0 }}>\n        <MobileNavDrawer nav={nav} rail={rail} bottomNav={bottomNav}>\n          {children}\n        </MobileNavDrawer>\n      </Box>\n    );\n  }\n\n  return (\n    <Box grow=\"Yes\" className={ContainerColor({ variant: 'Background' })} style={{ minWidth: 0 }}>\n      {nav}\n      {!isMobile && <Line variant=\"Background\" size=\"300\" direction=\"Vertical\" />}\n      {children}\n    </Box>\n  );\n}\n\ntype ClientDrawerLayoutProps = {\n  children: ReactNode;\n};\nexport function PageNav({ size, children }: ClientDrawerLayoutProps & css.PageNavVariants) {\n  return (\n    <Box className={classNames(css.PageNav({ size }), css.PageNavBox)}>\n      <Box grow=\"Yes\" direction=\"Column\">\n        {children}\n      </Box>\n    </Box>\n  );\n}\n\ntype PageNavHeaderOwnProps = Pick<ComponentProps<typeof Header>, 'size'>;\n\nexport const PageNavHeader = as<'header', css.PageNavHeaderVariants & PageNavHeaderOwnProps>(\n  ({ className, outlined, ...props }, ref) => (\n    <Header\n      className={classNames(css.PageNavHeader({ outlined }), className)}\n      variant=\"Background\"\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport function PageNavContent({\n  scrollRef,\n  children,\n}: {\n  children: ReactNode;\n  scrollRef?: MutableRefObject<HTMLDivElement | null>;\n}) {\n  return (\n    <Box grow=\"Yes\" direction=\"Column\">\n      <Scroll\n        ref={scrollRef}\n        variant=\"Background\"\n        direction=\"Vertical\"\n        size=\"300\"\n        hideTrack\n        visibility=\"Hover\"\n      >\n        <div className={css.PageNavContent}>{children}</div>\n      </Scroll>\n    </Box>\n  );\n}\n\nexport const Page = as<'div'>(({ className, ...props }, ref) => (\n  <Box\n    grow=\"Yes\"\n    direction=\"Column\"\n    className={classNames(ContainerColor({ variant: 'Surface' }), className)}\n    {...props}\n    ref={ref}\n  />\n));\n\nexport const PageHeader = as<'div', css.PageHeaderVariants>(\n  ({ className, outlined, balance, ...props }, ref) => (\n    <Header\n      as=\"header\"\n      size=\"600\"\n      className={classNames(css.PageHeader({ balance, outlined }), className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport const PageContent = as<'div'>(({ className, ...props }, ref) => (\n  <div className={classNames(css.PageContent, className)} {...props} ref={ref} />\n));\n\nexport function PageHeroEmpty({ children }: { children: ReactNode }) {\n  return (\n    <Box\n      className={classNames(ContainerColor({ variant: 'SurfaceVariant' }), css.PageHeroEmpty)}\n      direction=\"Column\"\n      alignItems=\"Center\"\n      justifyContent=\"Center\"\n      gap=\"200\"\n    >\n      {children}\n    </Box>\n  );\n}\n\nexport const PageHeroSection = as<'div', ComponentProps<typeof Box>>(\n  ({ className, ...props }, ref) => (\n    <Box\n      direction=\"Column\"\n      className={classNames(css.PageHeroSection, className)}\n      {...props}\n      ref={ref}\n    />\n  )\n);\n\nexport function PageHero({\n  icon,\n  title,\n  subTitle,\n  children,\n}: {\n  icon: ReactNode;\n  title: ReactNode;\n  subTitle: ReactNode;\n  children?: ReactNode;\n}) {\n  return (\n    <Box direction=\"Column\" gap=\"400\">\n      <Box direction=\"Column\" alignItems=\"Center\" gap=\"200\">\n        {icon}\n      </Box>\n      <Box as=\"h2\" direction=\"Column\" gap=\"200\" alignItems=\"Center\">\n        <Text align=\"Center\" size=\"H2\">\n          {title}\n        </Text>\n        <Text align=\"Center\" priority=\"400\">\n          {subTitle}\n        </Text>\n      </Box>\n      {children}\n    </Box>\n  );\n}\n\nexport const PageContentCenter = as<'div'>(({ className, ...props }, ref) => (\n  <div className={classNames(css.PageContentCenter, className)} {...props} ref={ref} />\n));\n","import { Box, IconButton, Text } from 'folds';\nimport { ArrowLeft, composerIcon, dropzoneIcon, MagnifyingGlass } from '$components/icons/phosphor';\nimport { BackRouteHandler } from '$components/BackRouteHandler';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { PageHeader } from './Page';\n\nexport function MessageSearchHeader() {\n  const screenSize = useScreenSizeContext();\n\n  return (\n    <PageHeader balance>\n      <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n        <Box grow=\"Yes\" basis=\"No\">\n          {screenSize === ScreenSize.Mobile && (\n            <BackRouteHandler>\n              {(onBack) => <IconButton onClick={onBack}>{composerIcon(ArrowLeft)}</IconButton>}\n            </BackRouteHandler>\n          )}\n        </Box>\n        <Box justifyContent=\"Center\" alignItems=\"Center\" gap=\"200\">\n          {screenSize !== ScreenSize.Mobile && dropzoneIcon(MagnifyingGlass)}\n          <Text size=\"H3\" truncate>\n            Message Search\n          </Text>\n        </Box>\n        <Box grow=\"Yes\" basis=\"No\" />\n      </Box>\n    </PageHeader>\n  );\n}\n","import type { ReactNode } from 'react';\nimport { Box, IconButton, Text } from 'folds';\nimport { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize';\nimport { ArrowLeft, composerIcon, X } from '$components/icons/phosphor';\nimport { useAndroidBackHandler } from '$utils/androidBack';\nimport { Page, PageHeader } from './Page';\nimport { SettingsSectionBody, SettingsSectionHeader } from './style.css';\n\ntype SettingsSectionPageProps = {\n  title: ReactNode;\n  requestBack?: () => void;\n  requestClose: () => void;\n  titleAs?: 'h1' | 'h2' | 'h3' | 'span' | 'div';\n  backLabel?: string;\n  actionLabel?: string;\n  children?: ReactNode;\n};\n\nexport function SettingsSectionPage({\n  title,\n  requestBack,\n  requestClose,\n  titleAs,\n  backLabel,\n  actionLabel,\n  children,\n}: SettingsSectionPageProps) {\n  const screenSize = useScreenSizeContext();\n  const closeLabel = actionLabel ?? 'Close';\n  const showBack = screenSize === ScreenSize.Mobile && requestBack;\n  useAndroidBackHandler(() => {\n    requestBack?.();\n    return true;\n  }, !!showBack);\n\n  return (\n    <Page>\n      <PageHeader className={SettingsSectionHeader}>\n        <Box grow=\"Yes\" gap=\"200\">\n          <Box grow=\"Yes\" alignItems=\"Center\" gap=\"200\">\n            {showBack && (\n              <IconButton aria-label={backLabel ?? 'Back'} onClick={requestBack} variant=\"Surface\">\n                {composerIcon(ArrowLeft)}\n              </IconButton>\n            )}\n            <Text size=\"H4\" as={titleAs} truncate>\n              {title}\n            </Text>\n          </Box>\n          <Box shrink=\"No\">\n            <IconButton aria-label={closeLabel} onClick={requestClose} variant=\"Surface\">\n              {composerIcon(X)}\n            </IconButton>\n          </Box>\n        </Box>\n      </PageHeader>\n      <Box grow=\"Yes\" className={SettingsSectionBody}>\n        {children}\n      </Box>\n    </Page>\n  );\n}\n","import type { ReactNode } from 'react';\nimport type { RectCords } from 'folds';\nimport { Box, IconButton, Text } from 'folds';\nimport { composerIcon, DotsThreeOutlineVerticalIcon } from '$components/icons/phosphor';\nimport { PageNavHeader } from '$components/page';\nimport { ResponsiveMenu } from '$components/ResponsiveMenu';\n\ntype PageNavHeaderWithMenuProps = {\n  hideText?: boolean;\n  title: string;\n  collapsedIcon: ReactNode;\n  menu: ReactNode;\n  anchor: RectCords | undefined;\n  requestClose: () => void;\n  triggerProps: {\n    onClick: React.MouseEventHandler<HTMLButtonElement>;\n  };\n};\n\nexport function PageNavHeaderWithMenu({\n  hideText,\n  title,\n  collapsedIcon,\n  menu,\n  anchor,\n  requestClose,\n  triggerProps,\n}: PageNavHeaderWithMenuProps) {\n  return (\n    <>\n      <PageNavHeader size=\"600\">\n        {hideText ? (\n          <Box alignItems=\"Center\" grow=\"Yes\" justifyContent=\"Center\">\n            <IconButton aria-pressed={!!anchor} variant=\"Background\" onClick={triggerProps.onClick}>\n              {collapsedIcon}\n            </IconButton>\n          </Box>\n        ) : (\n          <Box grow=\"Yes\" gap=\"300\">\n            <Box grow=\"Yes\" alignItems=\"Center\">\n              <Text size=\"H4\" truncate>\n                {title}\n              </Text>\n            </Box>\n            <Box shrink=\"No\">\n              <IconButton\n                aria-pressed={!!anchor}\n                variant=\"Background\"\n                onClick={triggerProps.onClick}\n              >\n                {composerIcon(DotsThreeOutlineVerticalIcon, {\n                  weight: anchor ? 'fill' : 'regular',\n                })}\n              </IconButton>\n            </Box>\n          </Box>\n        )}\n      </PageNavHeader>\n      <ResponsiveMenu\n        anchor={anchor}\n        requestClose={requestClose}\n        position=\"Bottom\"\n        align=\"End\"\n        offset={6}\n        menu={menu}\n      />\n    </>\n  );\n}\n"],"file":"page-BGd8-9CG.js"}